Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2382)

Unified Diff: core/fpdfapi/parser/cpdf_indirect_object_holder.cpp

Issue 2419173002: Update CPDF_IndirectObjectHolder APIs for unique objects (Closed)
Patch Set: windows Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: core/fpdfapi/parser/cpdf_indirect_object_holder.cpp
diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp
index 6e549de5a7d069e7b79da6b6c11bad1c6b0a0cd5..3bf1f7adc66a1f707d0f1b5354205d98e60aa7e0 100644
--- a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp
+++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp
@@ -6,8 +6,11 @@
#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h"
+#include "core/fpdfapi/parser/cpdf_array.h"
+#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/parser/cpdf_object.h"
#include "core/fpdfapi/parser/cpdf_parser.h"
+#include "core/fpdfapi/parser/cpdf_stream.h"
CPDF_IndirectObjectHolder::CPDF_IndirectObjectHolder() : m_LastObjNum(0) {}
@@ -42,35 +45,58 @@ CPDF_Object* CPDF_IndirectObjectHolder::ParseIndirectObject(uint32_t objnum) {
return nullptr;
}
-uint32_t CPDF_IndirectObjectHolder::AddIndirectObject(CPDF_Object* pObj) {
+CPDF_Object* CPDF_IndirectObjectHolder::AddIndirectObject(UniqueObject pObj) {
if (pObj->m_ObjNum)
- return pObj->m_ObjNum;
+ return pObj.release(); // TODO(tsepez): shouldn't happen, stop this leak.
- m_LastObjNum++;
+ pObj->m_ObjNum = ++m_LastObjNum;
m_IndirectObjs[m_LastObjNum].release(); // TODO(tsepez): stop this leak.
- m_IndirectObjs[m_LastObjNum].reset(pObj);
- pObj->m_ObjNum = m_LastObjNum;
- return m_LastObjNum;
+ m_IndirectObjs[m_LastObjNum].reset(pObj.release()); // Changes deleters.
+ return m_IndirectObjs[m_LastObjNum].get();
+}
+
+CPDF_Array* CPDF_IndirectObjectHolder::AddIndirectArray() {
+ return ToArray(AddIndirectObject(UniqueObject(new CPDF_Array())));
+}
+
+CPDF_Dictionary* CPDF_IndirectObjectHolder::AddIndirectDictionary() {
+ return ToDictionary(AddIndirectObject(UniqueObject(new CPDF_Dictionary())));
+}
+
+CPDF_Dictionary* CPDF_IndirectObjectHolder::AddIndirectDictionary(
+ const CFX_WeakPtr<CFX_ByteStringPool>& pPool) {
+ return ToDictionary(
+ AddIndirectObject(UniqueObject(new CPDF_Dictionary(pPool))));
+}
+
+CPDF_Stream* CPDF_IndirectObjectHolder::AddIndirectStream() {
+ return ToStream(AddIndirectObject(UniqueObject(new CPDF_Stream())));
+}
+
+CPDF_Stream* CPDF_IndirectObjectHolder::AddIndirectStream(
+ uint8_t* pData,
Lei Zhang 2016/10/14 23:18:04 Parameters are not used?
Tom Sepez 2016/10/14 23:42:29 Argh. I have some template foo coming to avoid th
+ uint32_t size,
+ CPDF_Dictionary* pDict) {
+ return ToStream(AddIndirectObject(UniqueObject(new CPDF_Stream())));
}
bool CPDF_IndirectObjectHolder::ReplaceIndirectObjectIfHigherGeneration(
uint32_t objnum,
- CPDF_Object* pObj) {
+ UniqueObject pObj) {
if (!objnum || !pObj)
return false;
CPDF_Object* pOldObj = GetIndirectObject(objnum);
- if (pOldObj && pObj->GetGenNum() <= pOldObj->GetGenNum()) {
- delete pObj;
+ if (pOldObj && pObj->GetGenNum() <= pOldObj->GetGenNum())
return false;
- }
+
pObj->m_ObjNum = objnum;
- m_IndirectObjs[objnum].reset(pObj);
+ m_IndirectObjs[objnum].reset(pObj.release()); // Changes deleters.
m_LastObjNum = std::max(m_LastObjNum, objnum);
return true;
}
-void CPDF_IndirectObjectHolder::ReleaseIndirectObject(uint32_t objnum) {
+void CPDF_IndirectObjectHolder::DeleteIndirectObject(uint32_t objnum) {
CPDF_Object* pObj = GetIndirectObject(objnum);
if (!pObj || pObj->GetObjNum() == CPDF_Object::kInvalidObjNum)
return;

Powered by Google App Engine
This is Rietveld 408576698