| 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..49567e50a1aa986dc6bd2bdbed6e82511370a7ea 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,59 @@ 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,
|
| + uint32_t size,
|
| + CPDF_Dictionary* pDict) {
|
| + return ToStream(
|
| + AddIndirectObject(UniqueObject(new CPDF_Stream(pData, size, pDict))));
|
| }
|
|
|
| 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;
|
|
|