From 71333dc57ac7e4cf7963c83333730b3882ab371f Mon Sep 17 00:00:00 2001 From: art-snake Date: Fri, 4 Nov 2016 18:17:27 -0700 Subject: Unify some code Move parsing of linearized header into separate CPDF_Linearized class. Review-Url: https://codereview.chromium.org/2466023002 --- core/fpdfapi/parser/cpdf_parser.cpp | 46 +++++++++++-------------------------- 1 file changed, 13 insertions(+), 33 deletions(-) (limited to 'core/fpdfapi/parser/cpdf_parser.cpp') diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp index c8c07bd0b7..044d12d6ef 100644 --- a/core/fpdfapi/parser/cpdf_parser.cpp +++ b/core/fpdfapi/parser/cpdf_parser.cpp @@ -12,6 +12,7 @@ #include "core/fpdfapi/parser/cpdf_crypto_handler.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_linearized.h" #include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fpdfapi/parser/cpdf_security_handler.h" @@ -54,8 +55,6 @@ CPDF_Parser::CPDF_Parser() m_pTrailer(nullptr), m_pEncryptDict(nullptr), m_bVersionUpdated(false), - m_pLinearized(nullptr), - m_dwFirstPageNo(0), m_dwXrefStartObjNum(0) { m_pSyntax.reset(new CPDF_SyntaxParser); } @@ -72,8 +71,6 @@ CPDF_Parser::~CPDF_Parser() { for (CPDF_Dictionary* trailer : m_Trailers) delete trailer; - - delete m_pLinearized; } uint32_t CPDF_Parser::GetLastObjNum() const { @@ -1402,6 +1399,10 @@ CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict( return pObj; } +uint32_t CPDF_Parser::GetFirstPageNo() const { + return m_pLinearized ? m_pLinearized->GetFirstPageNo() : 0; +} + CPDF_Dictionary* CPDF_Parser::LoadTrailerV4() { if (m_pSyntax->GetKeyword() != "trailer") return nullptr; @@ -1448,35 +1449,14 @@ bool CPDF_Parser::IsLinearizedFile(IFX_SeekableReadStream* pFileAccess, return false; } - m_pLinearized = m_pSyntax->GetObject(nullptr, objnum, gennum, true); + m_pLinearized = CPDF_Linearized::CreateForObject( + pdfium::WrapUnique(m_pSyntax->GetObject(nullptr, objnum, gennum, true))); if (!m_pLinearized) return false; - - CPDF_Dictionary* pDict = m_pLinearized->GetDict(); - if (pDict && pDict->GetObjectFor("Linearized")) { - m_pSyntax->GetNextWord(nullptr); - - CPDF_Object* pLen = pDict->GetObjectFor("L"); - if (!pLen) { - delete m_pLinearized; - m_pLinearized = nullptr; - return false; - } - - if (pLen->GetInteger() != (int)pFileAccess->GetSize()) - return false; - - if (CPDF_Number* pNo = ToNumber(pDict->GetObjectFor("P"))) - m_dwFirstPageNo = pNo->GetInteger(); - - if (CPDF_Number* pTable = ToNumber(pDict->GetObjectFor("T"))) - m_LastXRefOffset = pTable->GetInteger(); - - return true; - } - delete m_pLinearized; - m_pLinearized = nullptr; - return false; + m_LastXRefOffset = m_pLinearized->GetLastXRefOffset(); + // Move parser onto first page xref table start. + m_pSyntax->GetNextWord(nullptr); + return true; } CPDF_Parser::Error CPDF_Parser::StartLinearizedParse( @@ -1525,7 +1505,7 @@ CPDF_Parser::Error CPDF_Parser::StartLinearizedParse( if (eRet != SUCCESS) return eRet; - m_pDocument->LoadLinearizedDoc(m_pLinearized->GetDict()); + m_pDocument->LoadLinearizedDoc(m_pLinearized.get()); if (!m_pDocument->GetRoot() || m_pDocument->GetPageCount() == 0) { if (bXRefRebuilt) return FORMAT_ERROR; @@ -1538,7 +1518,7 @@ CPDF_Parser::Error CPDF_Parser::StartLinearizedParse( if (eRet != SUCCESS) return eRet; - m_pDocument->LoadLinearizedDoc(m_pLinearized->GetDict()); + m_pDocument->LoadLinearizedDoc(m_pLinearized.get()); if (!m_pDocument->GetRoot()) return FORMAT_ERROR; } -- cgit v1.2.3