Index: experimental/PdfViewer/generate_code.py |
=================================================================== |
--- experimental/PdfViewer/generate_code.py (revision 9765) |
+++ experimental/PdfViewer/generate_code.py (working copy) |
@@ -233,6 +233,7 @@ |
def write(self): |
global fileHeaders |
+ global fileHeadersCpp |
global knowTypes |
# generate enum |
@@ -246,6 +247,7 @@ |
cls.fEnumEnd = 'k' + name + '__End_SkPdfObjectType' |
fileHeaders.write('#include "SkPdf' + cls.fName + '_autogen.h"\n') |
+ fileHeadersCpp.write('#include "SkPdf' + cls.fName + '_autogen.cpp"\n') |
if cls.fBase != '': |
self.fClasses[cls.fBase].fEnumSubclasses.append(cls.fEnum) |
@@ -286,10 +288,12 @@ |
enum = cls.fEnum |
fileClass = open('SkPdf' + cls.fName + '_autogen.h', 'w') |
+ fileClassCpp = open('SkPdf' + cls.fName + '_autogen.cpp', 'w') |
fileClass.write('#ifndef __DEFINED__SkPdf' + cls.fName + '\n') |
fileClass.write('#define __DEFINED__SkPdf' + cls.fName + '\n') |
fileClass.write('\n') |
+ fileClassCpp.write('#include "SkPdf' + cls.fName + '_autogen.h"\n\n') |
fileClass.write('#include "SkPdfUtils.h"\n') |
fileClass.write('#include "SkPdfEnums_autogen.h"\n') |
fileClass.write('#include "SkPdfArray_autogen.h"\n') |
@@ -363,6 +367,7 @@ |
if prop.fCppName[0] == '[': |
fileClass.write('/*\n') # comment code of the atributes that can have any name |
+ fileClassCpp.write('/*\n') # comment code of the atributes that can have any name |
# TODO(edisonn): has_foo(); |
fileClass.write(' bool has_' + prop.fCppName + '() const {\n') |
@@ -372,16 +377,17 @@ |
if len(prop.fTypes.split()) == 1: |
t = prop.fTypes.strip() |
- fileClass.write(' ' + knowTypes[t][0] + ' ' + prop.fCppName + '() const {\n') |
- fileClass.write(' ' + knowTypes[t][0] + ' ret;\n') |
- fileClass.write(' if (' + knowTypes[t][1] + '(fPodofoDoc, fPodofoObj->GetDictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &ret)) return ret;\n') |
+ fileClass.write(' ' + knowTypes[t][0] + ' ' + prop.fCppName + '() const;\n') |
+ fileClassCpp.write('' + knowTypes[t][0] + ' SkPdf' + cls.fName + '::' + prop.fCppName + '() const {\n') |
+ fileClassCpp.write(' ' + knowTypes[t][0] + ' ret;\n') |
+ fileClassCpp.write(' if (' + knowTypes[t][1] + '(fPodofoDoc, fPodofoObj->GetDictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &ret)) return ret;\n') |
if field.fRequired == False and prop.fDefault != '': |
- fileClass.write(' return ' + prop.fDefault.toCpp() + ';\n'); |
+ fileClassCpp.write(' return ' + prop.fDefault.toCpp() + ';\n'); |
else: |
- fileClass.write(' // TODO(edisonn): warn about missing required field, assert for known good pdfs\n') |
- fileClass.write(' return ' + knowTypes[t][2].toCpp() + ';\n'); |
- fileClass.write(' }\n') |
- fileClass.write('\n') |
+ fileClassCpp.write(' // TODO(edisonn): warn about missing required field, assert for known good pdfs\n') |
+ fileClassCpp.write(' return ' + knowTypes[t][2].toCpp() + ';\n'); |
+ fileClassCpp.write('}\n') |
+ fileClassCpp.write('\n') |
else: |
for type in prop.fTypes.split(): |
t = type.strip() |
@@ -392,17 +398,19 @@ |
fileClass.write(' }\n') |
fileClass.write('\n') |
- fileClass.write(' ' + knowTypes[t][0] + ' get' + prop.fCppName + 'As' + t.title() + '() const {\n') |
- fileClass.write(' ' + knowTypes[t][0] + ' ret = ' + knowTypes[t][2].toCpp() + ';\n') |
- fileClass.write(' if (' + knowTypes[t][1] + '(fPodofoDoc, fPodofoObj->GetDictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &ret)) return ret;\n') |
- fileClass.write(' // TODO(edisonn): warn about missing required field, assert for known good pdfs\n') |
- fileClass.write(' return ' + knowTypes[t][2].toCpp() + ';\n') |
- fileClass.write(' }\n') |
- fileClass.write('\n') |
+ fileClass.write(' ' + knowTypes[t][0] + ' get' + prop.fCppName + 'As' + t.title() + '() const;\n') |
+ fileClassCpp.write('' + knowTypes[t][0] + ' SkPdf' + cls.fName + '::get' + prop.fCppName + 'As' + t.title() + '() const {\n') |
+ fileClassCpp.write(' ' + knowTypes[t][0] + ' ret = ' + knowTypes[t][2].toCpp() + ';\n') |
+ fileClassCpp.write(' if (' + knowTypes[t][1] + '(fPodofoDoc, fPodofoObj->GetDictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &ret)) return ret;\n') |
+ fileClassCpp.write(' // TODO(edisonn): warn about missing required field, assert for known good pdfs\n') |
+ fileClassCpp.write(' return ' + knowTypes[t][2].toCpp() + ';\n') |
+ fileClassCpp.write('}\n') |
+ fileClassCpp.write('\n') |
if prop.fCppName[0] == '[': |
fileClass.write('*/\n') # comment code of the atributes that can have any name |
+ fileClassCpp.write('*/\n') # comment code of the atributes that can have any name |
fileClass.write('};\n') |
@@ -410,6 +418,7 @@ |
fileClass.write('#endif // __DEFINED__SkPdf' + cls.fName + '\n') |
fileClass.close() |
+ fileClassCpp.close() |
@@ -419,60 +428,66 @@ |
# generate parser |
# TODO(edisonn): fast recognition based on must attributes. |
fileMapper = open('SkPdfPodofoMapper_autogen.h', 'w') |
+ fileMapperCpp = open('SkPdfPodofoMapper_autogen.cpp', 'w') |
fileMapper.write('#ifndef __DEFINED__SkPdfPodofoMapper\n') |
fileMapper.write('#define __DEFINED__SkPdfPodofoMapper\n') |
fileMapper.write('\n') |
fileMapper.write('#include "SkPdfHeaders_autogen.h"\n') |
- fileMapper.write('class PodofoMapper {\n') |
- fileMapper.write('public:\n') |
+ fileMapperCpp.write('#include "SkPdfPodofoMapper_autogen.h"\n') |
+# fileMapper.write('class PodofoMapper {\n') |
+# fileMapper.write('public:\n') |
for name in self.fClassesNamesInOrder: |
cls = self.fClasses[name] |
- fileMapper.write(' static bool map(const SkPdfObject& in, SkPdf' + name + '** out) {\n') |
- fileMapper.write(' return map(*in.doc(), *in.podofo(), out);\n') |
- fileMapper.write(' }\n') |
- fileMapper.write('\n') |
+ fileMapper.write('bool map' + name + '(const SkPdfObject& in, SkPdf' + name + '** out);\n') |
- fileMapper.write(' static bool map(const PdfMemDocument& podofoDoc, const PdfObject& podofoObj, SkPdf' + name + '** out) {\n') |
- fileMapper.write(' if (!is' + name + '(podofoDoc, podofoObj)) return false;\n') |
- fileMapper.write('\n') |
+ fileMapperCpp.write('bool map' + name + '(const SkPdfObject& in, SkPdf' + name + '** out) {\n') |
+ fileMapperCpp.write(' return map' + name + '(*in.doc(), *in.podofo(), out);\n') |
+ fileMapperCpp.write('}\n') |
+ fileMapperCpp.write('\n') |
+ fileMapper.write('bool map' + name + '(const PdfMemDocument& podofoDoc, const PdfObject& podofoObj, SkPdf' + name + '** out);\n') |
+ fileMapperCpp.write('bool map' + name + '(const PdfMemDocument& podofoDoc, const PdfObject& podofoObj, SkPdf' + name + '** out) {\n') |
+ fileMapperCpp.write(' if (!is' + name + '(podofoDoc, podofoObj)) return false;\n') |
+ fileMapperCpp.write('\n') |
+ |
# stream must be last one |
hasStream = False |
for sub in cls.fEnumSubclasses: |
if cls.fName == 'Object' and enumToCls[sub].fName == 'Stream': |
hasStream = True |
else: |
- fileMapper.write(' if (map(podofoDoc, podofoObj, (SkPdf' + enumToCls[sub].fName + '**)out)) return true;\n') |
+ fileMapperCpp.write(' if (map' + enumToCls[sub].fName + '(podofoDoc, podofoObj, (SkPdf' + enumToCls[sub].fName + '**)out)) return true;\n') |
if hasStream: |
- fileMapper.write(' if (map(podofoDoc, podofoObj, (SkPdfStream**)out)) return true;\n') |
+ fileMapperCpp.write(' if (mapStream(podofoDoc, podofoObj, (SkPdfStream**)out)) return true;\n') |
- fileMapper.write('\n') |
+ fileMapperCpp.write('\n') |
- fileMapper.write(' *out = new SkPdf' + name + '(&podofoDoc, &podofoObj);\n') |
- fileMapper.write(' return true;\n') |
- fileMapper.write(' }\n') |
- fileMapper.write('\n') |
+ fileMapperCpp.write(' *out = new SkPdf' + name + '(&podofoDoc, &podofoObj);\n') |
+ fileMapperCpp.write(' return true;\n') |
+ fileMapperCpp.write('}\n') |
+ fileMapperCpp.write('\n') |
for name in self.fClassesNamesInOrder: |
cls = self.fClasses[name] |
- fileMapper.write(' static bool is' + name + '(const PdfMemDocument& podofoDoc, const PdfObject& podofoObj) {\n') |
+ fileMapper.write('bool is' + name + '(const PdfMemDocument& podofoDoc, const PdfObject& podofoObj);\n') |
+ fileMapperCpp.write('bool is' + name + '(const PdfMemDocument& podofoDoc, const PdfObject& podofoObj) {\n') |
if cls.fCheck != '': |
- fileMapper.write(' return ' + cls.fCheck + ';\n') |
+ fileMapperCpp.write(' return ' + cls.fCheck + ';\n') |
else: |
cntMust = 0 |
for field in cls.fFields: |
prop = field.fProp |
if prop.fHasMust: |
cntMust = cntMust + 1 |
- fileMapper.write(' ' + knowTypes[prop.fTypes.strip()][0] + ' ' + prop.fCppName + ';\n') |
- fileMapper.write(' if (!' + knowTypes[prop.fTypes.strip()][1] + '(&podofoDoc, podofoObj.GetDictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &' + prop.fCppName + ')) return false;\n') |
+ fileMapperCpp.write(' ' + knowTypes[prop.fTypes.strip()][0] + ' ' + prop.fCppName + ';\n') |
+ fileMapperCpp.write(' if (!' + knowTypes[prop.fTypes.strip()][1] + '(&podofoDoc, podofoObj.GetDictionary(), \"' + prop.fName + '\", \"' + prop.fAbr + '\", &' + prop.fCppName + ')) return false;\n') |
eval = ''; |
# TODO(edisonn): this could get out of hand, and could have poor performance if continued on this path |
@@ -486,15 +501,32 @@ |
eval = '(' + prop.fCppName + ' != ' + cnd.toCpp() + ')' |
else: |
eval = eval + ' && ' + '(' + prop.fCppName + ' != ' + cnd.toCpp() + ')' |
- fileMapper.write(' if (' + eval + ') return false;\n') |
- fileMapper.write('\n') |
+ fileMapperCpp.write(' if (' + eval + ') return false;\n') |
+ fileMapperCpp.write('\n') |
- fileMapper.write(' return true;\n') |
+ fileMapperCpp.write(' return true;\n') |
- fileMapper.write(' }\n') |
- fileMapper.write('\n') |
+ fileMapperCpp.write('}\n') |
+ fileMapperCpp.write('\n') |
- fileMapper.write('};\n') |
+ fileMapper.write('bool ' + name + 'FromDictionary(const PdfMemDocument* pdfDoc, const PdfDictionary& dict, const char* key, SkPdf' + name + '** data);\n') |
+ fileMapperCpp.write('bool ' + name + 'FromDictionary(const PdfMemDocument* pdfDoc, const PdfDictionary& dict, const char* key, SkPdf' + name + '** data) {\n') |
+ fileMapperCpp.write(' const PdfObject* value = resolveReferenceObject(pdfDoc, dict.GetKey(PdfName(key)), true);\n') |
+ fileMapperCpp.write(' if (value == NULL) { return false; }\n') |
+ fileMapperCpp.write(' if (data == NULL) { return true; }\n') |
+ fileMapperCpp.write(' return map' + name + '(*pdfDoc, *value, (SkPdf' + name + '**)data);\n') |
+ fileMapperCpp.write('}\n') |
+ fileMapperCpp.write('\n') |
+ |
+ fileMapper.write('bool ' + name + 'FromDictionary(const PdfMemDocument* pdfDoc, const PdfDictionary& dict, const char* key, const char* abr, SkPdf' + name + '** data);\n') |
+ fileMapperCpp.write('bool ' + name + 'FromDictionary(const PdfMemDocument* pdfDoc, const PdfDictionary& dict, const char* key, const char* abr, SkPdf' + name + '** data) {\n') |
+ fileMapperCpp.write(' if (' + name + 'FromDictionary(pdfDoc, dict, key, data)) return true;\n') |
+ fileMapperCpp.write(' if (abr == NULL || *abr == \'\\0\') return false;\n') |
+ fileMapperCpp.write(' return ' + name + 'FromDictionary(pdfDoc, dict, abr, data);\n') |
+ fileMapperCpp.write('}\n') |
+ fileMapperCpp.write('\n') |
+ |
+ #fileMapper.write('};\n') |
fileMapper.write('\n') |
fileMapper.write('#endif // __DEFINED__SkPdfPodofoMapper\n') |
@@ -504,15 +536,19 @@ |
def generateCode(): |
global fileHeaders |
+ global fileHeadersCpp |
global knowTypes |
fileHeaders = open('SkPdfHeaders_autogen.h', 'w') |
+ fileHeadersCpp = open('SkPdfHeaders_autogen.cpp', 'w') |
fileHeaders.write('#ifndef __DEFINED__SkPdfHeaders\n') |
fileHeaders.write('#define __DEFINED__SkPdfHeaders\n') |
fileHeaders.write('\n') |
fileHeaders.write('#include "SkPdfEnums_autogen.h"\n') |
+ fileHeadersCpp.write('#include "SkPdfHeaders_autogen.h"\n') |
+ |
manager = PdfClassManager() |
manager.addClass('Object') |
@@ -581,6 +617,7 @@ |
fileHeaders.write('#endif // __DEFINED__SkPdfHeaders\n') |
fileHeaders.close() |
+ fileHeadersCpp.close() |
return 1 |