Index: experimental/PdfViewer/pdfparser/native/SkPdfNativeDoc.cpp |
=================================================================== |
--- experimental/PdfViewer/pdfparser/native/SkPdfNativeDoc.cpp (revision 11117) |
+++ experimental/PdfViewer/pdfparser/native/SkPdfNativeDoc.cpp (working copy) |
@@ -8,6 +8,7 @@ |
#include "SkPdfNativeDoc.h" |
#include "SkPdfNativeTokenizer.h" |
#include "SkPdfNativeObject.h" |
+#include "SkPdfReporter.h" |
#include <stdio.h> |
#include <string.h> |
@@ -107,7 +108,7 @@ |
fclose(file); |
if (!ok) { |
sk_free(content); |
- // TODO(edisonn): report read error |
+ SkPdfReport(kFatalError_SkPdfIssueSeverity, kReadStreamError_SkPdfIssue, "could not read file", NULL, NULL); |
// TODO(edisonn): not nice to return like this from constructor, create a static |
// function that can report NULL for failures. |
return; // Doc will have 0 pages |
@@ -125,7 +126,7 @@ |
const unsigned char* xrefstartKeywordLine = previousLineHome(fFileContent, xrefByteOffsetLine); |
if (strcmp((char*)xrefstartKeywordLine, "startxref") != 0) { |
- // TODO(edisonn): report/issue |
+ SkPdfReport(kWarning_SkPdfIssueSeverity, kMissingToken_SkPdfIssue, "Could not find startxref", NULL, NULL); |
} |
long xrefByteOffset = atol((const char*)xrefByteOffsetLine); |
@@ -189,6 +190,7 @@ |
current = nextObject(0, current, end, &token, NULL, NULL PUT_TRACK_STREAM_ARGS_EXPL2(0, fFileContent)); |
// TODO(edisonn): must be obj, return error if not? ignore ? |
if (!token.isKeyword("obj")) { |
+ SkPdfReport(kWarning_SkPdfIssueSeverity, kMissingToken_SkPdfIssue, "Could not find obj", NULL, NULL); |
continue; |
} |
@@ -203,7 +205,9 @@ |
fObjects[id].fResolvedReference = obj; |
fObjects[id].fObj = obj; |
+ fObjects[id].fIsReferenceResolved = true; |
+ |
// set objects |
} else if (token.isKeyword("trailer")) { |
long dummy; |
@@ -227,7 +231,6 @@ |
} |
} |
- |
if (fRootCatalogRef) { |
fRootCatalog = (SkPdfCatalogDictionary*)resolveReference(fRootCatalogRef); |
if (fRootCatalog->isDictionary() && fRootCatalog->valid()) { |
@@ -252,6 +255,7 @@ |
const unsigned char* current = nextObject(0, xrefStart, trailerEnd, &xref, NULL, NULL PUT_TRACK_STREAM_ARGS_EXPL2(0, fFileContent)); |
if (!xref.isKeyword("xref")) { |
+ SkPdfReport(kWarning_SkPdfIssueSeverity, kMissingToken_SkPdfIssue, "Could not find sref", NULL, NULL); |
return trailerEnd; |
} |
@@ -261,6 +265,7 @@ |
const unsigned char* previous = current; |
current = nextObject(0, current, trailerEnd, &token, NULL, NULL PUT_TRACK_STREAM_ARGS_EXPL2(0, fFileContent)); |
if (!token.isInteger()) { |
+ SkPdfReport(kInfo_SkPdfIssueSeverity, kNoIssue_SkPdfIssue, "Done readCrossReferenceSection", NULL, NULL); |
return previous; |
} |
@@ -269,7 +274,7 @@ |
current = nextObject(0, current, trailerEnd, &token, NULL, NULL PUT_TRACK_STREAM_ARGS_EXPL2(0, fFileContent)); |
if (!token.isInteger()) { |
- // TODO(edisonn): report/warning |
+ SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, "readCrossReferenceSection", &token, SkPdfNativeObject::kInteger_PdfObjectType, NULL); |
return current; |
} |
@@ -279,7 +284,7 @@ |
token.reset(); |
current = nextObject(0, current, trailerEnd, &token, NULL, NULL PUT_TRACK_STREAM_ARGS_EXPL2(0, fFileContent)); |
if (!token.isInteger()) { |
- // TODO(edisonn): report/warning |
+ SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, "readCrossReferenceSection", &token, SkPdfNativeObject::kInteger_PdfObjectType, NULL); |
return current; |
} |
int offset = (int)token.intValue(); |
@@ -287,7 +292,7 @@ |
token.reset(); |
current = nextObject(0, current, trailerEnd, &token, NULL, NULL PUT_TRACK_STREAM_ARGS_EXPL2(0, fFileContent)); |
if (!token.isInteger()) { |
- // TODO(edisonn): report/warning |
+ SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, "readCrossReferenceSection", &token, SkPdfNativeObject::kInteger_PdfObjectType, NULL); |
return current; |
} |
int generation = (int)token.intValue(); |
@@ -295,14 +300,14 @@ |
token.reset(); |
current = nextObject(0, current, trailerEnd, &token, NULL, NULL PUT_TRACK_STREAM_ARGS_EXPL2(0, fFileContent)); |
if (!token.isKeyword() || token.lenstr() != 1 || (*token.c_str() != 'f' && *token.c_str() != 'n')) { |
- // TODO(edisonn): report/warning |
+ SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, "readCrossReferenceSection: f or n expected", &token, SkPdfNativeObject::kKeyword_PdfObjectType, NULL); |
return current; |
} |
addCrossSectionInfo(startId + i, generation, offset, *token.c_str() == 'f'); |
} |
} |
- // TODO(edisonn): it should never get here? there is no trailer? |
+ SkPdfReport(kInfo_SkPdfIssueSeverity, kNoIssue_SkPdfIssue, "Unexpected end of readCrossReferenceSection", NULL, NULL); |
return current; |
} |
@@ -319,6 +324,7 @@ |
if (!trailerKeyword.isKeyword() || strlen("trailer") != trailerKeyword.lenstr() || |
strncmp(trailerKeyword.c_str(), "trailer", strlen("trailer")) != 0) { |
// TODO(edisonn): report warning, rebuild trailer from objects. |
+ SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, "readTrailer: trailer keyword expected", &trailerKeyword, SkPdfNativeObject::kKeyword_PdfObjectType, NULL); |
return current; |
} |
} |
@@ -336,7 +342,7 @@ |
if (storeCatalog) { |
SkPdfNativeObject* ref = trailer->Root(NULL); |
if (ref == NULL || !ref->isReference()) { |
- // TODO(edisonn): oops, we have to fix the corrup pdf file |
+ SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, "readTrailer: unexpected root reference", ref, SkPdfNativeObject::kReference_PdfObjectType, NULL); |
return current; |
} |
fRootCatalogRef = ref; |
@@ -381,28 +387,33 @@ |
current = nextObject(0, current, end, &idObj, NULL, NULL PUT_TRACK_STREAM_ARGS_EXPL2(0, fFileContent)); |
if (current >= end) { |
- // TODO(edisonn): report warning/error |
+ SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kReadStreamError_SkPdfIssue, "reading id", NULL, NULL); |
return NULL; |
} |
current = nextObject(0, current, end, &generationObj, NULL, NULL PUT_TRACK_STREAM_ARGS_EXPL2(0, fFileContent)); |
if (current >= end) { |
- // TODO(edisonn): report warning/error |
+ SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kReadStreamError_SkPdfIssue, "reading generation", NULL, NULL); |
return NULL; |
} |
current = nextObject(0, current, end, &objKeyword, NULL, NULL PUT_TRACK_STREAM_ARGS_EXPL2(0, fFileContent)); |
if (current >= end) { |
- // TODO(edisonn): report warning/error |
+ SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kReadStreamError_SkPdfIssue, "reading keyword obj", NULL, NULL); |
return NULL; |
} |
- if (!idObj.isInteger() || !generationObj.isInteger() || id != idObj.intValue()/* || generation != generationObj.intValue()*/) { |
- // TODO(edisonn): report warning/error |
+ if (!idObj.isInteger() || id != idObj.intValue()) { |
+ SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, "readObject: unexpected id", &idObj, SkPdfNativeObject::kInteger_PdfObjectType, NULL); |
} |
+ // TODO(edisonn): verify that the generation is the right one |
+ if (!generationObj.isInteger() /* || generation != generationObj.intValue()*/) { |
+ SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, "readObject: unexpected generation", &generationObj, SkPdfNativeObject::kInteger_PdfObjectType, NULL); |
+ } |
+ |
if (!objKeyword.isKeyword() || strcmp(objKeyword.c_str(), "obj") != 0) { |
- // TODO(edisonn): report warning/error |
+ SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, "readObject: unexpected obj keyword", &objKeyword, SkPdfNativeObject::kKeyword_PdfObjectType, NULL); |
} |
current = nextObject(1, current, end, dict, fAllocator, this PUT_TRACK_STREAM_ARGS_EXPL2(0, fFileContent)); |
@@ -543,7 +554,7 @@ |
// TODO(edisonn): verify id and gen expected |
if (id < 0 || id >= fObjects.count()) { |
- // TODO(edisonn): report error/warning |
+ SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kReadStreamError_SkPdfIssue, "resolve reference id out of bounds", NULL, NULL); |
return NULL; |
} |
@@ -553,7 +564,7 @@ |
printf("\nresolve(%s) = %s\n", ref->toString(0).c_str(), fObjects[id].fResolvedReference->toString(0, ref->toString().size() + 13).c_str()); |
#endif |
- // TODO(edisonn): for known good documents, assert here THAT THE REFERENCE IS NOT null |
+ SkPdfReportIf(!fObjects[id].fResolvedReference, kIgnoreError_SkPdfIssueSeverity, kBadReference_SkPdfIssue, "ref is NULL", NULL, NULL); |
return fObjects[id].fResolvedReference; |
} |