B
    Hee%                 @  s   d Z ddlmZ ddl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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               @  s$  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dS )&Windowsa  
    `MSDN on where to store app data files
    <http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120>`_.
    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   t/var/www/downstreamdata.science/rtclock/rtclock-venv/lib/python3.7/site-packages/pip/_vendor/platformdirs/windows.pyuser_data_dir   s    zWindows.user_data_dirN)opinion_valuez
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_dir7   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_dirB   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   Cache)r   )r   r   r   r   r   )r   r   r   r   r   user_cache_dirG   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   )r   r   r   r   r   site_cache_dirP   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_dirV   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   r   user_log_dir[   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_dird   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_DOWNLOADS)r   r   r   r   )r   r   r   r   user_downloads_diri   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_MYPICTURES)r   r   r   r   )r   r   r   r   user_pictures_dirn   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_MYVIDEO)r   r   r   r   )r   r   r   r   user_videos_dirs   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_MYMUSIC)r   r   r   r   )r   r   r   r   user_music_dirx   s    zWindows.user_music_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   r   user_runtime_dir}   s    zWindows.user_runtime_dir)__name__
__module____qualname____doc__propertyr   r   r#   r$   r%   r'   r(   r)   r*   r,   r.   r0   r2   r4   r5   r   r   r   r   r      s    		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   zUnknown CSIDL name: zUnset environment variable: )(get_win_folder_if_csidl_name_not_env_varget
ValueErrorr   environ)r;   resultZenv_var_namemsgr   r   r   get_win_folder_from_env_vars   s    

rD   z
str | Nonec             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 )zKGet folder for a CSIDL name that does not exist as an environment variable.r+   USERPROFILEZ	Documentsr-   	Downloadsr/   ZPicturesr1   ZVideosr3   ZMusicN)r   r   r   r   rA   )r;   r   r   r   r>      s    r>   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   r+   r-   r/   r1   r3   NzUnknown CSIDL name: win32r   z@Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders)
r?   r@   sysplatformNotImplementedErrorwinregOpenKeyHKEY_CURRENT_USERQueryValueExr	   )r;   Zshell_folder_namerC   rK   key	directory_r   r   r   get_win_folder_from_registry   s$    

rR   c          	   C  s   ddddddddd	 | }|d
kr6d|  }t|td}ttd}|jd
|d
d| tdd |D rtd}|j	|j
|dr|}| dkrtj|j
dS |j
S )zGet folder with ctypes.   #         '         (   )r   r"   r   r+   r/   r1   r3   r-   NzUnknown CSIDL name: i   windllr   c             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-   rF   )r?   r@   ctypesZcreate_unicode_buffergetattrZshell32ZSHGetFolderPathWanykernel32ZGetShortPathNameWvaluer   r   r   )r;   Zcsidl_constrC   bufr[   Zbuf2r   r   r   get_win_folder_via_ctypes   s,    



rg   zCallable[[str], str])r
   c              C  s8   t tdrtS ydd l} W n tk
r.   tS X tS d S )Nr[   r   )hasattrra   rg   rK   ImportErrorrD   rR   )rK   r   r   r   _pick_get_win_folder   s    
rj   )maxsize)r9   
__future__r   ra   r   rH   	functoolsr   typingr   apir   collections.abcr   r   rD   r>   rR   rg   rj   r   __all__r   r   r   r   <module>   s"   w$