o
    iQ                     @   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   L/var/www/html/formularioweb/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<iit   |   r       	utf_16_ler   z<IIIId   )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rt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'| || rtd(||| f d||< |d7 }|r||krtd)||||||d d||  }|t|||||   | }|tttfvsJ|r||krtd*||||||d |rt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|rtd3t| j|d t| jd,| t|d |r|rtd+t||d t|d,| t|t| jD ]}!t| j|!< qt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|rtd>||(f |d |(dkr|tksJ |rtd?|d t| j'd,| |rt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<109im   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sJ |dkrt| 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sJ ||ksJ |s ||fS |||f d fdd|D d|fS )Nr   z%_locate_stream: start_sid (%d) is -veiiiHr   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*    
   
