+
    Kid"  c                   sf    ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
Ht  ! R R4      tR# )i    N)logger)executeread_process_outputc                   s   a  ] tR t^t o RtRR lt]R 4       t]R 4       tR t	]R 4       t
R tR	 tR
 tR tR tR tR tR tR tR tR tR tR tRtV tR# )CabInstallerzExtract and install contents of cab files

Based on an implementation by tonix64: https://github.com/tonix64/python-installcab
Nc                s    Wn         T;'       g    V P                  4       V n        \        P                  ! 4       V n        W0n        R V n        R V n        R# )FN)	prefixget_wineprefix_archwinearchtempfileZmkdtemptmpdir	wine_pathregister_dlls
strip_dlls)selfr   archr	   s   &&&&@/usr/lib/python3.14/site-packages/lutris/util/wine/cabinstall.py__init__ZCabInstaller.__init__   sC    :: 8 8 :&&(""    c                sD    V P                  R4      P                  RR4      # )zI have no clue why\ZHKEY_CLASSES_ROOTz#HKEY_LOCAL_MACHINE\Software\Classes)stripreplace)key   &r   process_keyZCabInstaller.process_key   s!     yy&&':<cddr   c                sx    V P                  R 4      pV^ ,          P                  R,          pRRRRRR/pW2,          # )z2{urn:schemas-microsoft-com:asm.v3}assemblyIdentityZprocessorArchitectureZamd64win64Zx86win32wow64)findallattrib)rootregistry_keysr   Zarch_maps   &   r   get_arch_from_manifestZ#CabInstaller.get_arch_from_manifest    sA    %YZQ&&'>?WeWgwG~r   c                sR    V P                   ;'       g    R pVR9   d   V# VR,           # )ZwineZ64)r   r   )r	   )r   r   r	      && r   get_winebinZCabInstaller.get_winebin'   s+    NN,,f	 $66yLI<LLr   c                s.    R \        RV .4      9   d   R# R# )zx86-64filer   r   )r   )dll_pathr   r   get_arch_from_dllZCabInstaller.get_arch_from_dll+   s    *FH+=>>r   c                s    \         P                  ! R V P                  4       \        P                  ! V P                  4       R# )zCleaning up %sN)r    infor   shutilZrmtree)r   r   r   cleanupZCabInstaller.cleanup1   s%    $dkk2dkk"r   c                s$    V P                  V4      # )N)r#   r   r"      &&r   check_dll_archZCabInstaller.check_dll_arch5   s    %%h//r   c                s   R V9   d   VP                  RR4      pVP                  RR4      pVP                  RR4      pVP                  RR4      pVP                  R	R
4      pVP                  RR
4      pVP                  RR4      pVP                  RRV P                  V4      ,          4      pVP                  RRV P                  V4      ,          4      pVP                  RR4      pV# )z$(z$(runtime.help)zC:\windows\helpz$(runtime.inf)zC:\windows\infz$(runtime.wbem)zC:\windows\wbemz$(runtime.windows)
C:\windowsz$(runtime.ProgramFiles)C:\windows\Program Filesz$(runtime.programFiles)z$(runtime.programFilesX86)zC:\windows\Program Files (x86)z$(runtime.system32)zC:\windows\%sz$(runtime.drivers)zC:\windows\%s\driversr   z\\)r   get_system32_realdir)r   valuer      &&&r   replace_variablesZCabInstaller.replace_variables8   s    5=MM"35HIEMM"24FGEMM"35HIEMM"6FEMM";=YZEMM";=YZEMM">@bcEMM"79JTMfMfgkMl9lmEMM$*T-F-Ft-LLE dF+r   c                sr   VP                   pVR ,          pVR,          pVR,          pVP                  4       '       g   RpM	RV,          pV P                  WB4      pVR8X  d2   \        P                  ! RV4      pRRP                  V4      ,           pEM1VR	8X  d   R
VP                  RR4      ,          pEMVR8X  d   RVP                  RR4      ,          pMVR8X  d   RpMVR8X  d   VP                  RR4      pVP                  RR4      pVP                  RR4      pVP                  RR4      pVP                  RR4      pVP                  RR4      pVP                  RR4      pVP                  RR4      pVP                  RR4      pRV,          pM1VR 8X  d   RV,          pM \        P                  ! R!V4       RV,          pV'       dk   V P                  WR4      pV P                  '       dH   R"V9   dA   VP                  4       P                  R#R4      pVP                  4       P                  R$R4      pWE3# )%namer-   Z	valueTypeZ@z"%s"Z
REG_BINARYz..zhex:Z,Z	REG_DWORDzdword:%sZ0x Z	REG_QWORDzqword:%sZREG_NONENZREG_EXPAND_SZz%SystemRoot%r*   z%ProgramFiles%r+   z%WinDir%z%ResourceDir%z%Public%zC:\users\Publicz%LocalAppData%z1C:\windows\Public\Local Settings\Application Dataz%AllUsersProfile%z%UserProfile%z%ProgramData%zC:\ProgramDataZREG_SZzwarning unkown type: %s.dllzc:\\windows\\system32\\zc:\\windows\\syswow64\\)r   r   r/   rer   joinr   r    Zwarningr   Zlower)r   	reg_valuer   Zattrsr0   r-   Z
value_type   &&&    r   process_valueZCabInstaller.process_valueI   s     V}g;'
zz||DD=D%%d1%JJtU+ESXXe_,E;&tR!88E;&tR!88E:%E?* MM.-@EMM"24PQEMM*m<EMM/=AEMM*.ABEMM"24klEMM"5}EEMM/=AEMM/3DEEUNE8#UNENN4jAUNE**57EU?!KKM112QSUVE!KKM112QSUVE{r   c                s   R p\         P                  P                  P                  V4      P	                  4       pV P                  V4      pVP                  R4      pV'       d   \        V^ ,          4       F  pV P                  VP                  R,          4      pVRV,          ,          pVP                  R4       F,  pV P                  W4      w  rV
f   K  W): RV
: R2,          pK.  	  VR,          pK  	  W$3# )r1   z.{urn:schemas-microsoft-com:asm.v3}registryKeysZkeyNamez[%s]
z/{urn:schemas-microsoft-com:asm.v3}registryValueZ=Z
)xmlZetreeZElementTreeZparseZgetrootr   r   Zlistr   r   r7   )r   Z	file_nameoutr   r   r   Zregistry_keyr   r5   r0   r-   s   &&         r   get_registry_from_manifestZ'CabInstaller.get_registry_from_manifestv   s    yy$$**95==?**40%UV $]1%5 6&&|':':9'EFx#~%!-!5!56g!hI"&"4"4Y"EKD(D%88 "i t !7 {r   c                sp   \        \        P                  P                  V P                  R 4      RR7      ;_uu_ 4       pVP                  4        FG  pVP                  R4      '       d    RRR4       R# VP                  R4      '       g   K>   RRR4       R# 	  RRR4       R#   + '       g   i     R# ; i)z
system.regutf-8Zencodingz#arch=win32Nr   z#arch=win64r   )openospathr4   r   Z	readlinesZ
startswith)r   reg_fileZlines   &  r   r   Z CabInstaller.get_wineprefix_arch   s    "'',,t{{L9GLLPX **,??=11" ML ??=11" ML, M  ML s   ,B$4B$B$B$$B5	c                s>    RRRRRRRR/pW P                   V3,          # )r   ZSyswow64ZSystem32)r   r   )r   r   )r   r   )r   r   )r   )r   r   Zdest_mapr   r   r,   Z!CabInstaller.get_system32_realdir   s1    



	
 -..r   c                s    V P                  V4      R 8X  d<   V P                  R8X  d+   \        P                  P	                  V P
                  R4      # \        P                  P	                  V P
                  R4      # )r   r   zdrive_c/windows/syswow64zdrive_c/windows/system32)r#   r   r>   r?   r4   r   r'   r(   r   get_dll_destdirZCabInstaller.get_dll_destdir   sT    !!(+w64==G;S77<<-GHHww||DKK)CDDr   c                s   V P                  V4      p\        P                  ! R W4       \        P                  ! W4       \
        P                  P                  V\
        P                  P                  V4      4      pV P                  '       g   R# V P                  V4      p\        P                  ! V P                  V4      R\
        P                  P                  V4      .4       R# )zCopying %s to %sNZregsvr32)rA   r    Zdebugr%   Zcopyr>   r?   r4   Zbasenamer
   r#   
subprocesscallr    )r   r"   Zdest_dirZdest_dll_pathr   s   &&   r   install_dllZCabInstaller.install_dll   s    ''1'<H'Xrww/?/?/IJ!!!%%m4))$/RWW=M=Mm=\]^r   c                s    . pV F  pVP                  R 4      '       d   RpV P                  V4      w  rVV'       d   WE,          p\        \        P                  P                  V P                  VR,           4      RRR7      ;_uu_ 4       pVP                  V4       RRR4       VP                  VR,           V34       VP                  R4      '       g   K  V P                  V4       K  	  V#   + '       g   i     LZ; i)z	.manifestz&Windows Registry Editor Version 5.00

z.regZwr;   r<   Nr2   )
Zendswithr:   r=   r>   r?   r4   r   ZwriteZappendrD   )r   Zoutput_filesZ	reg_files	file_pathr9   Zoutdatar   r@   s   &&      r   get_registry_filesZCabInstaller.get_registry_files   s    	%I!!+..@ $ ? ?	 JNCbggll4;;	F8JKS[bccgo s+ d$$i&&8$%?@!!&))  + &  dcs   	C--C=c                s    \         P                  ! R V4       \        P                  ! V P	                  V4      R\
        P                  P                  V P                  V4      .4       R# )zApplying %s to registryZregeditN)	r    r$   rB   rC   r    r>   r?   r4   r   )r   rE   r   r.   r   apply_to_registryZCabInstaller.apply_to_registry   sC    -y9))$/BGGLLV_<`abr   c                s   \        RRRV,          RV P                  V.4       \        P                  ! V P                  4       UUUUu. uF-  w  r4qU F"  p\        P                  P                  W64      NK$  	  K/  	  upppp# u uppppi )zExtracts files matching a `component` name from a `cabfile`

Params:
    cabfile (str): Path to a cabfile to extract from
    component (str): component to extract from the cab file

Returns:
    list: Files extracted from the cab file
Z
cabextractz-Fz*%s*z-d)r   r   r>   Zwalkr?   r4   )r   cabfile	componentZrZdZfr!   r6   r   extract_from_cabZCabInstaller.extract_from_cab   se     	tVi%7t{{GTU57WWT[[5IX5I'!VWdQ%VW%5IXXXs   3B
c                s    \         P                  ! RW!4       V P                  V P                  W4      4       F  w  r4V P	                  W44       K  	  V P                  4        R# )z"Install `component` from `cabfile`zInstalling %s from %sN)r    r$   rF   rJ   rG   r&   )r   rH   rI   rE   r   s   &&&  r   installZCabInstaller.install   sM    +Y@#66t7L7LW7`aOI""93  b 	r   )r   r
   r   r   r	   r   )NN)Z__name__Z
__module__Z__qualname__Z__firstlineno__Z__doc__r   Zstaticmethodr   r   r    r#   r&   r)   r/   r7   r:   r   r,   rA   rD   rF   rG   rJ   rK   Z__static_attributes__Z__classdictcell__)Z__classdict__s   @r   r   r      s     
  e e  M  
#0"+Z /E
	_cY r   r   )r>   r3   r%   rB   r   Zxml.etree.ElementTreer8   Zlutris.util.logr    Zlutris.util.systemr   r   r   ) r   r   <module>rL      s)    	 	     " ;C Cr   