
     hi                          d Z ddlZddlZddlmZmZ  G d de      ZdZdZ	dZ
d	Zd
ZdZdZdZdZdZ G d d      ZddZy)z]
Python-based CArchive (PKG) reader implementation. Used only in the archive_viewer utility.
    N)ZlibArchiveReaderArchiveReadErrorc                       e Zd Zy)NotAnArchiveErrorN)__name__
__module____qualname__     GC:\des-py\Monitor\venv\Lib\site-packages\PyInstaller/archive/readers.pyr   r      s    r   r   bdzZMmsxolc                       e Zd ZdZdZdZ ej                  e      ZdZ	 ej                  e	      Z
d Zed        Zed        Zd Zd	 Zd
 Zy)CArchiveReaderz:
    Reader for PyInstaller's CArchive (PKG) archive.
    s   MEI
z
!8sIIII64sz!IIIIBcc                    || _         d| _        d| _        d| _        d| _        i | _        g | _        t        | j                   d      5 }| j                  || j                        }|dk(  rt        d      |j                  |t        j                         |j                  | j                        }t!        j"                  | j$                  |      \  }}}}}	}
|| j                  z   | _        | j                  |z
  | _        |
st        d      |j                  | j                  |z          |j                  |      }| j'                  |      \  | _        | _        d d d        y # 1 sw Y   y xY w)Nr   rbz$Could not find COOKIE magic pattern!z2Python shared library name not set in the archive!)	_filename_start_offset_end_offset_toc_offset_toc_lengthtocoptionsopen_find_magic_pattern_COOKIE_MAGIC_PATTERNr   seekosSEEK_SETread_COOKIE_LENGTHstructunpack_COOKIE_FORMAT
_parse_toc)selffilenamefpcookie_start_offsetcookie_datamagicarchive_length
toc_offset
toc_lengthpyvers
pylib_nametoc_datas               r   __init__zCArchiveReader.__init__M   sS   ! $..$' 	?2"&":":2t?Y?Y"Z"b(&'MNN GG'5''$"5"56K d11;? NE>:z6:  3T5H5HHD!%!1!1N!BD &'[\\ GGD&&34wwz*H%)__X%>"DHdl3	? 	? 	?s   DE""E+c                    | j                  dt        j                         | j                         }d}d}|t	        |      k\  rt        ||z
  d      }||z
  }|t	        |      k  r	 |S | j                  |t        j                         | j                  |      }|j                  |      }|dk7  r||z   }	 |S |t	        |      z   dz
  }|t	        |      k\  r|S )Nr   i    r      )	r&   r'   SEEK_ENDtelllenmaxr(   r)   rfind)	r1   magic_patternend_posSEARCH_CHUNK_SIZEmagic_offset	start_pos
chunk_sizebufposs	            r   r$   z"CArchiveReader._find_magic_patterns   s     	2;;'') !]++G&77;I 9,JC..  GGIr{{+''*%C))M*Cby(3   #m"44q8G ]++  r   c                    g }i }d}|t        |      k  rt        j                  | j                  |||| j                  z          \  }}}}}	}
|| j                  z  }|| j                  z
  }t        j                  | d||||z          ^}}||z  }|j                  d      j                  d      }|
j                  d      }
|
dk(  r|j                  |       n
||||	|
f||<   |t        |      k  r||fS )Nr   r       zutf-8asciir   )r@   r+   r,   _TOC_ENTRY_FORMAT_TOC_ENTRY_LENGTHrstripdecodeappend)clsdatar"   r!   cur_posentry_lengthentry_offsetdata_lengthuncompressed_lengthcompression_flagtypecodename_lengthname_s                 r   r.   zCArchiveReader._parse_toc   s   D	! c33T'7SMbMbCb5de eL,5HJZ\ds,,,G&)>)>>K}}}A%6WgP[F[8]^HD1{"G;;u%,,W5Dw/H 3t$);8KM]_ghD	' D	!* G|r   c                 n   | j                   j                  |      }|t        d|d      |\  }}}}}t        | j                  d      5 }|j                  | j                  |z   t        j                         |j                  |      }	ddd       |rddl
}
|
j                  	      }		S # 1 sw Y   "xY w)z8
        Extract data for the given entry name.
        NNo entry named  found in the archive!r   r   )r!   getKeyErrorr#   r   r&   r   r'   r(   r)   zlib
decompress)r/   r]   entryrW   rX   rY   rZ   r[   r1   rT   rd   s              r   extractzCArchiveReader.extract   s    
 T"=_TH4JKLLUZRk#68H($..$' 	(2GGD&&5r{{C77;'D	( ??4(D	( 	(s   ?B++B4c                    | j                   | j                  z
  }t        | j                  d      5 }|j	                  | j                  t
        j                         |j                  |      cddd       S # 1 sw Y   yxY w)zZ
        Extract complete PKG/CArchive archive from the parent file (executable).
        r   N)r   r   r#   r   r&   r'   r(   r)   )r/   total_lengthr1   s      r   raw_pkg_datazCArchiveReader.raw_pkg_data   sc     ''$*<*<<$..$' 	)2GGD&&477<(	) 	) 	)s   ;A55A>c                    | j                   j                  |      }|t        d|d      |\  }}}}}|t        k(  r#t	        | j
                  | j                  |z         S |t        k(  rt        d      t        d|d      )zC
        Open new archive reader for the embedded archive.
        r`   ra   z#Zipfile archives not supported yet!zEntry z% is not a supported embedded archive!)	r!   rb   rc   PKG_ITEM_PYZr   r   r   PKG_ITEM_ZIPFILEr   )r/   r]   rf   rW   rX   rY   rZ   r[   s           r   open_embedded_archivez$CArchiveReader.open_embedded_archive   s    
 T"=_TH4JKLLUZRk#68H(|#$T^^T5G5G,5VWW))#$IJJ#fTH4Y$Z[[r   N)r   r   r	   __doc__r%   r-   r+   calcsizer*   rN   rO   r;   staticmethodr$   classmethodr.   rg   rj   rn   r
   r   r   r   r   &   s|    " 7!N$V__^4N "'(9:$?L  4  6()\r   r   c                 ,   g }t        |       }|j                  j                         D ]i  \  }}|^ }}|j                  |       |t        k(  s&|s)|j                  |      }|j                  j                         D ]  }|j                  |        k |S )z
    List the contents of the PKG / CArchive. If `recursive` flag is set (the default), the contents of the embedded PYZ
    archive is included as well.

    Used by the tests.
    )r   r!   itemsrR   rl   rn   keys)	r0   	recursivecontentspkg_archiver]   	toc_entryr^   r[   pyz_archives	            r   pkg_archive_contentsr{      s     H *K&??002 &i H|#	%;;DAK#,,. &%&& Or   )T)ro   r'   r+   #PyInstaller.loader.pyimod01_archiver   r   	TypeErrorr   PKG_ITEM_BINARYPKG_ITEM_DEPENDENCYrl   rm   PKG_ITEM_PYPACKAGEPKG_ITEM_PYMODULEPKG_ITEM_PYSOURCEPKG_ITEM_DATAPKG_ITEM_RUNTIME_OPTIONPKG_ITEM_SPLASHr   r{   r
   r   r   <module>r      so    
  S		 	
       r\ r\jr   