ó
}\c           @  sÖ   d  Z  d d l m Z d d l Z d d l Z d d l m Z d d l Td Z d Z	 d Z
 d	 Z d
 Z d Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d e f d „  ƒ  YZ d d „ Z e j d „ Z d S(   s‘   
Implements the minimal functionality required
to extract a "Workbook" or "Book" stream (as one big string)
from an OLE2 Compound Document file.
iÿÿÿÿ(   t   print_functionN(   t   unpacki   (   t   *s   ÐÏà¡±áiþÿÿÿiýÿÿÿiüÿÿÿiûÿÿÿt   CompDocErrorc           B  s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s+   lib/python2.7/site-packages/xlrd/compdoc.pyR      s   t   DirNodec           B  s&   e  Z d  e j d „ Z d d „ Z RS(   i    c         C  së   | |  _  | |  _ t d | d d !ƒ \ } |  _ |  _ |  _ |  _ |  _ t d | d d !ƒ \ |  _ |  _	 | d k r‰ t
 d ƒ |  _ n t | d | d	 !d
 ƒ |  _ g  |  _ d |  _ t d | d d !ƒ |  _ | rç |  j | ƒ n  d  S(   Ns   <HBBiiii@   iP   s   <iiit   i|   i    t    i   t	   utf_16_leiÿÿÿÿs   <IIIIid   (   t   DIDt   logfileR   t   etypet   colourt   left_DIDt	   right_DIDt   root_DIDt	   first_SIDt   tot_sizet   UNICODE_LITERALt   namet   unicodet   childrent   parentt   tsinfot   dump(   t   selfR	   t   dentt   DEBUGR
   t   cbufsize(    (    s+   lib/python2.7/site-packages/xlrd/compdoc.pyt   __init__"   s    		7"		i   c         C  sx   t  |  j d |  j |  j |  j |  j |  j |  j |  j |  j	 |  j
 |  j ƒ | d k rt t d |  j d |  j ƒn  d  S(   Nsb   DID=%d name=%r etype=%d DIDs(left=%d right=%d root=%d parent=%d kids=%r) first_SID=%d tot_size=%d
i   s   timestamp infot   file(   t   fprintfR
   R	   R   R   R   R   R   R   R   R   R   t   printR   (   R   R   (    (    s+   lib/python2.7/site-packages/xlrd/compdoc.pyR   5   s    ((   R   R   t   syst   stdoutR   R   (    (    (    s+   lib/python2.7/site-packages/xlrd/compdoc.pyR       s   c         C  s   | d k  r d  St  |  | |  | j ƒ |  | j j | ƒ | |  | _ t  |  | |  | j ƒ |  | j d k rŒ t  |  | |  | j ƒ n  d  S(   Ni    i   (   t   _build_family_treeR   R   t   appendR   R   R   R   (   t   dirlistt
   parent_DIDt	   child_DID(    (    s+   lib/python2.7/site-packages/xlrd/compdoc.pyR#   @   s     t   CompDocc           B  sY   e  Z d  Z e j d d „ Z d	 d d	 d „ Z d d „ Z d „  Z	 d „  Z
 d „  Z RS(
   sÃ   
    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.
    i    c   +      C  sk
  | |  _  | |  _ | d d !t k r4 t d ƒ ‚ n  | d d !d k ra t d | d d !ƒ ‚ n  t d | d	 d !ƒ \ } } | r  t d
 | | f d | ƒn  | |  _ t d | d d !ƒ \ } } | d k rî t d | d | ƒd } n  | | k rt d | d | ƒd } n  d | >|  _ } d | >|  _ |  j d k sS|  j d k rvt d |  j |  j f d | ƒn  t d | d d !ƒ \ }	 |  _	 }
 |  _
 } } } } t | ƒ d } t | | ƒ \ } } | r| d 7} t d t | ƒ | f d | ƒn  | |  _ | |  _ t j 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 | ƒn  | d  } d! | } d } t t d" | d d !ƒ ƒ } | | d | } t d | d# | d$ | d ƒ } d } | d k rb| t t d f k rbn_| } xV| t t t f k rÀ| d k r©t d% | | f d | ƒn  | | k rôd& | | f } | d k råt | d | ƒPn  t | ƒ ‚ n | d k  rt d' | ƒ ‚ n  | | r:t d( | | | f ƒ ‚ n  d | | <| d 7} | r‚| | k r‚t d) | | | | | d | ƒn  d | | } | j t | | | | | !ƒ ƒ | j ƒ  } qkW| rõ| | k rõt d* | | | | | d | ƒn  | r't d+ t | ƒ d | ƒt | d, | ƒ n  g  |  _ d } d } x]t t | ƒ ƒ D]I} | | }  |  t t f k rwqOn  |  | k rÒ| s¼t d- d | ƒt d. |  | f d | ƒd } n  t | | <d } qOn |  d/ k  rñt d0 |  ƒ ‚ n  | |  rt d1 |  | |  f ƒ ‚ n  d$ | |  <| d 7} | rf| | k rft d2 | | | | | | |  d | ƒn  d | |  } |  j j t | | | | | !ƒ ƒ qOW| rát d3 t |  j ƒ d | ƒt |  j d, | ƒ t d | ƒ n  | rx| rxt d+ t | ƒ d | ƒt | d, | ƒ x- t | t |  j ƒ ƒ D] }! t |  j |! <q/Wt d3 t |  j ƒ d | ƒt |  j d, | ƒ n  |  j |  j d |  j |  j |  j	 d4 d5 d6 d7 ƒ}" g  }# d8 }$ xQ t d t |" ƒ d9 ƒ D]7 }% |$ d 7}$ |# j t |$ |" |% |% d9 !d | ƒ ƒ qÐW|# |  _ t  |# d |# d j! ƒ | rRx |# D] }& |& j" | ƒ q8Wn  |  j d }' |' j# d: k stt$ ‚ |' j% d k  s’|' j& d k ržd; |  _' n9 |  j |  j d |  j | |' j% |' j& d4 d< d6 d  ƒ|  _' g  |  _( | d k r	|' j& d k r	t d= d | ƒn  |' j& d k r
| } | }( x¢ | d k rÍ	|( d k rÍ	| | rk	t d> | | | f ƒ ‚ n  d: | | <|( d 8}( d | | }) t t | | |) |) | !ƒ ƒ }* |  j( j |* ƒ |  j | } q,	W| rñ	t d? | |( f d | ƒn  |( d k r	
| t k s
t$ ‚ n  | r>
t d@ d | ƒt |  j( d, | ƒ n  | rg
t dA d | ƒt | d | ƒ n  d  S(B   Ni    i   s   Not an OLE2 compound documenti   i   s   þÿs)   Expected "little-endian" marker, found %rs   <HHi   s/   
CompDoc format: version=0x%04x revision=0x%04xR   i"   i   sM   WARNING: sector size (2**%d) is preposterous; assuming 512 and continuing ...i	   sY   WARNING: short stream sector size (2**%d) is preposterous; assuming 64 and continuing ...i   i   i   i@   s"   @@@@ sec_size=%d short_sec_size=%ds	   <iiiiiiiii,   iL   sA   WARNING *** file size (%d) not 512 + multiple of sector size (%d)t   Bs	   sec sizess    mem data: %d bytes == %d sectorss=   SAT_tot_secs=%d, dir_first_sec_sid=%d, min_size_std_stream=%ds'   SSAT_first_sec_sid=%d, SSAT_tot_secs=%ds)   MSATX_first_sec_sid=%d, MSATX_tot_secs=%di   s   <%dis   <109iim   i   s   MSATX: sid=%d (0x%08X)s7   MSAT extension: accessing sector %d but only %d in files%   MSAT extension: invalid sector id: %ds   MSAT corruption: seen[%d] == %ds	   [1]===>>>s	   [2]===>>>s   MSAT: len =i
   s8   WARNING *** File is truncated, or OLE2 MSAT is corrupt!!s6   INFO: Trying to access sector %d but only %d availableiþÿÿÿs   MSAT: invalid sector id: %ds)   MSAT extension corruption: seen[%d] == %ds	   [3]===>>>s
   SAT: len =R   t	   directoryt   seen_idi   iÿÿÿÿi€   i   R   t   SSCSsH   WARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zeros   SSAT corruption: seen[%d] == %ds&   SSAT last sid %d; remaining sectors %dt   SSATt   seen()   R
   R   t	   SIGNATURER   R   R    t   memt   sec_sizet   short_sec_sizet   dir_first_sec_sidt   min_size_std_streamt   lent   divmodt   mem_data_secst   mem_data_lent   arrayR.   t   listt   maxt   EOCSIDt   FREESIDt   MSATSIDt   extendt   popt	   dump_listt   SATt   xranget   EVILSIDt   _get_streamR$   R   R%   R#   R   R   R   t   AssertionErrorR   R   R,   R-   (+   R   R0   R
   R   t   revisiont   versiont   sszt   ssszR1   t   SAT_tot_secst   _unusedt   SSAT_first_sec_sidt   SSAT_tot_secst   MSATX_first_sec_sidt   MSATX_tot_secsR8   R7   t	   left_overR.   t   nentt   fmtt   trunc_warnedt   MSATt   SAT_sectors_reqdt   expected_MSATX_sectorst   actual_MSATX_sectorst   sidt   msgt   offsett   actual_SAT_sectorst
   dump_againt   msidxt   msidt   satxt   dbytesR%   t   didt   post   dt   sscs_dirt   nsecst	   start_post   news(    (    s+   lib/python2.7/site-packages/xlrd/compdoc.pyR   T   s8   					#4
		 

#!


"!"	
	



((
+		


  !R   c	         C  s  g  }	 | }
 | d  k rê xº |
 d k rÔ | d  k	 rs |  j |
 rc t d | |
 |  j |
 f ƒ ‚ n  | |  j |
 <n  | |
 | } |	 j | | | | !ƒ y | |
 }
 Wq t k
 rÐ t d | |
 f ƒ ‚ q Xq W|
 t k st ‚ n&| } xß |
 d k rÑ| d  k	 rK|  j |
 r;t d | |
 |  j |
 f ƒ ‚ n  | |  j |
 <n  | |
 | } | } | | k rt| } n  | | 8} |	 j | | | | !ƒ y | |
 }
 Wqó t k
 rÍt d | |
 f ƒ ‚ qó Xqó W|
 t k sät ‚ | d k rt |  j d | | | | ƒ n  d j	 |	 ƒ S(   Ni    s   %s corruption: seen[%d] == %ds:   OLE2 stream %r: sector allocation table invalid entry (%d)s=   WARNING *** OLE2 stream %r: expected size %d, actual size %d
R   (
   t   NoneR.   R   R$   t
   IndexErrorR<   RF   R   R
   t   join(   R   R0   t   baset   satR1   t	   start_sidt   sizeR   R+   t   sectorst   sRg   t   todot   grab(    (    s+   lib/python2.7/site-packages/xlrd/compdoc.pyRE     sR    ##	
	c         C  sÊ   | d } | d } |  j  } x¦ | | j D]— } | | j j ƒ  | j ƒ  k r+ | | j } | d k rq | | S| d k r¢ | s’ t d ƒ ‚ n  |  j | | ƒ S| | j d ƒ t d ƒ ‚ q+ q+ Wd  S(   Ni    i   i   s"   Requested component is a 'storage's'   Requested stream is not a 'user stream'(	   R%   R   R   t   lowerR   R   t   _dir_searchR   Ri   (   R   t   patht   storage_DIDt   headt   tailt   dlt   childt   et(    (    s+   lib/python2.7/site-packages/xlrd/compdoc.pyRu   M  s    

	c         C  s·   |  j  | j d ƒ ƒ } | d k r( d S| j |  j k rx |  j |  j d |  j |  j | j	 | j d | d | j
 d ƒS|  j |  j d |  j |  j | j	 | j d | d d d ƒSd S(	   s  
        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.
        t   /i   R   R+   i   i    s    (from SSCS)N(   Ru   t   splitRi   R   R4   RE   R0   RB   R1   R   R	   R,   R-   R2   (   R   t   qnameRd   (    (    s+   lib/python2.7/site-packages/xlrd/compdoc.pyt   get_named_stream`  s    	c      
   C  s&  |  j  | j d ƒ ƒ } | d
 k r( d S| j |  j k r\ t d | | j |  j f ƒ ‚ n  | j |  j k rá |  j |  j d |  j	 |  j
 | j | j | | j d ƒ } |  j rÝ t d d |  j ƒt |  j d |  j ƒ n  | S|  j |  j d |  j |  j | j | j | d	 d
 ƒ d | j f Sd
 S(   sq  
        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}   i    s7   %r stream length (%d bytes) > file data size (%d bytes)i   i   s   
seenR   i   s    (from SSCS)N(   Ni    i    (   Ru   R~   Ri   R   R8   R   R4   t   _locate_streamR0   RB   R1   R   R	   R   R    R
   RA   R.   RE   R,   R-   R2   (   R   R   Rd   t   result(    (    s+   lib/python2.7/site-packages/xlrd/compdoc.pyt   locate_named_streamu  s&    	c	           sÜ  | }	 |	 d k  r% t  d | ƒ ‚ n  d }
 d } d } g  } d } | | d | } x|	 d k rk|  j |	 rÁ t d | d |  j ƒt |  j d	 |  j ƒ t  d
 | |	 |  j |	 f ƒ ‚ n  | |  j |	 <| d 7} | | k rt  d | | | f ƒ ‚ n  |	 |
 d k r| | 7} n: |
 d k r@| j | | f ƒ n  | |	 | } | | } |	 }
 | |	 }	 qX W|	 t k s~t ‚ | | k st ‚ | s£ˆ  | | f S| j | | f ƒ d j ‡  f d †  | Dƒ ƒ d | f S(   Ni    s%   _locate_stream: start_sid (%d) is -veiÿÿÿiñØÿÿiHÝÿÿi   s   _locate_stream(%s): seenR   i   s   %s corruption: seen[%d] == %ds,   %s: size exceeds expected %d bytes; corrupt?R   c         3  s"   |  ] \ } } ˆ  | | !Vq d  S(   N(    (   t   .0Rg   t   end_pos(   R0   (    s+   lib/python2.7/site-packages/xlrd/compdoc.pys	   <genexpr>È  s    (	   R   R.   R    R
   RA   R$   R<   RF   Rk   (   R   R0   Rl   Rm   R1   Rn   t   expected_stream_sizeR   R+   Rq   t   pRg   R…   t   slicest	   tot_foundt   found_limit(    (   R0   s+   lib/python2.7/site-packages/xlrd/compdoc.pyR     sD     #

N(   R   R   t   __doc__R!   R"   R   Ri   RE   Ru   R€   Rƒ   R   (    (    (    s+   lib/python2.7/site-packages/xlrd/compdoc.pyR(   J   s   È1		(i    c         C  sm   t  d | d | f d d d | ƒx5 |  | | | !D]" } t  t | ƒ d d d | ƒq6 Wt  d | ƒ d  S(   Ns   %5d%ss    =t   endt    R   (   R    t   str(   t   alistt   stridet   ft   dpost   equalt   value(    (    s+   lib/python2.7/site-packages/xlrd/compdoc.pyt   x_dump_lineË  s    $ c           sý   d ‡  ‡ ‡ f d † } d  } d  } x› t d t ˆ  ƒ ˆ ƒ D] } | d  k rb | | ƒ | } q= ˆ  | | ˆ !ˆ  | | ˆ !k r= | | ˆ k r« | | ˆ d d ƒn  | | ƒ | } q= q= W| d  k	 rù | d  k	 rù | | k rù | | d d ƒn  d  S(   Ni    c           sm   t  d |  d | f d d d ˆ ƒx5 ˆ  |  |  ˆ !D]" } t  t | ƒ d d d ˆ ƒq6 Wt  d ˆ ƒ d  S(   Ns   %5d%ss    =RŒ   R   R   (   R    RŽ   (   R’   R“   R”   (   R   R‘   R   (    s+   lib/python2.7/site-packages/xlrd/compdoc.pyt
   _dump_lineÒ  s    $ R“   i   (   Ri   RC   R5   (   R   R   R‘   R–   Rc   t   oldpos(    (   R   R‘   R   s+   lib/python2.7/site-packages/xlrd/compdoc.pyRA   Ñ  s    
	"
$(   R‹   t
   __future__R    R9   R!   t   structR   t   timemachineR/   R<   R=   t   SATSIDR>   RD   t	   ExceptionR   t   objectR   R#   R(   R•   R"   RA   (    (    (    s+   lib/python2.7/site-packages/xlrd/compdoc.pyt   <module>   s$   
 	
ÿ ‚