| Index: experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp | 
| =================================================================== | 
| --- experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp	(revision 10294) | 
| +++ experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp	(working copy) | 
| @@ -14,6 +14,7 @@ | 
| #include "SkPdfPageTreeNodeDictionary_autogen.h" | 
| #include "SkPdfMapper_autogen.h" | 
|  | 
| +#include "SkStream.h" | 
|  | 
|  | 
| static long getFileSize(const char* filename) | 
| @@ -67,25 +68,48 @@ | 
| // 1) run on a lot of file | 
| // 2) recoverable corupt file: remove endobj, endsteam, remove other keywords, use other white spaces, insert comments randomly, ... | 
| // 3) irrecoverable corrupt file | 
| + | 
| +SkNativeParsedPDF::SkNativeParsedPDF(SkStream* stream) | 
| +        : fAllocator(new SkPdfAllocator()) | 
| +        , fFileContent(NULL) | 
| +        , fContentLength(0) | 
| +        , fRootCatalogRef(NULL) | 
| +        , fRootCatalog(NULL) { | 
| +    size_t size = stream->getLength(); | 
| +    void* ptr = sk_malloc_throw(size); | 
| +    stream->read(ptr, size); | 
| + | 
| +    init(ptr, size); | 
| +} | 
| + | 
| SkNativeParsedPDF::SkNativeParsedPDF(const char* path) | 
| : fAllocator(new SkPdfAllocator()) | 
| +        , fFileContent(NULL) | 
| +        , fContentLength(0) | 
| , fRootCatalogRef(NULL) | 
| , fRootCatalog(NULL) { | 
| gDoc = this; | 
| FILE* file = fopen(path, "r"); | 
| -    fContentLength = getFileSize(path); | 
| -    unsigned char* content = new unsigned char[fContentLength + 1]; | 
| -    bool ok = (0 != fread(content, fContentLength, 1, file)); | 
| -    content[fContentLength] = '\0'; | 
| -    fFileContent = content; | 
| +    size_t size = getFileSize(path); | 
| +    void* content = sk_malloc_throw(size); | 
| +    bool ok = (0 != fread(content, size, 1, file)); | 
| fclose(file); | 
| file = NULL; | 
|  | 
| if (!ok) { | 
| +        sk_free(content); | 
| // TODO(edisonn): report read error | 
| +        // 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 | 
| } | 
|  | 
| +    init(content, size); | 
| +} | 
| + | 
| +void SkNativeParsedPDF::init(const void* bytes, size_t length) { | 
| +    fFileContent = (const unsigned char*)bytes; | 
| +    fContentLength = length; | 
| const unsigned char* eofLine = lineHome(fFileContent, fFileContent + fContentLength - 1); | 
| const unsigned char* xrefByteOffsetLine = previousLineHome(fFileContent, eofLine); | 
| const unsigned char* xrefstartKeywordLine = previousLineHome(fFileContent, xrefByteOffsetLine); | 
| @@ -126,7 +150,7 @@ | 
|  | 
| // TODO(edisonn): NYI | 
| SkNativeParsedPDF::~SkNativeParsedPDF() { | 
| -    delete[] fFileContent; | 
| +    sk_free((void*)fFileContent); | 
| delete fAllocator; | 
| } | 
|  | 
|  |