o
    Zh'                     @  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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
    <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>`.
    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   K/var/www/html/lang_env/lib/python3.10/site-packages/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   paramsZ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     | 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_dirB   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_dirG   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_dirP   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_dirV   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 itZLogs)r   r   r   r   r    r!   r%   r   r   r   user_log_dir[   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_dird      zWindows.user_documents_dirc                 C  r3   )zN:return: downloads directory tied to the user e.g. ``%USERPROFILE%\Downloads``CSIDL_DOWNLOADSr5   r)   r   r   r   user_downloads_diri   r7   zWindows.user_downloads_dirc                 C  r3   )zL:return: pictures directory tied to the user e.g. ``%USERPROFILE%\Pictures``CSIDL_MYPICTURESr5   r)   r   r   r   user_pictures_dirn   r7   zWindows.user_pictures_dirc                 C  r3   )zH:return: videos directory tied to the user e.g. ``%USERPROFILE%\Videos``CSIDL_MYVIDEOr5   r)   r   r   r   user_videos_dirs   r7   zWindows.user_videos_dirc                 C  r3   )zF:return: music directory tied to the user e.g. ``%USERPROFILE%\Music``CSIDL_MYMUSICr5   r)   r   r   r   user_music_dirx   r7   zWindows.user_music_dirc                 C  r3   )zK:return: desktop directory tied to the user, e.g. ``%USERPROFILE%\Desktop``CSIDL_DESKTOPDIRECTORYr5   r)   r   r   r   user_desktop_dir}   r7   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  r'   )zF:return: runtime directory shared by users, same as `user_runtime_dir`)rB   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,   r/   r0   r1   r2   r6   r9   r;   r=   r?   rA   rB   rC   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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)rI   resultZenv_var_namemsgr   r   r   get_win_folder_from_env_vars   s"   

rS   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 )zKGet folder for a CSIDL name that does not exist as an environment variable.r4   USERPROFILEZ	Documentsr8   	Downloadsr:   ZPicturesr<   ZVideosr>   ZMusicN)r   r   r    r   rP   )rI   r   r   r   rM      s   rM   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.
    ZAppDatazCommon AppDatazLocal AppDataZPersonalz&{374DE290-123F-4565-9164-39C4925E467B}zMy PictureszMy VideozMy Music)r   r#   r   r4   r8   r:   r<   r>   NrL   win32r   z@Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders)
rN   rO   sysplatformNotImplementedErrorwinregOpenKeyHKEY_CURRENT_USERQueryValueExr
   )rI   Zshell_folder_namerR   rZ   key	directory_r   r   r   get_win_folder_from_registry   s(   	


ra   c              
   C  s   ddddddddd	d
	 | }|du rd|  }t|td}ttd}|jd|dd| tdd |D rItd}|j	|j
|drI|}| dkrUtj|j
dS |j
S )zGet folder with ctypes.   #         '         (      )	r   r#   r   r4   r:   r<   r>   r8   r@   NrL   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>r8   rU   )rN   rO   ctypesZcreate_unicode_buffergetattrZshell32ZSHGetFolderPathWanyZkernel32ZGetShortPathNameWvaluer   r   r    )rI   Zcsidl_constrR   bufrk   Zbuf2r   r   r   get_win_folder_via_ctypes   s2   




rv   Callable[[str], str]c                  C  s4   t tdrtS zdd l} W tS  ty   t Y S w )Nrk   r   )hasattrrq   rv   rZ   ImportErrorrS   ra   )rZ   r   r   r   _pick_get_win_folder   s   

rz   )maxsize)rI   r
   r	   r
   )rI   r
   r	   r   )r	   rw   )rG   
__future__r   rq   r   rW   	functoolsr   typingr   apir   collections.abcr   r   rS   rM   ra   rv   rz   r   __all__r   r   r   r   <module>   s(     




%