diff options
5 files changed, 34 insertions, 30 deletions
diff --git a/core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp b/core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp index 9ad1d060cc..7ece85a602 100644 --- a/core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp +++ b/core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp @@ -1233,8 +1233,7 @@ int32_t CPDF_Creator::WriteOldIndirectObject(uint32_t objnum) { return 0; m_ObjectOffset[objnum] = m_Offset; - FX_BOOL bExistInMap = - pdfium::ContainsKey(m_pDocument->m_IndirectObjs, objnum); + FX_BOOL bExistInMap = !!m_pDocument->GetIndirectObject(objnum); const uint8_t object_type = m_pParser->GetObjectType(objnum); bool bObjStm = (object_type == 2) && m_pEncryptDict && !m_pXRefStream; if (m_pParser->IsVersionUpdated() || m_bSecurityChanged || bExistInMap || @@ -1320,15 +1319,15 @@ int32_t CPDF_Creator::WriteNewObjs(FX_BOOL bIncremental, IFX_Pause* pPause) { int32_t index = (int32_t)(uintptr_t)m_Pos; while (index < iCount) { uint32_t objnum = m_NewObjNumArray.ElementAt(index); - auto it = m_pDocument->m_IndirectObjs.find(objnum); - if (it == m_pDocument->m_IndirectObjs.end()) { + CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum); + if (!pObj) { ++index; continue; } m_ObjectOffset[objnum] = m_Offset; - if (WriteIndirectObj(it->second)) { + if (WriteIndirectObj(pObj)) return -1; - } + index++; if (pPause && pPause->NeedToPauseNow()) { m_Pos = (FX_POSITION)(uintptr_t)index; @@ -1363,7 +1362,7 @@ void CPDF_Creator::InitOldObjNumOffsets() { void CPDF_Creator::InitNewObjNumOffsets() { FX_BOOL bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; FX_BOOL bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0; - for (const auto& pair : m_pDocument->m_IndirectObjs) { + for (const auto& pair : *m_pDocument) { const uint32_t objnum = pair.first; const CPDF_Object* pObj = pair.second; if (bIncremental || pObj->GetObjNum() == CPDF_Object::kInvalidObjNum) diff --git a/core/fpdfapi/fpdf_parser/cfdf_document.cpp b/core/fpdfapi/fpdf_parser/cfdf_document.cpp index c268503715..773b97af2b 100644 --- a/core/fpdfapi/fpdf_parser/cfdf_document.cpp +++ b/core/fpdfapi/fpdf_parser/cfdf_document.cpp @@ -84,13 +84,13 @@ void CFDF_Document::ParseStream(IFX_FileRead* pFile, FX_BOOL bOwnFile) { } FX_BOOL CFDF_Document::WriteBuf(CFX_ByteTextBuf& buf) const { - if (!m_pRootDict) { + if (!m_pRootDict) return FALSE; - } + buf << "%FDF-1.2\r\n"; - for (const auto& pair : m_IndirectObjs) { + for (const auto& pair : *this) buf << pair.first << " 0 obj\r\n" << pair.second << "\r\nendobj\r\n\r\n"; - } + buf << "trailer\r\n<</Root " << m_pRootDict->GetObjNum() << " 0 R>>\r\n%%EOF\r\n"; return TRUE; diff --git a/core/fpdfapi/fpdf_parser/cpdf_document.cpp b/core/fpdfapi/fpdf_parser/cpdf_document.cpp index a05a24e07f..31d44b01fe 100644 --- a/core/fpdfapi/fpdf_parser/cpdf_document.cpp +++ b/core/fpdfapi/fpdf_parser/cpdf_document.cpp @@ -729,9 +729,9 @@ uint32_t CPDF_Document::GetUserPermissions() const { } FX_BOOL CPDF_Document::IsFormStream(uint32_t objnum, FX_BOOL& bForm) const { - auto it = m_IndirectObjs.find(objnum); - if (it != m_IndirectObjs.end()) { - CPDF_Stream* pStream = it->second->AsStream(); + CPDF_Object* pObj = GetIndirectObject(objnum); + if (pObj) { + CPDF_Stream* pStream = pObj->AsStream(); bForm = pStream && pStream->GetDict()->GetStringBy("Subtype") == "Form"; return TRUE; } diff --git a/core/fpdfapi/fpdf_parser/cpdf_indirect_object_holder.cpp b/core/fpdfapi/fpdf_parser/cpdf_indirect_object_holder.cpp index bb29da5052..d00b4a7961 100644 --- a/core/fpdfapi/fpdf_parser/cpdf_indirect_object_holder.cpp +++ b/core/fpdfapi/fpdf_parser/cpdf_indirect_object_holder.cpp @@ -20,20 +20,25 @@ CPDF_IndirectObjectHolder::~CPDF_IndirectObjectHolder() { pair.second->Destroy(); } +CPDF_Object* CPDF_IndirectObjectHolder::GetIndirectObject( + uint32_t objnum) const { + auto it = m_IndirectObjs.find(objnum); + return it != m_IndirectObjs.end() ? it->second : nullptr; +} + CPDF_Object* CPDF_IndirectObjectHolder::GetOrParseIndirectObject( uint32_t objnum) { if (objnum == 0) return nullptr; - auto it = m_IndirectObjs.find(objnum); - if (it != m_IndirectObjs.end()) - return it->second->GetObjNum() != CPDF_Object::kInvalidObjNum ? it->second - : nullptr; + CPDF_Object* pObj = GetIndirectObject(objnum); + if (pObj) + return pObj->GetObjNum() != CPDF_Object::kInvalidObjNum ? pObj : nullptr; if (!m_pParser) return nullptr; - CPDF_Object* pObj = m_pParser->ParseIndirectObject(this, objnum); + pObj = m_pParser->ParseIndirectObject(this, objnum); if (!pObj) return nullptr; @@ -62,13 +67,13 @@ bool CPDF_IndirectObjectHolder::ReplaceIndirectObjectIfHigherGeneration( if (!objnum || !pObj) return false; - auto it = m_IndirectObjs.find(objnum); - if (it != m_IndirectObjs.end()) { - if (pObj->GetGenNum() <= it->second->GetGenNum()) { + CPDF_Object* pOldObj = GetIndirectObject(objnum); + if (pOldObj) { + if (pObj->GetGenNum() <= pOldObj->GetGenNum()) { pObj->Destroy(); return false; } - it->second->Destroy(); + pOldObj->Destroy(); } pObj->m_ObjNum = objnum; m_IndirectObjs[objnum] = pObj; @@ -77,11 +82,10 @@ bool CPDF_IndirectObjectHolder::ReplaceIndirectObjectIfHigherGeneration( } void CPDF_IndirectObjectHolder::ReleaseIndirectObject(uint32_t objnum) { - auto it = m_IndirectObjs.find(objnum); - if (it == m_IndirectObjs.end() || - it->second->GetObjNum() == CPDF_Object::kInvalidObjNum) { + CPDF_Object* pObj = GetIndirectObject(objnum); + if (!pObj || pObj->GetObjNum() == CPDF_Object::kInvalidObjNum) return; - } - it->second->Destroy(); - m_IndirectObjs.erase(it); + + pObj->Destroy(); + m_IndirectObjs.erase(objnum); } diff --git a/core/fpdfapi/fpdf_parser/include/cpdf_indirect_object_holder.h b/core/fpdfapi/fpdf_parser/include/cpdf_indirect_object_holder.h index 31e0aba5ea..27a9bc39db 100644 --- a/core/fpdfapi/fpdf_parser/include/cpdf_indirect_object_holder.h +++ b/core/fpdfapi/fpdf_parser/include/cpdf_indirect_object_holder.h @@ -22,6 +22,7 @@ class CPDF_IndirectObjectHolder { explicit CPDF_IndirectObjectHolder(CPDF_Parser* pParser); ~CPDF_IndirectObjectHolder(); + CPDF_Object* GetIndirectObject(uint32_t objnum) const; CPDF_Object* GetOrParseIndirectObject(uint32_t objnum); void ReleaseIndirectObject(uint32_t objnum); @@ -40,10 +41,10 @@ class CPDF_IndirectObjectHolder { protected: CPDF_Parser* m_pParser; - std::map<uint32_t, CPDF_Object*> m_IndirectObjs; private: uint32_t m_LastObjNum; + std::map<uint32_t, CPDF_Object*> m_IndirectObjs; }; #endif // CORE_FPDFAPI_FPDF_PARSER_INCLUDE_CPDF_INDIRECT_OBJECT_HOLDER_H_ |