a
    lOKcuT                     @   st  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ ejdk rRd dl	m	Z	 ze
 e W n eyx   eZ
eZY n0 zejZejZW n ey   dZdZY n0 dd Zd	d
 Zdd Zdd Zdd Zdd ZddefddZddefddZeddfddZeddfddZG dd deZdd d!d"d#Ze Z G d$d% d%Z!d&d' Z"ee#e$e j e%fZ&G d(d) d)eZ'dS )*    N)BytesIO   r   )StringIOFMT_XML
FMT_BINARYc                 C   s   t  st| S | S N)
_check_py3plistlibDatavalue r   5/Volumes/EFI-PX-HACK/Utils/GenSMBIOS/Scripts/plist.py	wrap_data   s    r   c                 C   s   t  st| tjr| jS | S r   )r	   
isinstancer
   r   datar   r   r   r   extract_data#   s    r   c                   C   s
   t jdkS )Nr   )sysversion_infor   r   r   r   r	   '   s    r	   c                 C   s8   t | tr| dS | d}| d |d d dkS )N   bplist00    r      )r   
basestring
startswithreadseek)fpheaderr   r   r   
_is_binary*   s
    



r   c                 C   sH   t | tst| S t| d}t|W  d    S 1 s:0    Y  d S )Nrb)r   r   loadopen)
pathOrFilefr   r   r   	readPlist5   s    
r%   c                 C   s\   t |tst| |tdddS t|d"}t| |tdddW  d    S 1 sN0    Y  d S )NTFfmt	sort_keysskipkeyswb)r   r   dumpr   r"   )r   r#   r$   r   r   r   
writePlist;   s    
r,   c                    s  t  r|d krdn|}|d u rd| d}| d tj D ]}|d |r<|d } qrq<t ntj| d }z|| dW n   | dY n0 ttjrʇfdd	}fd
d}|_	|_
| S t| sddlm}	 t |	 j_j_j_ fdd}
fdd	}fdd}fdd}|
_|_	|_
|_t| trt| d} t| trt| } |  jS |d krdn|}zt| dW n   t dY n0 | S d S )NTr   r   detectparser)use_builtin_types	dict_type)r0   c                     sb      } |  dr t| dnt| }d|  kr<dk rLn n | ntd jjd S N0x   l                     zInteger overflow at line {})	get_datalowerr   int
add_objectOverflowErrorformatr.   CurrentLineNumberdr   pr   r   end_integer\   s
     zload.<locals>.end_integerc               
      sV   z  t   W n8 tyP }  z td jj| W Y d } ~ n
d } ~ 0 0 d S NzData error at line {}: {})r8   r
   _decode_base64r5   	Exceptionr:   r.   r;   er>   r   r   end_datac   s    zload.<locals>.end_data)ParserCreatec                    s      } | j| d S r   )	addObjectstackappend)attrsr=   )r0   r?   r   r   
begin_dictz   s    
zload.<locals>.begin_dictc                     s`      } |  dr t| dnt| }d|  kr<dk rLn n | ntdjd S r1   )getDatar6   r   r7   rH   r9   r:   r;   r<   r?   r.   r   r   r@   ~   s
     c               
      sV   z  tj   W n6 tyP }  ztdj| W Y d } ~ n
d } ~ 0 0 d S rA   )rH   r
   r   Z
fromBase64rM   rC   r:   r;   rD   rN   r   r   rF      s    c                     s*      } t| tr| d}  |  d S )Nutf-8)rM   r   unicodeencoderH   )r=   r>   r   r   
end_string   s    

zload.<locals>.end_stringrO   F)r	   r   r   r
   _FORMATSvaluesInvalidFileExceptionr   _PlistParserr@   rF   parser   xml.parsers.expatrG   ZPlistParserZhandleBeginElementStartElementHandlerZhandleEndElementEndElementHandlerZ
handleDataCharacterDataHandlerrL   rR   rP   rQ   r   r   	ParseFileroot_BinaryPlistParser)r   r'   r/   r0   r   infoPr@   rF   rG   rL   rR   r   )r0   r?   r.   r   r!   E   s`    






r!   c                 C   sR   t  rt| tr|  } ztt| |||dW S    tt| ||d Y S 0 d S )N)r'   r/   r0   )r'   r0   )r	   r   r   rQ   r!   r   )r   r'   r/   r0   r   r   r   loads   s    ra   TFc                    s   t  rtj| || d nx|tkrdt| fdd}|_d |  d n0|tkrt	| d
|  ntd|d S )Nr&   c                    s|   | rn d rt|  n|  }|D ]6\}}t|tsJ rBq*tdd| | q*d n
d d S )Ndictkeys must be stringskey)	ZbeginElementsorteditemsr   r   	TypeErrorZsimpleElement
writeValueZ
endElement)r=   rf   rd   r   r)   r(   writerr   r   	writeDict   s    

zdump.<locals>.writeDictz<plist version="1.0">z</plist>)r(   r)   zUnsupported format: {})r	   r
   r+   r   ZPlistWriterrk   writelnrh   r   _BinaryPlistWriterwrite
ValueErrorr:   )r   r   r'   r(   r)   rk   r   ri   r   r+      s    


r+   c                 C   sB   t  rtj| |||ddS t }t| ||||d | S d S )N)r'   r)   r(   rO   )r	   r
   dumpsdecoder   r+   getvalue)r   r'   r)   r(   r$   r   r   r   rp      s
    rp   c                   @   s   e Zd ZdddZdS )rU   Invalid filec                 C   s   t | | d S r   )ro   __init__)selfmessager   r   r   rt      s    zInvalidFileException.__init__N)rs   )__name__
__module____qualname__rt   r   r   r   r   rU      s   rU   BHLQ)         r   c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )r^   a  
    Read or write a binary plist file, following the description of the binary
    format.  Raise InvalidFileException in case of error, otherwise return the
    root object.
    see also: http://opensource.apple.com/source/CF/CF-744.18/CFBinaryPList.c
    c                 C   s   || _ || _d S r   )_use_builtin_types
_dict_type)ru   r/   r0   r   r   r   rt      s    z_BinaryPlistParser.__init__c                 C   s   z~|| _ | j dtj | j d}t|dkr6t td|\}| _	}}}| j | | 
||| _tg| | _| |W S  tttjttfy   t Y n0 d S )Nir   z>6xBBQQQ)_fpr   osSEEK_ENDr   lenrU   structunpack	_ref_size
_read_ints_object_offsets
_undefined_objects_read_objectOSError
IndexErrorerrorr9   UnicodeDecodeError)ru   r   traileroffset_sizenum_objects
top_objectoffset_table_offsetr   r   r   rW      s$    


z_BinaryPlistParser.parsec                 C   sP   |dkrLt | jdd d@ }d|> }dt|  }t|| j|d S |S )z$ return the size of the next object.   r~   r   r   >)ordr   r   _BINARY_FORMATr   r   )ru   tokenLmsr$   r   r   r   	_get_size  s    z_BinaryPlistParser._get_sizec                    sr   | j |  tv r0tdt |   S rDt | krJt t fddtd| D S d S )Nr   c                 3   s&   | ]}t  ||  d V  qdS )bigN)r7   
from_bytes).0ir   sizer   r   	<genexpr>  s   z0_BinaryPlistParser._read_ints.<locals>.<genexpr>r   )	r   r   r   r   r   r   rU   tuplerange)ru   nr   r   r   r   r     s    z_BinaryPlistParser._read_intsc                 C   s   |  || jS r   )r   r   )ru   r   r   r   r   
_read_refs!  s    z_BinaryPlistParser._read_refsc                    s   j | }|tur|S  j| } j| t jdd }|d@ |d@  }}|dkrbd}nZ|dkrrd}nJ|dkrd	}n:|dkrd
}n*|dkrd}td|> d D ]}|d> t jd }qn|dkrt	d jdd }n|dkrt	d jdd }n|dkrZt	d jdd }t

dddt
j|d }nb|dkr |}	 jr j|	}nt j|	}n"|dkrƈ |}	 j|	d}|}n|dkr |}	 j|	d d}n|dkr8 |}	 |	}
g }| j |< | fdd|
D  n|dkr |}	 |	} |	}
  }| j |< t||
D ]6\}} |}t|tjr|j} |||< q|nt | j |< |S )zw
        read the object by reference.
        May recursively read sub-objects (content of an array/dict/set)
        r~   r      r   Nr   F	   T    r3   r   "   z>fr   #   z>d3     )seconds@   P   ascii`   utf-16be   c                 3   s   | ]}  |V  qd S r   )r   )r   xru   r   r   r   m  r   z2_BinaryPlistParser._read_object.<locals>.<genexpr>   )r   r   r   r   r   r   r   r   r   r   datetime	timedeltar   r   r
   r   rq   r   extendr   zipr   r   r   rU   )ru   refresultoffsettokentokenHr   kr$   r   obj_refskey_refsord   r   r   r   r   $  sx    





















z_BinaryPlistParser._read_objectN)
rw   rx   ry   __doc__rt   rW   r   r   r   r   r   r   r   r   r^      s   

r^   c                 C   s0   | dk rdS | dk rdS | d> d> r(dS dS d S )N   r~      r   r   r   r   r   )countr   r   r   _count_to_size  s    r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )rm   c                 C   s   || _ || _|| _d S r   )r   
_sort_keys	_skipkeys)ru   r   r(   r)   r   r   r   rt     s    z_BinaryPlistWriter.__init__c           
      C   s   g | _ i | _i | _| | t| j }dg| | _t|| _t| j | _	| j
d | j D ]}| | qZ| |}| j
 }t|}dt| |  }| j
tj|g| jR   d}||| j|||f}	| j
tjdg|	R   d S )Nr   r   r   z	>5xBBBQQQ)_objlist	_objtable_objidtable_flattenr   r   r   r   r   _ref_formatr   rn   _write_object
_getrefnumtellr   pack)
ru   r   r   objr   r   r   offset_formatsort_versionr   r   r   r   rn     s*    






z_BinaryPlistWriter.writec           	      C   sv  t |tr"t||f| jv r\d S n:t |tjrJt|j|jf| jv r\d S nt|| jv r\d S t	| j
}| j
| t |tr|| jt||f< n2t |tjr|| jt|j|jf< n|| jt|< t |trLg }g }| }| jrt|}|D ]:\}}t |ts| jrqtd|| || qt||D ]}| | q8n&t |ttfrr|D ]}| | q`d S )Nrc   )r   _scalarstyper   r
   r   r   idr   r   r   rJ   rb   rf   r   re   r   r   rg   	itertoolschainr   listr   )	ru   r   refnumkeysrT   rf   r   vr   r   r   r   r     sB    



z_BinaryPlistWriter._flattenc                 C   sP   t |tr| jt||f S t |tjr>| jt|j|jf S | jt| S d S r   )	r   r   r   r   r
   r   r   r   r   )ru   r   r   r   r   r     s
    
z_BinaryPlistWriter._getrefnumc                 C   s   |dk r"| j td||B  n|dk rH| j td|dB d| nh|dk rn| j td|dB d| nB|d	k r| j td
|dB d| n| j td|dB d| d S )Nr   z>Br   z>BBBr3   r   z>BBH           z>BBL   z>BBQ   )r   rn   r   r   )ru   r   r   r   r   r   _write_size  s    z_BinaryPlistWriter._write_sizec                    s    |} j  j|< |d u r2 jd n|du rJ jd n|du rb jd nt|trh|dk rz jtdd| W n tj	y   t
|Y n0 n|d	k rЈ jtd
d| n|dk r jtdd| nt|dk r jtdd| nR|dk r4 jtdd| n0|dk r\ jd|jdddd  nt
|nzt|tr jtdd| nTt|tjr|tddd  } jtdd| nt|tjr dt|j  j|j nt|trlz|d} dt| W n2 tyZ   |d } d!t|d"  Y n0  j| nvt|ttfr dt|  j| nFt|ttfr fd#d$|D }t|} d%|  jtjd& j|  g|R   nt|trg g  }} jr$t| }	n| }	|	D ]J\}
}t|
tsX j rPq0t!d'|"  |
 |"  | q0t|} d(|  jtjd& j|  g|R    jtjd& j|  g|R   nt!|d S ))N    F   T   	r   z>Bqr   r   z>BBr3   r   z>BHr   r   z>BLr   r4   z>BQl               r   )signedz>Bdr   r   r~   r   r   r   r   r   r   r   c                    s   g | ]}  |qS r   )r   )r   r   r   r   r   
<listcomp>I  r   z4_BinaryPlistWriter._write_object.<locals>.<listcomp>r   r   rc   r   )#r   r   r   r   rn   r   r7   r   r   r   r9   to_bytesfloatr   total_secondsr
   r   r   r   r   r   rQ   UnicodeEncodeErrorbytes	bytearrayr   r   r   rb   r   re   rf   r   rg   rJ   )ru   r   r   r$   trefsr   keyRefsvalRefs	rootItemsr   r   r   r   r   r     s    





&
$&z _BinaryPlistWriter._write_objectN)	rw   rx   ry   rt   rn   r   r   r   r   r   r   r   r   rm     s   -0rm   )(r   r   r
   r   r   r   ior   r   r   r   rP   	NameErrorstrr   r   AttributeErrorr   r   r	   r   r%   r,   rb   r!   ra   r+   rp   ro   rU   r   objectr   r^   r   r7   r   r   r   rm   r   r   r   r   <module>   sB   0




`	" 