From 4540fbaa718b0b06e076321e0e1a61e80a161499 Mon Sep 17 00:00:00 2001 From: tsepez Date: Tue, 16 Aug 2016 11:12:21 -0700 Subject: Get CPDF_Parser out of the document creation business. Precursor to someday using possibly subclassed documents. Review-Url: https://codereview.chromium.org/2248123002 --- fpdfsdk/fpdfview.cpp | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) (limited to 'fpdfsdk/fpdfview.cpp') diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp index 8aebb550ff..29fe88d943 100644 --- a/fpdfsdk/fpdfview.cpp +++ b/fpdfsdk/fpdfview.cpp @@ -362,24 +362,25 @@ DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadDocument(FPDF_STRING file_path, return nullptr; } - CPDF_Parser* pParser = new CPDF_Parser; + std::unique_ptr pParser(new CPDF_Parser); pParser->SetPassword(password); - CPDF_Parser::Error error = pParser->StartParse(pFileAccess); + std::unique_ptr pDocument(new CPDF_Document(pParser.get())); + CPDF_Parser::Error error = + pParser->StartParse(pFileAccess, std::move(pDocument)); if (error != CPDF_Parser::SUCCESS) { - delete pParser; ProcessParseError(error); return nullptr; } #ifdef PDF_ENABLE_XFA - CPDF_Document* pPDFDoc = pParser->GetDocument(); + CPDF_Document* pPDFDoc = pParser.release()->GetDocument(); if (!pPDFDoc) return nullptr; CPDFXFA_App* pProvider = CPDFXFA_App::GetInstance(); return new CPDFXFA_Document(pPDFDoc, pProvider); #else // PDF_ENABLE_XFA - return pParser->GetDocument(); + return pParser.release()->GetDocument(); #endif // PDF_ENABLE_XFA } @@ -446,35 +447,36 @@ class CMemFile final : public IFX_FileRead { DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf, int size, FPDF_BYTESTRING password) { - CPDF_Parser* pParser = new CPDF_Parser; - pParser->SetPassword(password); CMemFile* pMemFile = new CMemFile((uint8_t*)data_buf, size); - CPDF_Parser::Error error = pParser->StartParse(pMemFile); + std::unique_ptr pParser(new CPDF_Parser); + pParser->SetPassword(password); + + std::unique_ptr pDocument(new CPDF_Document(pParser.get())); + CPDF_Parser::Error error = + pParser->StartParse(pMemFile, std::move(pDocument)); if (error != CPDF_Parser::SUCCESS) { - delete pParser; ProcessParseError(error); return nullptr; } - CPDF_Document* pDoc = pParser ? pParser->GetDocument() : nullptr; - CheckUnSupportError(pDoc, error); - return FPDFDocumentFromCPDFDocument(pParser->GetDocument()); + CheckUnSupportError(pParser->GetDocument(), error); + return FPDFDocumentFromCPDFDocument(pParser.release()->GetDocument()); } DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password) { - CPDF_Parser* pParser = new CPDF_Parser; - pParser->SetPassword(password); CPDF_CustomAccess* pFile = new CPDF_CustomAccess(pFileAccess); - CPDF_Parser::Error error = pParser->StartParse(pFile); + std::unique_ptr pParser(new CPDF_Parser); + pParser->SetPassword(password); + + std::unique_ptr pDocument(new CPDF_Document(pParser.get())); + CPDF_Parser::Error error = pParser->StartParse(pFile, std::move(pDocument)); if (error != CPDF_Parser::SUCCESS) { - delete pParser; ProcessParseError(error); return nullptr; } - CPDF_Document* pDoc = pParser ? pParser->GetDocument() : nullptr; - CheckUnSupportError(pDoc, error); - return FPDFDocumentFromCPDFDocument(pParser->GetDocument()); + CheckUnSupportError(pParser->GetDocument(), error); + return FPDFDocumentFromCPDFDocument(pParser.release()->GetDocument()); } DLLEXPORT FPDF_BOOL STDCALL FPDF_GetFileVersion(FPDF_DOCUMENT doc, -- cgit v1.2.3