Commit 1f74ef0f authored by Just van Rossum's avatar Just van Rossum

Made <data> output match Apple's exactly. To do that I had to add a custom

version of base64.encodestring() so I could control the line length of the
base64 output.
parent 8b8decea
...@@ -58,7 +58,7 @@ __all__ = [ ...@@ -58,7 +58,7 @@ __all__ = [
] ]
# Note: the Plist and Dict classes have been deprecated. # Note: the Plist and Dict classes have been deprecated.
import base64 import binascii
import datetime import datetime
from cStringIO import StringIO from cStringIO import StringIO
...@@ -252,9 +252,13 @@ class PlistWriter(DumbXMLWriter): ...@@ -252,9 +252,13 @@ class PlistWriter(DumbXMLWriter):
def writeData(self, data): def writeData(self, data):
self.beginElement("data") self.beginElement("data")
for line in data.asBase64().split("\n"): self.indentLevel -= 1
maxlinelength = 76 - len(self.indent.replace("\t", " " * 8) *
self.indentLevel)
for line in data.asBase64(maxlinelength).split("\n"):
if line: if line:
self.writeln(line) self.writeln(line)
self.indentLevel += 1
self.endElement("data") self.endElement("data")
def writeDict(self, d): def writeDict(self, d):
...@@ -317,7 +321,7 @@ class Dict(_InternalDict): ...@@ -317,7 +321,7 @@ class Dict(_InternalDict):
class Plist(_InternalDict): class Plist(_InternalDict):
"""This class has been deprecated. Use readPlist() and writePlist() """This class has been deprecated. Use readPlist() and writePlist()
functions instead, together with regular dict objects. functions instead, together with regular dict objects.
""" """
...@@ -340,6 +344,15 @@ class Plist(_InternalDict): ...@@ -340,6 +344,15 @@ class Plist(_InternalDict):
writePlist(self, pathOrFile) writePlist(self, pathOrFile)
def _encodeBase64(s, maxlinelength=76):
# copied from base64.encodestring(), with added maxlinelength argument
maxbinsize = (maxlinelength//4)*3
pieces = []
for i in range(0, len(s), maxbinsize):
chunk = s[i : i + maxbinsize]
pieces.append(binascii.b2a_base64(chunk))
return "".join(pieces)
class Data: class Data:
"""Wrapper for binary data.""" """Wrapper for binary data."""
...@@ -348,11 +361,13 @@ class Data: ...@@ -348,11 +361,13 @@ class Data:
self.data = data self.data = data
def fromBase64(cls, data): def fromBase64(cls, data):
return cls(base64.decodestring(data)) # base64.decodestring just calls binascii.a2b_base64;
# it seems overkill to use both base64 and binascii.
return cls(binascii.a2b_base64(data))
fromBase64 = classmethod(fromBase64) fromBase64 = classmethod(fromBase64)
def asBase64(self): def asBase64(self, maxlinelength=76):
return base64.encodestring(self.data) return _encodeBase64(self.data, maxlinelength)
def __cmp__(self, other): def __cmp__(self, other):
if isinstance(other, self.__class__): if isinstance(other, self.__class__):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment