o
    q¨Êh¼Q  ã                   @   s    d Z ddlmZ ddlZddlZddlmZ ddlT dZdZ	d	Z
d
ZdZdZG dd„ deƒZG dd„ deƒZdd„ ZG dd„ deƒZddd„Zejfdd„ZdS )z‘
Implements the minimal functionality required
to extract a "Workbook" or "Book" stream (as one big string)
from an OLE2 Compound Document file.
é    )Úprint_functionN)Úunpacké   )Ú*s   ÐÏà¡±áéþÿÿÿéÿÿÿÿéýÿÿÿéüÿÿÿéûÿÿÿc                   @   s   e Zd ZdS )ÚCompDocErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú>/var/www/html/env/lib/python3.10/site-packages/xlrd/compdoc.pyr      s    r   c                   @   s&   e Zd Zdejfdd„Zddd„ZdS )	ÚDirNoder   c                 C   s°   || _ || _td|dd… ƒ\}| _| _| _| _| _td|dd… ƒ\| _| _	|dkr1t
dƒ| _nt|d|d	 … d
ƒ| _g | _d| _td|dd… ƒ| _|rV|  |¡ d S d S )Nz<HBBiiié@   éP   z<iiét   é|   r   Ú é   Ú	utf_16_ler   z<IIIIéd   )ÚDIDÚlogfiler   ÚetypeÚcolourÚleft_DIDÚ	right_DIDÚroot_DIDÚ	first_SIDÚtot_sizeÚUNICODE_LITERALÚnameÚunicodeÚchildrenÚparentÚtsinfoÚdump)Úselfr   ÚdentÚDEBUGr   Úcbufsizer   r   r   Ú__init__"   s    þ
ÿÿzDirNode.__init__r   c                 C   sV   t | jd| j| j| j| j| j| j| j| j	| j
| jƒ |dkr)td| j| jd� d S d S )NzbDID=%d name=%r etype=%d DIDs(left=%d right=%d root=%d parent=%d kids=%r) first_SID=%d tot_size=%d
r   ztimestamp info©Úfile)Úfprintfr   r   r$   r   r   r   r    r'   r&   r!   r"   Úprintr(   )r*   r,   r   r   r   r)   5   s   üþzDirNode.dumpN)r   )r   r   r   ÚsysÚstdoutr.   r)   r   r   r   r   r       s    r   c                 C   sr   |dk rd S t | || | jƒ | | j |¡ || | _t | || | jƒ | | jdkr7t | || | jƒ d S d S )Nr   r   )Ú_build_family_treer   r&   Úappendr'   r   r   r    )ÚdirlistÚ
parent_DIDÚ	child_DIDr   r   r   r5   @   s   
ÿr5   c                   @   sL   e Zd ZdZejdfdd„Zddd„Zdd	d
„Zdd„ Z	dd„ Z
dd„ ZdS )ÚCompDoczÃ
    Compound document handler.

    :param mem:
      The raw contents of the file, as a string, or as an :class:`mmap.mmap`
      object. The only operation it needs to support is slicing.
    r   c           +      C   sÔ  || _ || _|dd… tkrtdƒ‚|dd… dkr$td|dd…  ƒ‚td|d	d… ƒ\}}|r;td
||f |d� || _td|dd… ƒ\}}|dkrWtd| |d� d}||kretd| |d� d}d|>  | _}d|> | _| jdks{| jdkr‡td| j| jf |d� td|dd… ƒ\}	| _	}
| _
}}}}t|ƒd }t||ƒ\}}|r¹|d7 }tdt|ƒ|f |d� || _|| _t ddg¡|  }| _|�rtd|||| j|d� td||f |d� td|	| j	| j
f |d� td||f |d� td||f |d� |d  }d!| }d}ttd"|dd… ƒƒ}|| d | }td|d# | d$ |d  ƒ}d}|dk�r@|ttdfv �r@n‰|}|tttfv�rÉ|dk�rYtd%||f |d� ||k�rtd&||f }|dk�rpt||d� nYt|ƒ‚|dk �rtd'| ƒ‚|| �rŽtd(||| f ƒ‚d||< |d7 }|�r©||k�r©td)||||||d� d||  }| t||||| … ƒ¡ | ¡ }|tttfv�sJ|�rÜ||k�rÜtd*||||||d� |�rîtd+t|ƒ|d� t|d,|ƒ g | _d}d}tt|ƒƒD ]~}|| } | ttfv �r
�qû| |k�r,|�s$td-|d� td.| |f |d� d}t||< d}�qû| d/k �r7td0|  ƒ‚||  �rFtd1| ||  f ƒ‚d$|| < |d7 }|�rc||k�rctd2||||||| |d�	 d||   }| j t||||| … ƒ¡ �qû|�r“td3t| jƒ|d� t| jd,|ƒ t|d� |�rÊ|�rÊtd+t|ƒ|d� t|d,|ƒ t|t| jƒƒD ]}!t| j|!< �q°td3t| jƒ|d� t| jd,|ƒ | j| jd| j| j| j	d4d5d6�}"g }#d7}$tdt|"ƒd8ƒD ]}%|$d7 }$|# t|$|"|%|%d8 … d|ƒ¡ �qæ|#| _t |#d|#d j!ƒ |�r|#D ]}&|& "|¡ �q| jd }'|'j#d9k�s%J ‚|'j$dk �s1|'j%dk�r5d:| _&n| j| jd| j||'j$|'j%d;d d6�| _&g | _'|dk�r[|'j%dk�r[td<|d� |'j%dk�rÇ|}|}(|dk�r®|(dk�r®|| �r~td=||| f ƒ‚d9||< |(d8 }(d||  })tt|||)|)| … ƒƒ}*| j' |*¡ | j| }|dk�r®|(dk�so|�r»td>||(f |d� |(dk�rÅ|tk�sÇJ ‚|�r×td?|d� t| j'd,|ƒ |�rètd@|d� t|d|ƒ d S d S )ANr   é   zNot an OLE2 compound documenté   é   s   þÿz)Expected "little-endian" marker, found %rz<HHé   z/
CompDoc format: version=0x%04x revision=0x%04xr/   é"   é   zMWARNING: sector size (2**%d) is preposterous; assuming 512 and continuing ...é	   zYWARNING: short stream sector size (2**%d) is preposterous; assuming 64 and continuing ...é   r   é   r   z"@@@@ sec_size=%d short_sec_size=%dz	<iiiiiiiié,   éL   zAWARNING *** file size (%d) not 512 + multiple of sector size (%d)ÚBz	sec sizesz mem data: %d bytes == %d sectorsz=SAT_tot_secs=%d, dir_first_sec_sid=%d, min_size_std_stream=%dz'SSAT_first_sec_sid=%d, SSAT_tot_secs=%dz)MSATX_first_sec_sid=%d, MSATX_tot_secs=%dé   z<%diz<109iém   r   zMSATX: sid=%d (0x%08X)z7MSAT extension: accessing sector %d but only %d in filez%MSAT extension: invalid sector id: %dzMSAT corruption: seen[%d] == %dz	[1]===>>>z	[2]===>>>zMSAT: len =é
   z8WARNING *** File is truncated, or OLE2 MSAT is corrupt!!z6INFO: Trying to access sector %d but only %d availabler   zMSAT: invalid sector id: %dz)MSAT extension corruption: seen[%d] == %dz	[3]===>>>z
SAT: len =Ú	directoryé   ©r$   Úseen_idr   é€   é   r   ÚSSCSzHWARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zerozSSAT corruption: seen[%d] == %dz&SSAT last sid %d; remaining sectors %dÚSSATÚseen)(r   r,   Ú	SIGNATUREr   r   r2   ÚmemÚsec_sizeÚshort_sec_sizeÚdir_first_sec_sidÚmin_size_std_streamÚlenÚdivmodÚmem_data_secsÚmem_data_lenÚarrayrR   ÚlistÚmaxÚEOCSIDÚFREESIDÚMSATSIDÚextendÚpopÚ	dump_listÚSATÚxrangeÚEVILSIDÚ_get_streamr6   r   r7   r5   r    r)   r   r!   r"   rP   rQ   )+r*   rT   r   r,   ÚrevisionÚversionÚsszÚssszrU   ÚSAT_tot_secsÚ_unusedÚSSAT_first_sec_sidÚSSAT_tot_secsÚMSATX_first_sec_sidÚMSATX_tot_secsr\   r[   Ú	left_overrR   ÚnentÚfmtÚtrunc_warnedÚMSATÚSAT_sectors_reqdÚexpected_MSATX_sectorsÚactual_MSATX_sectorsÚsidÚmsgÚoffsetÚactual_SAT_sectorsÚ
dump_againÚmsidxÚmsidÚsatxÚdbytesr7   ÚdidÚposÚdÚsscs_dirÚnsecsÚ	start_posÚnewsr   r   r   r.   T   sf  ÿÿÿÿ
ü
ÿÿÿÿ




ê
ÿÿ

"
þ$
þ

ø	þzCompDoc.__init__Nr   c	                 C   s’  g }	|}
|d u rX|
dkrQ|d ur&| j |
 r!td||
| j |
 f ƒ‚|| j |
< ||
|  }|	 |||| … ¡ z||
 }
W n tyL   td||
f ƒ‚w |
dks|
tksWJ ‚nl|}|
dkr¯|d urx| j |
 rstd||
| j |
 f ƒ‚|| j |
< ||
|  }|}||kr†|}||8 }|	 |||| … ¡ z||
 }
W n tyª   td||
f ƒ‚w |
dks^|
tksµJ ‚|dkrÄt| jd|||| ƒ d |	¡S )Nr   ú%s corruption: seen[%d] == %dz:OLE2 stream %r: sector allocation table invalid entry (%d)z=WARNING *** OLE2 stream %r: expected size %d, actual size %d
ó    )rR   r   r6   Ú
IndexErrorr`   r1   r   Újoin)r*   rT   ÚbaseÚsatrU   Ú	start_sidÚsizer$   rM   ÚsectorsÚsrŠ   ÚtodoÚgrabr   r   r   ri     sd   

ÿÿÿ÷

ÿÿÿó
þ
zCompDoc._get_streamc                 C   sœ   |d }|dd … }| j }|| jD ]9}|| j ¡ | ¡ krK|| j}|dkr.||   S |dkr@|s8tdƒ‚|  ||¡  S ||  d¡ tdƒ‚qd S )Nr   r   r   z"Requested component is a 'storage'z'Requested stream is not a 'user stream')r7   r&   r$   Úlowerr   r   Ú_dir_searchr)   )r*   ÚpathÚstorage_DIDÚheadÚtailÚdlÚchildÚetr   r   r   r™   M  s    
÷
zCompDoc._dir_searchc              
   C   sz   |   | d¡¡}|du rdS |j| jkr)| j| jd| j| j|j|j||j	d d�S | j| j
d| j| j|j|j|d dd�S )a  
        Interrogate the compound document's directory; return the stream as a
        string if found, otherwise return ``None``.

        :param qname:
          Name of the desired stream e.g. ``'Workbook'``.
          Should be in Unicode or convertible thereto.
        ú/NrC   rB   rL   r   ú (from SSCS))r™   Úsplitr"   rX   ri   rT   rf   rU   r!   r   rP   rQ   rV   )r*   Úqnamer‡   r   r   r   Úget_named_stream`  s   	þþzCompDoc.get_named_streamc                 C   sÈ   |   | d¡¡}|du rdS |j| jkrtd||j| jf ƒ‚|j| jkrM|  | jd| j| j	|j
|j||jd ¡}| jrKtd| jd� t| jd	| jƒ |S |  | jd
| j| j|j
|j|d d¡d
|jfS )aq  
        Interrogate the compound document's directory.

        If the named stream is not found, ``(None, 0, 0)`` will be returned.

        If the named stream is found and is contiguous within the original
        byte sequence (``mem``) used when the document was opened,
        then ``(mem, offset_to_start_of_stream, length_of_stream)`` is returned.

        Otherwise a new string is built from the fragments and
        ``(new_string, 0, length_of_stream)`` is returned.

        :param qname:
          Name of the desired stream e.g. ``'Workbook'``.
          Should be in Unicode or convertible thereto.
        r¡   N)Nr   r   z7%r stream length (%d bytes) > file data size (%d bytes)rC   rB   z
seenr/   r@   r   r¢   )r™   r£   r"   r\   r   rX   Ú_locate_streamrT   rf   rU   r!   r   r,   r2   r   re   rR   ri   rP   rQ   rV   )r*   r¤   r‡   Úresultr   r   r   Úlocate_named_streamu  s.   ÿþþûzCompDoc.locate_named_streamc	                    s\  |}	|	dk rt d| ƒ‚d}
d}d}g }d}|| d | }|	dkr…| j|	 rDtd| | jd� t| jd	| jƒ t d
||	| j|	 f ƒ‚|| j|	< |d7 }||kr[t d||| f ƒ‚|	|
d krf||7 }n|
dkrq| ||f¡ ||	|  }|| }|	}
||	 }	|	dks"|	tks‹J ‚||ks‘J ‚|s˜ˆ ||fS | ||f¡ d ‡ fdd„|D ƒ¡d|fS )Nr   z%_locate_stream: start_sid (%d) is -vei�ÿÿÿiñØÿÿiHÝÿÿr   z_locate_stream(%s): seenr/   r@   rŒ   z,%s: size exceeds expected %d bytes; corrupt?r�   c                 3   s    � | ]\}}ˆ ||… V  qd S )Nr   )Ú.0rŠ   Úend_pos©rT   r   r   Ú	<genexpr>È  s   € z)CompDoc._locate_stream.<locals>.<genexpr>)r   rR   r2   r   re   r6   r`   r�   )r*   rT   r�   r‘   rU   r’   Úexpected_stream_sizer¤   rM   r•   ÚprŠ   rª   ÚslicesÚ	tot_foundÚfound_limitr   r«   r   r¦   �  sH   
"

ÿÿ
é
zCompDoc._locate_stream)Nr   N©r   )r   r   r   Ú__doc__r3   r4   r.   ri   r™   r¥   r¨   r¦   r   r   r   r   r:   J   s    	 
I
1(r:   c                 C   sP   t d|d| f d|d� | ||| … D ]}t t|ƒd|d� qt |d� d S ©Nz%5d%sz =ú )Úendr0   r/   ©r2   Ústr)ÚalistÚstrideÚfÚdposÚequalÚvaluer   r   r   Úx_dump_lineË  ó   r¿   c                    sÂ   d‡ ‡‡fdd„	}d }d }t dtˆ ƒˆƒD ]1}|d u r"||ƒ |}qˆ ||ˆ … ˆ ||ˆ … krF|| ˆkr@||ˆ dd� ||ƒ |}q|d ur[|d ur]||kr_||dd� d S d S d S d S )Nr   c                    sP   t d| d| f dˆd� ˆ | | ˆ … D ]}t t|ƒdˆd� qt ˆd� d S r´   r·   )r¼   r½   r¾   ©r¹   r»   rº   r   r   Ú
_dump_lineÒ  rÀ   zdump_list.<locals>._dump_liner   )r½   r²   )rg   rY   )r¹   rº   r»   rÂ   r†   Úoldposr   rÁ   r   re   Ñ  s     €ÿre   r²   )r³   Ú
__future__r   r]   r3   Ústructr   ÚtimemachinerS   r`   ra   ÚSATSIDrb   rh   Ú	Exceptionr   Úobjectr   r5   r:   r¿   r4   re   r   r   r   r   Ú<module>   s*    
   
