U
    o_O                     @   sx  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k
rz   eZ
eZY nX zejZejZW n ek
r   dZdZY nX 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   >C:\Users\steff\Desktop\Mac OS\gibMacOS-master\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   s<   t | tst| S t| d}t|W  5 Q R  S Q R X d S )Nrb)r   r   loadopen)
pathOrFilefr   r   r   	readPlist5   s    
r%   c              
   C   sP   t |tst| |tdddS t|d }t| |tdddW  5 Q R  S Q R X 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 krd| d}| d tj D ]}|d |r<|d } qrq<t ntj| d }z|| dW n   | dY nX ttjrfdd	}|_	
| S t| s^dd
lm} t  fdd}	fdd	}|	_|_	| }
j|
_j|
_j|
_t| tr:| d} t| trNt| } |
|  jS |d krldn|}zt| dW n   t dY nX 
| S d S )NTr   r   detectparser)use_builtin_types	dict_type)r0   c                     s2      }  |  dr$t| dnt|  d S N0x   )get_data
add_objectlowerr   intdpr   r   end_integer\   s    zload.<locals>.end_integer)ParserCreatec                    s      } | j| d S r   )	addObjectstackappend)attrsr9   r0   r;   r   r   
begin_dictk   s    
zload.<locals>.begin_dictc                     s2      }  |  dr$t| dnt|  d S r1   )getDatar>   r6   r   r7   r8   r:   r   r   r<   o   s    utf-8F)r	   r   r   r
   _FORMATSvaluesInvalidFileExceptionr   _PlistParserr<   parser   xml.parsers.expatr=   PlistParserrC   handleBeginElementStartElementHandlerhandleEndElementEndElementHandler
handleDataCharacterDataHandlerunicodeencoder   r   	ParseFileroot_BinaryPlistParser)r   r'   r/   r0   r   infoPr<   r=   rC   r.   r   rB   r   r!   E   sT    






r!   c                 C   sR   t  rt| tr|  } ztt| |||dW S    tt| ||d Y S X d S )N)r'   r/   r0   )r'   r0   )r	   r   r   rT   r!   r   )r   r'   r/   r0   r   r   r   loads   s    rZ   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)r9   r_   r]   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PlistWriterrd   writelnra   r   _BinaryPlistWriterwrite
ValueErrorformat)r   r   r'   r(   r)   rd   r   rb   r   r+      s    


r+   c                 C   sB   t  rtj| |||ddS t }t| ||||d | S d S )N)r'   r)   r(   rE   )r	   r
   dumpsdecoder   r+   getvalue)r   r'   r)   r(   r$   r   r   r   rj      s
    rj   c                   @   s   e Zd ZdddZdS )rH   Invalid filec                 C   s   t | | d S r   )rh   __init__)selfmessager   r   r   rn      s    zInvalidFileException.__init__N)rm   )__name__
__module____qualname__rn   r   r   r   r   rH      s   rH   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 )rW   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)ro   r/   r0   r   r   r   rn      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k
r   t Y nX d S )Nir   z>6xBBQQQ)_fpr   osSEEK_ENDr   lenrH   structunpack	_ref_size
_read_ints_object_offsets
_undefined_objects_read_objectOSError
IndexErrorerrorOverflowErrorUnicodeDecodeError)ro   r   traileroffset_sizenum_objects
top_objectoffset_table_offsetr   r   r   rJ      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.   rx   r   r   >)ordr}   r   _BINARY_FORMATr   r   )ro   tokenLmsr$   r   r   r   	_get_size   s    z_BinaryPlistParser._get_sizec                    sr   | j |  tk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   rH   tuplerange)ro   nr   r   r   r   r      s    z_BinaryPlistParser._read_intsc                 C   s   |  || jS r   )r   r   )ro   r   r   r   r   
_read_refs  s    z_BinaryPlistParser._read_refsc                    s   j | }|tk	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)
        rx   r      r   Nr   F	   T    r3   ry   "   z>frz   #   z>d3     )seconds@   P   ascii`   utf-16be   c                 3   s   | ]}  |V  qd S r   )r   )r   xro   r   r   r   R  s     z2_BinaryPlistParser._read_object.<locals>.<genexpr>   )r   r   r   r}   r   r   r   r   r   r   datetime	timedeltar   r{   r
   r   rk   r   extendr|   zipr   r   r   rH   )ro   refresultoffsettokentokenHr   kr$   r   obj_refskey_refsor]   r   r   r   r   	  sx    





















z_BinaryPlistParser._read_objectN)
rq   rr   rs   __doc__rn   rJ   r   r   r   r   r   r   r   r   rW      s   

rW   c                 C   s0   | dk rdS | dk rdS | d> d> r(dS dS d S )N   rx      ry   r   rz   r   r   )countr   r   r   _count_to_sizel  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 )rf   c                 C   s   || _ || _|| _d S r   )r}   
_sort_keys	_skipkeys)ro   r   r(   r)   r   r   r   rn   |  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|f| j  d}||| j|||f}	| j
tjd|	  d S )Nr   r   r   	>5xBBBQQQ)r   )_objlist	_objtable_objidtable_flattenr   r   r   r   r   _ref_formatr}   rg   _write_object
_getrefnumtellr   pack)
ro   r   r   objr   r   r   offset_formatsort_versionr   r   r   r   rg     s2    





    z_BinaryPlistWriter.writec           	      C   sv  t |tr"t||f| jkr\d S n:t |tjrJt|j|jf| jkr\d S nt|| jk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 )Nr\   )r   _scalarstyper   r
   r   r   idr   r   r   r@   r[   r_   r   r^   r   r   r`   	itertoolschainr   listr   )	ro   r   refnumkeysrG   r_   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   )ro   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}   rg   r   r   )ro   r   r   r   r   r   _write_size  s    z_BinaryPlistWriter._write_sizec                    s    |} j  j|< |d kr2 jd n|dkrJ jd n|dkrb jd n~t|trj|dk rz jtdd| W n tj	k
r   t
|Y nX 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 r6 jtdd| n0|dk r^ jd|jdddd  nt
|nvt|tr jtdd| nPt|tjr|tddd  } jtdd| nt|tjr  dt|j  j|j nt|trpz|d} dt| W n4 tk
r^   |d } d!t|d"  Y nX  j| npt|ttfr dt|  j| n@t|ttfr fd#d$|D }t|} d%|  jtjd& j|  f|  nt|trg g  }} jr&t| }	n| }	|	D ]J\}
}t|
tsZ j rRq2t!d'|"  |
 |"  | q2t|} d(|  jtjd& j|  f|   jtjd& j|  f|  nt!|d S ))N    F   T   	r   z>Bqr   r   z>BBr3   r   z>BHr   r   z>BLr   l            z>BQl               r   )signedz>Bdr   r   rx   r   r   r   r   r   r   ry   c                    s   g | ]}  |qS r   )r   )r   r   r   r   r   
<listcomp>.  s     z4_BinaryPlistWriter._write_object.<locals>.<listcomp>r   r   r\   r   )#r   r}   r   r   rg   r   r7   r   r   r   r   to_bytesfloatr   total_secondsr
   r   r   r   r   r   rT   UnicodeEncodeErrorbytes	bytearrayr   r   r   r[   r   r^   r_   r   r`   r@   )ro   r   r   r$   trefsr   keyRefsvalRefs	rootItemsr   r   r   r   r   r     s    





$
"$z _BinaryPlistWriter._write_objectN)	rq   rr   rs   rn   rg   r   r   r   r   r   r   r   r   rf   {  s   -0rf   )(r   r~   r
   r   r   r   ior   r   r   r   rS   	NameErrorstrr   r   AttributeErrorr   r   r	   r   r%   r,   r[   r!   rZ   r+   rj   rh   rH   r   objectr   rW   r   r7   r   r   r   rf   r   r   r   r   <module>   sB   0




E	" 