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):
...@@ -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