From 72416ed65d682bb27458e13363338a6c5b6aaf27 Mon Sep 17 00:00:00 2001
From: lsowen <logan.owen@************.com>
Date: Sun, 22 Apr 2012 12:28:03 -0400
Subject: [PATCH 1/2] add automatic serialization/deserialization for base64Binary type

---
 generateDS.py |   56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/generateDS.py b/generateDS.py
index beb3f9e..32892da 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -205,7 +205,7 @@ def set_type_constants(nameSpace):
         NameType, NCNameType, QNameType, NameTypes, \
         AnyAttributeType, SimpleTypeType, RestrictionType, \
         WhiteSpaceType, ListType, EnumerationType, UnionType, \
-        AnyType, \
+        Base64Type, AnyType, \
         AnnotationType, DocumentationType, \
         OtherSimpleTypes
     CurrentNamespacePrefix = nameSpace
@@ -252,13 +252,13 @@ def set_type_constants(nameSpace):
     StringType = (nameSpace + 'string',
         nameSpace + 'duration',
         nameSpace + 'anyURI',
-        nameSpace + 'base64Binary',
         nameSpace + 'normalizedString',
         nameSpace + 'NMTOKEN',
         nameSpace + 'ID',
         nameSpace + 'Name',
         nameSpace + 'language',
         )
+    Base64Type = nameSpace + 'base64Binary'
     TokenType = nameSpace + 'token'
     NameType = nameSpace + 'Name'
     NCNameType = nameSpace + 'NCName'
@@ -1004,6 +1004,7 @@ class XschemaAttribute:
                 typeObjType == DateTimeType or \
                 typeObjType == TimeType or \
                 typeObjType == DateType or \
+                typeObjType == Base64Type or \
                 typeObjType in IntegerType or \
                 typeObjType == DecimalType or \
                 typeObjType == PositiveIntegerType or \
@@ -1196,6 +1197,7 @@ class XschemaHandler(handler.ContentHandler):
                     extensionBase == DateTimeType or \
                     extensionBase == TimeType or \
                     extensionBase == DateType or \
+                    extensionBase == Base64Type or \
                     extensionBase in IntegerType or \
                     extensionBase == DecimalType or \
                     extensionBase == PositiveIntegerType or \
@@ -1489,6 +1491,12 @@ def generateExportFn_1(wrt, child, name, namespace, fill):
             s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% (namespace_, self.gds_format_double(self.%s, input_name='%s'), namespace_, eol_))\n" % \
                 (fill, name, name, mappedName, name, )
         wrt(s1)
+    elif child_type == Base64Type:
+        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
+        s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% (namespace_, self.gds_format_base64(self.%s, input_name='%s'), namespace_, eol_))\n" % \
+            (fill, name, name, mappedName, name, )
+        wrt(s1)
     else:
         wrt("%s        if self.%s is not None:\n" % (fill, mappedName))
         # name_type_problem
@@ -1557,6 +1565,11 @@ def generateExportFn_2(wrt, child, name, namespace, fill):
             s1 = "%s        outfile.write('<%%s%s>%%s</%%s%s>%%s' %% (namespace_, self.gds_format_double(%s_, input_name='%s'), namespace_, eol_))\n" % \
                 (fill, name, name, cleanName, name, )
         wrt(s1)
+    elif child_type == Base64Type:
+        wrt('%s        showIndent(outfile, level, pretty_print)\n' % fill)
+        s1 = "%s        outfile.write('<%%s%s>%%s</%%s%s>%%s' %% (namespace_, self.gds_format_base64(%s_, input_name='%s'), namespace_, eol_))\n" % \
+            (fill, name, name, cleanName, name, )
+        wrt(s1)
     else:
         # name_type_problem
         if False:        # name == child.getType():
@@ -1634,6 +1647,12 @@ def generateExportFn_3(wrt, child, name, namespace, fill):
             s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% (namespace_, self.gds_format_double(self.%s, input_name='%s'), namespace_, eol_))\n" % \
                 (fill, name, name, mappedName, name, )
         wrt(s1)
+    elif child_type == Base64Type:
+        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
+        s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% (namespace_, self.gds_format_base64(self.%s, input_name='%s'), namespace_, eol_))\n" % \
+            (fill, name, name, mappedName, name, )
+        wrt(s1)
     else:
         wrt("%s        if self.%s is not None:\n" % (fill, mappedName))
         # name_type_problem
@@ -2313,6 +2332,18 @@ def generateBuildMixed_1(wrt, prefix, child, headChild, keyword, delayed):
         wrt("                MixedContainer.TypeFloat, '%s', fval_)\n" % \
             origName)
         wrt("            self.content_.append(obj_)\n")
+    elif childType == Base64Type:
+        wrt("        %s nodeName_ == '%s' and child_.text is not None:\n" % (
+            keyword, origName, ))
+        wrt("            sval_ = child_.text\n")
+        wrt("            try:\n")
+        wrt("                bval_ = base64.b64decode(sval_)\n")
+        wrt("            except (TypeError, ValueError), exp:\n")
+        wrt("                raise_parse_error(child_, 'requires base64 encoded string: %s' % exp)\n")
+        wrt("            obj_ = self.mixedclass_(MixedContainer.CategorySimple,\n")
+        wrt("                MixedContainer.TypeBase64, '%s', bval_)\n" % \
+            origName)
+        wrt("            self.content_.append(obj_)\n")
     else:
         # Perhaps it's a complexType that is defined right here.
         # Generate (later) a class for the nested types.
@@ -2485,6 +2516,19 @@ def generateBuildStandard_1(wrt, prefix, child, headChild,
             wrt("            self.%s.append(fval_)\n" % (mappedName, ))
         else:
             wrt("            self.%s = fval_\n" % (mappedName, ))
+    elif childType == Base64Type:
+        wrt("        %s nodeName_ == '%s':\n" % (keyword, origName, ))
+        wrt("            sval_ = child_.text\n")
+        wrt("            try:\n")
+        wrt("                bval_ = base64.b64decode(sval_)\n")
+        wrt("            except (TypeError, ValueError), exp:\n")
+        wrt("                raise_parse_error(child_, 'requires base64 encoded string: %s' % exp)\n")
+        wrt("            fval_ = self.gds_validate_base64(bval_, node, '%s')\n" % (
+            name, ))
+        if child.getMaxOccurs() > 1:
+            wrt("            self.%s.append(bval_)\n" % (mappedName, ))
+        else:
+            wrt("            self.%s = bval_\n" % (mappedName, ))
     else:
         # Perhaps it's a complexType that is defined right here.
         # Generate (later) a class for the nested types.
@@ -3277,6 +3321,7 @@ TEMPLATE_HEADER = """\
 import sys
 import getopt
 import re as re_
+import base64
 
 etree_ = None
 Verbose_import_ = False
@@ -3346,6 +3391,10 @@ except ImportError, exp:
             return input_data
         def gds_validate_string(self, input_data, node, input_name=''):
             return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node, input_name=''):
+            return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%%d' %% input_data
         def gds_validate_integer(self, input_data, node, input_name=''):
@@ -3555,6 +3604,7 @@ class MixedContainer:
     TypeDecimal = 5
     TypeDouble = 6
     TypeBoolean = 7
+    TypeBase64 = 8
     def __init__(self, category, content_type, name, value):
         self.category = category
         self.content_type = content_type
@@ -3588,6 +3638,8 @@ class MixedContainer:
             outfile.write('<%%s>%%f</%%s>' %% (self.name, self.value, self.name))
         elif self.content_type == MixedContainer.TypeDouble:
             outfile.write('<%%s>%%g</%%s>' %% (self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%%s>%%s</%%s>' %% (self.name, base64.b64encode(self.value), self.name))
     def exportLiteral(self, outfile, level, name, pretty_print):
         if self.category == MixedContainer.CategoryText:
             showIndent(outfile, level, pretty_print)
-- 
1.7.1

