\dndZgdZddlZddlZddlZddlZddlmZddlZddl Z ddl Z ddl Z ddl m Z ejddeZeejGd d Zd Ze jd Zd2dZdZe jde jZdZdZdZGddZGddZ Gdde Z!dZ"Gdde#Z$dddd d!Z%e&Z'Gd"d#Z(d$Z)e*e+e,eje-fZ.Gd%d&e&Z/d'Z0e1e2e"ee!(e3e2e0e(e/(iZ4de2d)d*Z5de2d)d+Z6e1d,d-d.d/Z7e1d-d,d0d1Z8dS)3a>plistlib.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: import datetime import plistlib pl = dict( aString = "Doodah", aList = ["A", "B", 12, 32.1, [1, 2, 3]], aFloat = 0.1, anInt = 728, aDict = dict( anotherString = "", aThirdString = "M\xe4ssig, Ma\xdf", aTrueValue = True, aFalseValue = False, ), someData = b"", someMoreData = b"" * 10, aDate = datetime.datetime.now() ) print(plistlib.dumps(pl).decode()) Parse Plist example: import plistlib plist = b''' foo bar ''' pl = plistlib.loads(plist) print(pl["foo"]) )InvalidFileExceptionFMT_XML FMT_BINARYloaddumploadsdumpsUIDN)BytesIO) ParserCreate PlistFormatzFMT_XML FMT_BINARY)modulec2eZdZdZdZdZdZdZdZdS)r ct|tstd|dkrtd|dkrtd||_dS)Nzdata must be an intzUIDs cannot be >= 2**64r UIDs must be positive) isinstanceint TypeError ValueErrordataselfrs ..\python\lib\plistlib.py__init__z UID.__init__Ns^$$$ 3122 2 7??677 7 !88455 5 c|jSN)rrs r __index__z UID.__index__Ws yrcJ|jjdt|jdS)N()) __class____name__reprrrs r__repr__z UID.__repr__Zs$>222DOOOODDrc |j|jffSr)r$rrs r __reduce__zUID.__reduce__]s~ |++rcZt|tstS|j|jkSr)rr NotImplementedr)rothers r__eq__z UID.__eq__`s)%%% "! !yEJ&&rc*t|jSr)hashrrs r__hash__z UID.__hash__esDIrN) r% __module__ __qualname__rr r'r)r-r0rrr r MsqEEE,,,''' rr 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]Lc|dzdz}g}tdt||D]6}||||z}|tj|7d|S)Nr r)rangelenappendbinascii b2a_base64join)s maxlinelength maxbinsizepiecesichunks r_encode_base64rDys|"A%J F 1c!ffj ) )22!a*n$% h)%001111 88F  rct|tr'tj|dStj|S)Nutf-8)rstrr; a2b_base64encode)r>s r_decode_base64rJsD!S&"188G#4#4555"1%%%rz{(?P\d\d\d\d)(?:-(?P\d\d)(?:-(?P\d\d)(?:T(?P\d\d)(?::(?P\d\d)(?::(?P\d\d))?)?)?)?)?Zcd}t|}g}|D]0}||}|n#|t |1t j|S)Nyearmonthdayhourminutesecond) _dateParsermatch groupdictr:rdatetime)r>ordergdlstkeyvals r_date_from_stringr\sv @E   1   ' ' ) )B Cg ; E 3s88  c ""rcTd|j|j|j|j|j|jfzS)Nz%04d-%02d-%02dT%02d:%02d:%02dZrL)ds r_date_to_stringr_s. +  !(/ rc8t|}|td|dd}|dd}|dd}|dd}|d d }|S) Nz;strings can't contain control characters; use bytes insteadz   &z&z>)_controlCharPatsearchrreplace)textms r_escaperkst$$A}-.. . << % %D <<d # #D <<W % %D <<V $ $D <<V $ $D KrceZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdS) _PlistParserc>g|_d|_d|_||_dSr)stack current_keyroot _dict_typer dict_types rrz_PlistParser.__init__s#  #rct|_|j|j_|j|j_|j|j_|j|j_ |j ||j Sr) r parserhandle_begin_elementStartElementHandlerhandle_end_elementEndElementHandler handle_dataCharacterDataHandlerhandle_entity_declEntityDeclHandler ParseFilerq)rfileobjs rparsez_PlistParser.parses_"nn *.*C '(,(? %+/+; ((,(? % g&&&yrc td)Nz8XML entity declarations are not supported in plist files)r)r entity_nameis_parameter_entityvaluebase system_id public_id notation_names rr}z_PlistParser.handle_entity_decls##]^^^rcZg|_t|d|zd}| ||dSdS)Nbegin_)rgetattr)relementattrshandlers rrwz!_PlistParser.handle_begin_elements> $7 2D99   GENNNNN  rcJt|d|zd}| |dSdS)Nend_)r)rrrs rryz_PlistParser.handle_end_elements5$ 0$77   GIIIII  rc:|j|dSr)rr:rs rr{z_PlistParser.handle_datas rc|jbt|jdtist d|jjz||jd|j<d|_dS|js ||_dSt|jdtgst d|jjz|jd|dS)Nzunexpected element at line %d) rprrotyperrvCurrentLineNumberrqr:rrs r add_objectz_PlistParser.add_objects   'djnd2hh77 @ !@!%!>"?@@@/4DJrN4+ ,#D    )DIIIdjnd2hh77 @ !@!%!>"?@@@ JrN ! !% ( ( ( ( (rcHd|j}g|_|S)N)r=rrs rget_dataz_PlistParser.get_datas!wwty!!  rc|}|||j|dSr)rrrror:)rrr^s r begin_dictz_PlistParser.begin_dicts? OO    !rc|jr#td|j|jjfz|jdS)Nz%missing value for key '%s' at line %d)rprrvrropoprs rend_dictz_PlistParser.end_dictsT   OD".t{/LMNOO O rc|js(t|jdtist d|jjz||_dS)Nrzunexpected key at line %d)rprrorrrvrrrs rend_keyz_PlistParser.end_keysb   <:djnd2hh#G#G <8![:;<< <==??rchg}|||j|dSr)rror:)rras r begin_arrayz_PlistParser.begin_arrays5   !rc8|jdSr)rorrs r end_arrayz_PlistParser.end_arrays rc0|ddS)NTrrs rend_truez_PlistParser.end_trues rc0|ddS)NFrrs r end_falsez_PlistParser.end_falses rc|}|ds|dr%|t|ddS|t|dS)N0x0X)r startswithrr)rraws r end_integerz_PlistParser.end_integerstmmoo >>$   &3>>$#7#7 & OOCRLL ) ) ) ) ) OOCHH % % % % %rcn|t|dSr)rfloatrrs rend_realz_PlistParser.end_reals* dmmoo../////rcT||dSr)rrrs r end_stringz_PlistParser.end_strings"  (((((rcn|t|dSr)rrJrrs rend_dataz_PlistParser.end_datas* t}}7788888rcn|t|dSr)rr\rrs rend_datez_PlistParser.end_dates+ )$--//::;;;;;rN)r%r1r2rrr}rwryr{rrrrrrrrrrrrrrr3rrrmrmsC$$$ ___   )))   +++  &&&000)))999<<<<||_g|_||_||_dSr)filero _indent_levelindent)rr indent_levelrs rrz_DumbXMLWriter.__init__s#  ) rc|j||d|z|xjdz c_dS)Nz<%s>)ror:writelnrrrs r begin_elementz_DumbXMLWriter.begin_element"sI '""" Vg%&&& arc|jdksJ|j|ksJ|xjdzc_|d|zdS)Nr rz)rrorrrs r end_elementz_DumbXMLWriter.end_element'sd!A%%%%z~~7**** a Ww&'''''rNc |0t|}|d|d|d|ddS|d|zdS)Nrdrez)rkr)rrrs rsimple_elementz_DumbXMLWriter.simple_element-s_  ENNE LLL'''555'''B C C C C C LL7* + + + + +rc|rkt|tr|d}|j|j|jz|j||jddS)NrF )rrGrIrwriterr)rlines rrz_DumbXMLWriter.writeln5s{  "$$$ ,{{7++ IOOD.< = = = IOOD ! ! ! r)r rr)r%r1r2rrrrrr3rrrrsi    ((( ,,,,     rrc8eZdZ d dZdZdZd Zd Zd Zd S) _PlistWriterr  rTFc|r|tt||||||_||_dSr)r PLISTHEADERrr _sort_keys _skipkeys)rrrr writeHeader sort_keysskipkeyss rrz_PlistWriter.__init__BsJ  $ JJ{ # # #dL&AAA#!rc|d|||ddS)Nzz)r write_valuers rrz_PlistWriter.writeLsA .///  Z     rct|tr|d|dS|dur|ddS|dur|ddSt|tr:d|cxkrdkrnn|dd |zdSt |t|t r%|d t |dSt|tr||dSt|ttfr| |dSt|tj r%|d t|dSt|ttfr||dSt#d t%|z) NstringTtrueFfalselrintegerz%drealdatezunsupported type: %s)rrGrr OverflowErrorrr&dict write_dictbytes bytearray write_bytesrVr_tuplelist write_arrayrrrs rrz_PlistWriter.write_valueQs eS ! ! B   % 0 0 0 0 0 d]]    ' ' ' ' ' e^^    ( ( ( ( ( s # # B5****7*****##Ite|<<<<<#E*** u % % B   U 4 4 4 4 4 t $ $ B OOE " " " " " y1 2 2 B   U # # # # # x0 1 1 B   (>(> ? ? ? ? ? t} - - B   U # # # # #2T%[[@AA Arc |d|xjdzc_tddt|jdd|jzz }t ||dD]}|r|||xjdz c_| ddS)Nrrrr4rs r) rrmaxr9rrhrDsplitrr)rrr?rs rrz_PlistWriter.write_bytesss 6""" a  T[((99D6xBBQQQ)_fpseekosSEEK_ENDreadr9rstructunpack _ref_size _read_ints_object_offsets _undefined_objects _read_objectOSError IndexErrorerrorrr)rfptrailer offset_size num_objects top_objectoffset_table_offsets rrz_BinaryPlistParser.parses ) DH HMM#r{ + + +hmmB''G7||r!!*,,, j'22 T^[*# HMM- . . .#'??; #L#LD 'L;6DM$$Z00 0V\= ) ) )&(( ( )s C C##7Dc|dkrk|jdddz}d|z}dt|z}tj||j|dS|S)z$ return the size of the next object.rr r7re)rr_BINARY_FORMATrr)rtokenLrjr>fs r _get_sizez_BinaryPlistParser._get_sizesj S== a  #c)AQAnQ''A=DHMM!$4$455a8 8 rcD|j|ztvr%tjd|tSrt |zkrt tfdtd|zDS)Nrec3dK|]*}t||zdV+dS)bigN)r from_bytes).0rBrsizes r z0_BinaryPlistParser._read_ints..sR<<QD[(95AA<<<<< ! !=!>Q!>t(!>EE E -3t99q00*,,,<<<<<"'4!8T":":<<<<< t jd|zd |d k}n|dkr5tj djdd}nP|dkr5tj djdd}n|dkratj djdd}tj dddtj |z}n|dkrR |}j|}t||krtnV|dkrg |}j|} t| |krt| d}n|dkrj |dz}j|} t| |krt| d}ny|dkrEt!t jd|zd }n.|dkrX |}|} g}|j|<|fd| Dn|d kr |}|} |} }|j|< t)| | D]0\} } | || <1n*#t,$rtwxYwt|j|<|S)!zx read the object by reference. May recursively read sub-objects (content of an array/dict/set) rr r,NrF Trrr3r7signed"z>fr6#z>d3)seconds@Pr`rutf-16bec3BK|]}|VdSr)r!)r5xrs rr7z2_BinaryPlistParser._read_object..Os1AA1$++A..AAAAAAr)r rrrrrrr4rrrV timedeltar0r9rrr r:extendrrzipr!r)rrefresultoffsettokentokenHr.r/r>robj_refskey_refskos` rr!z_BinaryPlistParser._read_objectsF s#  # #M%c*  f a  #ut| D==FF d]]FF d]]FF d]]FF t^^^^DHMM!v+$>$>$)&A+$??FFd]]]4q)9)9::1=FF d]]]4q)9)9::1=FF d]] dDHMM!$4$455a8A'a33(3334FFt^^v&&AX]]1%%F6{{a*,,, t^^v&&A8==##D4yyA~~*,,,[[))FF t^^v&&*A8==##D4yyA~~*,,,[[,,FF t^^ a&j(A(A5IIJJFF t^^v&&Aq))HF!'DM#  MMAAAAAAA A A A At^^v&&Aq))Hq))H__&&F!'DM#  -(33HHDAq373D3DQ3G3GF4,,Q//00H - - -*,,, -'(( (# c s 6AP88QN) r%r1r2__doc__rrr0rr:r!r3rrrrs}$$$)))2<<<222cccccrrc6|dkrdS|dkrdS|dkrdSdS)Nrrr6rr3)counts r_count_to_sizer`hs3 v~~q q qqrc2eZdZdZdZdZdZdZdZdS)_BinaryPlistWriterc0||_||_||_dSr)rrr)rr%rrs rrz_BinaryPlistWriter.__init__xs#!rcg|_i|_i|_||t |j}dg|z|_t ||_t|j|_ |j d|jD]}| || |}|j }t |}dt||zz}|j tj|g|jRd}|||j|||f} |j tjdg| RdS)Nr bplist00rez >5xBBBQQQ)_objlist _objtable _objidtable_flattenr9rr`rr- _ref_formatrr _write_object _getrefnumtellrpack) rrr(objr)r*r' offset_format sort_versionr&s rrz_BinaryPlistWriter.write}sh  e$-(( !s;' 44)$.9 {###= $ $C   s # # # #__U++ "hmmoo$%899 n[9KGG  v{=H43GHHHIII +t~{ +  v{;9999:::::rct|trt||f|jvrdSnt ||jvrdSt |j}|j|t|tr||jt||f<n||jt |<t|trg}g}| }|j rt|}|D][\}}t|ts|jr"td||||\t!j||D]}||dSt|t&t(fr|D]}||dSdS)Nr)r_scalarsrrgidrhr9rfr:rrrrrGrr itertoolschainrirr) rrrefnumkeysvaluesrrXvrYs rriz_BinaryPlistWriter._flattens eX & & U U#t~556YY$* * * FT]## U### eX & & 139DNDKK/ 0 0*0D RYY ' eT " " !DFKKMME &u  ! !1!!S))<~! #$:;;; A a    _T622 ! ! a     ! !e} - - ! ! ! a     ! ! ! !rct|tr|jt||fS|jt |Sr)rrsrgrrhrtrs rrlz_BinaryPlistWriter._getrefnums@ eX & & />4;;"67 7#BuII. .rc6|dkr2|jtjd||zdS|dkr4|jtjd|dzd|dS|dkr4|jtjd|dzd|dS|d kr4|jtjd |dzd |dS|jtjd |dzd |dS)Nr,z>Br\z>BBBrr]z>BBHr^z>BBLz>BBQ)rrrrn)rrTr6s r _write_sizez_BinaryPlistWriter._write_sizes  "99 HNN6;tUT\:: ; ; ; ; ; F]] HNN6;vus{D$GG H H H H H G^^ HNN6;vus{D$GG H H H H H G^^ HNN6;vus{D$GG H H H H H HNN6;vus{D$GG H H H H Hrc>|}jj|<|jddS|durjddS|durjddSt |t r||dkrT jtjdd|dS#tj $rt|dwxYw|d kr0jtjd d |dS|d kr0jtjd d|dS|dkr0jtjdd|dS|dkr0jtjdd|dS|dkr5jd| d ddzdSt|t |tr0jtjdd|dSt |tj r[|tj dddz }jtjdd|dSt |tt fr?dt%|j|dSt |t&r |d}dt%|nK#t*$r>|d }d!t%|d"zYnwxYwj|dSt |t,r|jdkrt1d#|jd kr0jtjd d$|dS|jd kr0jtjd d%|dS|jdkr0jtjdd&|dS|jdkr0jtjdd'|dSt|t |t2t4frjfd(|D}t%|}d)|jtjd*j|zzg|RdSt |t8rVgg}}jr"t=|} n|} | D]\} } t | t&sj r"tCd+|"| |"| t%|}d,|jtjd*j|zzg|Rjtjd*j|zzg|RdStC|)-NFTrr z>Bqrr\z>BBrr]z>BHr}r^z>BLr~lz>BQrr3r>z>BdrArCrrBrErrFrHrGrrrIc:g|]}|Sr3)rl)r5rYrs r z4_BinaryPlistWriter._write_object..-s%6661DOOA&&666rrJrerrM)#rlrrmrrrrrrnr$rto_bytesrrV total_secondsrrrr9rGrIUnicodeEncodeErrorr rrrrrjrrrrrrr:) rrrQr/trefsr>keyRefsvalRefs rootItemsrXrzs ` rrkz _BinaryPlistWriter._write_objectsooe$$$(HMMOOS! = HNN7 # # # # # e^^ HNN7 # # # # # d]] HNN7 # # # # # s # #R #qyy9HNN6;udE#B#BCCCCC|999'..D89v{5$>>?????v{5$>>?????v{5$>>?????v{5$>>?????wE$)O)OOPPPPP#E*** u % %? # HNN6;udE:: ; ; ; ; ; x0 1 1< #*4A666EEGGA HNN6;udA66 7 7 7 7 7 y1 2 28 #   T3u:: . . . HNN5 ! ! ! ! ! s # #4 # 4LL))  s5zz2222% 4 4 4LL,,  s1vv{33333 4 HNN1      s # #* #zA~~ !8999f$$v{5$>>?????g%%v{5$>>?????g%%v{5$>>?????g%%v{5$>>?????#E*** e} - - #6666666DD A   T1 % % % HNN6;sT-=-A'AIDIII J J J J J t $ $ #!2WG *"5;;==11 !KKMM ! 3 31!!S))<~! #$:;;;tq11222tq112222G A   T1 % % % HNN6;sT-=-A'ALGLLL M M M HNN6;sT-=-A'ALGLLL M M M M ME"" "s3.C## D8N AOON) r%r1r2rrrirlrrkr3rrrbrbwsx""" +;+;+;Z(!(!(!T/// III ^#^#^#^#^#rrbc|dddkS)Nrrer3)rs r_is_fmt_binaryrKs "1": $$r)detectrvwriterfmtrtcN|p|d}|dtD]}|d|r |d}nt nt|d}||}||S)zRead a .plist file. 'fp' should be a readable and binary file object. Return the unpacked root object (which usually is a dictionary). Nrr rrv)rt)rr_FORMATSryrr)r%rrtrinfoPps rrras {  OO%% ) )DtH~f%% N  '(( ( SM( # IA 772;;rcDt|}t|||S)zqRead a .plist file from a bytes object. Return the unpacked root object (which usually is a dictionary). r)r r)rrrtr%s rrrws$ B y 1 1 11rTF)rrrc|tvrtd|t|d|||}||dS)zWWrite 'value' to a .plist file. 'fp' should be a writable, binary file object. zUnsupported format: r)rrN)rrr)rr%rrrrs rrrsY (j338999 c]8 $R9x P P PF LLrrrrcnt}t||||||S)z?Return a bytes object with the contents for a .plist file. r)r rgetvalue)rrrrr%s rrrs4 Bh)DDDD ;;==r)r4)9rZ__all__r;rrVenumior rurrerxml.parsers.expatr Enumr%r globalsupdate __members__r rcompilerfrDrJASCIIrSr\r_rkrmrrrrrr-objectrrr`rGrrrrsrbrrrrrrrrrr3rrrs77p      ******di ';HMMM  ()))B "*IJJ&&&bjXZ\Zbcc  # # #   k<k<k<k<k<k<k<k<\########L[)[)[)[)[)>[)[)[)|B+++++J+++SSS11 VXX ^^^^^^^^@    eX. 6Q#Q#Q#Q#Q#&Q#Q#Q#h%%% TT !! D,22222#dU %4r