summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortsepez <tsepez@chromium.org>2016-11-09 13:28:26 -0800
committerCommit bot <commit-bot@chromium.org>2016-11-09 13:28:26 -0800
commit335cf093231c984a23cb9ea113148ea1f19621ba (patch)
treee9c7803b0ce71269beb3d423549a2d6a0ac7784a
parent3ff4deea307c38462393e4f83dabe32949338168 (diff)
downloadpdfium-335cf093231c984a23cb9ea113148ea1f19621ba.tar.xz
Return unique_ptr from CPDF_Object::Clone().
Because that's what clone does. There are numerous release() calls that will go away as more code is converted. Review-Url: https://codereview.chromium.org/2484033002
-rw-r--r--core/fpdfapi/edit/fpdf_edit_create.cpp12
-rw-r--r--core/fpdfapi/page/cpdf_contentmarkitem.cpp2
-rw-r--r--core/fpdfapi/page/cpdf_streamcontentparser.cpp2
-rw-r--r--core/fpdfapi/parser/cpdf_array.cpp17
-rw-r--r--core/fpdfapi/parser/cpdf_array.h6
-rw-r--r--core/fpdfapi/parser/cpdf_array_unittest.cpp6
-rw-r--r--core/fpdfapi/parser/cpdf_boolean.cpp5
-rw-r--r--core/fpdfapi/parser/cpdf_boolean.h2
-rw-r--r--core/fpdfapi/parser/cpdf_dictionary.cpp12
-rw-r--r--core/fpdfapi/parser/cpdf_dictionary.h6
-rw-r--r--core/fpdfapi/parser/cpdf_name.cpp5
-rw-r--r--core/fpdfapi/parser/cpdf_name.h2
-rw-r--r--core/fpdfapi/parser/cpdf_null.cpp5
-rw-r--r--core/fpdfapi/parser/cpdf_null.h2
-rw-r--r--core/fpdfapi/parser/cpdf_number.cpp6
-rw-r--r--core/fpdfapi/parser/cpdf_number.h4
-rw-r--r--core/fpdfapi/parser/cpdf_object.cpp7
-rw-r--r--core/fpdfapi/parser/cpdf_object.h11
-rw-r--r--core/fpdfapi/parser/cpdf_object_unittest.cpp32
-rw-r--r--core/fpdfapi/parser/cpdf_parser.cpp12
-rw-r--r--core/fpdfapi/parser/cpdf_reference.cpp7
-rw-r--r--core/fpdfapi/parser/cpdf_reference.h6
-rw-r--r--core/fpdfapi/parser/cpdf_stream.cpp12
-rw-r--r--core/fpdfapi/parser/cpdf_stream.h6
-rw-r--r--core/fpdfapi/parser/cpdf_string.cpp5
-rw-r--r--core/fpdfapi/parser/cpdf_string.h4
-rw-r--r--core/fpdfdoc/cpdf_formfield.cpp8
-rw-r--r--core/fpdfdoc/cpdf_interform.cpp13
-rw-r--r--core/fpdfdoc/cpvt_generateap.cpp6
-rw-r--r--fpdfsdk/fpdf_flatten.cpp5
-rw-r--r--fpdfsdk/fpdfppo.cpp38
31 files changed, 136 insertions, 130 deletions
diff --git a/core/fpdfapi/edit/fpdf_edit_create.cpp b/core/fpdfapi/edit/fpdf_edit_create.cpp
index a578a0a114..c823ab01e1 100644
--- a/core/fpdfapi/edit/fpdf_edit_create.cpp
+++ b/core/fpdfapi/edit/fpdf_edit_create.cpp
@@ -404,7 +404,7 @@ class CPDF_FlateEncoder {
void CPDF_FlateEncoder::CloneDict() {
if (!m_bCloned) {
- m_pDict = ToDictionary(m_pDict->Clone());
+ m_pDict = ToDictionary(m_pDict->Clone().release());
ASSERT(m_pDict);
m_bCloned = true;
}
@@ -425,7 +425,7 @@ CPDF_FlateEncoder::CPDF_FlateEncoder(CPDF_Stream* pStream, bool bFlateEncode)
destAcc.LoadAllData(pStream);
m_dwSize = destAcc.GetSize();
m_pData = (uint8_t*)destAcc.DetachData();
- m_pDict = ToDictionary(pStream->GetDict()->Clone());
+ m_pDict = ToDictionary(pStream->GetDict()->Clone().release());
m_pDict->RemoveFor("Filter");
m_bNewData = true;
m_bCloned = true;
@@ -441,7 +441,7 @@ CPDF_FlateEncoder::CPDF_FlateEncoder(CPDF_Stream* pStream, bool bFlateEncode)
m_bCloned = true;
// TODO(thestig): Move to Init() and check return value.
::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), &m_pData, &m_dwSize);
- m_pDict = ToDictionary(pStream->GetDict()->Clone());
+ m_pDict = ToDictionary(pStream->GetDict()->Clone().release());
m_pDict->SetIntegerFor("Length", m_dwSize);
m_pDict->SetNameFor("Filter", "FlateDecode");
m_pDict->RemoveFor("DecodeParms");
@@ -1931,7 +1931,7 @@ void CPDF_Creator::InitID(bool bDefault) {
m_pIDArray.reset(new CPDF_Array);
CPDF_Object* pID1 = pOldIDArray ? pOldIDArray->GetObjectAt(0) : nullptr;
if (pID1) {
- m_pIDArray->Add(pID1->Clone());
+ m_pIDArray->Add(pID1->Clone().release());
} else {
std::vector<uint8_t> buffer =
PDF_GenerateFileID((uint32_t)(uintptr_t) this, m_dwLastObjNum);
@@ -1945,7 +1945,7 @@ void CPDF_Creator::InitID(bool bDefault) {
if (pOldIDArray) {
CPDF_Object* pID2 = pOldIDArray->GetObjectAt(1);
if ((m_dwFlags & FPDFCREATE_INCREMENTAL) && m_pEncryptDict && pID2) {
- m_pIDArray->Add(pID2->Clone());
+ m_pIDArray->Add(pID2->Clone().release());
return;
}
std::vector<uint8_t> buffer =
@@ -1954,7 +1954,7 @@ void CPDF_Creator::InitID(bool bDefault) {
m_pIDArray->Add(new CPDF_String(bsBuffer, true));
return;
}
- m_pIDArray->Add(m_pIDArray->GetObjectAt(0)->Clone());
+ m_pIDArray->Add(m_pIDArray->GetObjectAt(0)->Clone().release());
if (m_pEncryptDict && !pOldIDArray && m_pParser && bNewId) {
if (m_pEncryptDict->GetStringFor("Filter") == "Standard") {
CFX_ByteString user_pass = m_pParser->GetPassword();
diff --git a/core/fpdfapi/page/cpdf_contentmarkitem.cpp b/core/fpdfapi/page/cpdf_contentmarkitem.cpp
index dffeada707..48a9679251 100644
--- a/core/fpdfapi/page/cpdf_contentmarkitem.cpp
+++ b/core/fpdfapi/page/cpdf_contentmarkitem.cpp
@@ -16,7 +16,7 @@ CPDF_ContentMarkItem::CPDF_ContentMarkItem(const CPDF_ContentMarkItem& that)
m_ParamType(that.m_ParamType),
m_pPropertiesDict(that.m_pPropertiesDict) {
if (that.m_pDirectDict)
- m_pDirectDict.reset(that.m_pDirectDict->Clone()->AsDictionary());
+ m_pDirectDict = ToDictionary(that.m_pDirectDict->Clone());
}
CPDF_ContentMarkItem::~CPDF_ContentMarkItem() {}
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index cd77c0b633..e7d23c0522 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -667,7 +667,7 @@ void CPDF_StreamContentParser::Handle_BeginImage() {
if (name != "DeviceRGB" && name != "DeviceGray" && name != "DeviceCMYK") {
pCSObj = FindResourceObj("ColorSpace", name);
if (pCSObj && pCSObj->IsInline()) {
- pCSObj = pCSObj->Clone();
+ pCSObj = pCSObj->Clone().release();
pDict->SetFor("ColorSpace", pCSObj);
}
}
diff --git a/core/fpdfapi/parser/cpdf_array.cpp b/core/fpdfapi/parser/cpdf_array.cpp
index 4000bbc980..af9b544f0a 100644
--- a/core/fpdfapi/parser/cpdf_array.cpp
+++ b/core/fpdfapi/parser/cpdf_array.cpp
@@ -44,21 +44,22 @@ const CPDF_Array* CPDF_Array::AsArray() const {
return this;
}
-CPDF_Object* CPDF_Array::Clone() const {
+std::unique_ptr<CPDF_Object> CPDF_Array::Clone() const {
return CloneObjectNonCyclic(false);
}
-CPDF_Object* CPDF_Array::CloneNonCyclic(
+std::unique_ptr<CPDF_Object> CPDF_Array::CloneNonCyclic(
bool bDirect,
std::set<const CPDF_Object*>* pVisited) const {
pVisited->insert(this);
- CPDF_Array* pCopy = new CPDF_Array();
- for (size_t i = 0; i < GetCount(); i++) {
- CPDF_Object* value = m_Objects[i];
- if (!pdfium::ContainsKey(*pVisited, value))
- pCopy->m_Objects.push_back(value->CloneNonCyclic(bDirect, pVisited));
+ auto pCopy = pdfium::MakeUnique<CPDF_Array>();
+ for (CPDF_Object* value : m_Objects) {
+ if (!pdfium::ContainsKey(*pVisited, value)) {
+ pCopy->m_Objects.push_back(
+ value->CloneNonCyclic(bDirect, pVisited).release());
+ }
}
- return pCopy;
+ return std::move(pCopy);
}
CFX_FloatRect CPDF_Array::GetRect() {
diff --git a/core/fpdfapi/parser/cpdf_array.h b/core/fpdfapi/parser/cpdf_array.h
index 9deb478809..5a9b10cb3c 100644
--- a/core/fpdfapi/parser/cpdf_array.h
+++ b/core/fpdfapi/parser/cpdf_array.h
@@ -23,9 +23,9 @@ class CPDF_Array : public CPDF_Object {
CPDF_Array();
~CPDF_Array() override;
- // CPDF_Object.
+ // CPDF_Object:
Type GetType() const override;
- CPDF_Object* Clone() const override;
+ std::unique_ptr<CPDF_Object> Clone() const override;
bool IsArray() const override;
CPDF_Array* AsArray() override;
const CPDF_Array* AsArray() const override;
@@ -62,7 +62,7 @@ class CPDF_Array : public CPDF_Object {
const_iterator end() const { return m_Objects.end(); }
protected:
- CPDF_Object* CloneNonCyclic(
+ std::unique_ptr<CPDF_Object> CloneNonCyclic(
bool bDirect,
std::set<const CPDF_Object*>* pVisited) const override;
diff --git a/core/fpdfapi/parser/cpdf_array_unittest.cpp b/core/fpdfapi/parser/cpdf_array_unittest.cpp
index b1a4605666..acb1bd89a9 100644
--- a/core/fpdfapi/parser/cpdf_array_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_array_unittest.cpp
@@ -87,7 +87,7 @@ TEST(cpdf_array, Clone) {
std::unique_ptr<CPDF_Array> arr(new CPDF_Array);
for (size_t i = 0; i < FX_ArraySize(elems); ++i)
arr->InsertAt(i, new CPDF_Number(elems[i]));
- std::unique_ptr<CPDF_Array> arr2(arr->Clone()->AsArray());
+ std::unique_ptr<CPDF_Array> arr2 = ToArray(arr->Clone());
EXPECT_EQ(arr->GetCount(), arr2->GetCount());
for (size_t i = 0; i < FX_ArraySize(elems); ++i) {
// Clone() always create new objects.
@@ -120,10 +120,10 @@ TEST(cpdf_array, Clone) {
ASSERT_EQ(kNumOfRows, arr->GetCount());
// Not dereferencing reference objects means just creating new references
// instead of new copies of direct objects.
- std::unique_ptr<CPDF_Array> arr1(arr->Clone()->AsArray());
+ std::unique_ptr<CPDF_Array> arr1 = ToArray(arr->Clone());
EXPECT_EQ(arr->GetCount(), arr1->GetCount());
// Dereferencing reference objects creates new copies of direct objects.
- std::unique_ptr<CPDF_Array> arr2(arr->CloneDirectObject()->AsArray());
+ std::unique_ptr<CPDF_Array> arr2 = ToArray(arr->CloneDirectObject());
EXPECT_EQ(arr->GetCount(), arr2->GetCount());
for (size_t i = 0; i < kNumOfRows; ++i) {
CPDF_Array* arr_elem = arr->GetObjectAt(i)->AsArray();
diff --git a/core/fpdfapi/parser/cpdf_boolean.cpp b/core/fpdfapi/parser/cpdf_boolean.cpp
index 416b6ff4bc..0204fd9eb0 100644
--- a/core/fpdfapi/parser/cpdf_boolean.cpp
+++ b/core/fpdfapi/parser/cpdf_boolean.cpp
@@ -5,6 +5,7 @@
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#include "core/fpdfapi/parser/cpdf_boolean.h"
+#include "third_party/base/ptr_util.h"
CPDF_Boolean::CPDF_Boolean() : m_bValue(false) {}
@@ -16,8 +17,8 @@ CPDF_Object::Type CPDF_Boolean::GetType() const {
return BOOLEAN;
}
-CPDF_Object* CPDF_Boolean::Clone() const {
- return new CPDF_Boolean(m_bValue);
+std::unique_ptr<CPDF_Object> CPDF_Boolean::Clone() const {
+ return pdfium::MakeUnique<CPDF_Boolean>(m_bValue);
}
CFX_ByteString CPDF_Boolean::GetString() const {
diff --git a/core/fpdfapi/parser/cpdf_boolean.h b/core/fpdfapi/parser/cpdf_boolean.h
index bc864a6ab8..808f9ee6f0 100644
--- a/core/fpdfapi/parser/cpdf_boolean.h
+++ b/core/fpdfapi/parser/cpdf_boolean.h
@@ -19,7 +19,7 @@ class CPDF_Boolean : public CPDF_Object {
// CPDF_Object:
Type GetType() const override;
- CPDF_Object* Clone() const override;
+ std::unique_ptr<CPDF_Object> Clone() const override;
CFX_ByteString GetString() const override;
int GetInteger() const override;
void SetString(const CFX_ByteString& str) override;
diff --git a/core/fpdfapi/parser/cpdf_dictionary.cpp b/core/fpdfapi/parser/cpdf_dictionary.cpp
index 37efbbc34a..403c29fa0d 100644
--- a/core/fpdfapi/parser/cpdf_dictionary.cpp
+++ b/core/fpdfapi/parser/cpdf_dictionary.cpp
@@ -57,23 +57,23 @@ const CPDF_Dictionary* CPDF_Dictionary::AsDictionary() const {
return this;
}
-CPDF_Object* CPDF_Dictionary::Clone() const {
+std::unique_ptr<CPDF_Object> CPDF_Dictionary::Clone() const {
return CloneObjectNonCyclic(false);
}
-CPDF_Object* CPDF_Dictionary::CloneNonCyclic(
+std::unique_ptr<CPDF_Object> CPDF_Dictionary::CloneNonCyclic(
bool bDirect,
std::set<const CPDF_Object*>* pVisited) const {
pVisited->insert(this);
- CPDF_Dictionary* pCopy = new CPDF_Dictionary(m_pPool);
+ auto pCopy = pdfium::MakeUnique<CPDF_Dictionary>(m_pPool);
for (const auto& it : *this) {
CPDF_Object* value = it.second;
if (!pdfium::ContainsKey(*pVisited, value)) {
- pCopy->m_Map.insert(
- std::make_pair(it.first, value->CloneNonCyclic(bDirect, pVisited)));
+ pCopy->m_Map.insert(std::make_pair(
+ it.first, value->CloneNonCyclic(bDirect, pVisited).release()));
}
}
- return pCopy;
+ return std::move(pCopy);
}
CPDF_Object* CPDF_Dictionary::GetObjectFor(const CFX_ByteString& key) const {
diff --git a/core/fpdfapi/parser/cpdf_dictionary.h b/core/fpdfapi/parser/cpdf_dictionary.h
index 4ef2f96ce7..fffe03463c 100644
--- a/core/fpdfapi/parser/cpdf_dictionary.h
+++ b/core/fpdfapi/parser/cpdf_dictionary.h
@@ -28,9 +28,9 @@ class CPDF_Dictionary : public CPDF_Object {
explicit CPDF_Dictionary(const CFX_WeakPtr<CFX_ByteStringPool>& pPool);
~CPDF_Dictionary() override;
- // CPDF_Object.
+ // CPDF_Object:
Type GetType() const override;
- CPDF_Object* Clone() const override;
+ std::unique_ptr<CPDF_Object> Clone() const override;
CPDF_Dictionary* GetDict() const override;
bool IsDictionary() const override;
CPDF_Dictionary* AsDictionary() override;
@@ -90,7 +90,7 @@ class CPDF_Dictionary : public CPDF_Object {
protected:
CFX_ByteString MaybeIntern(const CFX_ByteString& str);
- CPDF_Object* CloneNonCyclic(
+ std::unique_ptr<CPDF_Object> CloneNonCyclic(
bool bDirect,
std::set<const CPDF_Object*>* visited) const override;
diff --git a/core/fpdfapi/parser/cpdf_name.cpp b/core/fpdfapi/parser/cpdf_name.cpp
index 5cc8479c3b..bb46425117 100644
--- a/core/fpdfapi/parser/cpdf_name.cpp
+++ b/core/fpdfapi/parser/cpdf_name.cpp
@@ -7,6 +7,7 @@
#include "core/fpdfapi/parser/cpdf_name.h"
#include "core/fpdfapi/parser/fpdf_parser_decode.h"
+#include "third_party/base/ptr_util.h"
CPDF_Name::CPDF_Name(const CFX_ByteString& str) : m_Name(str) {}
@@ -16,8 +17,8 @@ CPDF_Object::Type CPDF_Name::GetType() const {
return NAME;
}
-CPDF_Object* CPDF_Name::Clone() const {
- return new CPDF_Name(m_Name);
+std::unique_ptr<CPDF_Object> CPDF_Name::Clone() const {
+ return pdfium::MakeUnique<CPDF_Name>(m_Name);
}
CFX_ByteString CPDF_Name::GetString() const {
diff --git a/core/fpdfapi/parser/cpdf_name.h b/core/fpdfapi/parser/cpdf_name.h
index aea1de4f83..ee50595ed9 100644
--- a/core/fpdfapi/parser/cpdf_name.h
+++ b/core/fpdfapi/parser/cpdf_name.h
@@ -16,7 +16,7 @@ class CPDF_Name : public CPDF_Object {
// CPDF_Object:
Type GetType() const override;
- CPDF_Object* Clone() const override;
+ std::unique_ptr<CPDF_Object> Clone() const override;
CFX_ByteString GetString() const override;
CFX_WideString GetUnicodeText() const override;
void SetString(const CFX_ByteString& str) override;
diff --git a/core/fpdfapi/parser/cpdf_null.cpp b/core/fpdfapi/parser/cpdf_null.cpp
index dd23101aa8..41478d7b4c 100644
--- a/core/fpdfapi/parser/cpdf_null.cpp
+++ b/core/fpdfapi/parser/cpdf_null.cpp
@@ -5,6 +5,7 @@
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#include "core/fpdfapi/parser/cpdf_null.h"
+#include "third_party/base/ptr_util.h"
CPDF_Null::CPDF_Null() {}
@@ -12,6 +13,6 @@ CPDF_Object::Type CPDF_Null::GetType() const {
return NULLOBJ;
}
-CPDF_Object* CPDF_Null::Clone() const {
- return new CPDF_Null;
+std::unique_ptr<CPDF_Object> CPDF_Null::Clone() const {
+ return pdfium::MakeUnique<CPDF_Null>();
}
diff --git a/core/fpdfapi/parser/cpdf_null.h b/core/fpdfapi/parser/cpdf_null.h
index 2b8b053b99..df985b92c0 100644
--- a/core/fpdfapi/parser/cpdf_null.h
+++ b/core/fpdfapi/parser/cpdf_null.h
@@ -15,7 +15,7 @@ class CPDF_Null : public CPDF_Object {
// CPDF_Object.
Type GetType() const override;
- CPDF_Object* Clone() const override;
+ std::unique_ptr<CPDF_Object> Clone() const override;
};
#endif // CORE_FPDFAPI_PARSER_CPDF_NULL_H_
diff --git a/core/fpdfapi/parser/cpdf_number.cpp b/core/fpdfapi/parser/cpdf_number.cpp
index 3ae629ede9..24feb2a2e0 100644
--- a/core/fpdfapi/parser/cpdf_number.cpp
+++ b/core/fpdfapi/parser/cpdf_number.cpp
@@ -5,6 +5,7 @@
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#include "core/fpdfapi/parser/cpdf_number.h"
+#include "third_party/base/ptr_util.h"
CPDF_Number::CPDF_Number() : m_bInteger(true), m_Integer(0) {}
@@ -21,8 +22,9 @@ CPDF_Object::Type CPDF_Number::GetType() const {
return NUMBER;
}
-CPDF_Object* CPDF_Number::Clone() const {
- return m_bInteger ? new CPDF_Number(m_Integer) : new CPDF_Number(m_Float);
+std::unique_ptr<CPDF_Object> CPDF_Number::Clone() const {
+ return m_bInteger ? pdfium::MakeUnique<CPDF_Number>(m_Integer)
+ : pdfium::MakeUnique<CPDF_Number>(m_Float);
}
FX_FLOAT CPDF_Number::GetNumber() const {
diff --git a/core/fpdfapi/parser/cpdf_number.h b/core/fpdfapi/parser/cpdf_number.h
index 717c2b7887..0a8f187244 100644
--- a/core/fpdfapi/parser/cpdf_number.h
+++ b/core/fpdfapi/parser/cpdf_number.h
@@ -19,9 +19,9 @@ class CPDF_Number : public CPDF_Object {
explicit CPDF_Number(const CFX_ByteStringC& str);
~CPDF_Number() override;
- // CPDF_Object.
+ // CPDF_Object:
Type GetType() const override;
- CPDF_Object* Clone() const override;
+ std::unique_ptr<CPDF_Object> Clone() const override;
CFX_ByteString GetString() const override;
FX_FLOAT GetNumber() const override;
int GetInteger() const override;
diff --git a/core/fpdfapi/parser/cpdf_object.cpp b/core/fpdfapi/parser/cpdf_object.cpp
index e9c215ce19..acda334c9e 100644
--- a/core/fpdfapi/parser/cpdf_object.cpp
+++ b/core/fpdfapi/parser/cpdf_object.cpp
@@ -22,16 +22,17 @@ CPDF_Object* CPDF_Object::GetDirect() const {
return const_cast<CPDF_Object*>(this);
}
-CPDF_Object* CPDF_Object::CloneObjectNonCyclic(bool bDirect) const {
+std::unique_ptr<CPDF_Object> CPDF_Object::CloneObjectNonCyclic(
+ bool bDirect) const {
std::set<const CPDF_Object*> visited_objs;
return CloneNonCyclic(bDirect, &visited_objs);
}
-CPDF_Object* CPDF_Object::CloneDirectObject() const {
+std::unique_ptr<CPDF_Object> CPDF_Object::CloneDirectObject() const {
return CloneObjectNonCyclic(true);
}
-CPDF_Object* CPDF_Object::CloneNonCyclic(
+std::unique_ptr<CPDF_Object> CPDF_Object::CloneNonCyclic(
bool bDirect,
std::set<const CPDF_Object*>* pVisited) const {
return Clone();
diff --git a/core/fpdfapi/parser/cpdf_object.h b/core/fpdfapi/parser/cpdf_object.h
index 8f6491ec72..c24b40a789 100644
--- a/core/fpdfapi/parser/cpdf_object.h
+++ b/core/fpdfapi/parser/cpdf_object.h
@@ -46,12 +46,13 @@ class CPDF_Object {
bool IsInline() const { return m_ObjNum == 0; }
// Create a deep copy of the object.
- virtual CPDF_Object* Clone() const = 0;
+ virtual std::unique_ptr<CPDF_Object> Clone() const = 0;
+
// Create a deep copy of the object except any reference object be
// copied to the object it points to directly.
- virtual CPDF_Object* CloneDirectObject() const;
- virtual CPDF_Object* GetDirect() const;
+ virtual std::unique_ptr<CPDF_Object> CloneDirectObject() const;
+ virtual CPDF_Object* GetDirect() const;
virtual CFX_ByteString GetString() const;
virtual CFX_WideString GetUnicodeText() const;
virtual FX_FLOAT GetNumber() const;
@@ -97,7 +98,7 @@ class CPDF_Object {
CPDF_Object() : m_ObjNum(0), m_GenNum(0) {}
- CPDF_Object* CloneObjectNonCyclic(bool bDirect) const;
+ std::unique_ptr<CPDF_Object> CloneObjectNonCyclic(bool bDirect) const;
// Create a deep copy of the object with the option to either
// copy a reference object or directly copy the object it refers to
@@ -105,7 +106,7 @@ class CPDF_Object {
// Also check cyclic reference against |pVisited|, no copy if it is found.
// Complex objects should implement their own CloneNonCyclic()
// function to properly check for possible loop.
- virtual CPDF_Object* CloneNonCyclic(
+ virtual std::unique_ptr<CPDF_Object> CloneNonCyclic(
bool bDirect,
std::set<const CPDF_Object*>* pVisited) const;
diff --git a/core/fpdfapi/parser/cpdf_object_unittest.cpp b/core/fpdfapi/parser/cpdf_object_unittest.cpp
index 1bcf6164be..b40a8e373d 100644
--- a/core/fpdfapi/parser/cpdf_object_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_object_unittest.cpp
@@ -91,10 +91,11 @@ class PDFObjectsTest : public testing::Test {
// Indirect references to indirect objects.
m_ObjHolder.reset(new CPDF_IndirectObjectHolder());
- m_IndirectObjs = {boolean_true_obj->Clone(), number_int_obj->Clone(),
- str_spec_obj->Clone(), name_obj->Clone(),
- m_ArrayObj->Clone(), m_DictObj->Clone(),
- stream_obj->Clone()};
+ m_IndirectObjs = {
+ boolean_true_obj->Clone().release(), number_int_obj->Clone().release(),
+ str_spec_obj->Clone().release(), name_obj->Clone().release(),
+ m_ArrayObj->Clone().release(), m_DictObj->Clone().release(),
+ stream_obj->Clone().release()};
for (size_t i = 0; i < m_IndirectObjs.size(); ++i) {
m_ObjHolder->AddIndirectObject(m_IndirectObjs[i]);
m_RefObjs.emplace_back(new CPDF_Reference(
@@ -268,13 +269,13 @@ TEST_F(PDFObjectsTest, GetArray) {
TEST_F(PDFObjectsTest, Clone) {
// Check for direct objects.
for (size_t i = 0; i < m_DirectObjs.size(); ++i) {
- std::unique_ptr<CPDF_Object> obj(m_DirectObjs[i]->Clone());
+ std::unique_ptr<CPDF_Object> obj = m_DirectObjs[i]->Clone();
EXPECT_TRUE(Equal(m_DirectObjs[i].get(), obj.get()));
}
// Check indirect references.
for (const auto& it : m_RefObjs) {
- std::unique_ptr<CPDF_Object> obj(it->Clone());
+ std::unique_ptr<CPDF_Object> obj = it->Clone();
EXPECT_TRUE(Equal(it.get(), obj.get()));
}
}
@@ -751,11 +752,12 @@ TEST(PDFArrayTest, CloneDirectObject) {
ASSERT_TRUE(obj);
EXPECT_TRUE(obj->IsReference());
- CPDF_Object* cloned_array_object = array->CloneDirectObject();
+ std::unique_ptr<CPDF_Object> cloned_array_object = array->CloneDirectObject();
ASSERT_TRUE(cloned_array_object);
ASSERT_TRUE(cloned_array_object->IsArray());
- std::unique_ptr<CPDF_Array> cloned_array(cloned_array_object->AsArray());
+ std::unique_ptr<CPDF_Array> cloned_array =
+ ToArray(std::move(cloned_array_object));
ASSERT_EQ(1U, cloned_array->GetCount());
CPDF_Object* cloned_obj = cloned_array->GetObjectAt(0);
EXPECT_FALSE(cloned_obj);
@@ -785,12 +787,12 @@ TEST(PDFDictionaryTest, CloneDirectObject) {
ASSERT_TRUE(obj);
EXPECT_TRUE(obj->IsReference());
- CPDF_Object* cloned_dict_object = dict->CloneDirectObject();
+ std::unique_ptr<CPDF_Object> cloned_dict_object = dict->CloneDirectObject();
ASSERT_TRUE(cloned_dict_object);
ASSERT_TRUE(cloned_dict_object->IsDictionary());
- std::unique_ptr<CPDF_Dictionary> cloned_dict(
- cloned_dict_object->AsDictionary());
+ std::unique_ptr<CPDF_Dictionary> cloned_dict =
+ ToDictionary(std::move(cloned_dict_object));
ASSERT_EQ(1U, cloned_dict->GetCount());
CPDF_Object* cloned_obj = cloned_dict->GetObjectFor("foo");
EXPECT_FALSE(cloned_obj);
@@ -805,7 +807,7 @@ TEST(PDFObjectTest, CloneCheckLoop) {
arr_obj->InsertAt(0, dict_obj);
// Clone this object to see whether stack overflow will be triggered.
- std::unique_ptr<CPDF_Array> cloned_array(arr_obj->Clone()->AsArray());
+ std::unique_ptr<CPDF_Array> cloned_array = ToArray(arr_obj->Clone());
// Cloned object should be the same as the original.
ASSERT_TRUE(cloned_array);
EXPECT_EQ(1u, cloned_array->GetCount());
@@ -823,7 +825,7 @@ TEST(PDFObjectTest, CloneCheckLoop) {
dict_obj->SetFor("stream", stream_obj.get());
// Clone this object to see whether stack overflow will be triggered.
- std::unique_ptr<CPDF_Stream> cloned_stream(stream_obj->Clone()->AsStream());
+ std::unique_ptr<CPDF_Stream> cloned_stream = ToStream(stream_obj->Clone());
// Cloned object should be the same as the original.
ASSERT_TRUE(cloned_stream);
CPDF_Object* cloned_dict = cloned_stream->GetDict();
@@ -849,8 +851,8 @@ TEST(PDFObjectTest, CloneCheckLoop) {
EXPECT_EQ(dict_obj, elem0->AsReference()->GetDirect());
// Clone this object to see whether stack overflow will be triggered.
- std::unique_ptr<CPDF_Dictionary> cloned_dict(
- ToDictionary(dict_obj->CloneDirectObject()));
+ std::unique_ptr<CPDF_Dictionary> cloned_dict =
+ ToDictionary(dict_obj->CloneDirectObject());
// Cloned object should be the same as the original.
ASSERT_TRUE(cloned_dict);
CPDF_Object* cloned_arr = cloned_dict->GetObjectFor("arr");
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index ed20cf73f4..2d96834964 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -737,8 +737,7 @@ bool CPDF_Parser::RebuildCrossRef() {
CPDF_Object* pRoot = pDict->GetObjectFor("Root");
if (pRoot && pRoot->GetDict() &&
pRoot->GetDict()->GetObjectFor("Pages")) {
- m_pTrailer =
- ToDictionary(pdfium::WrapUnique(pDict->Clone()));
+ m_pTrailer = ToDictionary(pDict->Clone());
}
}
}
@@ -811,14 +810,14 @@ bool CPDF_Parser::RebuildCrossRef() {
m_pTrailer->SetReferenceFor(key, m_pDocument,
dwObjNum);
} else {
- m_pTrailer->SetFor(key, pElement->Clone());
+ m_pTrailer->SetFor(key,
+ pElement->Clone().release());
}
}
}
} else {
if (pObj->IsStream()) {
- m_pTrailer =
- ToDictionary(pdfium::WrapUnique(pTrailer->Clone()));
+ m_pTrailer = ToDictionary(pTrailer->Clone());
} else {
m_pTrailer = ToDictionary(std::move(pObj));
}
@@ -959,8 +958,7 @@ bool CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, bool bMainXRef) {
if (size < 0)
return false;
- std::unique_ptr<CPDF_Dictionary> pNewTrailer =
- ToDictionary(pdfium::WrapUnique(pDict->Clone()));
+ std::unique_ptr<CPDF_Dictionary> pNewTrailer = ToDictionary(pDict->Clone());
if (bMainXRef) {
m_pTrailer = std::move(pNewTrailer);
ShrinkObjectMap(size);
diff --git a/core/fpdfapi/parser/cpdf_reference.cpp b/core/fpdfapi/parser/cpdf_reference.cpp
index a9cdf54855..8f44aa0200 100644
--- a/core/fpdfapi/parser/cpdf_reference.cpp
+++ b/core/fpdfapi/parser/cpdf_reference.cpp
@@ -7,6 +7,7 @@
#include "core/fpdfapi/parser/cpdf_reference.h"
#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h"
+#include "third_party/base/ptr_util.h"
#include "third_party/base/stl_util.h"
CPDF_Reference::CPDF_Reference(CPDF_IndirectObjectHolder* pDoc, int objnum)
@@ -50,11 +51,11 @@ const CPDF_Reference* CPDF_Reference::AsReference() const {
return this;
}
-CPDF_Object* CPDF_Reference::Clone() const {
+std::unique_ptr<CPDF_Object> CPDF_Reference::Clone() const {
return CloneObjectNonCyclic(false);
}
-CPDF_Object* CPDF_Reference::CloneNonCyclic(
+std::unique_ptr<CPDF_Object> CPDF_Reference::CloneNonCyclic(
bool bDirect,
std::set<const CPDF_Object*>* pVisited) const {
pVisited->insert(this);
@@ -64,7 +65,7 @@ CPDF_Object* CPDF_Reference::CloneNonCyclic(
? pDirect->CloneNonCyclic(true, pVisited)
: nullptr;
}
- return new CPDF_Reference(m_pObjList, m_RefObjNum);
+ return pdfium::MakeUnique<CPDF_Reference>(m_pObjList, m_RefObjNum);
}
CPDF_Object* CPDF_Reference::SafeGetDirect() const {
diff --git a/core/fpdfapi/parser/cpdf_reference.h b/core/fpdfapi/parser/cpdf_reference.h
index 20516ae567..93bab00334 100644
--- a/core/fpdfapi/parser/cpdf_reference.h
+++ b/core/fpdfapi/parser/cpdf_reference.h
@@ -18,9 +18,9 @@ class CPDF_Reference : public CPDF_Object {
CPDF_Reference(CPDF_IndirectObjectHolder* pDoc, int objnum);
~CPDF_Reference() override;
- // CPDF_Object.
+ // CPDF_Object:
Type GetType() const override;
- CPDF_Object* Clone() const override;
+ std::unique_ptr<CPDF_Object> Clone() const override;
CPDF_Object* GetDirect() const override;
CFX_ByteString GetString() const override;
FX_FLOAT GetNumber() const override;
@@ -36,7 +36,7 @@ class CPDF_Reference : public CPDF_Object {
void SetRef(CPDF_IndirectObjectHolder* pDoc, uint32_t objnum);
protected:
- CPDF_Object* CloneNonCyclic(
+ std::unique_ptr<CPDF_Object> CloneNonCyclic(
bool bDirect,
std::set<const CPDF_Object*>* pVisited) const override;
CPDF_Object* SafeGetDirect() const;
diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp
index 11ef1d2dc1..e8ee022940 100644
--- a/core/fpdfapi/parser/cpdf_stream.cpp
+++ b/core/fpdfapi/parser/cpdf_stream.cpp
@@ -68,11 +68,11 @@ void CPDF_Stream::InitStreamFromFile(IFX_SeekableReadStream* pFile,
m_pDict->SetIntegerFor("Length", m_dwSize);
}
-CPDF_Object* CPDF_Stream::Clone() const {
+std::unique_ptr<CPDF_Object> CPDF_Stream::Clone() const {
return CloneObjectNonCyclic(false);
}
-CPDF_Object* CPDF_Stream::CloneNonCyclic(
+std::unique_ptr<CPDF_Object> CPDF_Stream::CloneNonCyclic(
bool bDirect,
std::set<const CPDF_Object*>* pVisited) const {
pVisited->insert(this);
@@ -81,11 +81,11 @@ CPDF_Object* CPDF_Stream::CloneNonCyclic(
uint32_t streamSize = acc.GetSize();
CPDF_Dictionary* pDict = GetDict();
if (pDict && !pdfium::ContainsKey(*pVisited, pDict)) {
- pDict = ToDictionary(
- static_cast<CPDF_Object*>(pDict)->CloneNonCyclic(bDirect, pVisited));
+ pDict = ToDictionary(static_cast<CPDF_Object*>(pDict)
+ ->CloneNonCyclic(bDirect, pVisited)
+ .release());
}
-
- return new CPDF_Stream(acc.DetachData(), streamSize, pDict);
+ return pdfium::MakeUnique<CPDF_Stream>(acc.DetachData(), streamSize, pDict);
}
void CPDF_Stream::SetData(const uint8_t* pData, uint32_t size) {
diff --git a/core/fpdfapi/parser/cpdf_stream.h b/core/fpdfapi/parser/cpdf_stream.h
index f0ba31924e..ddf7cc5b69 100644
--- a/core/fpdfapi/parser/cpdf_stream.h
+++ b/core/fpdfapi/parser/cpdf_stream.h
@@ -22,9 +22,9 @@ class CPDF_Stream : public CPDF_Object {
CPDF_Stream(uint8_t* pData, uint32_t size, CPDF_Dictionary* pDict);
~CPDF_Stream() override;
- // CPDF_Object.
+ // CPDF_Object:
Type GetType() const override;
- CPDF_Object* Clone() const override;
+ std::unique_ptr<CPDF_Object> Clone() const override;
CPDF_Dictionary* GetDict() const override;
CFX_WideString GetUnicodeText() const override;
bool IsStream() const override;
@@ -48,7 +48,7 @@ class CPDF_Stream : public CPDF_Object {
bool IsMemoryBased() const { return m_bMemoryBased; }
protected:
- CPDF_Object* CloneNonCyclic(
+ std::unique_ptr<CPDF_Object> CloneNonCyclic(
bool bDirect,
std::set<const CPDF_Object*>* pVisited) const override;
diff --git a/core/fpdfapi/parser/cpdf_string.cpp b/core/fpdfapi/parser/cpdf_string.cpp
index f4fa956280..2116c200fe 100644
--- a/core/fpdfapi/parser/cpdf_string.cpp
+++ b/core/fpdfapi/parser/cpdf_string.cpp
@@ -7,6 +7,7 @@
#include "core/fpdfapi/parser/cpdf_string.h"
#include "core/fpdfapi/parser/fpdf_parser_decode.h"
+#include "third_party/base/ptr_util.h"
CPDF_String::CPDF_String() : m_bHex(false) {}
@@ -23,8 +24,8 @@ CPDF_Object::Type CPDF_String::GetType() const {
return STRING;
}
-CPDF_Object* CPDF_String::Clone() const {
- return new CPDF_String(m_String, m_bHex);
+std::unique_ptr<CPDF_Object> CPDF_String::Clone() const {
+ return pdfium::MakeUnique<CPDF_String>(m_String, m_bHex);
}
CFX_ByteString CPDF_String::GetString() const {
diff --git a/core/fpdfapi/parser/cpdf_string.h b/core/fpdfapi/parser/cpdf_string.h
index 49834c03f2..1e73e8699f 100644
--- a/core/fpdfapi/parser/cpdf_string.h
+++ b/core/fpdfapi/parser/cpdf_string.h
@@ -18,9 +18,9 @@ class CPDF_String : public CPDF_Object {
explicit CPDF_String(const CFX_WideString& str);
~CPDF_String() override;
- // CPDF_Object.
+ // CPDF_Object:
Type GetType() const override;
- CPDF_Object* Clone() const override;
+ std::unique_ptr<CPDF_Object> Clone() const override;
CFX_ByteString GetString() const override;
CFX_WideString GetUnicodeText() const override;
void SetString(const CFX_ByteString& str) override;
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index 8170b7fcbf..4999f2d6b8 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -219,14 +219,14 @@ bool CPDF_FormField::ResetField(bool bNotify) {
return false;
if (pDV) {
- CPDF_Object* pClone = pDV->Clone();
+ std::unique_ptr<CPDF_Object> pClone = pDV->Clone();
if (!pClone)
return false;
- m_pDict->SetFor("V", pClone);
+ m_pDict->SetFor("V", pClone.release());
if (pRV) {
- CPDF_Object* pCloneR = pDV->Clone();
- m_pDict->SetFor("RV", pCloneR);
+ std::unique_ptr<CPDF_Object> pCloneR = pDV->Clone();
+ m_pDict->SetFor("RV", pCloneR.release());
}
} else {
m_pDict->RemoveFor("V");
diff --git a/core/fpdfdoc/cpdf_interform.cpp b/core/fpdfdoc/cpdf_interform.cpp
index f709c57961..2a02e890c3 100644
--- a/core/fpdfdoc/cpdf_interform.cpp
+++ b/core/fpdfdoc/cpdf_interform.cpp
@@ -1105,22 +1105,22 @@ CPDF_FormField* CPDF_InterForm::AddTerminalField(CPDF_Dictionary* pFieldDict) {
if (pFieldDict->KeyExist("FT")) {
CPDF_Object* pFTValue = pFieldDict->GetDirectObjectFor("FT");
if (pFTValue)
- pParent->SetFor("FT", pFTValue->Clone());
+ pParent->SetFor("FT", pFTValue->Clone().release());
}
if (pFieldDict->KeyExist("Ff")) {
CPDF_Object* pFfValue = pFieldDict->GetDirectObjectFor("Ff");
if (pFfValue)
- pParent->SetFor("Ff", pFfValue->Clone());
+ pParent->SetFor("Ff", pFfValue->Clone().release());
}
}
pField = new CPDF_FormField(this, pParent);
CPDF_Object* pTObj = pDict->GetObjectFor("T");
if (ToReference(pTObj)) {
- CPDF_Object* pClone = pTObj->CloneDirectObject();
+ std::unique_ptr<CPDF_Object> pClone = pTObj->CloneDirectObject();
if (pClone)
- pDict->SetFor("T", pClone);
+ pDict->SetFor("T", pClone.release());
else
pDict->SetNameFor("T", "");
}
@@ -1251,7 +1251,7 @@ CFDF_Document* CPDF_InterForm::ExportToFDF(
} else {
CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V");
if (pV)
- pFieldDict->SetFor("V", pV->CloneDirectObject());
+ pFieldDict->SetFor("V", pV->CloneDirectObject().release());
}
pFields->Add(pFieldDict);
}
@@ -1304,7 +1304,8 @@ void CPDF_InterForm::FDF_ImportField(CPDF_Dictionary* pFieldDict,
if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) &&
pFieldDict->KeyExist("Opt")) {
pField->m_pDict->SetFor(
- "Opt", pFieldDict->GetDirectObjectFor("Opt")->CloneDirectObject());
+ "Opt",
+ pFieldDict->GetDirectObjectFor("Opt")->CloneDirectObject().release());
}
if (bNotify && m_pFormNotify) {
diff --git a/core/fpdfdoc/cpvt_generateap.cpp b/core/fpdfdoc/cpvt_generateap.cpp
index 66abde63a8..93ef9dc366 100644
--- a/core/fpdfdoc/cpvt_generateap.cpp
+++ b/core/fpdfdoc/cpvt_generateap.cpp
@@ -186,7 +186,8 @@ bool GenerateWidgetAP(CPDF_Document* pDoc,
pStreamResFontList->SetReferenceFor(sFontName, pDoc,
pFontDict->GetObjNum());
} else {
- pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone());
+ pStreamDict->SetFor("Resources",
+ pFormDict->GetDictFor("DR")->Clone().release());
pStreamResList = pStreamDict->GetDictFor("Resources");
}
}
@@ -437,7 +438,8 @@ bool GenerateWidgetAP(CPDF_Document* pDoc,
pStreamResFontList->SetReferenceFor(sFontName, pDoc,
pFontDict->GetObjNum());
} else {
- pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone());
+ pStreamDict->SetFor("Resources",
+ pFormDict->GetDictFor("DR")->Clone().release());
pStreamResList = pStreamDict->GetDictFor("Resources");
}
}
diff --git a/fpdfsdk/fpdf_flatten.cpp b/fpdfsdk/fpdf_flatten.cpp
index 6cffbe0b31..f39a50aad4 100644
--- a/fpdfsdk/fpdf_flatten.cpp
+++ b/fpdfsdk/fpdf_flatten.cpp
@@ -408,8 +408,9 @@ DLLEXPORT int STDCALL FPDFPage_Flatten(FPDF_PAGE page, int nFlag) {
CPDF_Object* pObj = pAPStream;
if (pObj->IsInline()) {
- pObj = pObj->Clone();
- pDocument->AddIndirectObject(pObj);
+ std::unique_ptr<CPDF_Object> pNew = pObj->Clone();
+ pObj = pNew.get();
+ pDocument->AddIndirectObject(pNew.release());
}
CPDF_Dictionary* pObjDic = pObj->GetDict();
diff --git a/fpdfsdk/fpdfppo.cpp b/fpdfsdk/fpdfppo.cpp
index ccfd141db2..f8b96de1f3 100644
--- a/fpdfsdk/fpdfppo.cpp
+++ b/fpdfsdk/fpdfppo.cpp
@@ -109,7 +109,7 @@ bool CPDF_PageOrganizer::ExportPage(CPDF_Document* pSrcPDFDoc,
if (cbSrcKeyStr.Compare(("Type")) && cbSrcKeyStr.Compare(("Parent"))) {
if (pCurPageDict->KeyExist(cbSrcKeyStr))
pCurPageDict->RemoveFor(cbSrcKeyStr);
- pCurPageDict->SetFor(cbSrcKeyStr, pObj->Clone());
+ pCurPageDict->SetFor(cbSrcKeyStr, pObj->Clone().release());
}
}
@@ -123,7 +123,7 @@ bool CPDF_PageOrganizer::ExportPage(CPDF_Document* pSrcPDFDoc,
// if not exists,we take the letter size.
pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox");
if (pInheritable) {
- pCurPageDict->SetFor("MediaBox", pInheritable->Clone());
+ pCurPageDict->SetFor("MediaBox", pInheritable->Clone().release());
} else {
// Make the default size to be letter size (8.5'x11')
CPDF_Array* pArray = new CPDF_Array;
@@ -134,7 +134,7 @@ bool CPDF_PageOrganizer::ExportPage(CPDF_Document* pSrcPDFDoc,
pCurPageDict->SetFor("MediaBox", pArray);
}
} else {
- pCurPageDict->SetFor("MediaBox", pInheritable->Clone());
+ pCurPageDict->SetFor("MediaBox", pInheritable->Clone().release());
}
}
// 2 Resources //required
@@ -142,27 +142,25 @@ bool CPDF_PageOrganizer::ExportPage(CPDF_Document* pSrcPDFDoc,
pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Resources");
if (!pInheritable)
return false;
- pCurPageDict->SetFor("Resources", pInheritable->Clone());
+ pCurPageDict->SetFor("Resources", pInheritable->Clone().release());
}
// 3 CropBox //Optional
if (!pCurPageDict->KeyExist("CropBox")) {
pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox");
if (pInheritable)
- pCurPageDict->SetFor("CropBox", pInheritable->Clone());
+ pCurPageDict->SetFor("CropBox", pInheritable->Clone().release());
}
// 4 Rotate //Optional
if (!pCurPageDict->KeyExist("Rotate")) {
pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Rotate");
if (pInheritable)
- pCurPageDict->SetFor("Rotate", pInheritable->Clone());
+ pCurPageDict->SetFor("Rotate", pInheritable->Clone().release());
}
// Update the reference
uint32_t dwOldPageObj = pSrcPageDict->GetObjNum();
uint32_t dwNewPageObj = pCurPageDict->GetObjNum();
-
(*pObjNumberMap)[dwOldPageObj] = dwNewPageObj;
-
UpdateReference(pCurPageDict, pDestPDFDoc, pObjNumberMap.get());
++curpage;
}
@@ -277,29 +275,22 @@ uint32_t CPDF_PageOrganizer::GetNewObjId(CPDF_Document* pDoc,
if (!pDirect)
return 0;
- CPDF_Object* pClone = pDirect->Clone();
- if (!pClone)
- return 0;
-
+ std::unique_ptr<CPDF_Object> pClone = pDirect->Clone();
if (CPDF_Dictionary* pDictClone = pClone->AsDictionary()) {
if (pDictClone->KeyExist("Type")) {
CFX_ByteString strType = pDictClone->GetStringFor("Type");
- if (!FXSYS_stricmp(strType.c_str(), "Pages")) {
- delete pDictClone;
+ if (!FXSYS_stricmp(strType.c_str(), "Pages"))
return 4;
- }
- if (!FXSYS_stricmp(strType.c_str(), "Page")) {
- delete pDictClone;
+ if (!FXSYS_stricmp(strType.c_str(), "Page"))
return 0;
- }
}
}
- dwNewObjNum = pDoc->AddIndirectObject(pClone);
+ dwNewObjNum = pDoc->AddIndirectObject(pClone.get());
(*pObjNumberMap)[dwObjnum] = dwNewObjNum;
- if (!UpdateReference(pClone, pDoc, pObjNumberMap)) {
- delete pClone;
+ if (!UpdateReference(pClone.get(), pDoc, pObjNumberMap))
return 0;
- }
+
+ pClone.release(); // TODO(tsepez): figure out ownership.
return dwNewObjNum;
}
@@ -400,6 +391,7 @@ DLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc,
if (!pDstDict)
return false;
- pDstDict->SetFor("ViewerPreferences", pSrcDict->CloneDirectObject());
+ pDstDict->SetFor("ViewerPreferences",
+ pSrcDict->CloneDirectObject().release());
return true;
}