o
    5‘ði�'  ã                   @  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r*ddlmZ G d	d
„ d
e
ƒZddd„Zddd„Zddd„Zddd„Zddd„Zedd�eƒ ƒZd
gZdS )zWindows.é    )ÚannotationsN)Ú	lru_cache)ÚTYPE_CHECKINGé   )ÚPlatformDirsABC)ÚCallablec                   @  s   e Zd ZdZed+dd„ƒZddœd,dd„Zed+dd„ƒZed+dd„ƒZed+dd„ƒZ	ed+dd„ƒZ
ed+dd„ƒZed+dd„ƒZed+dd„ƒZed+dd„ƒZed+dd„ƒZed+dd „ƒZed+d!d"„ƒZed+d#d$„ƒZed+d%d&„ƒZed+d'd(„ƒZe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>`.

    ÚreturnÚstrc                 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   úf/root/parts/websockify/install/lib/python3.10/site-packages/setuptools/_vendor/platformdirs/windows.pyÚuser_data_dir   s   
zWindows.user_data_dirN©Úopinion_valuer   r   ú
str | Nonec                C  s‚   g }| j r0| jdur| jp| j }| |¡ | | j ¡ |d ur'| jr'| |¡ | jr0| | j¡ tjj|g|¢R Ž }|  |¡ |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  ó   | j S )zC:return: config directory tied to the user, same as `user_data_dir`©r   ©r   r   r   r   Úuser_config_dir;   ó   zWindows.user_config_dirc                 C  r(   )zF:return: config directory shared by the users, same as `site_data_dir`)r'   r*   r   r   r   Úsite_config_dir@   r,   zWindows.site_config_dirc                 C  ó   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  r.   )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  r(   )zB:return: state directory tied to the user, same as `user_data_dir`r)   r*   r   r   r   Úuser_state_dirT   r,   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 itÚLogs)r   r   r   r   r    r!   r&   r   r   r   Úuser_log_dirY   s
   
zWindows.user_log_dirc                 C  ó   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   ó   zWindows.user_documents_dirc                 C  r5   )zN:return: downloads directory tied to the user e.g. ``%USERPROFILE%\Downloads``ÚCSIDL_DOWNLOADSr7   r*   r   r   r   Úuser_downloads_dirg   r9   zWindows.user_downloads_dirc                 C  r5   )zL:return: pictures directory tied to the user e.g. ``%USERPROFILE%\Pictures``ÚCSIDL_MYPICTURESr7   r*   r   r   r   Úuser_pictures_dirl   r9   zWindows.user_pictures_dirc                 C  r5   )zH:return: videos directory tied to the user e.g. ``%USERPROFILE%\Videos``ÚCSIDL_MYVIDEOr7   r*   r   r   r   Úuser_videos_dirq   r9   zWindows.user_videos_dirc                 C  r5   )zF:return: music directory tied to the user e.g. ``%USERPROFILE%\Music``ÚCSIDL_MYMUSICr7   r*   r   r   r   Úuser_music_dirv   r9   zWindows.user_music_dirc                 C  r5   )zK:return: desktop directory tied to the user, e.g. ``%USERPROFILE%\Desktop``ÚCSIDL_DESKTOPDIRECTORYr7   r*   r   r   r   Úuser_desktop_dir{   r9   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   ÚTemp)r   r   r   r    r   r   r&   r   r   r   Úuser_runtime_dir€   s   
zWindows.user_runtime_dirc                 C  r(   )zF:return: runtime directory shared by users, same as `user_runtime_dir`)rE   r*   r   r   r   Úsite_runtime_dir‰   r,   zWindows.site_runtime_dir)r	   r
   )r   r
   r   r   r	   r
   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   r   r'   r+   r-   r0   r1   r2   r4   r8   r;   r=   r?   rA   rC   rE   rF   r   r   r   r   r      sF    

r   Ú
csidl_namer
   r	   c                 C  sj   t | ƒ}|dur
|S ddddœ | ¡}|du r d| › �}t|ƒ‚tj |¡}|du r3d|› �}t|ƒ‚|S )z&Get folder from environment variables.NÚAPPDATAÚALLUSERSPROFILEÚLOCALAPPDATA)r   r$   r   úUnknown CSIDL name: zUnset environment variable: )Ú(get_win_folder_if_csidl_name_not_env_varÚgetÚ
ValueErrorr   Úenviron)rL   ÚresultÚenv_var_nameÚmsgr   r   r   Úget_win_folder_from_env_vars�   s"   ýü

rX   r   c                 C  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kr6t j t j t jd ¡d¡S | dkrHt j t j t jd ¡d	¡S | d
krZt 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.r6   ÚUSERPROFILEÚ	Documentsr:   Ú	Downloadsr<   ÚPicturesr>   ÚVideosr@   ÚMusicN)r   r   r    r   rT   )rL   r   r   r   rQ   ¤   s   rQ   c              	   C  sr   ddddddddd	œ  | ¡}|d
u rd| › �}t|ƒ‚tjdkr"t‚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.

    ÚAppDatazCommon AppDatazLocal AppDataÚPersonalz&{374DE290-123F-4565-9164-39C4925E467B}zMy PictureszMy VideozMy Music)r   r$   r   r6   r:   r<   r>   r@   NrP   Úwin32r   z@Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders)
rR   rS   ÚsysÚplatformÚNotImplementedErrorÚwinregÚOpenKeyÚHKEY_CURRENT_USERÚQueryValueExr
   )rL   Úshell_folder_namerW   re   ÚkeyÚ	directoryÚ_r   r   r   Úget_win_folder_from_registry·   s(   	ø	÷


rm   c              
   C  s¸   ddl }ddddddd	d
ddœ	 | ¡}|du r d| › �}t|ƒ‚| d¡}t|dƒ}|j d|dd|¡ tdd„ |D ƒƒrM| d¡}|j 	|j
|d¡rM|}| dkrYtj |j
d¡S |j
S )zGet folder with ctypes.r   Né   é#   é   é   é'   é   é   é(   é   )	r   r$   r   r6   r<   r>   r@   r:   rB   rP   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>r:   r[   )ÚctypesrR   rS   Úcreate_unicode_bufferÚgetattrÚshell32ÚSHGetFolderPathWÚanyÚkernel32ÚGetShortPathNameWÚvaluer   r   r    )rL   r}   Úcsidl_constrW   Úbufrw   Úbuf2r   r   r   Úget_win_folder_via_ctypesÕ   s4   ÷
ö



r‰   úCallable[[str], str]c                  C  sT   zdd l } W n	 ty   Y nw t| dƒrtS zdd l}W tS  ty)   t Y S w )Nr   rw   )r}   ÚImportErrorÚhasattrr‰   re   rX   rm   )r}   re   r   r   r   Ú_pick_get_win_folderü   s   ÿ

ýÿr�   )Úmaxsize)rL   r
   r	   r
   )rL   r
   r	   r   )r	   rŠ   )rJ   Ú
__future__r   r   rb   Ú	functoolsr   Útypingr   Úapir   Úcollections.abcr   r   rX   rQ   rm   r‰   r�   r   Ú__all__r   r   r   r   Ú<module>   s$    




'ÿ