U
    M»{j�'  ã                   @  sÌ   d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
 erTddlmZ G d	d
„ d
e
ƒZdddœdd„Zdddœdd„Zdddœdd„Zdddœdd„Zddœdd„Zedd�eƒ ƒZd
gZdS )zWindows.é    )ÚannotationsN)Ú	lru_cache)ÚTYPE_CHECKINGé   )ÚPlatformDirsABC)ÚCallablec                   @  sH  e Zd ZdZeddœdd„ƒZddœdddd	œd
d„Zeddœdd„ƒZeddœdd„ƒZeddœdd„ƒZ	eddœdd„ƒZ
eddœdd„ƒZeddœdd„ƒZeddœdd„ƒZeddœdd„ƒZeddœdd„ƒZeddœdd„ƒZeddœd d!„ƒZeddœd"d#„ƒZeddœd$d%„ƒZeddœd&d'„ƒZeddœd(d)„ƒZdS )*ÚWindowsað  
    `MSDN on where to store app data files <https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid>`_.

    Makes use of the `appname <platformdirs.api.PlatformDirsABC.appname>`, `appauthor
    <platformdirs.api.PlatformDirsABC.appauthor>`, `version <platformdirs.api.PlatformDirsABC.version>`, `roaming
    <platformdirs.api.PlatformDirsABC.roaming>`, `opinion <platformdirs.api.PlatformDirsABC.opinion>`, `ensure_exists
    <platformdirs.api.PlatformDirsABC.ensure_exists>`.

    Ústr©Úreturnc                 C  s(   | j r
dnd}tj t|ƒ¡}|  |¡S )z×
        :return: data directory tied to the user, e.g.
         ``%USERPROFILE%\AppData\Local\$appauthor\$appname`` (not roaming) or
         ``%USERPROFILE%\AppData\Roaming\$appauthor\$appname`` (roaming)
        ÚCSIDL_APPDATAÚCSIDL_LOCAL_APPDATA)ÚroamingÚosÚpathÚnormpathÚget_win_folderÚ_append_parts)ÚselfÚconstr   © r   úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/platformdirs/windows.pyÚuser_data_dir   s    zWindows.user_data_dirN©Úopinion_valueú
str | None)r   r   r   c                C  s€   g }| j r`| jdk	r*| jp| j }| |¡ | | j ¡ |d k	rN| jrN| |¡ | jr`| | j¡ tjj|f|žŽ }|  |¡ |S )NF)	ÚappnameÚ	appauthorÚappendÚopinionÚversionr   r   ÚjoinÚ_optionally_create_directory)r   r   r   ÚparamsÚauthorr   r   r   r   &   s    



zWindows._append_partsc                 C  s   t j tdƒ¡}|  |¡S )zT:return: data directory shared by users, e.g. ``C:\ProgramData\$appauthor\$appname``ÚCSIDL_COMMON_APPDATA©r   r   r   r   r   ©r   r   r   r   r   Úsite_data_dir5   s    zWindows.site_data_dirc                 C  s   | j S )zC:return: config directory tied to the user, same as `user_data_dir`©r   ©r   r   r   r   Úuser_config_dir;   s    zWindows.user_config_dirc                 C  s   | j S )zF:return: config directory shared by the users, same as `site_data_dir`)r(   r*   r   r   r   Úsite_config_dir@   s    zWindows.site_config_dirc                 C  s   t j tdƒ¡}| j|dd�S )zÇ
        :return: cache directory tied to the user (if opinionated with ``Cache`` folder within ``$appname``) e.g.
         ``%USERPROFILE%\AppData\Local\$appauthor\$appname\Cache\$version``
        r   ÚCacher   r&   r'   r   r   r   Úuser_cache_dirE   s    zWindows.user_cache_dirc                 C  s   t j tdƒ¡}| j|dd�S )zd:return: cache directory shared by users, e.g. ``C:\ProgramData\$appauthor\$appname\Cache\$version``r%   r-   r   r&   r'   r   r   r   Úsite_cache_dirN   s    zWindows.site_cache_dirc                 C  s   | j S )zB:return: state directory tied to the user, same as `user_data_dir`r)   r*   r   r   r   Úuser_state_dirT   s    zWindows.user_state_dirc                 C  s(   | j }| jr$tj |d¡}|  |¡ |S )zg:return: log directory tied to the user, same as `user_data_dir` if not opinionated else ``Logs`` in itZLogs)r   r   r   r   r!   r"   r'   r   r   r   Úuser_log_dirY   s
    
zWindows.user_log_dirc                 C  s   t j tdƒ¡S )zN:return: documents directory tied to the user e.g. ``%USERPROFILE%\Documents``ÚCSIDL_PERSONAL©r   r   r   r   r*   r   r   r   Úuser_documents_dirb   s    zWindows.user_documents_dirc                 C  s   t j tdƒ¡S )zN:return: downloads directory tied to the user e.g. ``%USERPROFILE%\Downloads``ÚCSIDL_DOWNLOADSr3   r*   r   r   r   Úuser_downloads_dirg   s    zWindows.user_downloads_dirc                 C  s   t j tdƒ¡S )zL:return: pictures directory tied to the user e.g. ``%USERPROFILE%\Pictures``ÚCSIDL_MYPICTURESr3   r*   r   r   r   Úuser_pictures_dirl   s    zWindows.user_pictures_dirc                 C  s   t j tdƒ¡S )zH:return: videos directory tied to the user e.g. ``%USERPROFILE%\Videos``ÚCSIDL_MYVIDEOr3   r*   r   r   r   Úuser_videos_dirq   s    zWindows.user_videos_dirc                 C  s   t j tdƒ¡S )zF:return: music directory tied to the user e.g. ``%USERPROFILE%\Music``ÚCSIDL_MYMUSICr3   r*   r   r   r   Úuser_music_dirv   s    zWindows.user_music_dirc                 C  s   t j tdƒ¡S )zK:return: desktop directory tied to the user, e.g. ``%USERPROFILE%\Desktop``ÚCSIDL_DESKTOPDIRECTORYr3   r*   r   r   r   Úuser_desktop_dir{   s    zWindows.user_desktop_dirc                 C  s$   t j t j tdƒd¡¡}|  |¡S )z…
        :return: runtime directory tied to the user, e.g.
         ``%USERPROFILE%\AppData\Local\Temp\$appauthor\$appname``
        r   ZTemp)r   r   r   r!   r   r   r'   r   r   r   Úuser_runtime_dir€   s    zWindows.user_runtime_dirc                 C  s   | j S )zF:return: runtime directory shared by users, same as `user_runtime_dir`)r?   r*   r   r   r   Úsite_runtime_dir‰   s    zWindows.site_runtime_dir)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   r   r(   r+   r,   r.   r/   r0   r1   r4   r6   r8   r:   r<   r>   r?   r@   r   r   r   r   r      sD   

r   r	   )Ú
csidl_namer   c                 C  sj   t | ƒ}|dk	r|S ddddœ | ¡}|dkr@d| › �}t|ƒ‚tj |¡}|dkrfd|› �}t|ƒ‚|S )z&Get folder from environment variables.NÚAPPDATAZALLUSERSPROFILEÚLOCALAPPDATA)r   r%   r   úUnknown CSIDL name: zUnset environment variable: )Ú(get_win_folder_if_csidl_name_not_env_varÚgetÚ
ValueErrorr   Úenviron)rF   ÚresultZenv_var_nameÚmsgr   r   r   Úget_win_folder_from_env_vars�   s"    ýü

rP   r   c                 C  s¸   | dkr$t j t j t jd ¡d¡S | dkrHt j t j t jd ¡d¡S | dkrlt j t j t jd ¡d¡S | dkr�t j t j t jd ¡d	¡S | d
kr´t j t j t jd ¡d¡S dS )zMGet a folder for a CSIDL name that does not exist as an environment variable.r2   ÚUSERPROFILEZ	Documentsr5   Ú	Downloadsr7   ZPicturesr9   ZVideosr;   ZMusicN)r   r   r!   r   rM   )rF   r   r   r   rJ   ¤   s    rJ   c              	   C  sr   ddddddddd	œ  | ¡}|d
kr6d| › �}t|ƒ‚tjdkrDt‚dd
l}| |jd¡}| ||¡\}}t	|ƒS )z¼
    Get folder from the registry.

    This is a fallback technique at best. I'm not sure if using the registry for these guarantees us the correct answer
    for all CSIDL_* names.

    ZAppDatazCommon AppDatazLocal AppDataZPersonalz&{374DE290-123F-4565-9164-39C4925E467B}zMy PictureszMy VideozMy Music)r   r%   r   r2   r5   r7   r9   r;   NrI   Úwin32r   z@Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders)
rK   rL   ÚsysÚplatformÚNotImplementedErrorÚwinregÚOpenKeyÚHKEY_CURRENT_USERÚQueryValueExr	   )rF   Zshell_folder_namerO   rW   ÚkeyÚ	directoryÚ_r   r   r   Úget_win_folder_from_registry·   s(    	ø	÷


r^   c              
   C  s¸   ddl }ddddddd	d
ddœ	 | ¡}|dkr@d| › �}t|ƒ‚| d¡}t|dƒ}|j d|dd|¡ tdd„ |D ƒƒrš| d¡}|j 	|j
|d¡rš|}| dkr²tj |j
d¡S |j
S )zGet folder with ctypes.r   Né   é#   é   é   é'   é   é   é(   é   )	r   r%   r   r2   r7   r9   r;   r5   r=   rI   i   Úwindllc                 s  s   | ]}t |ƒd kV  qdS )éÿ   N)Úord)Ú.0Úcr   r   r   Ú	<genexpr>ñ   s     z,get_win_folder_via_ctypes.<locals>.<genexpr>r5   rR   )ÚctypesrK   rL   Zcreate_unicode_bufferÚgetattrZshell32ZSHGetFolderPathWÚanyÚkernel32ZGetShortPathNameWÚvaluer   r   r!   )rF   rn   Zcsidl_constrO   Úbufrh   Zbuf2r   r   r   Úget_win_folder_via_ctypesÕ   s4    ÷
ö



rt   zCallable[[str], str]r
   c                  C  s^   zdd l } W n tk
r    Y nX t| dƒr0tS zdd l}W n tk
rT   t Y S X tS d S )Nr   rh   )rn   ÚImportErrorÚhasattrrt   rW   rP   r^   )rn   rW   r   r   r   Ú_pick_get_win_folderü   s    

rw   )Úmaxsize)rD   Ú
__future__r   r   rT   Ú	functoolsr   Útypingr   Úapir   Úcollections.abcr   r   rP   rJ   r^   rt   rw   r   Ú__all__r   r   r   r   Ú<module>   s"   'ÿ