annotate Lib/plistlib.py @ 79691:05c8928362ee

Merge __next__ method link fixes with 3.3.
author Ezio Melotti <ezio.melotti@gmail.com>
date Fri, 12 Oct 2012 13:46:37 +0300
parents 9e64084f9980
children 6a8cb4875ac6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
53072
7e978ca42930 Merged revisions 70980,71059,71225,71234,71241,71243,71249,71251,71255,71266,71299,71329,71397-71398,71486 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
1 r"""plistlib.py -- a tool to generate and parse MacOSX .plist files.
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2
55980
560c054a01aa Merged revisions 74813 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 54568
diff changeset
3 The property list (.plist) file format is a simple XML pickle supporting
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
4 basic object types, like dictionaries, lists, numbers and strings.
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
5 Usually the top level object is a dictionary.
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
6
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
7 To write out a plist file, use the writePlist(rootObject, pathOrFile)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
8 function. 'rootObject' is the top level object, 'pathOrFile' is a
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
9 filename or a (writable) file object.
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
10
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
11 To parse a plist from a file, use the readPlist(pathOrFile) function,
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
12 with a file name or a (readable) file object as the only argument. It
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
13 returns the top level object (again, usually a dictionary).
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
14
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
15 To work with plist data in bytes objects, you can use readPlistFromBytes()
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
16 and writePlistToBytes().
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
17
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
18 Values can be strings, integers, floats, booleans, tuples, lists,
55980
560c054a01aa Merged revisions 74813 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 54568
diff changeset
19 dictionaries (but only with string keys), Data or datetime.datetime objects.
560c054a01aa Merged revisions 74813 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 54568
diff changeset
20 String values (including dictionary keys) have to be unicode strings -- they
560c054a01aa Merged revisions 74813 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 54568
diff changeset
21 will be written out as UTF-8.
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
22
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
23 The <data> plist type is supported through the Data class. This is a
55980
560c054a01aa Merged revisions 74813 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 54568
diff changeset
24 thin wrapper around a Python bytes object. Use 'Data' if your strings
560c054a01aa Merged revisions 74813 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 54568
diff changeset
25 contain control characters.
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
26
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
27 Generate Plist example:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
28
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
29 pl = dict(
55980
560c054a01aa Merged revisions 74813 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 54568
diff changeset
30 aString = "Doodah",
560c054a01aa Merged revisions 74813 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 54568
diff changeset
31 aList = ["A", "B", 12, 32.1, [1, 2, 3]],
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
32 aFloat = 0.1,
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
33 anInt = 728,
55980
560c054a01aa Merged revisions 74813 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 54568
diff changeset
34 aDict = dict(
560c054a01aa Merged revisions 74813 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 54568
diff changeset
35 anotherString = "<hello & hi there!>",
560c054a01aa Merged revisions 74813 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 54568
diff changeset
36 aUnicodeValue = "M\xe4ssig, Ma\xdf",
560c054a01aa Merged revisions 74813 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 54568
diff changeset
37 aTrueValue = True,
560c054a01aa Merged revisions 74813 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 54568
diff changeset
38 aFalseValue = False,
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
39 ),
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
40 someData = Data(b"<binary gunk>"),
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
41 someMoreData = Data(b"<lots of binary gunk>" * 10),
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
42 aDate = datetime.datetime.fromtimestamp(time.mktime(time.gmtime())),
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
43 )
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
44 writePlist(pl, fileName)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
45
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
46 Parse Plist example:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
47
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
48 pl = readPlist(pathOrFile)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
49 print pl["aKey"]
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
50 """
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
51
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
52
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
53 __all__ = [
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
54 "readPlist", "writePlist", "readPlistFromBytes", "writePlistToBytes",
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
55 "Plist", "Data", "Dict"
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
56 ]
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
57 # Note: the Plist and Dict classes have been deprecated.
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
58
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
59 import binascii
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
60 import datetime
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
61 from io import BytesIO
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
62 import re
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
63
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
64
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
65 def readPlist(pathOrFile):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
66 """Read a .plist file. 'pathOrFile' may either be a file name or a
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
67 (readable) file object. Return the unpacked root object (which
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
68 usually is a dictionary).
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
69 """
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
70 didOpen = False
70451
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
71 try:
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
72 if isinstance(pathOrFile, str):
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
73 pathOrFile = open(pathOrFile, 'rb')
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
74 didOpen = True
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
75 p = PlistParser()
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
76 rootObject = p.parse(pathOrFile)
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
77 finally:
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
78 if didOpen:
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
79 pathOrFile.close()
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
80 return rootObject
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
81
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
82
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
83 def writePlist(rootObject, pathOrFile):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
84 """Write 'rootObject' to a .plist file. 'pathOrFile' may either be a
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
85 file name or a (writable) file object.
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
86 """
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
87 didOpen = False
70451
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
88 try:
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
89 if isinstance(pathOrFile, str):
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
90 pathOrFile = open(pathOrFile, 'wb')
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
91 didOpen = True
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
92 writer = PlistWriter(pathOrFile)
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
93 writer.writeln("<plist version=\"1.0\">")
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
94 writer.writeValue(rootObject)
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
95 writer.writeln("</plist>")
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
96 finally:
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
97 if didOpen:
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
98 pathOrFile.close()
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
99
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
100
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
101 def readPlistFromBytes(data):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
102 """Read a plist data from a bytes object. Return the root object.
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
103 """
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
104 return readPlist(BytesIO(data))
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
105
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
106
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
107 def writePlistToBytes(rootObject):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
108 """Return 'rootObject' as a plist-formatted bytes object.
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
109 """
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
110 f = BytesIO()
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
111 writePlist(rootObject, f)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
112 return f.getvalue()
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
113
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
114
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
115 class DumbXMLWriter:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
116 def __init__(self, file, indentLevel=0, indent="\t"):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
117 self.file = file
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
118 self.stack = []
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
119 self.indentLevel = indentLevel
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
120 self.indent = indent
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
121
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
122 def beginElement(self, element):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
123 self.stack.append(element)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
124 self.writeln("<%s>" % element)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
125 self.indentLevel += 1
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
126
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
127 def endElement(self, element):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
128 assert self.indentLevel > 0
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
129 assert self.stack.pop() == element
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
130 self.indentLevel -= 1
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
131 self.writeln("</%s>" % element)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
132
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
133 def simpleElement(self, element, value=None):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
134 if value is not None:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
135 value = _escape(value)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
136 self.writeln("<%s>%s</%s>" % (element, value, element))
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
137 else:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
138 self.writeln("<%s/>" % element)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
139
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
140 def writeln(self, line):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
141 if line:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
142 # plist has fixed encoding of utf-8
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
143 if isinstance(line, str):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
144 line = line.encode('utf-8')
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
145 self.file.write(self.indentLevel * self.indent)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
146 self.file.write(line)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
147 self.file.write(b'\n')
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
148
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
149
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
150 # Contents should conform to a subset of ISO 8601
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
151 # (in particular, YYYY '-' MM '-' DD 'T' HH ':' MM ':' SS 'Z'. Smaller units may be omitted with
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
152 # a loss of precision)
48769
83b2d07b475b #2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents: 46970
diff changeset
153 _dateParser = re.compile(r"(?P<year>\d\d\d\d)(?:-(?P<month>\d\d)(?:-(?P<day>\d\d)(?:T(?P<hour>\d\d)(?::(?P<minute>\d\d)(?::(?P<second>\d\d))?)?)?)?)?Z", re.ASCII)
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
154
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
155 def _dateFromString(s):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
156 order = ('year', 'month', 'day', 'hour', 'minute', 'second')
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
157 gd = _dateParser.match(s).groupdict()
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
158 lst = []
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
159 for key in order:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
160 val = gd[key]
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
161 if val is None:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
162 break
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
163 lst.append(int(val))
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
164 return datetime.datetime(*lst)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
165
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
166 def _dateToString(d):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
167 return '%04d-%02d-%02dT%02d:%02d:%02dZ' % (
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
168 d.year, d.month, d.day,
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
169 d.hour, d.minute, d.second
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
170 )
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
171
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
172
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
173 # Regex to find any control chars, except for \t \n and \r
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
174 _controlCharPat = re.compile(
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
175 r"[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f"
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
176 r"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]")
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
177
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
178 def _escape(text):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
179 m = _controlCharPat.search(text)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
180 if m is not None:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
181 raise ValueError("strings can't contains control characters; "
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
182 "use plistlib.Data instead")
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
183 text = text.replace("\r\n", "\n") # convert DOS line endings
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
184 text = text.replace("\r", "\n") # convert Mac line endings
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
185 text = text.replace("&", "&amp;") # escape '&'
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
186 text = text.replace("<", "&lt;") # escape '<'
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
187 text = text.replace(">", "&gt;") # escape '>'
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
188 return text
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
189
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
190
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
191 PLISTHEADER = b"""\
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
192 <?xml version="1.0" encoding="UTF-8"?>
60786
d09f84258e52 Merged revisions 80279 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 55980
diff changeset
193 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
194 """
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
195
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
196 class PlistWriter(DumbXMLWriter):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
197
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
198 def __init__(self, file, indentLevel=0, indent=b"\t", writeHeader=1):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
199 if writeHeader:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
200 file.write(PLISTHEADER)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
201 DumbXMLWriter.__init__(self, file, indentLevel, indent)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
202
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
203 def writeValue(self, value):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
204 if isinstance(value, str):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
205 self.simpleElement("string", value)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
206 elif isinstance(value, bool):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
207 # must switch for bool before int, as bool is a
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
208 # subclass of int...
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
209 if value:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
210 self.simpleElement("true")
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
211 else:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
212 self.simpleElement("false")
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
213 elif isinstance(value, int):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
214 self.simpleElement("integer", "%d" % value)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
215 elif isinstance(value, float):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
216 self.simpleElement("real", repr(value))
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
217 elif isinstance(value, dict):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
218 self.writeDict(value)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
219 elif isinstance(value, Data):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
220 self.writeData(value)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
221 elif isinstance(value, datetime.datetime):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
222 self.simpleElement("date", _dateToString(value))
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
223 elif isinstance(value, (tuple, list)):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
224 self.writeArray(value)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
225 else:
55980
560c054a01aa Merged revisions 74813 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 54568
diff changeset
226 raise TypeError("unsupported type: %s" % type(value))
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
227
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
228 def writeData(self, data):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
229 self.beginElement("data")
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
230 self.indentLevel -= 1
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
231 maxlinelength = 76 - len(self.indent.replace(b"\t", b" " * 8) *
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
232 self.indentLevel)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
233 for line in data.asBase64(maxlinelength).split(b"\n"):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
234 if line:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
235 self.writeln(line)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
236 self.indentLevel += 1
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
237 self.endElement("data")
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
238
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
239 def writeDict(self, d):
77218
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
240 if d:
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
241 self.beginElement("dict")
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
242 items = sorted(d.items())
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
243 for key, value in items:
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
244 if not isinstance(key, str):
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
245 raise TypeError("keys must be strings")
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
246 self.simpleElement("key", key)
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
247 self.writeValue(value)
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
248 self.endElement("dict")
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
249 else:
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
250 self.simpleElement("dict")
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
251
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
252 def writeArray(self, array):
77218
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
253 if array:
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
254 self.beginElement("array")
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
255 for value in array:
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
256 self.writeValue(value)
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
257 self.endElement("array")
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
258 else:
9e64084f9980 #14835: Make plistlib output empty arrays & dicts like OS X
Hynek Schlawack <hs@ox.cx>
parents: 71194
diff changeset
259 self.simpleElement("array")
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
260
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
261
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
262 class _InternalDict(dict):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
263
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
264 # This class is needed while Dict is scheduled for deprecation:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
265 # we only need to warn when a *user* instantiates Dict or when
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
266 # the "attribute notation for dict keys" is used.
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
267
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
268 def __getattr__(self, attr):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
269 try:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
270 value = self[attr]
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
271 except KeyError:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
272 raise AttributeError(attr)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
273 from warnings import warn
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
274 warn("Attribute access from plist dicts is deprecated, use d[key] "
71194
4f14050a963f Issue #12452: Plist and Dict are now deprecated
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70452
diff changeset
275 "notation instead", DeprecationWarning, 2)
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
276 return value
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
277
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
278 def __setattr__(self, attr, value):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
279 from warnings import warn
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
280 warn("Attribute access from plist dicts is deprecated, use d[key] "
71194
4f14050a963f Issue #12452: Plist and Dict are now deprecated
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70452
diff changeset
281 "notation instead", DeprecationWarning, 2)
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
282 self[attr] = value
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
283
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
284 def __delattr__(self, attr):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
285 try:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
286 del self[attr]
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
287 except KeyError:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
288 raise AttributeError(attr)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
289 from warnings import warn
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
290 warn("Attribute access from plist dicts is deprecated, use d[key] "
71194
4f14050a963f Issue #12452: Plist and Dict are now deprecated
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70452
diff changeset
291 "notation instead", DeprecationWarning, 2)
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
292
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
293 class Dict(_InternalDict):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
294
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
295 def __init__(self, **kwargs):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
296 from warnings import warn
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
297 warn("The plistlib.Dict class is deprecated, use builtin dict instead",
71194
4f14050a963f Issue #12452: Plist and Dict are now deprecated
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70452
diff changeset
298 DeprecationWarning, 2)
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
299 super().__init__(**kwargs)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
300
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
301
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
302 class Plist(_InternalDict):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
303
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
304 """This class has been deprecated. Use readPlist() and writePlist()
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
305 functions instead, together with regular dict objects.
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
306 """
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
307
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
308 def __init__(self, **kwargs):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
309 from warnings import warn
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
310 warn("The Plist class is deprecated, use the readPlist() and "
71194
4f14050a963f Issue #12452: Plist and Dict are now deprecated
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70452
diff changeset
311 "writePlist() functions instead", DeprecationWarning, 2)
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
312 super().__init__(**kwargs)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
313
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
314 def fromFile(cls, pathOrFile):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
315 """Deprecated. Use the readPlist() function instead."""
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
316 rootObject = readPlist(pathOrFile)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
317 plist = cls()
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
318 plist.update(rootObject)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
319 return plist
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
320 fromFile = classmethod(fromFile)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
321
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
322 def write(self, pathOrFile):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
323 """Deprecated. Use the writePlist() function instead."""
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
324 writePlist(self, pathOrFile)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
325
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
326
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
327 def _encodeBase64(s, maxlinelength=76):
54568
031b963f2bc2 More codestring -> codebytes.
Georg Brandl <georg@python.org>
parents: 53909
diff changeset
328 # copied from base64.encodebytes(), with added maxlinelength argument
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
329 maxbinsize = (maxlinelength//4)*3
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
330 pieces = []
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
331 for i in range(0, len(s), maxbinsize):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
332 chunk = s[i : i + maxbinsize]
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
333 pieces.append(binascii.b2a_base64(chunk))
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
334 return b''.join(pieces)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
335
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
336 class Data:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
337
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
338 """Wrapper for binary data."""
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
339
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
340 def __init__(self, data):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
341 if not isinstance(data, bytes):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
342 raise TypeError("data must be as bytes")
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
343 self.data = data
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
344
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
345 @classmethod
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
346 def fromBase64(cls, data):
54568
031b963f2bc2 More codestring -> codebytes.
Georg Brandl <georg@python.org>
parents: 53909
diff changeset
347 # base64.decodebytes just calls binascii.a2b_base64;
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
348 # it seems overkill to use both base64 and binascii.
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
349 return cls(binascii.a2b_base64(data))
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
350
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
351 def asBase64(self, maxlinelength=76):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
352 return _encodeBase64(self.data, maxlinelength)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
353
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
354 def __eq__(self, other):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
355 if isinstance(other, self.__class__):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
356 return self.data == other.data
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
357 elif isinstance(other, str):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
358 return self.data == other
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
359 else:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
360 return id(self) == id(other)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
361
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
362 def __repr__(self):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
363 return "%s(%s)" % (self.__class__.__name__, repr(self.data))
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
364
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
365 class PlistParser:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
366
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
367 def __init__(self):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
368 self.stack = []
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
369 self.currentKey = None
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
370 self.root = None
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
371
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
372 def parse(self, fileobj):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
373 from xml.parsers.expat import ParserCreate
70451
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
374 self.parser = ParserCreate()
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
375 self.parser.StartElementHandler = self.handleBeginElement
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
376 self.parser.EndElementHandler = self.handleEndElement
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
377 self.parser.CharacterDataHandler = self.handleData
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
378 self.parser.ParseFile(fileobj)
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
379 return self.root
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
380
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
381 def handleBeginElement(self, element, attrs):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
382 self.data = []
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
383 handler = getattr(self, "begin_" + element, None)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
384 if handler is not None:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
385 handler(attrs)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
386
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
387 def handleEndElement(self, element):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
388 handler = getattr(self, "end_" + element, None)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
389 if handler is not None:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
390 handler()
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
391
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
392 def handleData(self, data):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
393 self.data.append(data)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
394
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
395 def addObject(self, value):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
396 if self.currentKey is not None:
70451
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
397 if not isinstance(self.stack[-1], type({})):
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
398 raise ValueError("unexpected element at line %d" %
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
399 self.parser.CurrentLineNumber)
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
400 self.stack[-1][self.currentKey] = value
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
401 self.currentKey = None
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
402 elif not self.stack:
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
403 # this is the root object
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
404 self.root = value
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
405 else:
70451
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
406 if not isinstance(self.stack[-1], type([])):
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
407 raise ValueError("unexpected element at line %d" %
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
408 self.parser.CurrentLineNumber)
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
409 self.stack[-1].append(value)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
410
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
411 def getData(self):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
412 data = ''.join(self.data)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
413 self.data = []
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
414 return data
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
415
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
416 # element handlers
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
417
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
418 def begin_dict(self, attrs):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
419 d = _InternalDict()
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
420 self.addObject(d)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
421 self.stack.append(d)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
422 def end_dict(self):
70451
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
423 if self.currentKey:
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
424 raise ValueError("missing value for key '%s' at line %d" %
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
425 (self.currentKey,self.parser.CurrentLineNumber))
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
426 self.stack.pop()
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
427
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
428 def end_key(self):
70451
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
429 if self.currentKey or not isinstance(self.stack[-1], type({})):
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
430 raise ValueError("unexpected key at line %d" %
a2688e252204 Issue #985064: Make plistlib more resilient to faulty input plists.
Ned Deily <nad@acm.org>
parents: 55980
diff changeset
431 self.parser.CurrentLineNumber)
45001
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
432 self.currentKey = self.getData()
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
433
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
434 def begin_array(self, attrs):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
435 a = []
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
436 self.addObject(a)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
437 self.stack.append(a)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
438 def end_array(self):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
439 self.stack.pop()
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
440
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
441 def end_true(self):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
442 self.addObject(True)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
443 def end_false(self):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
444 self.addObject(False)
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
445 def end_integer(self):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
446 self.addObject(int(self.getData()))
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
447 def end_real(self):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
448 self.addObject(float(self.getData()))
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
449 def end_string(self):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
450 self.addObject(self.getData())
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
451 def end_data(self):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
452 self.addObject(Data.fromBase64(self.getData().encode("utf-8")))
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
453 def end_date(self):
f5e52a53fcd1 svn cp -r60150 svn+ssh://pythondev@svn.python.org/python/branches/py3k/Lib/plat-mac/plistlib.py Lib/
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
454 self.addObject(_dateFromString(self.getData()))