YfB| @sdZddddddddd d d d d g ZddlZddlZddlZddlZddlZddlmZddl Z ddl Z ddl Z ddl Z ddl mZddlmZejdddeZejejGdddeZGdddeZejddZGdddeZddZddZddZddZ Gd ddZ!d!Z"e j#d"Z$d#d$d%Z%d&d'Z&e j#d(e j'Z(d)d*Z)d+d,Z*d-d.Z+Gd/d0d0Z,Gd1d2d2Z-Gd3d4d4e-Z.d5d6Z/Gd7d8d8e0Z1d9d:d;d<d=d>d?d@iZ2e3Z4GdAdBdBZ5dCdDZ6e7e8e9eje:fZ;GdEdFdFe3Z<dGdHZ=e>edIe/dJe,dKe.e?edIe=dJe5dKe<iZ@dLddMdNdOedPd ZAdLddMdNdOedQd ZBdLe>dRdNdSdTdUd ZCdLe>dSdTdRdNdVd ZDdS)Waplistlib.py -- a tool to generate and parse MacOSX .plist files. The property list (.plist) file format is a simple XML pickle supporting basic object types, like dictionaries, lists, numbers and strings. Usually the top level object is a dictionary. To write out a plist file, use the dump(value, file) function. 'value' is the top level object, 'file' is a (writable) file object. To parse a plist from a file, use the load(file) function, with a (readable) file object as the only argument. It returns the top level object (again, usually a dictionary). To work with plist data in bytes objects, you can use loads() and dumps(). Values can be strings, integers, floats, booleans, tuples, lists, dictionaries (but only with string keys), Data, bytes, bytearray, or datetime.datetime objects. Generate Plist example: pl = dict( aString = "Doodah", aList = ["A", "B", 12, 32.1, [1, 2, 3]], aFloat = 0.1, anInt = 728, aDict = dict( anotherString = "", aUnicodeValue = "M\xe4ssig, Ma\xdf", aTrueValue = True, aFalseValue = False, ), someData = b"", someMoreData = b"" * 10, aDate = datetime.datetime.fromtimestamp(time.mktime(time.gmtime())), ) with open(fileName, 'wb') as fp: dump(pl, fp) Parse Plist example: with open(fileName, 'rb') as fp: pl = load(fp) print(pl["aKey"]) readPlist writePlistreadPlistFromByteswritePlistToBytesPlistDataDictFMT_XML FMT_BINARYloaddumploadsdumpsN)BytesIO)warn) ParserCreate PlistFormatzFMT_XML FMT_BINARYmodulec@s:eZdZfZddZddZddZdS) _InternalDictc CsCy||}Wntk r.t|YnXtdtd|S)NzLAttribute access from plist dicts is deprecated, use d[key] notation instead)KeyErrorAttributeErrorrDeprecationWarning)selfattrvaluer-/opt/alt/python35/lib64/python3.5/plistlib.py __getattr__Vs  z_InternalDict.__getattr__cCstdtd||||j|kStSdS)N)r)r(r=r@NotImplemented)rotherrrr__eq__s  z Data.__eq__cCsd|jjt|jfS)Nz%s(%s))r(r!reprr=)rrrr__repr__sz Data.__repr__N) r!r"r#r6r&r7rCrGrJrLrrrrrs   s zv[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]rDcCsn|dd}g}xJtdt||D]0}||||}|jtj|q-Wdj|S)Nr)rangelenappendbinasciiZ b2a_base64join)srFZ maxbinsizepiecesichunkrrrrEs rEcCs6t|tr%tj|jdStj|SdS)Nzutf-8)r)r*rSZ a2b_base64encode)rUrrrrB srBz{(?P\d\d\d\d)(?:-(?P\d\d)(?:-(?P\d\d)(?:T(?P\d\d)(?::(?P\d\d)(?::(?P\d\d))?)?)?)?)?ZcCsid}tj|j}g}x8|D]0}||}|dkrEP|jt|q(Wtj|S)Nyearmonthdayhourminutesecond)rZr[r\r]r^r_) _dateParsermatch groupdictrRintdatetime)rUorderZgdZlstkeyvalrrr_date_from_strings   rhcCs,d|j|j|j|j|j|jfS)Nz%04d-%02d-%02dT%02d:%02d:%02dZ)rZr[r\r]r^r_)drrr_date_to_string&srjcCstj|}|dk r'td|jdd}|jdd}|jdd}|jdd}|jd d }|S) Nzz>)_controlCharPatsearch ValueErrorreplace)textmrrr_escape,s  rvc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'S)( _PlistParsercCs1g|_d|_d|_||_||_dS)N)stack current_keyroot_use_builtin_types _dict_type)rr9r:rrrr&9s     z_PlistParser.__init__cCsPt|_|j|j_|j|j_|j|j_|jj||j S)N) rparserhandle_begin_elementZStartElementHandlerhandle_end_elementZEndElementHandler handle_dataZCharacterDataHandlerZ ParseFilerz)rZfileobjrrrparse@s  z_PlistParser.parsecCs9g|_t|d|d}|dk r5||dS)NZbegin_)r=getattr)relementattrshandlerrrrr~Hs  z!_PlistParser.handle_begin_elementcCs-t|d|d}|dk r)|dS)NZend_)r)rrrrrrrNs z_PlistParser.handle_end_elementcCs|jj|dS)N)r=rR)rr=rrrrSsz_PlistParser.handle_datacCs|jdk rat|jdtisAtd|jj||jd|jr)rxrRwritelnr)rrrrr begin_elementsz_DumbXMLWriter.begin_elementcCsT|jdkst|jj|ks0t|jd8_|jd|dS)Nrrz)rAssertionErrorrxrr)rrrrr end_elementsz_DumbXMLWriter.end_elementNcCsJ|dk r5t|}|jd|||fn|jd|dS)Nz <%s>%sz<%s/>)rvr)rrrrrrsimple_elements  z_DumbXMLWriter.simple_elementcCsb|rNt|tr$|jd}|jj|j|j|jj||jjddS)Nzutf-8s )r)r*rYrr5rr)rlinerrrrs z_DumbXMLWriter.writeln)r!r"r#r&rrrrrrrrrs   rc@sseZdZdddddddZdd Zd d Zd d ZddZddZddZ dS) _PlistWriterrs rTFcCs?|r|jttj||||||_||_dS)N)r5 PLISTHEADERrr& _sort_keys _skipkeys)rrrrZ writeHeaderr;r<rrrr&s   z_PlistWriter.__init__cCs+|jd|j||jddS)Nzz)r write_value)rrrrrr5s  z_PlistWriter.writecCst|tr"|jd|nz|dkr>|jdn^|dkrZ|jdnBt|trd|kodknr|jd d |qt|nt|tr|jd t|nt|tr|j|nt|t r|j |nt|t t fr6|j |nft|tjra|jd t|n;t|ttfr|j|ntd t|dS)NstringTtrueFfalser?@Zintegerz%drealZdatezunsupported type: %srll)r)r*rrc OverflowErrorrrKdict write_dictr write_datar@ bytearray write_bytesrdrjtuplelist write_arrayrAr)rrrrrrs.  z_PlistWriter.write_valuecCs|j|jdS)N)rr=)rr=rrrrsz_PlistWriter.write_datacCs|jd|jd8_tddt|jjdd |j}x3t||jdD]}|rd|j|qdW|jd7_|j ddS) Nr=rrDs  s s ) rrmaxrQrrsrEsplitrr)rr=rFrrrrrs )z_PlistWriter.write_bytescCs|r|jd|jr1t|j}n |j}xX|D]P\}}t|tsw|jrkqDtd|jd||j |qDW|j dn |jddS)Nrzkeys must be stringsrf) rrsorteditemsr)r*rrArrr)rrirrfrrrrr s     z_PlistWriter.write_dictcCsR|rA|jdx|D]}|j|qW|jdn |jddS)Narray)rrrr)rrrrrrrs   z_PlistWriter.write_arrayN) r!r"r#r&r5rrrrrrrrrrs    %  rcCsd }x!|D]}|j|r dSq WxtjdftjdftjdffD]k\}}|j|ssqUxJ|D]B}||jdj|}|dt||krzdSqzWqUWdS) N6xBBQQQi)_fpseekosSEEK_ENDreadrQrstructunpack _ref_size _read_ints_object_offsets _undefined_objects _read_objectOSError IndexErrorerror)rr.trailer offset_size num_objects top_objectoffset_table_offsetrrrr_s  $z_BinaryPlistParser.parsecCsb|dkr^|jjddd@}d|>}dt|}tj||jj|dS|S)z$ return the size of the next object.rrrNro)rr_BINARY_FORMATrr)rtokenLrurUr?rrr _get_sizews    z_BinaryPlistParser._get_sizecsr|jj|tkr>tjdt|Stfddtd|DSdS)Nroc3s/|]%}tj||dVqdS)bigN)rc from_bytes).0rW)r=sizerr sz0_BinaryPlistParser._read_ints..r)rrrrrrrP)rnrr)r=rrrs  z_BinaryPlistParser._read_intscCs|j||jS)N)rr)rrrrr _read_refssz_BinaryPlistParser._read_refsc sj|}|tk r|Sj|}jj|jjdd}|d@|d@}}|dkrzd}n|dkrd}n|dkrd }n|dkrd }n|d krtjjjd|>d d |dk}n|dkr'tj djjdd}nQ|dkrXtj djjdd}n |dkrtj djjdd}t j dddt j d|}n|dkrj |}j rjj|}qxtjj|}nv|dkrAj |}jj|jd}|}n7|dkr~j |}jj|djd}n|dkrj |}j|} g}|j|<|jfdd| Dn|d kroj |}j|} j|} j}|j|frM#z>d3iZsecondsrPr`rzutf-16bec3s|]}j|VqdS)N)r)rx)rrrrsz2_BinaryPlistParser._read_object..)rrrrrrrcrrrrdZ timedeltarr{rrrextendr|ziprr) rrefresultoffsettokenZtokenHrr?rUZobj_refsZkey_refskor)rrrsn             % % "     "  #   #  z_BinaryPlistParser._read_objectN) r!r"r#r6r&rrrrrrrrrrSs     rcCs:|dkrdS|dkr dS|d>d>r2dSdSdS) NrrrrrrMir)countrrr_count_to_sizes  rc@sXeZdZddZddZddZddZd d Zd d Zd S)_BinaryPlistWritercCs||_||_||_dS)N)rrr)rr.r;r<rrrr&s  z_BinaryPlistWriter.__init__c Cs3g|_i|_i|_|j|t|j}dg||_t||_t|j|_ |j j dx|jD]}|j |qW|j |}|j j}t|}dt||}|j j tj||jd}|||j|||f} |j j tjd| dS)Nrsbplist00roz >5xBBBQQQ)_objlist _objtable _objidtable_flattenrQrrrr _ref_formatrr5 _write_object _getrefnumtellrpack) rrrobjrrrZ offset_formatZ sort_versionrrrrr5s(      z_BinaryPlistWriter.writec Cst|tr1t||f|jkrdSnPt|trht|j|jf|jkrdSnt||jkrdSt|j }|j j |t|tr||jt||fBrrz>BBBrz>BBHrz>BBLz>BBQril)rr5rr)rr rrrr _write_sizeds # ) ) )z_BinaryPlistWriter._write_sizec sj|}jjj|<|dkrDjjdn|dkrcjjdn|dkrjjdnt|tr|dkry#jjtjdd|Wqtj k rt |dYqXq |d'krjjtjd d |q |d(krFjjtjd d|q |d)krtjjtjdd|q |d*krjjtjdd|q |d+krjjd|j d dddq t |n&t|t rjjtjdd|nt|t j rj|t j dd d j}jjtjdd|nt|trjdt|jjj|jndt|ttfrjdt|jj|n&t|troy)|jd}jdt|Wn;tk r[|jd}jdt|d YnXjj|nt|ttfrfd!d"|D}t|}jd#|jjtjd$j||n)t|trgg}}jrt|j} n |j} xg| D]_\} } t| tscjrWq0t d%|j!j| |j!j| q0Wt|}jd&|jjtjd$j||jjtjd$j||n t |dS),NsFsTs rz>Bqr%rrz>BBrz>BHr#rz>BLr$rz>BQrsrrz>Bdrirrrzutf-16berrcsg|]}j|qSr)r)rr )rrr s z4_BinaryPlistWriter._write_object..rrozkeys must be stringsrrilll)"rrrrr5r)rcrrrrto_bytesrrdZ total_secondsrr&rQr=r@rr*rYUnicodeEncodeErrorrrrrrrrrrArR) rrrr?tZrefsrUZkeyRefsZvalRefsZ rootItemsr r"r)rrrts    # " " " " )""  *      '*z _BinaryPlistWriter._write_objectN) r!r"r#r&r5rrr&rrrrrrs   - 0  rcCs|dddkS)Nrsbplist00r)rrrr_is_fmt_binarysr+detectr}writerr8r9Tr:cCs|dkrf|jd}|jdxItjD]!}|d|r5|d}Pq5Wtnt|d}|d|d|}|j|S)zRead a .plist file. 'fp' should be (readable) file object. Return the unpacked root object (which usually is a dictionary). Nrrr,r}r9r:)rr_FORMATSr!rr)r.r8r9r:rinfoPprrrr s    cCs(t|}t|d|d|d|S)zqRead a .plist file from a bytes object. Return the unpacked root object (which usually is a dictionary). r8r9r:)rr )rr8r9r:r.rrrr s r;r<FcCsP|tkrtd|ft|d|d|d|}|j|dS)zQWrite 'value' to a .plist file. 'fp' should be a (writable) file object. zUnsupported format: %rr-r;r<N)r.rrr5)rr.r8r;r<r-rrrr s  c Cs2t}t||d|d|d||jS)z?Return a bytes object with the contents for a .plist file. r8r<r;)rr r>)rr8r<r;r.rrrr s )Er6__all__rSr contextlibrdZenumiorrrrerwarningsrZxml.parsers.expatrZEnumr!rglobalsr1Z __members__rrrcontextmanagerr/rrrrrrrcompilerprErBASCIIr`rhrjrvrwrrrrrrrobjectrrrr*rcrr@rrr+rr r.r r r r rrrr/sv              0    h&d !