
    XicR                         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e          Z G d de          Zd Z G d de          ZddZej        f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                       e Zd ZdS )CompDocErrorN)__name__
__module____qualname__     7/usr/local/lib/python3.11/dist-packages/xlrd/compdoc.pyr   r      s        Dr   r   c                   ,    e Zd Zdej        fdZddZdS )DirNoder   c                    || _         || _        t          d|dd                   \  }| _        | _        | _        | _        | _        t          d|dd                   \  | _        | _	        |dk    rt          d          | _        n t          |d|d	z
           d
          | _        g | _        d| _        t          d|dd                   | _        |r|                     |           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    cbufsizes         r   __init__zDirNode.__init__"   s     9d2b5k**	4:t{DM4> 5$s3w-(( 	(q=='++DIIQxz\ 2K@@DIWd3s7m44 	IIe	 	r   r   c                     t          | j        d| j        | j        | j        | j        | j        | j        | j        | j	        | j
        | j                   |dk    rt          d| j        | j                   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/   r1   s     r   r.   zDirNode.dump5   sz    LqHdiT]NDM4;t~W[Wd		
 	
 	
 A::"DKdlCCCCCC :r   N)r   )r   r   r   sysstdoutr3   r.   r   r   r   r   r       sI        ()3:    &	D 	D 	D 	D 	D 	Dr   r   c                 >   |dk     rd S t          | || |         j                   | |         j                            |           || |         _        t          | || |         j                   | |         j        dk    rt          | || |         j                   d S d S )Nr   r   )_build_family_treer#   r+   appendr,   r$   r!   r%   )dirlist
parent_DID	child_DIDs      r   r<   r<   @   s    1}}ffw
GI,>,GHHHJ ''	222 *GIw
GI,>,HIIIy1$$7Iwy/A/JKKKKK %$r   c                   L    e Zd ZdZej        ddfdZddZddZd	 Z	d
 Z
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   Fc                    || _         || _        || _        |dd         t          k    rt	          d          |dd         dk    rt	          d|dd         z            t          d|d	d                   \  }}|rt          d
||fz  |           || _        t          d|dd                   \  }}|dk    rt          d|z  |           d}||k    rt          d|z  |           d}d|z  x| _        }	d|z  | _	        | j        dk    s| j	        dk    r t          d| j        | j	        fz  |           t          d|dd                   \  }
| _
        }| _        }}}}t          |          dz
  }t          ||	          \  }}|r(|dz  }t          dt          |          |	fz  |           || _        || _        t!          j        ddg          |z  x}| _        |r}t          d|||	| j	        |           t          d||fz  |           t          d|
| j
        | j        fz  |           t          d||fz  |           t          d||fz  |           |	d z  }d!|z  }d}t%          t          d"|dd                             }||z   dz
  |z  }t'          d|d#z
  |z   d$z
  |dz
  z            }d}|dk    r|t(          t*          dfv rn,|}|t(          t*          t,          fvr|dk    rt          d%||fz  |           ||k    r.d&||fz  }|dk    rt          ||           nt	          |          |dk     rt	          d'|z            ||         rt	          d(|||         fz            d||<   |dz  }|r||k    rt          d)||||||           d|	|z  z   }|                    t          |||||	z                                 |                                }|t(          t*          t,          fv|r||k    rt          d*||||||           |r0t          d+t          |          |           t3          |d,|           g | _        d}d}t7          t          |                    D ]} ||          }!|!t*          t(          fv r|!|k    r8|s)t          d-|           t          d.|!|fz  |           d}t8          || <   d}Y|!d/k     rt	          d0|!z            ||!         rt	          d1|!||!         fz            d$||!<   |dz  }|r||k    rt          d2|||||||!|	  	         d|	|!z  z   }| j                            t          |||||	z                                 |rJt          d3t          | j                  |           t3          | j        d,|           t          |           |r|rt          d+t          |          |           t3          |d,|           t7          |t          | j                            D ]}"t8          | j        |"<   t          d3t          | j                  |           t3          | j        d,|           |                     | j        d| j        | j        | j
        d4d56          }#g }$d7}%t7          dt          |#          d8          D ]7}&|%dz  }%|$                    t?          |%|#|&|&d8z            d|                     8|$| _         tC          |$d|$d         j"                   |r|$D ]}'|'#                    |           | j         d         }(|(j$        d9k    sJ |(j%        dk     s|(j&        dk    rd:| _'        n6|                     | j        d| j        |	|(j%        |(j&        d;d 6          | _'        g | _(        |dk    r|(j&        dk    rt          d<|           |(j&        dk    r|}|})|dk    r|)dk    r||         rt	          d=|||         fz            d9||<   |)dz  })d||	z  z   }*t%          t          |||*|*|	z                                }+| j(                            |+           | j        |         }|dk    r|)dk    |rt          d>||)fz  |           |)dk    r|t(          k    sJ |r't          d?|           t3          | j(        d,|           |r$t          d@|           t3          |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%04xr5   "      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    ignore_workbook_corruptionr1   	SIGNATUREr   r   r8   memsec_sizeshort_sec_sizedir_first_sec_sidmin_size_std_streamlendivmodmem_data_secsmem_data_lenarrayr[   listmaxEOCSIDFREESIDMSATSIDextendpop	dump_listSATxrangeEVILSID_get_streamr=   r   r>   r<   r%   r.   r!   r&   r'   rY   rZ   ),r/   r^   r    r1   r\   revisionversionsszssszr_   SAT_tot_secs_unusedSSAT_first_sec_sidSSAT_tot_secsMSATX_first_sec_sidMSATX_tot_secsrf   re   	left_overr[   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dbytesr>   didposdsscs_dirnsecs	start_posnewss,                                               r   r3   zCompDoc.__init__T   s^   *D'
qs8y  >???r"u:$$JSQSTVQVZWXXX"5#be*55' 	jDQYGZZahiiii5#be*--	T88a#% % % %C#::m$& & & &D#$8+4i=C4#6"#<#<6$-I\9]]dkllll
 ;BrE
++		
$0'4;S3xx#~#),#A#A y 	6QMUs88X&'-46 6 6 6*( ;sQC00=@@ty 	v+sD(D4GgVVVV4m7TT[bccccQ!79QSTZac c c c;?QS`>bbipqqqq=ATVd@ffmtuuuu1}tm F7C3K0011)D014=!$Q)9C)?$)F)JPTWXPX(Y!Z!Z Q#667A:N#N#N %Cfgw777 1992c3Z?gNNNN-''SWZ\iVjjCqyyc0000&s+++1WW&'NQT'TUUU9 ]&'HCQUVYQZK['[\\\S	$)$ J14JJJ+}d<LNdfz  BI  J  J  J  Jx#~-F3F6(?,B(CDDEEEhhjj- fgw7770  	B)-CCC+}d4DF\^r  zA  B  B  B  B 	)-T9999dB((( 
CII&& 	F 	FE;D((( }$$# %T[bccccR/06=? ? ? ?#$L%U
"#@4#GHHHDz e"#NRVX\]aXbQc#cdddDJ!# `+.>>>k=$8HJ`bv  yK  MQ  X_  `  `  `  `8d?*FHOOF3F6(?,B(CDDEEEE 	 ,DHG<<<<dhG,,,
 w 	-Z 	--T9999dB(((}c$(mm<< ) )!(,DHG<<<<dhG,,, !!Hc48T]D4Ja " ) ) !S[[#.. 	J 	JC1HCNN73s3s7{(;QHHIIII7Awqz':;;; 	  u <?~""""!!X%6!%;%; DII((#tx83E! ) ; ;DI 	1!2a!7!7\cjkkkkq  $C!E((uqyy9 ]&'HCQUVYQZK['[\\\S	
#.0	F3Ii6H,H(IJJKK	  &&&hsm ((uqyy beDU|SZabbbbA::#---- 	.&w''''diW--- 	)&w''''dB(((((	) 	)r   Nr   c	                 6   g }	|}
||
dk    r|7| j         |
         r t          d||
| j         |
         fz            || j         |
<   ||
|z  z   }|	                    ||||z                       	 ||
         }
n"# t          $ r t          d||
fz            w xY w|
dk    |
t          k    sJ n|}|
dk    r|7| j         |
         r t          d||
| j         |
         fz            || j         |
<   ||
|z  z   }|}||k    r|}||z  }|	                    ||||z                       	 ||
         }
n"# t          $ r t          d||
fz            w xY w|
dk    |
t          k    sJ |dk    rt          | j        d||||z
             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
r   )r[   r   r=   
IndexErrorrj   r7   r    join)r/   r^   basesatr_   	start_sidsizer)   rV   sectorssr   todograbs                 r   rs   zCompDoc._get_stream  s<   <q&&&y| f*+JdTUW[W`abWcMd+deee#*DIaL 1x</	s9Yx-?#?@AAAAAA!   &Tq	"   q&& ;;;;;Dq&&&y| f*+JdTUW[W`abWcMd+deee#*DIaL 1x</	$;;Ds9Yt^#;<===AAA!   &Tq	"   q&&$ ;;;;qyyT$t- - - xx   s   /A8 8B'D0 0Ec                    |d         }|dd          }| j         }||         j        D ]}||         j                                        |                                k    rv||         j        }|dk    r
||         c S |dk    r)|st          d          |                     ||          c S ||                             d           t          d          d S )Nr   r   r   z"Requested component is a 'storage'z'Requested stream is not a 'user stream')r>   r+   r)   lowerr!   r   _dir_searchr.   )r/   pathstorage_DIDheadtaildlchildets           r   r   zCompDoc._dir_searchN  s    AwABBx\_- 
	N 
	NE%y~##%%55Y_77e9$$$77 Q*+OPPP++D%888885	q!!!"#LMMM 6 tr   c                 h   |                      |                    d                    }|dS |j        | j        k    r>|                     | j        d| j        | j        |j        |j        ||j	        dz             S |                     | j
        d| j        | j        |j        |j        |dz   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.
        /NrL   rK   rU   r    (from SSCS))r   splitr'   rb   rs   r^   rp   r_   r&   r   rY   rZ   r`   )r/   qnamer   s      r   get_named_streamzCompDoc.get_named_streama  s     U[[--..94:111###tx
a $ 9 9 9 ##	1di)<ak
!7 $ G G Gr   c                 F   |                      |                    d                    }|dS |j        | j        k    rt	          d||j        | j        fz            |j        | j        k    rw|                     | j        d| j        | j	        |j
        |j        ||j        dz             }| j        r1t          d| j                   t          | j        d	| j                   |S |                     | j        d
| j        | j        |j
        |j        |dz   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)rL   rK   z
seenr5   rI   r   r   )r   r   r'   rf   r   rb   _locate_streamr^   rp   r_   r&   r   r1   r8   r    ro   r[   rs   rY   rZ   r`   )r/   r   r   results       r   locate_named_streamzCompDoc.locate_named_streamv  s4   " U[[--..9<:)))X!*d&78 9 : : ::111((#tx
E157, ,F z 7hT\2222$)R666M   Iq$)T-@!+J 6> > 
 r   c	                    |}	|	dk     rt          d|z            d}
d}d}g }d}||z   dz
  |z  }|	dk    r| j        |	         r[| j        sTt          d|z  | j                   t          | j        d	| j                   t          d
||	| j        |	         fz            || j        |	<   |dz  }||k    rt          d|||z  fz            |	|
dz   k    r||z  }n*|
dk    r|                    ||f           ||	|z  z   }||z   }|	}
||	         }	|	dk    |	t          k    sJ ||k    sJ |s||fS |                    ||f           d                    fd|D                       d|fS )Nr   z%_locate_stream: start_sid (%d) is -veiiiHr   z_locate_stream(%s): seenr5   rI   r   z,%s: size exceeds expected %d bytes; corrupt?r   c              3   2   K   | ]\  }}||         V  d S )Nr   ).0r   end_posr^   s      r   	<genexpr>z)CompDoc._locate_stream.<locals>.<genexpr>  s2      QQ4FIwYw./QQQQQQr   )	r   r[   r\   r8   r    ro   r=   rj   r   )r/   r^   r   r   r_   r   expected_stream_sizer   rV   r   pr   r   slices	tot_foundfound_limits    `              r   r   zCompDoc._locate_stream  s   q55FRSSS		+h6:xG1ffy| c6 c4u<4<PPPPR[\`\egikokwRxRxRx&'F%QRTXT]^_T`Ia'abbb"DIaLNI;&&"BkH456   AaCxx8# 66MM9g"6777 1x</	#h.AAA1 1ff2 F{{{{K'''' 	:$899y'*+++QQQQ&QQQQQSTVjkkr   )Nr   Nr   )r   r   r   __doc__r9   r:   r3   rs   r   r   r   r   r   r   r   rB   rB   J   s          %(JaTY G) G) G) G)R/! /! /! /!b   &G G G*& & &P,l ,l ,l ,l ,lr   rB   c                     t          d|d|         fz  d|           | |||z            D ]!}t          t          |          d|           "t          |           d S Nz%5d%sz = )endr6   r5   r8   str)aliststridefdposequalvalues         r   x_dump_liner     sq    	'T4;'
'Sq9999tD6M)* + +c%jjc*****	qMMMMMMr   c                 D    d fd	}d }d }t          dt                               D ]T}| ||           |} ||z             ||z            k    r&||z
  k    r ||z
  d            ||           |}U||||k    r ||d           d S d S d S d S )Nr   c                     t          d| d|         fz  d           | | z            D ]!}t          t          |          d           "t                     d S r   r   )r   r   r   r   r   r   s      r   
_dump_linezdump_list.<locals>._dump_line  sr    gtE{++1====4v-. 	/ 	/E#e**#A.....1r   r   )r   r   )rq   rc   )r   r   r   r   r   oldposs   ```   r   ro   ro     s          
 CFaUV,,  >JsOOOFF3s6z>"eF6&=,@&AAAV|f$$
3<q1111JsOOOFco#--
3a       oo--r   r   )r   
__future__r   rg   r9   structr   timemachiner]   rj   rk   SATSIDrl   rr   	Exceptionr   objectr   r<   rB   r   r:   ro   r   r   r   <module>r      sV   
 & % % % % %  



           0		
	

	 	 	 	 	9 	 	 	D D D D Df D D D@L L L@l @l @l @l @lf @l @l @lF     #z ! ! ! ! ! !r   