a
    $lJh'                     @  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   R/var/www/shaz/venv/lib/python3.9/site-packages/pip/_vendor/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ur*| jp| j }|| || j  |d urN| jrN|| | jr`|| 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  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 it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_DOWNLOADSr4   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_MYPICTURESr4   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_MYVIDEOr4   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_MYMUSICr4   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_DESKTOPDIRECTORYr4   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   r2   r5   r7   r9   r;   r=   r?   r@   rA   r   r   r   r   r      sD   

r   r	   )
csidl_namer   c                 C  sj   t | }|dur|S dddd| }|du r@d|  }t|tj|}|du 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)rG   resultZenv_var_namemsgr   r   r   get_win_folder_from_env_vars   s"    

rQ   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rt jt jt jd d	S | d
krt 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.r3   USERPROFILEZ	Documentsr6   	Downloadsr8   ZPicturesr:   ZVideosr<   ZMusicN)r   r   r!   r   rN   )rG   r   r   r   rK      s    rK   c              	   C  sr   ddddddddd	 | }|d
u 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.

    AppDatazCommon AppDatazLocal AppDataZPersonalz&{374DE290-123F-4565-9164-39C4925E467B}zMy PictureszMy VideozMy Music)r   r%   r   r3   r6   r8   r:   r<   NrJ   win32r   z@Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders)
rL   rM   sysplatformNotImplementedErrorwinregOpenKeyHKEY_CURRENT_USERQueryValueExr	   )rG   shell_folder_namerP   rY   key	directory_r   r   r   get_win_folder_from_registry   s(    		


ra   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 r|d}|j	|j
|dr|}| dkrtj|j
dS |j
S )zGet folder with ctypes.r   N   #         '         (      )	r   r%   r   r3   r8   r:   r<   r6   r>   rJ   i   windllc                 s  s   | ]}t |d kV  qdS )   N)ord).0cr   r   r   	<genexpr>       z,get_win_folder_via_ctypes.<locals>.<genexpr>r6   rS   )ctypesrL   rM   create_unicode_buffergetattrshell32SHGetFolderPathWanykernel32GetShortPathNameWvaluer   r   r!   )rG   rr   csidl_constrP   bufrk   buf2r   r   r   get_win_folder_via_ctypes   s4    




r~   zCallable[[str], str]r
   c                  C  sZ   zdd l } W n ty   Y n0 t| dr.tS zdd l}W n tyP   t Y S 0 tS d S )Nr   rk   )rr   ImportErrorhasattrr~   rY   rQ   ra   )rr   rY   r   r   r   _pick_get_win_folder   s    

r   )maxsize)rE   
__future__r   r   rV   	functoolsr   typingr   apir   collections.abcr   r   rQ   rK   ra   r~   r   r   __all__r   r   r   r   <module>   s"   '