diff -r 8a82bd4d7b19 -r ab800b3e45ab scripts/python/sis2rom/sis2rom.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/python/sis2rom/sis2rom.py Wed Jan 27 10:52:27 2010 +0000 @@ -0,0 +1,219 @@ +""" +Copyright (c) 2006, Jari Sukanen +All rights reserved. + +Redistribution and use in source and binary forms, with or +without modification, are permitted provided that the following +conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Names of the contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE. +""" +from sis import sisinfo, sisfields +import optparse +import sys, os + +APP_PATH = "epoc32" + os.sep + "apps" +IBY_PATH = "epoc32" + os.sep + "rom" + os.sep + "include" +CRLF = '\r\n' + +try: + os.uname() + ZIP_CMD = 'zip -r ' +except: # no uname on windows + ZIP_CMD = '7z a ' + +PyASN1Availabe = True + +try : + from pyasn1.codec.der import decoder + from pyasn1.type import univ, base +except : + PyASN1Availabe = False + +def _findItem(item, itemParent, index, objectIdentifier) : + if isinstance(item, base.AbstractSimpleAsn1Item) : + if item == objectIdentifier : + return itemParent[index+1] + else : + for i in range(len(item)) : + found = _findItem(item[i], item, i, objectIdentifier) + if found : + return found + +def findItem(decodedCert, objectIdentifier) : + return _findItem(decodedCert, None, 0, objectIdentifier) + + +class CertificateOrganization : + def __init__(self) : + pass + + def parse(self, decodedCert) : + self.commonName = findItem(decodedCert, (2,5,4,3)) + self.countryCode = findItem(decodedCert, (2,5,4,6)) + self.locality = findItem(decodedCert, (2,5,4,7)) + self.state = findItem(decodedCert, (2,5,4,8)) + self.street = findItem(decodedCert, (2,5,4,9)) + self.organization = findItem(decodedCert, (2,5,4,10)) + + def readableStr(self) : + buf = "" + if self.commonName : + buf += self.commonName.prettyPrint() + "\n" + if self.countryCode : + buf += self.countryCode.prettyPrint() + "\n" + if self.locality : + buf += self.locality.prettyPrint() + "\n" + if self.state : + buf += self.state.prettyPrint() + "\n" + if self.street : + buf += self.street.prettyPrint() + "\n" + if self.organization : + buf += self.organization.prettyPrint() + return buf + +class CertificateInfo : + def __init__(self) : + pass + + def parse(self, decodedCert) : + self.issuer = CertificateOrganization() + self.issuer.parse(decodedCert[0][3]) + + self.signer = CertificateOrganization() + self.signer.parse(decodedCert[0][5]) + + def readableStr(self) : + buf = "Signer:\n " + "\n ".join(self.signer.readableStr().split('\n')) + "\n" + buf += "Issuer:\n " + "\n ".join(self.issuer.readableStr().split('\n')) + "\n" + return buf + + +class Handler : + def __init__(self) : + self.files = [] + self.fileDatas = [] + self.signatureCertificateChains = [] + + def handleField(self, field, depth) : + if field.type == sisfields.FileDescriptionField : + self.files.append(field) + elif field.type == sisfields.FileDataField : + self.fileDatas.append(field) + elif field.type == sisfields.SignatureCertificateChainField : + self.signatureCertificateChains.append(field) + + def print_iby_for_file(self, iby, extracted_file, install_path): + #binarypath="file=ABI_DIR\\BUILD_DIR\\" + #datapath="data=DATAZ_\\RESOURCE_FILES_DIR\\" + binarypath="file=\\" + datapath="data=\\" + #privatepath="data=\\epoc32\\data\\z\\" + + install_path=install_path.replace('c:', 'z:') + #basename = filepath[filepath.rfind('\\')+1:] + + if extracted_file.endswith('exe') or extracted_file.endswith('dll'): + iby.write( binarypath + extracted_file + '\t\t' + install_path + CRLF) + else: + iby.write( datapath + extracted_file + '\t\t' + install_path + CRLF) + + + def execute(self,outputname, iby) : + for f in self.files : + buf = f.findField(sisfields.StringField)[0].readableStr() +# caps = f.findField(sisfields.CapabilitiesField)[0] +# if caps : +# buf += " [" + " ".join(f.findField(sisfields.CapabilitiesField)[0].readableCaps) + "]" + + install_path=buf + parts = f.findField(sisfields.StringField)[0].readableStr().split("\\") + #for part in parts: + # print part + if len(parts[len(parts) - 1]) > 0 : + path = os.getcwd() + os.sep + APP_PATH + + path += os.sep + os.sep.join(parts[1:-1]) + rel_file = APP_PATH + os.sep + outputname + os.sep + os.sep.join(parts[1:]) + rel_file = rel_file.replace('/','\\') + if not os.path.exists(path) : + os.makedirs(path) + extracted_file = path + os.sep + parts[len(parts) - 1] + newFile = file(extracted_file, "wb") + newFile.write(self.fileDatas[f.fileIndex].findField(sisfields.CompressedField)[0].data) + newFile.close() + self.print_iby_for_file(iby,rel_file, install_path) + +class ContentPrinter : + def __init__(self) : + pass + + def handleField(self, field, depth) : + buf = "" + for i in range(depth) : + buf += " " + buf += sisfields.FieldNames[field.type] + " " + if len(field.readableStr()) > 0 : + buf += field.readableStr() + print buf + +import pdb + +if __name__ == "__main__" : + if len(sys.argv) == 1: + print "usage: %s " % sys.argv[0] + exit() + + sisname = sys.argv[1] + sisInfo = sisinfo.SISInfo() + sisInfo.parse(sisname) + + handler = Handler() + sisInfo.traverse(handler) + + tmp = sisname.lower() + + if tmp.find(os.sep): + tmp = sisname[sisname.rfind(os.sep)+1:] + + if tmp.find('sisx'): + tmp = tmp[0:len(tmp)-4] + elif tmp.find('sis'): + tmp = tmp[0:len(tmp)-3] + + iby_path = os.getcwd() + os.sep + IBY_PATH + os.sep + iby_file = tmp + ".iby" + + if not os.path.exists(iby_path) : + os.makedirs(iby_path) + + iby = open(iby_path + iby_file,'w') + print "Creating IBY file..." + iby.write( "#ifndef __%s_IBY__" % tmp.upper() + CRLF) + iby.write( "#define __%s_IBY__" % tmp.upper() + CRLF) + print "Extracting SIS..." + handler.execute(tmp, iby) + iby.write( "#endif" + CRLF) + iby.close() + print "Zipping..." + os.system(ZIP_CMD + tmp + '.zip epoc32') + print "All done. Remember to #include <%s> in your main IBY file" % iby_file \ No newline at end of file