+
    Ki\/  c                   s    R t ^ RIt^ RIt^ RIHt ^ RIHt ^ RIHt ^ RIH	t	 ^ RI
Ht ]! ^4      w  ttttttttR]R]R	]R
]R]R]/t ! R R4      t ! R R4      t ! R R4      tR# )zManipulate Wine registry filesN)OrderedDict)datetime)system)logger)WINE_DEFAULT_ARCH"zstr:"zstr(2):"zstr(7):"ZhexZdwordc                   sn   a  ] tR t^!t o RtRtRtRR ltR t]	R 4       t
R t]	R	 4       tR
 tR tRtV tR# )WindowsFileTimez~Utility class to deal with Windows FILETIME structures.

See: https://msdn.microsoft.com/en-us/library/ms724284(v=vs.85).aspx
i l    !l
 Nc                s    Wn         R # N	timestamp)selfr	      &&>/usr/lib/python3.14/site-packages/lutris/util/wine/registry.py__init__ZWindowsFileTime.__init__*   s    "    c                sb    R P                  V P                  P                  V P                  4      # )z<{}>: {})formatZ	__class____name__r	   r
      &r   __repr__ZWindowsFileTime.__repr__-   s#      !8!8$..IIr   c                s0    \        V^4      p\        V4      # )i   )intr   )clsZhexvaluer	      && r   from_hexZWindowsFileTime.from_hex0   s    "%	y))r   c                s8    R P                  V P                  4      # )z{:x})r   r	   r   r   r   to_hexZWindowsFileTime.to_hex5   s    }}T^^,,r   c                sr    WP                   ,           p\        WP                  ,          4      p\        V4      # r   )epoch_deltar   ticks_per_secondsr   )r   r	   r   r   from_unix_timestampZ#WindowsFileTime.from_unix_timestamp8   s,    /		$9$99:	y))r   c                s    V P                   '       g   \        R 4      hV P                   V P                  ,          pWP                  ,
          pV# )zNo timestamp set)r	   
ValueErrorr   r   )r
   Zunix_tss   & r   to_unix_timestampZ!WindowsFileTime.to_unix_timestamp>   s>    ~~~/00..4#9#99,,,r   c                sJ    \         P                  ! V P                  4       4      # r   )r   Zfromtimestampr   r   r   r   to_date_timeZWindowsFileTime.to_date_timeE   s    %%d&<&<&>??r   r   r   )r   
__module____qualname____firstlineno____doc__r   r   r   r   Zclassmethodr   r   r   r   r   __static_attributes____classdictcell__Z__classdict__   @r   r   r   !   s`     
 !K#J * *- * *
@ @r   r   c                   s   a  ] tR t^It o RtRtRR ltR t]R 4       t	]
R 4       tR tR	 tRR
 ltR tR tR tR tR tRtV tR# )WineRegistryzWINE REGISTRY Version z;; All keys relative to Nc                s    \         V n        ^V n        RV n        \	        4       V n        Wn        V'       dG   \        P                  ! V4      '       g   \        P                  ! RV4       V P                  V4       R# R# )   z\\User\\S-1-5-21-0-0-0-1000zNo registry file at %sN)r   archversionrelative_tor    keysreg_filenamer   path_existsr   errorparse_reg_file)r
   r-   r   r   r   ZWineRegistry.__init__M   s]    %	<M	(%%l335|D- r   c                s(    R V P                   ,          # )zWindows Registry @ %s)r-   r   r   r   __str__ZWineRegistry.__str__X   s    &):):::r   c                s|    V P                   '       d*   \        P                  P                  V P                   4      # R# )z>Return the Wine prefix path (where the .reg files are located)N)r-   ospathdirnamer   r   r   prefix_pathZWineRegistry.prefix_path[   s,     77??4#4#455r   c                s   \         P                  ! V 4      '       g   . # \        V RRR7      ;_uu_ 4       p VP                  4       pRRR4       V#   \         d    \
        P                  ! RT 4       . p L0i ; i  + '       g   i     X# ; i)z>Return an array of the unprocessed contents of a registry fileZrutf-8ZencodingzFailed to registry read %sN)r   r.   openZ	readlinesZ	Exceptionr   	exception)r-   Zreg_fileZregistry_content   &  r   get_raw_registryZWineRegistry.get_raw_registryb   s     !!,//I,g66(&#+#5#5#7  7    &  !=|L#% & 76  s(   A;A$A85A;7A88A;;B	c                s^   V P                  V4      pR pRp. pV EF  pVP                  R4      pVP                  R4      '       d'   \        VR7      pW0P                  VP
                  &   KR  V'       ds   V'       d   VP                  V4       MEV'       g>   V'       d%   RP                  V4      pVP                  V4       . pVP                  V4       VP                  R4      pK  VP                  V P                  4      '       d*   \        V\        V P                  4      R  4      V n        EK  VP                  V P                  4      '       d!   V\        V P                  4      R  V n        EKW  VP                  R4      '       g   EKq  VP#                  R4      ^,          V n        EK  	  R # )NF
Z[)key_def\z#arch=)r;   Zrstrip
startswithWineRegistryKeyr,   nameZappendjoinadd_to_lastparseendswithversion_headerr   lenr*   relative_to_headerr+   splitr)   )r
   r-   Zregistry_linesZcurrent_keyZadd_next_to_valueZadditional_valuesline   &&     r   r0   ZWineRegistry.parse_reg_fileo   sI   ..|<!"D;;t$Ds##-d;.9		+**+$%,,T2*(,0II6G,H)#//0AB,.)%%d+$(MM$$7!!4!455"4D,?,?(@(B#CD!8!899#'D,C,C(D(F#G )) JJsOA.	+ #r   c                sv   R P                  V P                  V P                  4      pVRP                  V P                  V P                  4      ,          pVRP                  V P
                  4      ,          pV P                   F3  pVR,          pWP                  V,          P                  4       ,          pK5  	  V# )z{}{}
z{}{}

z	#arch={}
r<   )r   rG   r*   rI   r+   r)   r,   render)r
   contentkeyr:   r   rM   ZWineRegistry.render   s    //$"5"5t||D:$$T%<%<d>N>NOO<&&tyy1199CtOGyy~,,..G  r   c                s   V'       g   V P                   pV'       g   \        R4      h\        P                  P	                  V4      p\        P                  P                  V4      '       g   \        RV,          4      h\        VRRR7      ;_uu_ 4       pVP                  V P                  4       4       RRR4       R#   + '       g   i     R# ; i)zWrite the registry to a filezNo filename providedzWInvalid Wine prefix path %s, make sure to create the prefix before saving to a registryZwr6   r7   N)	r-   ZOSErrorr2   r3   r4   Zisdirr8   ZwriterM   )r
   r3   r5   Zregistry_files   &&  r   saveZWineRegistry.save   s    $$D011ggood+ww}}[))ilww  $g..-. /...s    B>>C	c                sn    V P                   P                  V4      pV'       d   VP                  V4      # R # r   )r,   get
get_subkey)r
   r3   subkeyrO   s   &&& r   queryZWineRegistry.query   s)    iimmD!>>&))r   c                s    V P                   P                  V4      pV'       g%   \        VR 7      pW@P                   VP                  &   VP	                  W#4       R# ))r3   N)r,   rQ   rA   rB   
set_subkey)r
   r3   rS   valuerO   s   &&&& r   	set_valueZWineRegistry.set_value   s=    iimmD!!t,C"%IIchhv%r   c                s    V P                   P                  V4      pV'       g   R# VP                  P                  4        R# )zRemoves all subkeys from a keyN)r,   rQ   subkeysZclear)r
   r3   rO   r   r   	clear_keyZWineRegistry.clear_key   s*    iimmD!r   c                s    V P                   P                  V4      pV'       g   R# \        VP                  P                  4       4       F&  pWB9  d   K  VP                  P	                  V4       K(  	  R# )zRemove some subkeys from a keyN)r,   rQ   ZlistrX   pop)r
   r3   r,   rO   rS   s   &&&  r   clear_subkeysZWineRegistry.clear_subkeys   sO    iimmD!3;;++-.F!KKOOF# /r   c                s   VP                  R R4      pV P                  '       g   R# \        P                  P	                  V P                  R4      p\
        P                  ! V4      '       g   R# VP                  R^4      w  r4VP                  R4      p\        P                  P	                  W#P                  4       R,           4      p \        P                  ! V4      p\        P                  P                  T4      '       g    \        P                  P	                  Y&4      p\        P                  P	                  Yd4      #   \         d    \        P                  ! RT4        R# i ; i)r>   /NZ
dosdevicesZ:zUnable to read link for %s)replacer5   r2   r3   rC   r   r.   rJ   stripZlowerZreadlinkZFileNotFoundErrorr   r/   Zisabs)r
   Zwindows_pathZdrives_pathZletterZrelpathZ
drive_linkZ
drive_pathrL   r   get_unix_pathZWineRegistry.get_unix_path   s    #++D#6ggll4#3#3\B!!+..&,,S!4--$WW\\+||~/CD
	Z0J
 ww}}Z((k>Jww||J00 ! 	LL5zB	s   	E "E('E()r)   r,   r-   r+   r*   r   )r   r   r    r!   rG   rI   r   r1   Zpropertyr5   staticmethodr;   r0   rM   rP   rT   rW   rY   r[   r_   r#   r$   r%   r&   r   r'   r'   I   so     -N3	.;   
  
 /8/&$1 1r   r'   c                   sp   a  ] tR t^t o RR ltR tR tR tR tR t	]
R 4       tR	 tR
 tR tR tRtV tR# )rA   Nc                s   \        4       V n        \        4       V n        V'       d   \        P                  ! 4       P                  4       pW n        R P                  VP                  RR4      4      V n	        RP                  \        V4      P                  R4      4      V n        \        P                  V4      pVP!                  4       V P                  R&   Mj\"        P                  ! \"        P$                  ! R4      V^R7      w  V n	        V n        V P                  P                  RR4      P'                  R4      V n        V P                  P'                  4       P                  4       p\)        V4      ^8X  d   \+        V^ ,          4      V n        R
# \-        R	P                  V^ ,          V^,          4      4      V n        R
# )z[{}]r\   \\ Z.Ztimez(?<=[^\\]\]) Zmaxsplitz[]z{}.{}N)r    rX   metasr   Znowr	   rB   r   r]   raw_namerC   strrJ   raw_timestampr   r   r   recompiler^   rH   r   Zfloat)r
   r=   r3   r	   Zwindows_timestampZts_partss   &&&   r   r   ZWineRegistryKey.__init__   s:   "} ]
 002II"MM$,,sF*CDDM!$#i.*>*>s*C!DD / C CI N!2!9!9!;DJJv 13DT9UW^ij0k-DM4---fc:@@FDI %%++-335x=A !-DN"7>>(1+x{#KLDNr   c                sN    R P                  V P                  V P                  4      # )z{0} {1})r   re   rg   r   r   r   r1   ZWineRegistryKey.__str__   s    t/A/ABBr   c                s8   \        V4      ^8  d   R# VP                  R4      '       d   V P                  V4       R# VP                  R4      '       dF    \        P                  ! \        P
                  ! R4      V^R7      w  r#T^R
 pY0P                  T&   R# VP                  R4      '       d%   VP	                  R^4      w  r#W0P                  R	&   R# R#   \         d9   p\        P                  ! RT4       \        P                  ! T4        Rp?R# Rp?ii ; i)z2Parse a registry line, populating meta and subkeysN#r   z(?<![^\\]\\\")=rc   zUnable to parse line %s@r?   default)rH   r@   add_metarh   rJ   ri   r   r   r/   r9   rX   )r
   rK   rO   rV   Zex   &&   r   rE   ZWineRegistryKey.parse   s    t9q=??3MM$__S!!XXbjj1C&DdUVW

 a)C %LL__S!!C+JC&+LL# "  6=  $s   /C D!-DDc                s     \        \        V P                  4      4      pT P                  T;;,          RP                  T4      ,          uu&   R#   \         d    \        P
                  ! R 4        R# i ; i)zShould this be happening?Nz
{})ZnextZreversedrX   ZStopIterationr   Zwarningr   )r
   rK   Zlast_subkeyr   r   rD   ZWineRegistryKey.add_to_last  sZ    	x56K 	[!V]]4%88!  	NN67	s   A !A54A5c                s   V P                   R,           V P                  ,           R,           pV P                  P                  4        F;  w  r#Vf   VRP	                  V4      ,          pK#  VRP	                  W#4      ,          pK=  	  V P
                  P                  4        F8  w  r#VR8X  d   RpMRP	                  V4      pVRP	                  W#4      ,          pK:  	  V# )	z5Return the content of the key in the wine .reg formatrb   r<   z#{}
z#{}={}
rl   rk   "{}"z{}={}
)re   rg   rd   Zitemsr   rX   )r
   rN   rO   rV   s   &   r   rM   ZWineRegistryKey.render  s    --#%(:(::TA****,JC}7>>#..:,,S88	 -
 ,,,,.JCimmC(y''33G / r   c                s    \        V\        4      '       d   R P                  V4      # \        V\        4      '       d   RP                  V4      # \	        R4      h)zdword:{:08x}rp   ZTODO)Z
isinstancer   r   rf   ZNotImplementedError)r
   rV   r   r   render_valueZWineRegistryKey.render_value  sG    eS!!!((//eS!!==''!&))r   c                sv   \         P                  ! R V P                  RR4      4      pVP                  ^ 4      P	                  4       P                  R4      pV FK  pR FB  p VRP                  RV,          V4      P	                  4       P                  R4      ,          p KI  	  KM  	  V#   \         d     KZ  i ; i)z\\xra   z\x005cZunicode_escapez\u{}{}Z0)i       r(   )rh   rJ   r]   rZ   ZencodeZdecoder   ZUnicodeDecodeError)ZstringZchunksZoutZchunkZis   &    r   decode_unicodeZWineRegistryKey.decode_unicode&  s     &&..	"BCjjm""$++,<=E
 9++C!GU;BBDKKL\]]C   
 * s   !=B))B87B8c                sL   VP                  R 4      '       g   \        R4      hVR,          pVP                  R4      p\        V4      ^8X  d   V^ ,          pV^,          pM6\        V4      ^8X  d   V^ ,          pRpM\        RP	                  V4      4      hW@P
                  V&   R# )rj   zKey metas should start with '#':rr   NNr?   NzInvalid meta line '{}')r@   r   rJ   rH   r   rd   )r
   Z	meta_lineZpartsrO   rV   ro   r   rn   ZWineRegistryKey.add_meta;  s    ##C((>??bM	$u:?(C!HEZ1_(CE5<<YGHH

3r   c                s8    V P                   P                  V4      # r   )rd   rQ   )r
   rB   r   r   get_metaZWineRegistryKey.get_metaJ  s    zz~~d##r   c                sB    V P                  V4      V P                  V&   R # r   )rq   rX   r
   rB   rV   s   &&&r   rU   ZWineRegistryKey.set_subkeyM  s    !..u5Tr   c                sH   WP                   9  d   R # V P                   V,          pVP                  R4      '       d,   VP                  R4      '       d   V P                  V^R 4      # VP                  R4      '       d   \	        VR,          ^4      # \        RV,          4      h)Nr   zdword::i   NNz	Handle %srm   )rX   r@   rF   rs   r   r   ru   r   r   rR   ZWineRegistryKey.get_subkeyP  s    ||#T"C  U^^C%8%8&&uQr{33H%%uRy"%%u,--r   )rd   rB   re   rg   rX   r	   )NN)r   r   r    r!   r   r1   rE   rD   rM   rq   r`   rs   rn   rt   rU   rR   r#   r$   r%   r&   r   rA   rA      sR     M2C,*9 *  ( $6. .r   rA   )r"   r2   rh   Zcollectionsr    r   Zlutris.utilr   Zlutris.util.logr   Zlutris.util.wine.winer   ZrangeZREG_NONEZREG_SZZREG_EXPAND_SZZ
REG_BINARYZ	REG_DWORDZREG_DWORD_BIG_ENDIANZREG_LINKZREG_MULTI_SZZ
DATA_TYPESr   r'   rA   ) r   r   <module>rv      s    $ 	 	 #   " 3 
!H	
 V	:Y
%@ %@PI1 I1XC. C.r   