buildframework/helium/sf/python/pythoncore/lib/iadinfo.py
changeset 628 7c4a911dc066
parent 588 c7c26511138f
equal deleted inserted replaced
588:c7c26511138f 628:7c4a911dc066
     1 #============================================================================ 
     1 #============================================================================ 
     2 #Name        : iadinfo.py 
     2 #Name       : iadinfo.py 
     3 #Part of     : Helium 
     3 #Part of    : Helium 
     4 
     4 
     5 #Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
     5 #Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
     6 #All rights reserved.
     6 #All rights reserved.
     7 #This component and the accompanying materials are made available
     7 #This component and the accompanying materials are made available
     8 #under the terms of the License "Eclipse Public License v1.0"
     8 #under the terms of the License "Eclipse Public License v1.0"
    22 import struct
    22 import struct
    23 import zlib
    23 import zlib
    24 
    24 
    25 PyASN1Availabe = True
    25 PyASN1Availabe = True
    26 
    26 
    27 try :
    27 try:
    28     from pyasn1.codec.der import decoder
    28     from pyasn1.codec.der import decoder
    29     from pyasn1.type import base
    29     from pyasn1.type import base
    30 except ImportError:
    30 except ImportError:
    31     PyASN1Availabe = False
    31     PyASN1Availabe = False
    32 
    32 
    33 def _findItem(item, itemParent, index, objectIdentifier) :
    33 def _findItem(item, itemParent, index, objectIdentifier):
    34     """find Item"""
    34     """find Item"""
    35     if isinstance(item, base.AbstractSimpleAsn1Item) :
    35     if isinstance(item, base.AbstractSimpleAsn1Item):
    36         if item == objectIdentifier :
    36         if item == objectIdentifier:
    37             return itemParent[index + 1]
    37             return itemParent[index + 1]
    38     else:
    38     else:
    39         for i_item in range(len(item)) :
    39         for i_item in range(len(item)):
    40             found = _findItem(item[i_item], item, i_item, objectIdentifier)
    40             found = _findItem(item[i_item], item, i_item, objectIdentifier)
    41             if found: 
    41             if found: 
    42                 return found
    42                 return found
    43 
    43 
    44 def findItem(decodedCert, objectIdentifier) :
    44 def findItem(decodedCert, objectIdentifier):
    45     """find item"""
    45     """find item"""
    46     return _findItem(decodedCert, None, 0, objectIdentifier)
    46     return _findItem(decodedCert, None, 0, objectIdentifier)
    47 
    47 
    48 
    48 
    49 class CertificateOrganization :
    49 class CertificateOrganization:
    50     """ This class holds organisation details of certificate issuer or signer """
    50     """ This class holds organisation details of certificate issuer or signer """
    51     def __init__(self) :
    51     def __init__(self):
    52         pass
    52         self.commonName = None
    53     
    53         self.countryCode = None
    54     def parse(self, decodedCert) :
    54         self.locality = None
       
    55         self.state = None
       
    56         self.street = None
       
    57         self.organization = None
       
    58         
       
    59     def parse(self, decodedCert):
    55         """parse certificate Organisation"""
    60         """parse certificate Organisation"""
    56         self.commonName = findItem(decodedCert, (2, 5, 4, 3))
    61         self.commonName = findItem(decodedCert, (2, 5, 4, 3))
    57         self.countryCode = findItem(decodedCert, (2, 5, 4, 6))
    62         self.countryCode = findItem(decodedCert, (2, 5, 4, 6))
    58         self.locality = findItem(decodedCert, (2, 5, 4, 7))
    63         self.locality = findItem(decodedCert, (2, 5, 4, 7))
    59         self.state = findItem(decodedCert, (2, 5, 4, 8))
    64         self.state = findItem(decodedCert, (2, 5, 4, 8))
    60         self.street = findItem(decodedCert, (2, 5, 4, 9))
    65         self.street = findItem(decodedCert, (2, 5, 4, 9))
    61         self.organization = findItem(decodedCert, (2, 5, 4, 10))
    66         self.organization = findItem(decodedCert, (2, 5, 4, 10))
    62 
    67 
    63     def readableStr(self) :
    68     def readableStr(self):
    64         """readable String"""
    69         """readable String"""
    65         buf = ""
    70         buf = ""
    66         if self.commonName :
    71         if self.commonName:
    67             buf += self.commonName.prettyPrint() + "\n"
    72             buf += self.commonName.prettyPrint() + "\n"
    68         if self.countryCode :
    73         if self.countryCode:
    69             buf += self.countryCode.prettyPrint() + "\n"
    74             buf += self.countryCode.prettyPrint() + "\n"
    70         if self.locality :
    75         if self.locality:
    71             buf += self.locality.prettyPrint() + "\n"
    76             buf += self.locality.prettyPrint() + "\n"
    72         if self.state :
    77         if self.state:
    73             buf += self.state.prettyPrint() + "\n"
    78             buf += self.state.prettyPrint() + "\n"
    74         if self.street :
    79         if self.street:
    75             buf += self.street.prettyPrint() + "\n"
    80             buf += self.street.prettyPrint() + "\n"
    76         if self.organization :
    81         if self.organization:
    77             buf += self.organization.prettyPrint()
    82             buf += self.organization.prettyPrint()
    78         return buf
    83         return buf
    79 
    84 
    80 class CertificateInfo :
    85 class CertificateInfo:
    81     """ This class holds certificate information such as certificate signer and issuer """
    86     """ This class holds certificate information such as certificate signer and issuer """
    82     def __init__(self) :
    87     def __init__(self):
    83         pass
    88         self.issuer = None
    84         
    89         self.signer = None
    85     def parse(self, decodedCert) :
    90         
       
    91     def parse(self, decodedCert):
    86         """parse"""
    92         """parse"""
    87         self.issuer = CertificateOrganization()
    93         self.issuer = CertificateOrganization()
    88         self.issuer.parse(decodedCert[0][3])
    94         self.issuer.parse(decodedCert[0][3])
    89         
    95         
    90         self.signer = CertificateOrganization()
    96         self.signer = CertificateOrganization()
    91         self.signer.parse(decodedCert[0][5])
    97         self.signer.parse(decodedCert[0][5])
    92         
    98         
    93     def readableStr(self) :
    99     def readableStr(self):
    94         """readable String"""
   100         """readable String"""
    95         buf = "Signer:\n      " + "\n      ".join(self.signer.readableStr().split('\n')) + "\n"
   101         buf = "Signer:\n      " + "\n      ".join(self.signer.readableStr().split('\n')) + "\n"
    96         buf += "Issuer:\n      " + "\n      ".join(self.issuer.readableStr().split('\n')) + "\n"
   102         buf += "Issuer:\n      " + "\n      ".join(self.issuer.readableStr().split('\n')) + "\n"
    97         return buf
   103         return buf
    98 
   104 
    99 
   105 
   100 class SISFileHeader :
   106 class SISFileHeader:
   101     """ Class SIS File header """
   107     """ Class SIS File header """
   102     def __init__(self) :
   108     def __init__(self):
   103         self.uid1 = 0
   109         self.uid1 = 0
   104         self.uid2 = 0
   110         self.uid2 = 0
   105         self.uid3 = 0
   111         self.uid3 = 0
   106         self.uidChecksum = 0
   112         self.uidChecksum = 0
   107 
   113 
   108 class SISField :
   114 class SISField:
   109     """ Class SIS Field """
   115     """ Class SIS Field """
   110     def __init__(self) :
   116     def __init__(self):
   111         self.type = 0
   117         self.type_ = 0
   112         self.length = None
   118         self.length = None
   113         self.subFields = []
   119         self.subFields = []
   114         
   120         
   115     def readFieldLength(self, fileReader) :
   121     def readFieldLength(self, fileReader):
   116         """read Field Length"""
   122         """read Field Length"""
   117         length = fileReader.readBytesAsUint(4)
   123         length = fileReader.readBytesAsUint(4)
   118         if length & 0x80000000 > 0 :
   124         if length & 0x80000000 > 0:
   119             length = length << 32
   125             length = length << 32
   120             length |= fileReader.readBytesAsUint(4)
   126             length |= fileReader.readBytesAsUint(4)
   121         return length
   127         return length
   122         
   128         
   123     def findField(self, fieldType, startIndex=0) :
   129     def findField(self, fieldType, startIndex=0):
   124         """find Field"""
   130         """find Field"""
   125         result = None
   131         result = None
   126         index = startIndex
   132         index = startIndex
   127         
   133         
   128         for field in self.subFields[startIndex:] :
   134         for field in self.subFields[startIndex:]:
   129             if field.type == fieldType :
   135             if field.type_ == fieldType:
   130                 result = field
   136                 result = field
   131                 break
   137                 break
   132             ++ index
   138             index = index + 1
   133         return (result, index)
   139         return (result, index)
   134         
   140         
   135     def readableStr(self) :
   141     def readableStr(self):
   136         """readable String"""
   142         """readable String"""
   137         return ""
   143         return ""
   138     
   144     
   139     def traverse(self, handler, depth=0) :
   145     def traverse(self, handler, depth=0):
   140         """ traverse"""
   146         """ traverse"""
   141         handler.handleField(self, depth)
   147         handler.handleField(self, depth)
   142         for field in self.subFields :
   148         for field in self.subFields:
   143             field.traverse(handler, depth + 1)
   149             field.traverse(handler, depth + 1)
   144         
   150         
   145 class SISUnsupportedField(SISField) :
   151 class SISUnsupportedField(SISField):
   146     """ Class SIS UnsupportedField """
   152     """ Class SIS UnsupportedField """
   147     def __init__(self) :
   153     def __init__(self):
   148         SISField.__init__(self)
   154         SISField.__init__(self)
   149         
   155         
   150     def initFromFile(self, fileReader) :
   156     def initFromFile(self, fileReader):
   151         """initialisation From File"""
   157         """initialisation From File"""
   152         self.length = self.readFieldLength(fileReader)
   158         self.length = self.readFieldLength(fileReader)
   153         fileReader.readPlainBytes(self.length)
   159         fileReader.readPlainBytes(self.length)
   154 
   160 
   155 class SISStringField(SISField) :
   161 class SISStringField(SISField):
   156     """ Class SIS StringField """
   162     """ Class SIS StringField """
   157     def __init__(self) :
   163     def __init__(self):
   158         SISField.__init__(self)
   164         SISField.__init__(self)
   159         self.data = None
   165         self.data = None
   160         
   166         
   161     def initFromFile(self, fileReader) :
   167     def initFromFile(self, fileReader):
   162         """initialise From File"""
   168         """initialise From File"""
   163         self.length = self.readFieldLength(fileReader)
   169         self.length = self.readFieldLength(fileReader)
   164         buf = fileReader.readPlainBytes(self.length)
   170         buf = fileReader.readPlainBytes(self.length)
   165         self.data = u""
   171         self.data = u""
   166         while len(buf) > 0 :
   172         while len(buf) > 0:
   167             temp = buf[:2]
   173             temp = buf[:2]
   168             buf = buf[2:]
   174             buf = buf[2:]
   169             self.data += unichr(ord(temp[0]) | ord(temp[1]) << 8)
   175             self.data += unichr(ord(temp[0]) | ord(temp[1]) << 8)
   170         
   176         
   171     def readableStr(self) :
   177     def readableStr(self):
   172         """readable String"""
   178         """readable String"""
   173         return self.data
   179         return self.data
   174         
   180         
   175 class SISArrayField(SISField) :
   181 class SISArrayField(SISField):
   176     """ Class SIS ArrayField """
   182     """ Class SIS ArrayField """
   177     def __init__(self) :
   183     def __init__(self):
   178         SISField.__init__(self)
   184         SISField.__init__(self)
   179         
   185         
   180     def initFromFile(self, fileReader) :
   186     def initFromFile(self, fileReader):
   181         """initialise From File"""
   187         """initialise From File"""
   182         self.length = self.readFieldLength(fileReader)
   188         self.length = self.readFieldLength(fileReader)
   183         type = fileReader.readBytesAsInt(4)
   189         type_ = fileReader.readBytesAsInt(4)
   184         l_len = self.length - 4
   190         l_len = self.length - 4
   185         while l_len > 0 :
   191         while l_len > 0:
   186             field = SISFieldTypes[type]()
   192             field = SISFieldTypes[type_]()
   187             field.type = type
   193             field.type_ = type_
   188             field.initFromFile(fileReader)
   194             field.initFromFile(fileReader)
   189             self.subFields.append(field)
   195             self.subFields.append(field)
   190             
   196             
   191             l_len -= field.length + 4 # field length + the length field
   197             l_len -= field.length + 4 # field length + the length field
   192             padding = fileReader.skipPadding()
   198             padding = fileReader.skipPadding()
   193             l_len -= padding
   199             l_len -= padding
   194 
   200 
   195 class SISCompressedField(SISField) :
   201 class SISCompressedField(SISField):
   196     """ Class SIS CompressedField """
   202     """ Class SIS CompressedField """
   197     def __init__(self) :
   203     def __init__(self):
   198         SISField.__init__(self)
   204         SISField.__init__(self)
   199         self.algorithm = None
   205         self.algorithm = None
   200         self.uncompressedDataSize = None
   206         self.uncompressedDataSize = None
   201         self.data = None
   207         self.data = None
   202         
   208         
   203     def initFromFile(self, fileReader) :
   209     def initFromFile(self, fileReader):
   204         """initialise From File"""
   210         """initialise From File"""
   205         self.length = self.readFieldLength(fileReader)
   211         self.length = self.readFieldLength(fileReader)
   206         self.algorithm = fileReader.readBytesAsUint(4)
   212         self.algorithm = fileReader.readBytesAsUint(4)
   207         self.uncompressedDataSize = fileReader.readBytesAsUint(8)
   213         self.uncompressedDataSize = fileReader.readBytesAsUint(8)
   208         data = fileReader.readPlainBytes(self.length - 4 - 8)
   214         data = fileReader.readPlainBytes(self.length - 4 - 8)
   209         if self.algorithm == 0 :
   215         if self.algorithm == 0:
   210             self.data = data
   216             self.data = data
   211         elif self.algorithm == 1 :
   217         elif self.algorithm == 1:
   212             self.data = zlib.decompress(data)
   218             self.data = zlib.decompress(data)
   213             
   219             
   214 class SISVersionField(SISField) :
   220 class SISVersionField(SISField):
   215     """ Class SIS VersionField """
   221     """ Class SIS VersionField """
   216     def __init__(self) :
   222     def __init__(self):
   217         SISField.__init__(self)
   223         SISField.__init__(self)
   218         self.version = (- 1, - 1, - 1)
   224         self.version = (- 1, - 1, - 1)
   219         
   225         
   220     def initFromFile(self, fileReader) :
   226     def initFromFile(self, fileReader):
   221         """initialise From File"""
   227         """initialise From File"""
   222         self.length = self.readFieldLength(fileReader)
   228         self.length = self.readFieldLength(fileReader)
   223         major = fileReader.readBytesAsInt(4)
   229         major = fileReader.readBytesAsInt(4)
   224         minor = fileReader.readBytesAsInt(4)
   230         minor = fileReader.readBytesAsInt(4)
   225         build = fileReader.readBytesAsInt(4)
   231         build = fileReader.readBytesAsInt(4)
   226         self.version = (major, minor, build)
   232         self.version = (major, minor, build)
   227         
   233         
   228     def readableStr(self) :
   234     def readableStr(self):
   229         """readable string"""
   235         """readable string"""
   230         return str(self.version)
   236         return str(self.version)
   231     
   237     
   232 class SISVersionRangeField(SISField) :
   238 class SISVersionRangeField(SISField):
   233     """ Class SIS VersionRangeField """
   239     """ Class SIS VersionRangeField """
   234     def __init__(self) :
   240     def __init__(self):
   235         SISField.__init__(self)
   241         SISField.__init__(self)
   236         self.fromVersion = None
   242         self.fromVersion = None
   237         self.toVersion = None
   243         self.toVersion = None
   238         
   244         
   239     def initFromFile(self, fileReader) :
   245     def initFromFile(self, fileReader):
   240         """initialise From File"""
   246         """initialise From File"""
   241         self.length = self.readFieldLength(fileReader)
   247         self.length = self.readFieldLength(fileReader)
   242         fieldParser = SISFieldParser()
   248         fieldParser = SISFieldParser()
   243         self.fromVersion = fieldParser.parseField(fileReader)
   249         self.fromVersion = fieldParser.parseField(fileReader)
   244         if self.length - fieldParser.lastReadBytes > 0  :
   250         if self.length - fieldParser.lastReadBytes > 0 :
   245             self.toVersion = fieldParser.parseField(fileReader)
   251             self.toVersion = fieldParser.parseField(fileReader)
   246     
   252     
   247 class SISDateField(SISField) :
   253 class SISDateField(SISField):
   248     """ Class SIS DateField """
   254     """ Class SIS DateField """
   249     def __init__(self) :
   255     def __init__(self):
   250         SISField.__init__(self)
   256         SISField.__init__(self)
   251         self.year = None
   257         self.year = None
   252         self.month = None
   258         self.month = None
   253         self.day = None
   259         self.day = None
   254         
   260         
   255     def initFromFile(self, fileReader) :
   261     def initFromFile(self, fileReader):
   256         """initialise from File"""
   262         """initialise from File"""
   257         self.length = self.readFieldLength(fileReader)
   263         self.length = self.readFieldLength(fileReader)
   258         self.year = fileReader.readBytesAsUint(2)
   264         self.year = fileReader.readBytesAsUint(2)
   259         self.month = fileReader.readBytesAsUint(1)
   265         self.month = fileReader.readBytesAsUint(1)
   260         self.day = fileReader.readBytesAsUint(1)
   266         self.day = fileReader.readBytesAsUint(1)
   261     
   267     
   262     def readableStr(self) :
   268     def readableStr(self):
   263         """readable string"""
   269         """readable string"""
   264         return str(self.year) + "." + str(self.month) + "." + str(self.day)
   270         return str(self.year) + "." + str(self.month) + "." + str(self.day)
   265     
   271     
   266 class SISTimeField(SISField) :
   272 class SISTimeField(SISField):
   267     """ Class SIS TimeField """
   273     """ Class SIS TimeField """
   268     def __init__(self) :
   274     def __init__(self):
   269         SISField.__init__(self)
   275         SISField.__init__(self)
   270         self.hours = None
   276         self.hours = None
   271         self.minutes = None
   277         self.minutes = None
   272         self.seconds = None
   278         self.seconds = None
   273         
   279         
   274     def initFromFile(self, fileReader) :
   280     def initFromFile(self, fileReader):
   275         """initialise from File"""
   281         """initialise from File"""
   276         self.length = self.readFieldLength(fileReader)
   282         self.length = self.readFieldLength(fileReader)
   277         self.hours = fileReader.readBytesAsUint(1)
   283         self.hours = fileReader.readBytesAsUint(1)
   278         self.minutes = fileReader.readBytesAsUint(1)
   284         self.minutes = fileReader.readBytesAsUint(1)
   279         self.seconds = fileReader.readBytesAsUint(1)
   285         self.seconds = fileReader.readBytesAsUint(1)
   280     
   286     
   281     def readableStr(self) :
   287     def readableStr(self):
   282         """readable String"""
   288         """readable String"""
   283         return str(self.hours) + ":" + str(self.minutes) + ":" + str(self.seconds)
   289         return str(self.hours) + ":" + str(self.minutes) + ":" + str(self.seconds)
   284     
   290     
   285 class SISDateTimeField(SISField) :
   291 class SISDateTimeField(SISField):
   286     """ Class SIS DateTimeField """
   292     """ Class SIS DateTimeField """
   287     def __init__(self) :
   293     def __init__(self):
   288         SISField.__init__(self)
   294         SISField.__init__(self)
   289         self.date = None
   295         self.date = None
   290         self.time = None
   296         self.time = None
   291         
   297         
   292     def initFromFile(self, fileReader) :
   298     def initFromFile(self, fileReader):
   293         """initialise From File"""
   299         """initialise From File"""
   294         self.length = self.readFieldLength(fileReader)
   300         self.length = self.readFieldLength(fileReader)
   295         fieldParser = SISFieldParser()
   301         fieldParser = SISFieldParser()
   296         self.date = fieldParser.parseField(fileReader)
   302         self.date = fieldParser.parseField(fileReader)
   297         self.time = fieldParser.parseField(fileReader)
   303         self.time = fieldParser.parseField(fileReader)
   298     
   304     
   299 class SISUidField(SISField) :
   305 class SISUidField(SISField):
   300     """ Class SIS UidField """
   306     """ Class SIS UidField """
   301     def __init__(self) :
   307     def __init__(self):
   302         SISField.__init__(self)
   308         SISField.__init__(self)
   303         self.uid = None
   309         self.uid = None
   304         
   310         
   305     def initFromFile(self, fileReader) :
   311     def initFromFile(self, fileReader):
   306         """initialise From File"""
   312         """initialise From File"""
   307         self.length = self.readFieldLength(fileReader)
   313         self.length = self.readFieldLength(fileReader)
   308         self.uid = fileReader.readBytesAsUint(4)
   314         self.uid = fileReader.readBytesAsUint(4)
   309         
   315         
   310     def readableStr(self) :
   316     def readableStr(self):
   311         """readable String"""
   317         """readable String"""
   312         return hex(self.uid)
   318         return hex(self.uid)
   313     
   319     
   314 class SISLanguageField(SISField) :
   320 class SISLanguageField(SISField):
   315     """ Class SIS LanguageField """
   321     """ Class SIS LanguageField """
   316     def __init__(self) :
   322     def __init__(self):
   317         SISField.__init__(self)
   323         SISField.__init__(self)
   318         self.language = None
   324         self.language = None
   319         
   325         
   320     def initFromFile(self, fileReader) :
   326     def initFromFile(self, fileReader):
   321         """initialise From File"""
   327         """initialise From File"""
   322         self.length = self.readFieldLength(fileReader)
   328         self.length = self.readFieldLength(fileReader)
   323         self.language = fileReader.readBytesAsUint(4)
   329         self.language = fileReader.readBytesAsUint(4)
   324         
   330         
   325     def readableStr(self) :
   331     def readableStr(self):
   326         """readable String"""
   332         """readable String"""
   327         return str(self.language)
   333         return str(self.language)
   328     
   334     
   329 class SISContentsField(SISField) :
   335 class SISContentsField(SISField):
   330     """ Class SIS ContentsField """
   336     """ Class SIS ContentsField """
   331     def __init__(self) :
   337     def __init__(self):
   332         SISField.__init__(self)
   338         SISField.__init__(self)
   333         
   339         
   334     def initFromFile(self, fileReader) :
   340     def initFromFile(self, fileReader):
   335         """initialise From File"""
   341         """initialise From File"""
   336         self.length = self.readFieldLength(fileReader)
   342         self.length = self.readFieldLength(fileReader)
   337         fieldParser = SISFieldParser()
   343         fieldParser = SISFieldParser()
   338         field = fieldParser.parseField(fileReader)
   344         field = fieldParser.parseField(fileReader)
   339         while field :
   345         while field:
   340             if field.type == 3 : # compressed<conroller>
   346             if field.type_ == 3: # compressed<conroller>
   341                 bufferReader = SISBufferReader(field.data)
   347                 bufferReader = SISBufferReader(field.data)
   342                 field = fieldParser.parseField(bufferReader)
   348                 field = fieldParser.parseField(bufferReader)
   343             self.subFields.append(field)
   349             self.subFields.append(field)
   344             field = fieldParser.parseField(fileReader)
   350             field = fieldParser.parseField(fileReader)
   345 
   351 
   346 class SISControllerField(SISField) :
   352 class SISControllerField(SISField):
   347     """ Class SIS ControllerField """
   353     """ Class SIS ControllerField """
   348     def __init__(self) :
   354     def __init__(self):
   349         SISField.__init__(self)
   355         SISField.__init__(self)
   350         
   356         
   351     def initFromFile(self, fileReader) :
   357     def initFromFile(self, fileReader):
   352         """initialise From File"""
   358         """initialise From File"""
   353         self.length = self.readFieldLength(fileReader)
   359         self.length = self.readFieldLength(fileReader)
   354         fieldParser = SISFieldParser()
   360         fieldParser = SISFieldParser()
   355         bufferReader = SISBufferReader(fileReader.readPlainBytes(self.length))
   361         bufferReader = SISBufferReader(fileReader.readPlainBytes(self.length))
   356         field = fieldParser.parseField(bufferReader)
   362         field = fieldParser.parseField(bufferReader)
   357         while field :
   363         while field:
   358             self.subFields.append(field)
   364             self.subFields.append(field)
   359             field = fieldParser.parseField(bufferReader)
   365             field = fieldParser.parseField(bufferReader)
   360 
   366 
   361 class SISInfoField(SISField) :
   367 class SISInfoField(SISField):
   362     """ Class SIS InfoField """
   368     """ Class SIS InfoField """
   363     def __init__(self) :
   369     def __init__(self):
   364         SISField.__init__(self)
   370         SISField.__init__(self)
   365         self.installType = None
   371         self.installType = None
   366         self.installFlags = None
   372         self.installFlags = None
   367         
   373         
   368     def initFromFile(self, fileReader) :
   374     def initFromFile(self, fileReader):
   369         """initialise From File"""
   375         """initialise From File"""
   370         self.length = self.readFieldLength(fileReader)
   376         self.length = self.readFieldLength(fileReader)
   371         fieldParser = SISFieldParser()
   377         fieldParser = SISFieldParser()
   372         self.subFields.append(fieldParser.parseField(fileReader)) # UID
   378         self.subFields.append(fieldParser.parseField(fileReader)) # UID
   373         self.subFields.append(fieldParser.parseField(fileReader)) # Vendor name unique
   379         self.subFields.append(fieldParser.parseField(fileReader)) # Vendor name unique
   376         self.subFields.append(fieldParser.parseField(fileReader)) # version
   382         self.subFields.append(fieldParser.parseField(fileReader)) # version
   377         self.subFields.append(fieldParser.parseField(fileReader)) # creation time
   383         self.subFields.append(fieldParser.parseField(fileReader)) # creation time
   378         self.installType = fileReader.readBytesAsUint(1)
   384         self.installType = fileReader.readBytesAsUint(1)
   379         self.installFlags = fileReader.readBytesAsUint(1) 
   385         self.installFlags = fileReader.readBytesAsUint(1) 
   380             
   386             
   381 class SISSupportedLanguagesField(SISField) :
   387 class SISSupportedLanguagesField(SISField):
   382     """ Class SISSupportedLanguagesField """
   388     """ Class SISSupportedLanguagesField """
   383     def __init__(self) :
   389     def __init__(self):
   384         SISField.__init__(self)
   390         SISField.__init__(self)
   385         
   391         
   386     def initFromFile(self, fileReader) :
   392     def initFromFile(self, fileReader):
   387         """initialise From File"""
   393         """initialise From File"""
   388         self.length = self.readFieldLength(fileReader)
   394         self.length = self.readFieldLength(fileReader)
   389         fieldParser = SISFieldParser()
   395         fieldParser = SISFieldParser()
   390         self.subFields.append(fieldParser.parseField(fileReader)) # languages
   396         self.subFields.append(fieldParser.parseField(fileReader)) # languages
   391         
   397         
   392 class SISSupportedOptionsField(SISField) :
   398 class SISSupportedOptionsField(SISField):
   393     """ Class SISSupportedOptionsField """
   399     """ Class SISSupportedOptionsField """
   394     def __init__(self) :
   400     def __init__(self):
   395         SISField.__init__(self)
   401         SISField.__init__(self)
   396         
   402         
   397     def initFromFile(self, fileReader) :
   403     def initFromFile(self, fileReader):
   398         """initialise From File"""
   404         """initialise From File"""
   399         self.length = self.readFieldLength(fileReader)
   405         self.length = self.readFieldLength(fileReader)
   400         fieldParser = SISFieldParser()
   406         fieldParser = SISFieldParser()
   401         self.subFields.append(fieldParser.parseField(fileReader)) # options
   407         self.subFields.append(fieldParser.parseField(fileReader)) # options
   402             
   408             
   403 class SISPrerequisitiesField(SISField) :
   409 class SISPrerequisitiesField(SISField):
   404     """ Class SISPrerequisitiesField """
   410     """ Class SISPrerequisitiesField """
   405     def __init__(self) :
   411     def __init__(self):
   406         SISField.__init__(self)
   412         SISField.__init__(self)
   407         
   413         
   408     def initFromFile(self, fileReader) :
   414     def initFromFile(self, fileReader):
   409         """initialise From File"""
   415         """initialise From File"""
   410         self.length = self.readFieldLength(fileReader)
   416         self.length = self.readFieldLength(fileReader)
   411         fieldParser = SISFieldParser()
   417         fieldParser = SISFieldParser()
   412         self.subFields.append(fieldParser.parseField(fileReader)) # target devices
   418         self.subFields.append(fieldParser.parseField(fileReader)) # target devices
   413         self.subFields.append(fieldParser.parseField(fileReader)) # dependencies
   419         self.subFields.append(fieldParser.parseField(fileReader)) # dependencies
   414         
   420         
   415         
   421         
   416 class SISDependencyField(SISField) :
   422 class SISDependencyField(SISField):
   417     """ Class SISDependencyField """
   423     """ Class SISDependencyField """
   418     def __init__(self) :
   424     def __init__(self):
   419         SISField.__init__(self)
   425         SISField.__init__(self)
   420         
   426         
   421     def initFromFile(self, fileReader) :
   427     def initFromFile(self, fileReader):
   422         """initialise From File"""
   428         """initialise From File"""
   423         self.length = self.readFieldLength(fileReader)
   429         self.length = self.readFieldLength(fileReader)
   424         fieldParser = SISFieldParser()
   430         fieldParser = SISFieldParser()
   425         self.subFields.append(fieldParser.parseField(fileReader)) # UID
   431         self.subFields.append(fieldParser.parseField(fileReader)) # UID
   426         field = fieldParser.parseField(fileReader)
   432         field = fieldParser.parseField(fileReader)
   427         # Version range field is optional
   433         # Version range field is optional
   428         if field.type == VersionRangeField :
   434         if field.type_ == VersionRangeField:
   429             self.subFields.append(field) # version range
   435             self.subFields.append(field) # version range
   430             self.subFields.append(fieldParser.parseField(fileReader)) # dependency names
   436             self.subFields.append(fieldParser.parseField(fileReader)) # dependency names
   431         else :
   437         else:
   432             self.subFields.append(field) # dependency names
   438             self.subFields.append(field) # dependency names
   433     
   439     
   434 class SISPropertiesField(SISField) :
   440 class SISPropertiesField(SISField):
   435     """ Class SISPropertiesField """
   441     """ Class SISPropertiesField """
   436     def __init__(self) :
   442     def __init__(self):
   437         SISField.__init__(self)
   443         SISField.__init__(self)
   438         
   444         
   439     def initFromFile(self, fileReader) :
   445     def initFromFile(self, fileReader):
   440         """initialise From File"""
   446         """initialise From File"""
   441         self.length = self.readFieldLength(fileReader)
   447         self.length = self.readFieldLength(fileReader)
   442         fieldParser = SISFieldParser()
   448         fieldParser = SISFieldParser()
   443         self.subFields.append(fieldParser.parseField(fileReader)) # properties
   449         self.subFields.append(fieldParser.parseField(fileReader)) # properties
   444     
   450     
   445 class SISPropertyField(SISField) :
   451 class SISPropertyField(SISField):
   446     """ Class SISPropertyField """
   452     """ Class SISPropertyField """
   447     def __init__(self) :
   453     def __init__(self):
   448         SISField.__init__(self)
   454         SISField.__init__(self)
   449         self.key = None
   455         self.key = None
   450         self.value = None
   456         self.value = None
   451         
   457         
   452     def initFromFile(self, fileReader) :
   458     def initFromFile(self, fileReader):
   453         """initialise From File"""
   459         """initialise From File"""
   454         self.length = self.readFieldLength(fileReader)
   460         self.length = self.readFieldLength(fileReader)
   455         self.key = fileReader.readBytesAsInt(4)
   461         self.key = fileReader.readBytesAsInt(4)
   456         self.value = fileReader.readBytesAsInt(4)
   462         self.value = fileReader.readBytesAsInt(4)
   457     
   463     
   458 class SISSignaturesField(SISUnsupportedField) :
   464 class SISSignaturesField(SISUnsupportedField):
   459     """ Class SISSignaturesField There is a type for this field, but there is no definition of the field contents"""
   465     """ Class SISSignaturesField There is a type for this field, but there is no definition of the field contents"""
   460     pass
   466     pass
   461     
   467     
   462 class SISCertificateChainField(SISField) :
   468 class SISCertificateChainField(SISField):
   463     """ Class SISCertificateChainField """
   469     """ Class SISCertificateChainField """
   464     def __init__(self) :
   470     def __init__(self):
   465         SISField.__init__(self)
   471         SISField.__init__(self)
   466         
   472         
   467     def initFromFile(self, fileReader) :
   473     def initFromFile(self, fileReader):
   468         """initialise From File"""
   474         """initialise From File"""
   469         self.length = self.readFieldLength(fileReader)
   475         self.length = self.readFieldLength(fileReader)
   470         fieldParser = SISFieldParser()
   476         fieldParser = SISFieldParser()
   471         self.subFields.append(fieldParser.parseField(fileReader)) # certificate data
   477         self.subFields.append(fieldParser.parseField(fileReader)) # certificate data
   472     
   478     
   473 class SISLogoField(SISField) :
   479 class SISLogoField(SISField):
   474     """ Class SISLogoField """
   480     """ Class SISLogoField """
   475     def __init__(self) :
   481     def __init__(self):
   476         SISField.__init__(self)
   482         SISField.__init__(self)
   477 
   483 
   478     def initFromFile(self, fileReader) :
   484     def initFromFile(self, fileReader):
   479         """initialise From File"""
   485         """initialise From File"""
   480         self.length = self.readFieldLength(fileReader)
   486         self.length = self.readFieldLength(fileReader)
   481         fieldParser = SISFieldParser()
   487         fieldParser = SISFieldParser()
   482         self.subFields.append(fieldParser.parseField(fileReader)) # logo file
   488         self.subFields.append(fieldParser.parseField(fileReader)) # logo file
   483     
   489     
   484 class SISFileDescriptionField(SISField) :
   490 class SISFileDescriptionField(SISField):
   485     """ Class SISFileDescriptionField """
   491     """ Class SISFileDescriptionField """
   486     def __init__(self) :
   492     def __init__(self):
   487         SISField.__init__(self)
   493         SISField.__init__(self)
   488         self.operation = None
   494         self.operation = None
   489         self.operationOptions = None
   495         self.operationOptions = None
   490         self.compressedLength = None
   496         self.compressedLength = None
   491         self.uncompressedLength = None
   497         self.uncompressedLength = None
   492         self.fileIndex = None
   498         self.fileIndex = None
   493         
   499         
   494     def initFromFile(self, fileReader) :
   500     def initFromFile(self, fileReader):
   495         """initialise From File"""
   501         """initialise From File"""
   496         self.length = self.readFieldLength(fileReader)
   502         self.length = self.readFieldLength(fileReader)
   497         fieldParser = SISFieldParser()
   503         fieldParser = SISFieldParser()
   498         
   504         
   499         self.subFields.append(fieldParser.parseField(fileReader))
   505         self.subFields.append(fieldParser.parseField(fileReader))
   500         self.subFields.append(fieldParser.parseField(fileReader))
   506         self.subFields.append(fieldParser.parseField(fileReader))
   501         field = fieldParser.parseField(fileReader)
   507         field = fieldParser.parseField(fileReader)
   502         self.subFields.append(field)
   508         self.subFields.append(field)
   503         if field.type == 41 : # read field was capabilities ==> there is one more field left
   509         if field.type_ == 41: # read field was capabilities ==> there is one more field left
   504             self.subFields.append(fieldParser.parseField(fileReader))
   510             self.subFields.append(fieldParser.parseField(fileReader))
   505         
   511         
   506         self.operation = fileReader.readBytesAsUint(4)
   512         self.operation = fileReader.readBytesAsUint(4)
   507         self.operationOptions = fileReader.readBytesAsUint(4)
   513         self.operationOptions = fileReader.readBytesAsUint(4)
   508         self.compressedLength = fileReader.readBytesAsUint(8)
   514         self.compressedLength = fileReader.readBytesAsUint(8)
   509         self.uncompressedLength = fileReader.readBytesAsUint(8)
   515         self.uncompressedLength = fileReader.readBytesAsUint(8)
   510         self.fileIndex = fileReader.readBytesAsUint(4)
   516         self.fileIndex = fileReader.readBytesAsUint(4)
   511         
   517         
   512     def readableStr(self) :
   518     def readableStr(self):
   513         """readable string"""
   519         """readable string"""
   514         return "index: " + str(self.fileIndex)
   520         return "index: " + str(self.fileIndex)
   515     
   521     
   516 class SISHashField(SISField) :
   522 class SISHashField(SISField):
   517     """ Class SISHashField """
   523     """ Class SISHashField """
   518     def __init__(self) :
   524     def __init__(self):
   519         SISField.__init__(self)
   525         SISField.__init__(self)
   520         self.algorithm = None
   526         self.algorithm = None
   521 
   527 
   522     def initFromFile(self, fileReader) :
   528     def initFromFile(self, fileReader):
   523         """initialise From File"""
   529         """initialise From File"""
   524         self.length = self.readFieldLength(fileReader)
   530         self.length = self.readFieldLength(fileReader)
   525         fieldParser = SISFieldParser()
   531         fieldParser = SISFieldParser()
   526         self.algorithm = fileReader.readBytesAsUint(4)
   532         self.algorithm = fileReader.readBytesAsUint(4)
   527         self.subFields.append(fieldParser.parseField(fileReader)) # logo file
   533         self.subFields.append(fieldParser.parseField(fileReader)) # logo file
   528     
   534     
   529 class SISIfField(SISField) :
   535 class SISIfField(SISField):
   530     """ Class SISIfField """
   536     """ Class SISIfField """
   531     def __init__(self) :
   537     def __init__(self):
   532         SISField.__init__(self)
   538         SISField.__init__(self)
   533 
   539 
   534     def initFromFile(self, fileReader) :
   540     def initFromFile(self, fileReader):
   535         """initialise From File"""
   541         """initialise From File"""
   536         self.length = self.readFieldLength(fileReader)
   542         self.length = self.readFieldLength(fileReader)
   537         fieldParser = SISFieldParser()
   543         fieldParser = SISFieldParser()
   538         self.subFields.append(fieldParser.parseField(fileReader)) # expression
   544         self.subFields.append(fieldParser.parseField(fileReader)) # expression
   539         self.subFields.append(fieldParser.parseField(fileReader)) # install block
   545         self.subFields.append(fieldParser.parseField(fileReader)) # install block
   540         self.subFields.append(fieldParser.parseField(fileReader)) # else ifs
   546         self.subFields.append(fieldParser.parseField(fileReader)) # else ifs
   541 
   547 
   542 class SISElseIfField(SISField) :
   548 class SISElseIfField(SISField):
   543     """ Class SISElseIfField """
   549     """ Class SISElseIfField """
   544     def __init__(self) :
   550     def __init__(self):
   545         SISField.__init__(self)
   551         SISField.__init__(self)
   546 
   552 
   547     def initFromFile(self, fileReader) :
   553     def initFromFile(self, fileReader):
   548         """initialise From File"""
   554         """initialise From File"""
   549         self.length = self.readFieldLength(fileReader)
   555         self.length = self.readFieldLength(fileReader)
   550         fieldParser = SISFieldParser()
   556         fieldParser = SISFieldParser()
   551         self.subFields.append(fieldParser.parseField(fileReader)) # expression
   557         self.subFields.append(fieldParser.parseField(fileReader)) # expression
   552         self.subFields.append(fieldParser.parseField(fileReader)) # install block
   558         self.subFields.append(fieldParser.parseField(fileReader)) # install block
   553     
   559     
   554 class SISInstallBlockField(SISField) :
   560 class SISInstallBlockField(SISField):
   555     """ Class SISInstallBlockField """
   561     """ Class SISInstallBlockField """
   556     def __init__(self) :
   562     def __init__(self):
   557         SISField.__init__(self)
   563         SISField.__init__(self)
   558         self.files = None
   564         self.files = None
   559         self.embeddedSISFiles = None
   565         self.embeddedSISFiles = None
   560         self.ifBlocks = None
   566         self.ifBlocks = None
   561         
   567         
   562     def initFromFile(self, fileReader) :
   568     def initFromFile(self, fileReader):
   563         """initialise From File"""
   569         """initialise From File"""
   564         self.length = self.readFieldLength(fileReader)
   570         self.length = self.readFieldLength(fileReader)
   565         fieldParser = SISFieldParser()
   571         fieldParser = SISFieldParser()
   566         self.subFields.append(fieldParser.parseField(fileReader))
   572         self.subFields.append(fieldParser.parseField(fileReader))
   567         self.subFields.append(fieldParser.parseField(fileReader))
   573         self.subFields.append(fieldParser.parseField(fileReader))
   568         self.subFields.append(fieldParser.parseField(fileReader))
   574         self.subFields.append(fieldParser.parseField(fileReader))
   569 
   575 
   570 class SISExpressionField(SISField) :
   576 class SISExpressionField(SISField):
   571     """ Class SISExpressionField """
   577     """ Class SISExpressionField """
   572     def __init__(self) :
   578     def __init__(self):
   573         SISField.__init__(self)
   579         SISField.__init__(self)
   574         self.operator = None
   580         self.operator = None
   575         self.integerValue = None
   581         self.integerValue = None
   576         
   582         
   577     def initFromFile(self, fileReader) :
   583     def initFromFile(self, fileReader):
   578         """initialise From File"""
   584         """initialise From File"""
   579         self.length = self.readFieldLength(fileReader)
   585         self.length = self.readFieldLength(fileReader)
   580         fieldParser = SISFieldParser()
   586         fieldParser = SISFieldParser()
   581         self.operator = fileReader.readBytesAsUint(4)
   587         self.operator = fileReader.readBytesAsUint(4)
   582         self.integerValue = fileReader.readBytesAsInt(4)
   588         self.integerValue = fileReader.readBytesAsInt(4)
   583         
   589         
   584         if self.operator == 10 or self.operator == 13 :
   590         if self.operator == 10 or self.operator == 13:
   585             self.subFields.append(fieldParser.parseField(fileReader))
   591             self.subFields.append(fieldParser.parseField(fileReader))
   586         if self.operator == 1 or self.operator == 2 or self.operator == 3 or self.operator == 4 or self.operator == 5 or self.operator == 6 or self.operator == 7 or self.operator == 8 or self.operator == 11 or self.operator == 12 :
   592         if self.operator == 1 or self.operator == 2 or self.operator == 3 or self.operator == 4 or self.operator == 5 or self.operator == 6 or self.operator == 7 or self.operator == 8 or self.operator == 11 or self.operator == 12:
   587             self.subFields.append(fieldParser.parseField(fileReader))
   593             self.subFields.append(fieldParser.parseField(fileReader))
   588         if not (self.operator == 13 or self.operator == 14 or self.operator == 15 or self.operator == 16 or self.operator == 10) :
   594         if not (self.operator == 13 or self.operator == 14 or self.operator == 15 or self.operator == 16 or self.operator == 10):
   589             self.subFields.append(fieldParser.parseField(fileReader))
   595             self.subFields.append(fieldParser.parseField(fileReader))
   590         
   596         
   591 class SISDataField(SISField) :
   597 class SISDataField(SISField):
   592     """ Class SISDataField """
   598     """ Class SISDataField """
   593     def __init__(self) :
   599     def __init__(self):
   594         SISField.__init__(self)
   600         SISField.__init__(self)
   595         
   601         
   596     def initFromFile(self, fileReader) :
   602     def initFromFile(self, fileReader):
   597         """initialise From File"""
   603         """initialise From File"""
   598         self.length = self.readFieldLength(fileReader)
   604         self.length = self.readFieldLength(fileReader)
   599         fieldParser = SISFieldParser()
   605         fieldParser = SISFieldParser()
   600         self.subFields.append(fieldParser.parseField(fileReader)) # data units
   606         self.subFields.append(fieldParser.parseField(fileReader)) # data units
   601     
   607     
   602 class SISDataUnitField(SISField) :
   608 class SISDataUnitField(SISField):
   603     """ Class SISDataUnitField """
   609     """ Class SISDataUnitField """
   604     def __init__(self) :
   610     def __init__(self):
   605         SISField.__init__(self)
   611         SISField.__init__(self)
   606         
   612         
   607     def initFromFile(self, fileReader) :
   613     def initFromFile(self, fileReader):
   608         """initialise From File"""
   614         """initialise From File"""
   609         self.length = self.readFieldLength(fileReader)
   615         self.length = self.readFieldLength(fileReader)
   610         fieldParser = SISFieldParser()
   616         fieldParser = SISFieldParser()
   611         self.subFields.append(fieldParser.parseField(fileReader)) # file data
   617         self.subFields.append(fieldParser.parseField(fileReader)) # file data
   612     
   618     
   613 class SISFileDataField(SISField) :
   619 class SISFileDataField(SISField):
   614     """ Class SISFileDataField """
   620     """ Class SISFileDataField """
   615     def __init__(self) :
   621     def __init__(self):
   616         SISField.__init__(self)
   622         SISField.__init__(self)
   617         
   623         
   618     def initFromFile(self, fileReader) :
   624     def initFromFile(self, fileReader):
   619         """initialise From File"""
   625         """initialise From File"""
   620         self.length = self.readFieldLength(fileReader)
   626         self.length = self.readFieldLength(fileReader)
   621         fieldParser = SISFieldParser()
   627         fieldParser = SISFieldParser()
   622         self.subFields.append(fieldParser.parseField(fileReader)) # raw file data
   628         self.subFields.append(fieldParser.parseField(fileReader)) # raw file data
   623     
   629     
   624 class SISSupportedOptionField(SISField) :
   630 class SISSupportedOptionField(SISField):
   625     """ Class SISSupportedOptionField """
   631     """ Class SISSupportedOptionField """
   626     def __init__(self) :
   632     def __init__(self):
   627         SISField.__init__(self)
   633         SISField.__init__(self)
   628         
   634         
   629     def initFromFile(self, fileReader) :
   635     def initFromFile(self, fileReader):
   630         """initialise From File"""
   636         """initialise From File"""
   631         self.length = self.readFieldLength(fileReader)
   637         self.length = self.readFieldLength(fileReader)
   632         fieldParser = SISFieldParser()
   638         fieldParser = SISFieldParser()
   633         self.subFields.append(fieldParser.parseField(fileReader)) # names
   639         self.subFields.append(fieldParser.parseField(fileReader)) # names
   634     
   640     
   635 class SISControllerChecksumField(SISField) :
   641 class SISControllerChecksumField(SISField):
   636     """ Class SISControllerChecksumField """
   642     """ Class SISControllerChecksumField """
   637     def __init__(self) :
   643     def __init__(self):
   638         SISField.__init__(self)
   644         SISField.__init__(self)
   639         self.checksum = None
   645         self.checksum = None
   640         
   646         
   641     def initFromFile(self, fileReader) :
   647     def initFromFile(self, fileReader):
   642         """initialise From File"""
   648         """initialise From File"""
   643         self.length = self.readFieldLength(fileReader)
   649         self.length = self.readFieldLength(fileReader)
   644         self.checksum = fileReader.readBytesAsUint(2)
   650         self.checksum = fileReader.readBytesAsUint(2)
   645     
   651     
   646 class SISDataChecksumField(SISField) :
   652 class SISDataChecksumField(SISField):
   647     """ Class SISDataChecksumField """
   653     """ Class SISDataChecksumField """
   648     def __init__(self) :
   654     def __init__(self):
   649         SISField.__init__(self)
   655         SISField.__init__(self)
   650         self.checksum = None
   656         self.checksum = None
   651         
   657         
   652     def initFromFile(self, fileReader) :
   658     def initFromFile(self, fileReader):
   653         """initialise From File"""
   659         """initialise From File"""
   654         self.length = self.readFieldLength(fileReader)
   660         self.length = self.readFieldLength(fileReader)
   655         self.checksum = fileReader.readBytesAsUint(2)
   661         self.checksum = fileReader.readBytesAsUint(2)
   656     
   662     
   657 class SISSignatureField(SISField) :
   663 class SISSignatureField(SISField):
   658     """ Class SISSignatureField """
   664     """ Class SISSignatureField """
   659     def __init__(self) :
   665     def __init__(self):
   660         SISField.__init__(self)
   666         SISField.__init__(self)
   661         
   667         
   662     def initFromFile(self, fileReader) :
   668     def initFromFile(self, fileReader):
   663         """initialise From File"""
   669         """initialise From File"""
   664         self.length = self.readFieldLength(fileReader)
   670         self.length = self.readFieldLength(fileReader)
   665         fieldParser = SISFieldParser()
   671         fieldParser = SISFieldParser()
   666         self.subFields.append(fieldParser.parseField(fileReader)) # signature algorithm
   672         self.subFields.append(fieldParser.parseField(fileReader)) # signature algorithm
   667         self.subFields.append(fieldParser.parseField(fileReader)) # signature data
   673         self.subFields.append(fieldParser.parseField(fileReader)) # signature data
   668     
   674     
   669 class SISBlobField(SISField) :
   675 class SISBlobField(SISField):
   670     """ Class SISBlobField """ 
   676     """ Class SISBlobField """ 
   671     def __init__(self) :
   677     def __init__(self):
   672         SISField.__init__(self)
   678         SISField.__init__(self)
   673         self.data = None
   679         self.data = None
   674         
   680         
   675     def initFromFile(self, fileReader) :
   681     def initFromFile(self, fileReader):
   676         """initialise From File"""
   682         """initialise From File"""
   677         self.length = self.readFieldLength(fileReader)
   683         self.length = self.readFieldLength(fileReader)
   678         self.data = fileReader.readPlainBytes(self.length)
   684         self.data = fileReader.readPlainBytes(self.length)
   679     
   685     
   680 class SISSignatureAlgorithmField(SISField) :
   686 class SISSignatureAlgorithmField(SISField):
   681     """ Class SISSignatureAlgorithmField """
   687     """ Class SISSignatureAlgorithmField """
   682     def __init__(self) :
   688     def __init__(self):
   683         SISField.__init__(self)
   689         SISField.__init__(self)
   684         
   690         
   685     def initFromFile(self, fileReader) :
   691     def initFromFile(self, fileReader):
   686         """initialise From File"""
   692         """initialise From File"""
   687         self.length = self.readFieldLength(fileReader)
   693         self.length = self.readFieldLength(fileReader)
   688         fieldParser = SISFieldParser()
   694         fieldParser = SISFieldParser()
   689         self.subFields.append(fieldParser.parseField(fileReader)) # algorithm identifier
   695         self.subFields.append(fieldParser.parseField(fileReader)) # algorithm identifier
   690     
   696     
   691 class SISSignatureCertificateChainField(SISField) :
   697 class SISSignatureCertificateChainField(SISField):
   692     """ Class SISSignatureCertificateChainField """
   698     """ Class SISSignatureCertificateChainField """
   693     def __init__(self) :
   699     def __init__(self):
   694         SISField.__init__(self)
   700         SISField.__init__(self)
   695         
   701         
   696     def initFromFile(self, fileReader) :
   702     def initFromFile(self, fileReader):
   697         """initialise From File"""
   703         """initialise From File"""
   698         self.length = self.readFieldLength(fileReader)
   704         self.length = self.readFieldLength(fileReader)
   699         fieldParser = SISFieldParser()
   705         fieldParser = SISFieldParser()
   700         self.subFields.append(fieldParser.parseField(fileReader)) # signatures
   706         self.subFields.append(fieldParser.parseField(fileReader)) # signatures
   701         self.subFields.append(fieldParser.parseField(fileReader)) # certificate chain
   707         self.subFields.append(fieldParser.parseField(fileReader)) # certificate chain
   702     
   708     
   703 class SISDataIndexField(SISField) :
   709 class SISDataIndexField(SISField):
   704     """ Class SISDataIndexField """
   710     """ Class SISDataIndexField """
   705     def __init__(self) :
   711     def __init__(self):
   706         SISField.__init__(self)
   712         SISField.__init__(self)
   707         self.dataIndex = None
   713         self.dataIndex = None
   708         
   714         
   709     def initFromFile(self, fileReader) :
   715     def initFromFile(self, fileReader):
   710         """initialise From File"""
   716         """initialise From File"""
   711         self.length = self.readFieldLength(fileReader)
   717         self.length = self.readFieldLength(fileReader)
   712         self.dataIndex = fileReader.readBytesAsUint(4)
   718         self.dataIndex = fileReader.readBytesAsUint(4)
   713 
   719 
   714 class SISCapabilitiesField(SISField) :
   720 class SISCapabilitiesField(SISField):
   715     """ Class SISCapabilitiesField """
   721     """ Class SISCapabilitiesField """
   716     def __init__(self) :
   722     def __init__(self):
   717         SISField.__init__(self)
   723         SISField.__init__(self)
   718         self.capabilities = 0
   724         self.capabilities = 0
   719         self.readableCaps = []
   725         self.readableCaps = []
   720         
   726         
   721     def initFromFile(self, fileReader) :
   727     def initFromFile(self, fileReader):
   722         """initialise From File"""
   728         """initialise From File"""
   723         self.length = self.readFieldLength(fileReader)
   729         self.length = self.readFieldLength(fileReader)
   724         self.capabilities = fileReader.readBytesAsUint(self.length)
   730         self.capabilities = fileReader.readBytesAsUint(self.length)
   725         
   731         
   726         for i in range(20) :
   732         for i in range(20):
   727             if (self.capabilities >> i) & 0x01 :
   733             if (self.capabilities >> i) & 0x01:
   728                 self.readableCaps.append(CapabilityNames[i])
   734                 self.readableCaps.append(CapabilityNames[i])
   729                 
   735                 
   730     def readableStr(self) :
   736     def readableStr(self):
   731         """readable string"""
   737         """readable string"""
   732         return " ".join(self.readableCaps)
   738         return " ".join(self.readableCaps)
   733     
   739     
   734 SISFieldTypes = { 
   740 SISFieldTypes = { 
   735     1 : SISStringField,
   741     1: SISStringField,
   736     2 : SISArrayField,
   742     2: SISArrayField,
   737     3 : SISCompressedField,
   743     3: SISCompressedField,
   738     4 : SISVersionField,
   744     4: SISVersionField,
   739     5 : SISVersionRangeField,
   745     5: SISVersionRangeField,
   740     6 : SISDateField,
   746     6: SISDateField,
   741     7 : SISTimeField,
   747     7: SISTimeField,
   742     8 : SISDateTimeField,
   748     8: SISDateTimeField,
   743     9 : SISUidField,
   749     9: SISUidField,
   744     10 : SISUnsupportedField,
   750     10: SISUnsupportedField,
   745     11 : SISLanguageField,
   751     11: SISLanguageField,
   746     12 : SISContentsField,
   752     12: SISContentsField,
   747     13 : SISControllerField,
   753     13: SISControllerField,
   748     14 : SISInfoField,
   754     14: SISInfoField,
   749     15 : SISSupportedLanguagesField,
   755     15: SISSupportedLanguagesField,
   750     16 : SISSupportedOptionsField,
   756     16: SISSupportedOptionsField,
   751     17 : SISPrerequisitiesField,
   757     17: SISPrerequisitiesField,
   752     18 : SISDependencyField,
   758     18: SISDependencyField,
   753     19 : SISPropertiesField,
   759     19: SISPropertiesField,
   754     20 : SISPropertyField,
   760     20: SISPropertyField,
   755     21 : SISSignaturesField,
   761     21: SISSignaturesField,
   756     22 : SISCertificateChainField,
   762     22: SISCertificateChainField,
   757     23 : SISLogoField,
   763     23: SISLogoField,
   758     24 : SISFileDescriptionField,
   764     24: SISFileDescriptionField,
   759     25 : SISHashField,
   765     25: SISHashField,
   760     26 : SISIfField,
   766     26: SISIfField,
   761     27 : SISElseIfField,
   767     27: SISElseIfField,
   762     28 : SISInstallBlockField,
   768     28: SISInstallBlockField,
   763     29 : SISExpressionField,
   769     29: SISExpressionField,
   764     30 : SISDataField,
   770     30: SISDataField,
   765     31 : SISDataUnitField,
   771     31: SISDataUnitField,
   766     32 : SISFileDataField,
   772     32: SISFileDataField,
   767     33 : SISSupportedOptionField,
   773     33: SISSupportedOptionField,
   768     34 : SISControllerChecksumField,
   774     34: SISControllerChecksumField,
   769     35 : SISDataChecksumField,
   775     35: SISDataChecksumField,
   770     36 : SISSignatureField,
   776     36: SISSignatureField,
   771     37 : SISBlobField,
   777     37: SISBlobField,
   772     38 : SISSignatureAlgorithmField,
   778     38: SISSignatureAlgorithmField,
   773     39 : SISSignatureCertificateChainField,
   779     39: SISSignatureCertificateChainField,
   774     40 : SISDataIndexField,
   780     40: SISDataIndexField,
   775     41 : SISCapabilitiesField
   781     41: SISCapabilitiesField
   776     }
   782     }
   777 
   783 
   778 [StringField,
   784 [StringField,
   779  ArrayField,
   785  ArrayField,
   780  CompressedField,
   786  CompressedField,
   816  SignatureCertificateChainField,
   822  SignatureCertificateChainField,
   817  DataIndexField,
   823  DataIndexField,
   818  CapabilitiesField] = range(1, 42)
   824  CapabilitiesField] = range(1, 42)
   819      
   825      
   820 FieldNames = {
   826 FieldNames = {
   821  0 : "ROOT",
   827  0: "ROOT",
   822  StringField : "StringField",
   828  StringField: "StringField",
   823  ArrayField : "ArrayField",
   829  ArrayField: "ArrayField",
   824  CompressedField : "CompressedField",
   830  CompressedField: "CompressedField",
   825  VersionField : "VersionField",
   831  VersionField: "VersionField",
   826  VersionRangeField : "VersionRangeField",
   832  VersionRangeField: "VersionRangeField",
   827  DateField : "DateField",
   833  DateField: "DateField",
   828  TimeField : "TimeField",
   834  TimeField: "TimeField",
   829  DateTimeField : "DateTimeField",
   835  DateTimeField: "DateTimeField",
   830  UidField : "UidField",
   836  UidField: "UidField",
   831  UnusedField : "UnusedField",
   837  UnusedField: "UnusedField",
   832  LanguageField : "LanguageField",
   838  LanguageField: "LanguageField",
   833  ContentsField : "ContentsField",
   839  ContentsField: "ContentsField",
   834  ControllerField : "ControllerField",
   840  ControllerField: "ControllerField",
   835  InfoField : "InfoField",
   841  InfoField: "InfoField",
   836  SupportedLanguagesField : "SupportedLanguagesField",
   842  SupportedLanguagesField: "SupportedLanguagesField",
   837  SupportedOptionsField : "SupportedOptionsField",
   843  SupportedOptionsField: "SupportedOptionsField",
   838  PrerequisitiesField : "PrerequisitiesField",
   844  PrerequisitiesField: "PrerequisitiesField",
   839  DependencyField : "DependencyField",
   845  DependencyField: "DependencyField",
   840  PropertiesField : "PropertiesField",
   846  PropertiesField: "PropertiesField",
   841  PropertyField : "PropertyField",
   847  PropertyField: "PropertyField",
   842  SignaturesField : "SignaturesField",
   848  SignaturesField: "SignaturesField",
   843  CertificateChainField : "CertificateChainField",
   849  CertificateChainField: "CertificateChainField",
   844  LogoField : "LogoField",
   850  LogoField: "LogoField",
   845  FileDescriptionField : "FileDescriptionField",
   851  FileDescriptionField: "FileDescriptionField",
   846  HashField : "HashField",
   852  HashField: "HashField",
   847  IfField : "IfField",
   853  IfField: "IfField",
   848  ElseIfField : "ElseIfField",
   854  ElseIfField: "ElseIfField",
   849  InstallBlockField : "InstallBlockField",
   855  InstallBlockField: "InstallBlockField",
   850  ExpressionField : "ExpressionField",
   856  ExpressionField: "ExpressionField",
   851  DataField : "DataField",
   857  DataField: "DataField",
   852  DataUnitField : "DataUnitField",
   858  DataUnitField: "DataUnitField",
   853  FileDataField : "FileDataField",
   859  FileDataField: "FileDataField",
   854  SupportedOptionField : "SupportedOptionField",
   860  SupportedOptionField: "SupportedOptionField",
   855  ControllerChecksumField : "ControllerChecksumField",
   861  ControllerChecksumField: "ControllerChecksumField",
   856  DataChecksumField : "DataChecksumField",
   862  DataChecksumField: "DataChecksumField",
   857  SignatureField : "SignatureField",
   863  SignatureField: "SignatureField",
   858  BlobField : "BlobField",
   864  BlobField: "BlobField",
   859  SignatureAlgorithmField : "SignatureAlgorithmField",
   865  SignatureAlgorithmField: "SignatureAlgorithmField",
   860  SignatureCertificateChainField : "SignatureCertificateChainField",
   866  SignatureCertificateChainField: "SignatureCertificateChainField",
   861  DataIndexField : "DataIndexField",
   867  DataIndexField: "DataIndexField",
   862  CapabilitiesField : "CapabilitiesField"
   868  CapabilitiesField: "CapabilitiesField"
   863 }
   869 }
   864      
   870      
   865 CapabilityNames = {
   871 CapabilityNames = {
   866     0 : "TCB",
   872     0: "TCB",
   867     1 : "CommDD",
   873     1: "CommDD",
   868     2 : "PowerMgmt",
   874     2: "PowerMgmt",
   869     3 : "MultimediaDD",
   875     3: "MultimediaDD",
   870     4 : "ReadDeviceData",
   876     4: "ReadDeviceData",
   871     5 : "WriteDeviceData",
   877     5: "WriteDeviceData",
   872     6 : "DRM",
   878     6: "DRM",
   873     7 : "TrustedUI",
   879     7: "TrustedUI",
   874     8 : "ProtServ",
   880     8: "ProtServ",
   875     9 : "DiskAdmin",
   881     9: "DiskAdmin",
   876     10 : "NetworkControl",
   882     10: "NetworkControl",
   877     11 : "AllFiles",
   883     11: "AllFiles",
   878     12 : "SwEvent",
   884     12: "SwEvent",
   879     13 : "NetworkServices",
   885     13: "NetworkServices",
   880     14 : "LocalServices",
   886     14: "LocalServices",
   881     15 : "ReadUserData",
   887     15: "ReadUserData",
   882     16 : "WriteUserData",
   888     16: "WriteUserData",
   883     17 : "Location",
   889     17: "Location",
   884     18 : "SurroundingsDD",
   890     18: "SurroundingsDD",
   885     19 : "UserEnvironment"
   891     19: "UserEnvironment"
   886     }
   892     }
   887 
   893 
   888 InstallTypes = {
   894 InstallTypes = {
   889     0: "SA",
   895     0: "SA",
   890     1: "SP",
   896     1: "SP",
   891     2: "PU",
   897     2: "PU",
   892     3: "PA",
   898     3: "PA",
   893     4: "PP"
   899     4: "PP"
   894     }
   900     }
   895     
   901     
   896 class SISReader :
   902 class SISReader:
   897     """ SIS Reader """
   903     """ SIS Reader """
   898     def __init__(self) :
   904     def __init__(self):
   899         self.bytesRead = 0
   905         self.bytesRead = 0
   900         
   906         
   901     def readUnsignedBytes(self, numBytes) :
   907     def readUnsignedBytes(self, numBytes):
   902         """read Unsigned bytes"""
   908         """read Unsigned bytes"""
   903         buf = self.readPlainBytes(numBytes)
   909         buf = self.readPlainBytes(numBytes)
   904         if len(buf) < numBytes :
   910         if len(buf) < numBytes:
   905             return []
   911             return []
   906             
   912             
   907         format = ""
   913         format_ = ""
   908         for _ in range(numBytes) :
   914         for _ in range(numBytes):
   909             format += "B"
   915             format_ += "B"
   910         return struct.unpack(format, buf)
   916         return struct.unpack(format_, buf)
   911     
   917     
   912     def readSignedBytes(self, numBytes) :
   918     def readSignedBytes(self, numBytes):
   913         """read signed bytes"""
   919         """read signed bytes"""
   914         buf = self.readPlainBytes(numBytes)
   920         buf = self.readPlainBytes(numBytes)
   915         if len(buf) < numBytes :
   921         if len(buf) < numBytes:
   916             return []
   922             return []
   917             
   923             
   918         format = ""
   924         format_ = ""
   919         for _ in range(numBytes) :
   925         for _ in range(numBytes):
   920             format += "b"
   926             format_ += "b"
   921         return struct.unpack(format, buf)
   927         return struct.unpack(format_, buf)
   922         
   928         
   923     def readBytesAsUint(self, numBytes) :
   929     def readBytesAsUint(self, numBytes):
   924         """read bytes as Unit"""
   930         """read bytes as Unit"""
   925         result = 0
   931         result = 0
   926         bytes = self.readUnsignedBytes(numBytes)
   932         bytes_ = self.readUnsignedBytes(numBytes)
   927         if len(bytes) == numBytes :
   933         if len(bytes_) == numBytes:
   928             for i_byte in range(numBytes) :
   934             for i_byte in range(numBytes):
   929                 result |= bytes[i_byte] << (i_byte * 8)
   935                 result |= bytes_[i_byte] << (i_byte * 8)
   930         
   936         
   931         return result
   937         return result
   932         
   938         
   933     def readBytesAsInt(self, numBytes) :
   939     def readBytesAsInt(self, numBytes):
   934         """read bytes as Integer"""
   940         """read bytes as Integer"""
   935         result = 0
   941         result = 0
   936         bytes = self.readSignedBytes(numBytes)
   942         bytes_ = self.readSignedBytes(numBytes)
   937         if len(bytes) == numBytes :
   943         if len(bytes_) == numBytes:
   938             for i_byte in range(numBytes) :
   944             for i_byte in range(numBytes):
   939                 result |= bytes[i_byte] << (i_byte * 8)
   945                 result |= bytes_[i_byte] << (i_byte * 8)
   940         
   946         
   941         return result
   947         return result
   942         
   948         
   943     def skipPadding(self) :
   949     def skipPadding(self):
   944         """skip padding"""
   950         """skip padding"""
   945         result = 0
   951         result = 0
   946         if self.bytesRead % 4 != 0 :
   952         if self.bytesRead % 4 != 0:
   947             paddingLength = 4 - self.bytesRead % 4
   953             paddingLength = 4 - self.bytesRead % 4
   948             self.readPlainBytes(paddingLength)
   954             self.readPlainBytes(paddingLength)
   949             result = paddingLength
   955             result = paddingLength
   950             
   956             
   951         return result
   957         return result
   952 
   958 
   953     def readPlainBytes(self, numBytes) :
   959     def readPlainBytes(self, numBytes):
   954         """read plain bytes"""
   960         """read plain bytes"""
   955         pass
   961         pass
   956 
   962 
   957 class SISFileReader(SISReader) : 
   963 class SISFileReader(SISReader): 
   958     """ SIS File Reader """
   964     """ SIS File Reader """
   959     def __init__(self, inStream) :
   965     def __init__(self, inStream):
   960         SISReader.__init__(self)
   966         SISReader.__init__(self)
   961         self.inStream = inStream
   967         self.inStream = inStream
   962         self.eof = False
   968         self.eof = False
   963         self.bytesRead = 0
   969         self.bytesRead = 0
   964 
   970 
   965     def readPlainBytes(self, numBytes) :
   971     def readPlainBytes(self, numBytes):
   966         """read Plain byytes"""
   972         """read Plain byytes"""
   967         if self.eof :
   973         if self.eof:
   968             return ""
   974             return ""
   969             
   975             
   970         if numBytes == 0 :
   976         if numBytes == 0:
   971             return ""
   977             return ""
   972             
   978             
   973         buf = ""
   979         buf = ""
   974         buf = self.inStream.read(numBytes)
   980         buf = self.inStream.read(numBytes)
   975         if len(buf) < numBytes :
   981         if len(buf) < numBytes:
   976             self.eof = True
   982             self.eof = True
   977             return ""
   983             return ""
   978             
   984             
   979         self.bytesRead += numBytes
   985         self.bytesRead += numBytes
   980         
   986         
   981         return buf
   987         return buf
   982 
   988 
   983     def isEof(self) :
   989     def isEof(self):
   984         """is it End of File"""
   990         """is it End of File"""
   985         return self.eof
   991         return self.eof
   986         
   992         
   987 class SISBufferReader(SISReader) :
   993 class SISBufferReader(SISReader):
   988     """ SIS Buffer reader """
   994     """ SIS Buffer reader """
   989     def __init__(self, buffer) :
   995     def __init__(self, buffer_):
   990         self.buffer = buffer
   996         SISReader.__init__(self)
       
   997         self.buffer_ = buffer_
   991         self.bytesRead = 0
   998         self.bytesRead = 0
   992         
   999         
   993     def readPlainBytes(self, numBytes) :
  1000     def readPlainBytes(self, numBytes):
   994         """read Plain bytes"""
  1001         """read Plain bytes"""
   995         if self.isEof() :
  1002         if self.isEof():
   996             return ""
  1003             return ""
   997             
  1004             
   998         if numBytes == 0 :
  1005         if numBytes == 0:
   999             return ""
  1006             return ""
  1000             
  1007             
  1001         result = self.buffer[self.bytesRead:self.bytesRead + numBytes]
  1008         result = self.buffer_[self.bytesRead:self.bytesRead + numBytes]
  1002             
  1009             
  1003         self.bytesRead += numBytes
  1010         self.bytesRead += numBytes
  1004         
  1011         
  1005         return result
  1012         return result
  1006             
  1013             
  1007     def isEof(self) :
  1014     def isEof(self):
  1008         """is it End of File"""
  1015         """is it End of File"""
  1009         return self.bytesRead >= len(self.buffer)
  1016         return self.bytesRead >= len(self.buffer_)
  1010         
  1017         
  1011 class SISFieldParser :
  1018 class SISFieldParser:
  1012     """ Parser to read a SIS field """
  1019     """ Parser to read a SIS field """
  1013     def __init__(self) :
  1020     def __init__(self):
  1014         self.lastReadBytes = 0
  1021         self.lastReadBytes = 0
  1015         
  1022         
  1016     def parseField(self, fileReader) :
  1023     def parseField(self, fileReader):
  1017         """Reads the next field from the fileReader stream and returns it"""
  1024         """Reads the next field from the fileReader stream and returns it"""
  1018         field = None
  1025         field = None
  1019         self.lastReadBytes = 0
  1026         self.lastReadBytes = 0
  1020         type = fileReader.readBytesAsUint(4)
  1027         type_ = fileReader.readBytesAsUint(4)
  1021         self.lastReadBytes += 4
  1028         self.lastReadBytes += 4
  1022         if type != 0 :
  1029         if type_ != 0:
  1023             field = SISFieldTypes[type]()
  1030             field = SISFieldTypes[type_]()
  1024             field.type = type
  1031             field.type_ = type_
  1025             field.initFromFile(fileReader)
  1032             field.initFromFile(fileReader)
  1026             self.lastReadBytes += field.length + 4 # Field length + length field
  1033             self.lastReadBytes += field.length + 4 # Field length + length field
  1027             self.lastReadBytes += fileReader.skipPadding()
  1034             self.lastReadBytes += fileReader.skipPadding()
  1028         return field
  1035         return field
  1029 
  1036 
  1030 class SISInfo(SISField) :
  1037 class SISInfo(SISField):
  1031     """ SIS file information """
  1038     """ SIS file information """
  1032     def __init__(self) :
  1039     def __init__(self):
  1033         SISField.__init__(self)
  1040         SISField.__init__(self)
  1034         self.fin = None
  1041         self.fin = None
  1035         self.fileHeader = SISFileHeader()
  1042         self.fileHeader = SISFileHeader()
  1036         
  1043         
  1037     def parse(self, filename) :
  1044     def parse(self, filename):
  1038         """parse"""
  1045         """parse"""
  1039         fin = open(filename, 'rb')
  1046         fin = open(filename, 'rb')
  1040         fileReader = SISFileReader(fin)
  1047         fileReader = SISFileReader(fin)
  1041         self.parseHeader(fileReader)
  1048         self.parseHeader(fileReader)
  1042         self.parseSISFields(fileReader)
  1049         self.parseSISFields(fileReader)
  1043         
  1050         
  1044     def parseHeader(self, fileReader) :
  1051     def parseHeader(self, fileReader):
  1045         """parse Holder"""
  1052         """parse Holder"""
  1046         self.fileHeader.uid1 = fileReader.readBytesAsUint(4)
  1053         self.fileHeader.uid1 = fileReader.readBytesAsUint(4)
  1047         self.fileHeader.uid2 = fileReader.readBytesAsUint(4)
  1054         self.fileHeader.uid2 = fileReader.readBytesAsUint(4)
  1048         self.fileHeader.uid3 = fileReader.readBytesAsUint(4)
  1055         self.fileHeader.uid3 = fileReader.readBytesAsUint(4)
  1049         self.fileHeader.uidChecksum = fileReader.readBytesAsUint(4)
  1056         self.fileHeader.uidChecksum = fileReader.readBytesAsUint(4)
  1050         
  1057         
  1051     def parseSISFields(self, fileReader) :
  1058     def parseSISFields(self, fileReader):
  1052         """parse SIS Fileds"""
  1059         """parse SIS Fileds"""
  1053         parser = SISFieldParser()
  1060         parser = SISFieldParser()
  1054         while not fileReader.isEof() :
  1061         while not fileReader.isEof():
  1055             self.subFields.append(parser.parseField(fileReader))
  1062             self.subFields.append(parser.parseField(fileReader))
  1056 
  1063 
  1057 class Handler :
  1064 class Handler:
  1058     """ A handler class """
  1065     """ A handler class """
  1059     def __init__(self) :
  1066     def __init__(self):
  1060         self.files = []
  1067         self.files = []
  1061         self.fileDatas = []
  1068         self.fileDatas = []
  1062         self.signatureCertificateChains = []
  1069         self.signatureCertificateChains = []
  1063         
  1070         
  1064     def handleField(self, field, _) :
  1071     def handleField(self, field, _):
  1065         """handle Field"""
  1072         """handle Field"""
  1066         if field.type == FileDescriptionField :
  1073         if field.type_ == FileDescriptionField:
  1067             self.files.append(field)
  1074             self.files.append(field)
  1068         elif field.type == FileDataField :
  1075         elif field.type_ == FileDataField:
  1069             self.fileDatas.append(field)
  1076             self.fileDatas.append(field)
  1070         elif field.type == SignatureCertificateChainField  :
  1077         elif field.type_ == SignatureCertificateChainField :
  1071             self.signatureCertificateChains.append(field)
  1078             self.signatureCertificateChains.append(field)
  1072 
  1079 
  1073     def execute(self, options) :
  1080     def execute(self, options):
  1074         """execute"""
  1081         """execute"""
  1075         for f_file in self.files :
  1082         for f_file in self.files:
  1076             if options.info :
  1083             if options.info:
  1077                 buf = "   " + f_file.findField(StringField)[0].readableStr()
  1084                 buf = "   " + f_file.findField(StringField)[0].readableStr()
  1078                 caps = f_file.findField(CapabilitiesField)[0]
  1085                 caps = f_file.findField(CapabilitiesField)[0]
  1079                 if caps :
  1086                 if caps:
  1080                     buf += " [" + " ".join(f_file.findField(CapabilitiesField)[0].readableCaps) + "]"
  1087                     buf += " [" + " ".join(f_file.findField(CapabilitiesField)[0].readableCaps) + "]"
  1081                 print buf
  1088                 print buf
  1082             if options.extract :
  1089             if options.extract:
  1083                 parts = f_file.findField(StringField)[0].readableStr().split("\\")
  1090                 parts = f_file.findField(StringField)[0].readableStr().split("\\")
  1084                 if len(parts[len(parts) - 1]) > 0 :
  1091                 if len(parts[len(parts) - 1]) > 0:
  1085                     path = os.path.abspath(options.extract)
  1092                     path = os.path.abspath(options.extract)
  1086                     path += os.sep + os.sep.join(parts[1: - 1])
  1093                     path += os.sep + os.sep.join(parts[1: - 1])
  1087                     if not os.path.exists(path) :
  1094                     if not os.path.exists(path):
  1088                         os.makedirs(path)
  1095                         os.makedirs(path)
  1089                     newFile = file(path + os.sep + parts[len(parts) - 1], "wb")
  1096                     newFile = file(path + os.sep + parts[len(parts) - 1], "wb")
  1090                     newFile.write(self.fileDatas[f_file.fileIndex].findField(CompressedField)[0].data)
  1097                     newFile.write(self.fileDatas[f_file.fileIndex].findField(CompressedField)[0].data)
  1091                     newFile.close()
  1098                     newFile.close()
  1092         for sig in self.signatureCertificateChains :
  1099         for sig in self.signatureCertificateChains:
  1093             if options.certificate:
  1100             if options.certificate:
  1094                 buf = sig.findField(CertificateChainField)[0].subFields[0].data
  1101                 buf = sig.findField(CertificateChainField)[0].subFields[0].data
  1095                 print "Certificate chain:"
  1102                 print "Certificate chain:"
  1096                 i_num = 1
  1103                 i_num = 1
  1097                 while len(buf) > 0 :
  1104                 while len(buf) > 0:
  1098                     print "   Certificate " + str(i_num) + ":"
  1105                     print "   Certificate " + str(i_num) + ":"
  1099                     i_num += 1
  1106                     i_num += 1
  1100                     decoded = decoder.decode(buf)
  1107                     decoded = decoder.decode(buf)
  1101                     cer = CertificateInfo()
  1108                     cer = CertificateInfo()
  1102                     cer.parse(decoded[0])
  1109                     cer.parse(decoded[0])
  1103                     readableStr = cer.readableStr()
  1110                     readableStr = cer.readableStr()
  1104                     print "      " + "\n      ".join(readableStr.split('\n'))
  1111                     print "      " + "\n      ".join(readableStr.split('\n'))
  1105                     buf = decoded[1]
  1112                     buf = decoded[1]
  1106             
  1113             
  1107 class ContentPrinter :
  1114 class ContentPrinter:
  1108     """ A handler class which prints the field contents """
  1115     """ A handler class which prints the field contents """
  1109     def __init__(self) :
  1116     def __init__(self):
  1110         pass
  1117         pass
  1111         
  1118         
  1112     def handleField(self, field, depth) :
  1119     def handleField(self, field, depth):
  1113         """handle Field"""
  1120         """handle Field"""
  1114         buf = ""
  1121         buf = ""
  1115         for _ in range(depth) :
  1122         for _ in range(depth):
  1116             buf += "  "
  1123             buf += "  "
  1117         buf += FieldNames[field.type] + " "
  1124         buf += FieldNames[field.type_] + " "
  1118         if len(field.readableStr()) > 0 :
  1125         if len(field.readableStr()) > 0:
  1119             buf += field.readableStr()
  1126             buf += field.readableStr()
  1120         print buf
  1127         print buf
  1121 
  1128 
  1122 class IADHandler :
  1129 class IADHandler:
  1123     """ IAD handler class """
  1130     """ IAD handler class """
  1124     def __init__(self) :
  1131     def __init__(self):
  1125         self.packageVersion = (0, 0, 0)
  1132         self.packageVersion = (0, 0, 0)
  1126         self.packageUid = 0
  1133         self.packageUid = 0
  1127         self.vendorName = ""
  1134         self.vendorName = ""
  1128         self.packageNames = []
  1135         self.packageNames = []
  1129         self.packageNamesFields = []
  1136         self.packageNamesFields = []
  1130         self.languages = []
  1137         self.languages = []
  1131         self.platformDependencies = []
  1138         self.platformDependencies = []
  1132         self.packageDependencies = []
  1139         self.packageDependencies = []
  1133         self.installType = 0
  1140         self.installType = 0
  1134         self.installFlags = 0
  1141         self.installFlags = 0
  1135         
  1142         self.packageVersionField = None
  1136     def handleDependency(self, field) :
  1143         self.packageUidField = None
       
  1144         self.vendorNameField = None
       
  1145         
       
  1146     def handleDependency(self, field):
  1137         """handle dependancy"""
  1147         """handle dependancy"""
  1138         dep = [0, - 1, - 1, - 1, - 1, - 1, - 1]
  1148         dep = [0, - 1, - 1, - 1, - 1, - 1, - 1]
  1139         dep[0] = field.subFields[0].uid
  1149         dep[0] = field.subFields[0].uid
  1140         if field.subFields[1] and field.subFields[1].type == VersionRangeField :
  1150         if field.subFields[1] and field.subFields[1].type_ == VersionRangeField:
  1141             res = field.subFields[1]
  1151             res = field.subFields[1]
  1142             if res.fromVersion != None :
  1152             if res.fromVersion != None:
  1143                 dep[1] = res.fromVersion.version[0]
  1153                 dep[1] = res.fromVersion.version[0]
  1144                 dep[2] = res.fromVersion.version[1]
  1154                 dep[2] = res.fromVersion.version[1]
  1145                 dep[3] = res.fromVersion.version[2]
  1155                 dep[3] = res.fromVersion.version[2]
  1146             if res.toVersion != None :
  1156             if res.toVersion != None:
  1147                 dep[4] = res.toVersion.version[0]
  1157                 dep[4] = res.toVersion.version[0]
  1148                 dep[5] = res.toVersion.version[1]
  1158                 dep[5] = res.toVersion.version[1]
  1149                 dep[6] = res.toVersion.version[2]
  1159                 dep[6] = res.toVersion.version[2]
  1150         return dep
  1160         return dep
  1151         
  1161         
  1152     def handleField(self, field, _) :
  1162     def handleField(self, field, _):
  1153         """handle Field"""
  1163         """handle Field"""
  1154         if field.type == InfoField :
  1164         if field.type_ == InfoField:
  1155             self.packageVersion = field.subFields[4].version
  1165             self.packageVersion = field.subFields[4].version
  1156             self.packageVersionField = field.subFields[4]
  1166             self.packageVersionField = field.subFields[4]
  1157             self.packageUid = field.subFields[0].uid
  1167             self.packageUid = field.subFields[0].uid
  1158             self.packageUidField = field.subFields[0]
  1168             self.packageUidField = field.subFields[0]
  1159             self.vendorName = field.subFields[1].data
  1169             self.vendorName = field.subFields[1].data
  1160             self.vendorNameField = field.subFields[1]
  1170             self.vendorNameField = field.subFields[1]
  1161             self.installType = field.installType
  1171             self.installType = field.installType
  1162             self.installFlags = field.installFlags
  1172             self.installFlags = field.installFlags
  1163             for name in field.subFields[2].subFields :
  1173             for name in field.subFields[2].subFields:
  1164                 self.packageNames.append(name.data)
  1174                 self.packageNames.append(name.data)
  1165         elif field.type == LanguageField :
  1175         elif field.type_ == LanguageField:
  1166             self.languages.append(field.language)
  1176             self.languages.append(field.language)
  1167         elif field.type == PrerequisitiesField :
  1177         elif field.type_ == PrerequisitiesField:
  1168             for f_field in field.subFields[0].subFields :
  1178             for f_field in field.subFields[0].subFields:
  1169                 dependency = self.handleDependency(f_field)
  1179                 dependency = self.handleDependency(f_field)
  1170                 self.platformDependencies.append(dependency)
  1180                 self.platformDependencies.append(dependency)
  1171             for f_field in field.subFields[1].subFields :
  1181             for f_field in field.subFields[1].subFields:
  1172                 dependency = self.handleDependency(f_field)
  1182                 dependency = self.handleDependency(f_field)
  1173                 self.packageDependencies.append(dependency)
  1183                 self.packageDependencies.append(dependency)
  1174         
  1184         
  1175     def getInfo (self, fileName) :
  1185     def getInfo (self, fileName):
  1176         """get Info"""
  1186         """get Info"""
  1177         sisInfo = SISInfo()
  1187         sisInfo = SISInfo()
  1178         sisInfo.parse(fileName)
  1188         sisInfo.parse(fileName)
  1179         handler = IADHandler()
  1189         handler = IADHandler()
  1180         sisInfo.traverse(handler)
  1190         sisInfo.traverse(handler)
  1185              + "<major>" + repr(handler.packageVersion[0]) + "</major>" \
  1195              + "<major>" + repr(handler.packageVersion[0]) + "</major>" \
  1186              + "<minor>" + repr(handler.packageVersion[1]) + "</minor>" \
  1196              + "<minor>" + repr(handler.packageVersion[1]) + "</minor>" \
  1187              + "<build>" + repr(handler.packageVersion[2]) + "</build>" \
  1197              + "<build>" + repr(handler.packageVersion[2]) + "</build>" \
  1188              + "</version>\n" \
  1198              + "</version>\n" \
  1189              + "  <type>" + InstallTypes[self.installType] + "</type>\n"
  1199              + "  <type>" + InstallTypes[self.installType] + "</type>\n"
  1190         for num, name in enumerate(handler.packageNames) :
  1200         for num, name in enumerate(handler.packageNames):
  1191             info += "  <name language='" + repr(handler.languages[num]) + "'>" + name + "</name>\n"
  1201             info += "  <name language='" + repr(handler.languages[num]) + "'>" + name + "</name>\n"
  1192         for language in handler.languages :
  1202         for language in handler.languages:
  1193             info += "  <language>" + repr(language) + "</language>\n"
  1203             info += "  <language>" + repr(language) + "</language>\n"
  1194         for platDep in handler.platformDependencies :
  1204         for platDep in handler.platformDependencies:
  1195             info += "  <platform_dependency><uid>" + hex(platDep[0]) + "</uid>\n"
  1205             info += "  <platform_dependency><uid>" + hex(platDep[0]) + "</uid>\n"
  1196             info += "    <from>" \
  1206             info += "    <from>" \
  1197                  + "<major>" + repr(platDep[1]) + "</major>" \
  1207                  + "<major>" + repr(platDep[1]) + "</major>" \
  1198                  + "<minor>" + repr(platDep[2]) + "</minor>"
  1208                  + "<minor>" + repr(platDep[2]) + "</minor>"
  1199 #           info += "<build>" + repr(platDep[3]) + "</build>"
  1209 #           info += "<build>" + repr(platDep[3]) + "</build>"
  1201                  + "<major>" + repr(platDep[4]) + "</major>" \
  1211                  + "<major>" + repr(platDep[4]) + "</major>" \
  1202                  + "<minor>" + repr(platDep[5]) + "</minor>"
  1212                  + "<minor>" + repr(platDep[5]) + "</minor>"
  1203 #           info += "<build>" + repr(platDep[6]) + "</build>"
  1213 #           info += "<build>" + repr(platDep[6]) + "</build>"
  1204             info += "</to>\n" \
  1214             info += "</to>\n" \
  1205              + "  </platform_dependency>\n"
  1215              + "  </platform_dependency>\n"
  1206         for packageDep in handler.packageDependencies :
  1216         for packageDep in handler.packageDependencies:
  1207             info += "  <package_dependency><uid>" + hex(packageDep[0]) + "</uid>\n"
  1217             info += "  <package_dependency><uid>" + hex(packageDep[0]) + "</uid>\n"
  1208             info += "    <from>" \
  1218             info += "    <from>" \
  1209                  + "<major>" + repr(packageDep[1]) + "</major>" \
  1219                  + "<major>" + repr(packageDep[1]) + "</major>" \
  1210                  + "<minor>" + repr(packageDep[2]) + "</minor>"
  1220                  + "<minor>" + repr(packageDep[2]) + "</minor>"
  1211 #           info += "<build>" + repr(packageDep[3]) + "</build>"
  1221 #           info += "<build>" + repr(packageDep[3]) + "</build>"
  1216             info += "</to>\n" \
  1226             info += "</to>\n" \
  1217                  + "  </package_dependency>\n"
  1227                  + "  </package_dependency>\n"
  1218         info += "</sisinfo>\n"
  1228         info += "</sisinfo>\n"
  1219         return info
  1229         return info
  1220 
  1230 
  1221 if __name__ == "__main__" :
  1231 if __name__ == "__main__":
  1222     _handler = IADHandler()
  1232     _handler = IADHandler()
  1223     print (_handler.getInfo (sys.argv[1]))
  1233     print (_handler.getInfo (sys.argv[1]))