U ʗRe'@sddlmZddlZddlZddlmZddlmZddlm Z Gddde Z d d d d d Z d d d d dZ d d d ddZ ddddZeddeZdgZdS)) annotationsN) lru_cache)Callable)PlatformDirsABCc@seZdZdZeddddZdddddd d d Zeddd d ZeddddZeddddZ eddddZ eddddZ eddddZ eddddZ eddddZdS)Windowsa`MSDN on where to store app data files `_. Makes use of the `appname `, `appauthor `, `version `, `roaming `, `opinion `.strreturncCs(|jr dnd}tjt|}||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_APPDATACSIDL_LOCAL_APPDATA)roamingospathnormpathget_win_folder _append_parts)selfconstrr/builddir/build/BUILDROOT/alt-python38-pip-22.2.1-2.el8.x86_64/opt/alt/python38/lib/python3.8/site-packages/pip/_vendor/platformdirs/windows.py user_data_dirszWindows.user_data_dirN opinion_valuez str | None)rrr cCsrg}|jr`|jdk r*|jp|j}||||j|dk rN|jrN|||jr`||jtjj|f|S)NF)appname appauthorappendopinionversionrrjoin)rrrparamsauthorrrrr s      zWindows._append_partscCstjtd}||S)zT:return: data directory shared by users, e.g. ``C:\ProgramData\$appauthor\$appname``CSIDL_COMMON_APPDATArrrrrrrrrr site_data_dir-szWindows.site_data_dircCs|jS)zC:return: config directory tied to the user, same as `user_data_dir`rrrrruser_config_dir3szWindows.user_config_dircCs|jS)zF:return: config directory shared by the users, same as `site_data_dir`)r%r'rrrsite_config_dir8szWindows.site_config_dircCstjtd}|j|ddS)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 Cacherr#r$rrruser_cache_dir=szWindows.user_cache_dircCs|jS)zB:return: state directory tied to the user, same as `user_data_dir`r&r'rrruser_state_dirFszWindows.user_state_dircCs|j}|jrtj|d}|S)zy :return: log directory tied to the user, same as `user_data_dir` if not opinionated else ``Logs`` in it ZLogs)rrrrrr$rrr user_log_dirKszWindows.user_log_dircCstjtdS)z` :return: documents directory tied to the user e.g. ``%USERPROFILE%\Documents`` CSIDL_PERSONAL)rrrrr'rrruser_documents_dirUszWindows.user_documents_dircCs$tjtjtdd}||S)z :return: runtime directory tied to the user, e.g. ``%USERPROFILE%\AppData\Local\Temp\$appauthor\$appname`` r ZTemp)rrrrrrr$rrruser_runtime_dir\szWindows.user_runtime_dir)__name__ __module__ __qualname____doc__propertyrrr%r(r)r+r,r-r/r0rrrrr s(    rr) csidl_namer cCsr|dkr$tjtjtjddSdddd|}|dkrLtd |tj|}|dkrntd ||S) z&Get folder from environment variables.r. USERPROFILEZ DocumentsAPPDATAZALLUSERSPROFILE LOCALAPPDATA)r r"r NUnknown CSIDL name: zUnset environment variable: )rrrrenvironget ValueError)r6Z env_var_nameresultrrrget_win_folder_from_env_varsfs r?cCsXddddd|}|dkr*td|ddl}||jd }|||\}}t|S) zGet folder from the registry. This is a fallback technique at best. I'm not sure if using the registry for this guarantees us the correct answer for all CSIDL_* names. ZAppDatazCommon AppDataz Local AppDataZPersonalr r"r r.Nr:rz@Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders)r<r=winregOpenKeyHKEY_CURRENT_USER QueryValueExr)r6Zshell_folder_namerAkey directory_rrrget_win_folder_from_registryxsrHcCsddddd|}|dkr*td|td}ttd }|jd|dd |td d |Drtd}|j |j |dr|}|j S) zGet folder with ctypes.#r@Nr:iwindllrcss|]}t|dkVqdS)N)ord).0crrr sz,get_win_folder_via_ctypes..) r<r=ctypesZcreate_unicode_buffergetattrZshell32ZSHGetFolderPathWanykernel32ZGetShortPathNameWvalue)r6Z csidl_constbufrMZbuf2rrrget_win_folder_via_ctypess"   rYzCallable[[str], str]r cCs<ttdrtSz ddl}Wntk r2tYSXtSdS)NrMr)hasattrrSrYrA ImportErrorr?rH)rArrr_pick_get_win_folders   r\)maxsize) __future__rrSr functoolsrtypingrapirrr?rHrYr\r__all__rrrrs    [