Add CPDF_Array::GetMutableObjectAt()
Change-Id: I57256d1f30bd8b0a4dd926bf09825128a673c115
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/94690
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp b/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp
index 3a2d1f5..9f8832f 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp
@@ -46,20 +46,20 @@
CPDF_PageContentManager::~CPDF_PageContentManager() = default;
+// TODO(tsepez): return retained reference.
CPDF_Stream* CPDF_PageContentManager::GetStreamByIndex(size_t stream_index) {
if (contents_stream_)
return stream_index == 0 ? contents_stream_.Get() : nullptr;
- if (contents_array_) {
- CPDF_Reference* stream_reference =
- ToReference(contents_array_->GetObjectAt(stream_index));
- if (!stream_reference)
- return nullptr;
+ if (!contents_array_)
+ return nullptr;
- return stream_reference->GetDirect()->AsStream();
- }
+ RetainPtr<CPDF_Reference> stream_reference =
+ ToReference(contents_array_->GetMutableObjectAt(stream_index));
+ if (!stream_reference)
+ return nullptr;
- return nullptr;
+ return stream_reference->GetDirect()->AsStream();
}
size_t CPDF_PageContentManager::AddStream(fxcrt::ostringstream* buf) {
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 55ff2e9..9cc2ed6 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -213,7 +213,7 @@
void ReplaceAbbrInArray(CPDF_Array* pArray) {
for (size_t i = 0; i < pArray->size(); ++i) {
- CPDF_Object* pElement = pArray->GetObjectAt(i);
+ RetainPtr<CPDF_Object> pElement = pArray->GetMutableObjectAt(i);
if (pElement->IsName()) {
ByteString name = pElement->GetString();
ByteStringView fullname = FindFullName(
@@ -221,7 +221,7 @@
if (!fullname.IsEmpty())
pArray->SetNewAt<CPDF_Name>(i, ByteString(fullname));
} else {
- ReplaceAbbr(pElement);
+ ReplaceAbbr(pElement.Get());
}
}
}
diff --git a/core/fpdfapi/parser/cpdf_array.cpp b/core/fpdfapi/parser/cpdf_array.cpp
index 8d5dd1b..869da53 100644
--- a/core/fpdfapi/parser/cpdf_array.cpp
+++ b/core/fpdfapi/parser/cpdf_array.cpp
@@ -101,10 +101,8 @@
return Find(pThat).has_value();
}
-CPDF_Object* CPDF_Array::GetObjectAt(size_t index) {
- if (index >= m_Objects.size())
- return nullptr;
- return m_Objects[index].Get();
+RetainPtr<CPDF_Object> CPDF_Array::GetMutableObjectAt(size_t index) {
+ return pdfium::WrapRetain(const_cast<CPDF_Object*>(GetObjectAt(index)));
}
const CPDF_Object* CPDF_Array::GetObjectAt(size_t index) const {
diff --git a/core/fpdfapi/parser/cpdf_array.h b/core/fpdfapi/parser/cpdf_array.h
index 201a2a1..12ecfca 100644
--- a/core/fpdfapi/parser/cpdf_array.h
+++ b/core/fpdfapi/parser/cpdf_array.h
@@ -42,10 +42,10 @@
bool IsEmpty() const { return m_Objects.empty(); }
size_t size() const { return m_Objects.size(); }
- // The GetObjectAt() methods tolerate out-of-bounds indices and return
+ // The Get*ObjectAt() methods tolerate out-of-bounds indices and return
// nullptr in those cases. Otherwise, for in-bound indices, the result
// is never nullptr.
- CPDF_Object* GetObjectAt(size_t index);
+ RetainPtr<CPDF_Object> GetMutableObjectAt(size_t index);
const CPDF_Object* GetObjectAt(size_t index) const;
// The Get*DirectObjectAt() methods tolerate out-of-bounds indices and
diff --git a/core/fpdfapi/parser/cpdf_array_unittest.cpp b/core/fpdfapi/parser/cpdf_array_unittest.cpp
index 009575b..4833a08 100644
--- a/core/fpdfapi/parser/cpdf_array_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_array_unittest.cpp
@@ -151,9 +151,9 @@
RetainPtr<CPDF_Array> arr2 = ToArray(arr->CloneDirectObject());
ASSERT_EQ(arr->size(), arr2->size());
for (size_t i = 0; i < kNumOfRows; ++i) {
- CPDF_Array* arr_elem = arr->GetObjectAt(i)->AsArray();
- CPDF_Array* arr1_elem = arr1->GetObjectAt(i)->AsArray();
- CPDF_Array* arr2_elem = arr2->GetObjectAt(i)->AsArray();
+ const CPDF_Array* arr_elem = arr->GetObjectAt(i)->AsArray();
+ const CPDF_Array* arr1_elem = arr1->GetObjectAt(i)->AsArray();
+ const CPDF_Array* arr2_elem = arr2->GetObjectAt(i)->AsArray();
EXPECT_NE(arr_elem, arr1_elem);
EXPECT_NE(arr_elem, arr2_elem);
for (size_t j = 0; j < kNumOfRowElems; ++j) {
diff --git a/core/fpdfapi/parser/cpdf_data_avail.cpp b/core/fpdfapi/parser/cpdf_data_avail.cpp
index 25d61e7..3cde64b 100644
--- a/core/fpdfapi/parser/cpdf_data_avail.cpp
+++ b/core/fpdfapi/parser/cpdf_data_avail.cpp
@@ -551,7 +551,7 @@
pPageNode->m_type = PageNode::Type::kPages;
for (size_t i = 0; i < pArray->size(); ++i) {
- CPDF_Reference* pKid = ToReference(pArray->GetObjectAt(i));
+ const CPDF_Reference* pKid = ToReference(pArray->GetObjectAt(i));
if (!pKid)
continue;
@@ -616,7 +616,7 @@
case CPDF_Object::kArray: {
CPDF_Array* pKidsArray = pKids->AsArray();
for (size_t i = 0; i < pKidsArray->size(); ++i) {
- CPDF_Reference* pKid = ToReference(pKidsArray->GetObjectAt(i));
+ const CPDF_Reference* pKid = ToReference(pKidsArray->GetObjectAt(i));
if (!pKid)
continue;
diff --git a/core/fpdfapi/parser/cpdf_object_unittest.cpp b/core/fpdfapi/parser/cpdf_object_unittest.cpp
index b42a7dd..6298e4e 100644
--- a/core/fpdfapi/parser/cpdf_object_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_object_unittest.cpp
@@ -810,7 +810,7 @@
auto array = pdfium::MakeRetain<CPDF_Array>();
array->AppendNew<CPDF_Reference>(&objects_holder, 1234);
ASSERT_EQ(1U, array->size());
- CPDF_Object* obj = array->GetObjectAt(0);
+ const CPDF_Object* obj = array->GetObjectAt(0);
ASSERT_TRUE(obj);
EXPECT_TRUE(obj->IsReference());
@@ -820,7 +820,7 @@
RetainPtr<CPDF_Array> cloned_array = ToArray(std::move(cloned_array_object));
ASSERT_EQ(0U, cloned_array->size());
- CPDF_Object* cloned_obj = cloned_array->GetObjectAt(0);
+ const CPDF_Object* cloned_obj = cloned_array->GetObjectAt(0);
EXPECT_FALSE(cloned_obj);
}
@@ -942,7 +942,7 @@
// Cloned object should be the same as the original.
ASSERT_TRUE(cloned_array);
EXPECT_EQ(1u, cloned_array->size());
- CPDF_Object* cloned_dict = cloned_array->GetObjectAt(0);
+ const CPDF_Object* cloned_dict = cloned_array->GetObjectAt(0);
ASSERT_TRUE(cloned_dict);
ASSERT_TRUE(cloned_dict->IsDictionary());
// Recursively referenced object is not cloned.
@@ -972,7 +972,7 @@
RetainPtr<CPDF_Array> arr_obj = pdfium::MakeRetain<CPDF_Array>();
arr_obj->InsertNewAt<CPDF_Reference>(0, &objects_holder,
dict_obj->GetObjNum());
- CPDF_Object* elem0 = arr_obj->GetObjectAt(0);
+ const CPDF_Object* elem0 = arr_obj->GetObjectAt(0);
dict_obj->SetFor("arr", std::move(arr_obj));
EXPECT_EQ(1u, dict_obj->GetObjNum());
ASSERT_TRUE(elem0);
diff --git a/core/fpdfapi/parser/cpdf_reference.h b/core/fpdfapi/parser/cpdf_reference.h
index d0f2be7..37f47a8 100644
--- a/core/fpdfapi/parser/cpdf_reference.h
+++ b/core/fpdfapi/parser/cpdf_reference.h
@@ -63,4 +63,8 @@
return obj ? obj->AsReference() : nullptr;
}
+inline RetainPtr<CPDF_Reference> ToReference(RetainPtr<CPDF_Object> obj) {
+ return RetainPtr<CPDF_Reference>(ToReference(obj.Get()));
+}
+
#endif // CORE_FPDFAPI_PARSER_CPDF_REFERENCE_H_
diff --git a/fpdfsdk/fpdf_ppo.cpp b/fpdfsdk/fpdf_ppo.cpp
index b42d1dc..2d544eb 100644
--- a/fpdfsdk/fpdf_ppo.cpp
+++ b/fpdfsdk/fpdf_ppo.cpp
@@ -316,7 +316,7 @@
case CPDF_Object::kArray: {
CPDF_Array* pArray = pObj->AsArray();
for (size_t i = 0; i < pArray->size(); ++i) {
- if (!UpdateReference(pArray->GetObjectAt(i)))
+ if (!UpdateReference(pArray->GetMutableObjectAt(i).Get()))
return false;
}
return true;
diff --git a/fpdfsdk/fpdf_save.cpp b/fpdfsdk/fpdf_save.cpp
index bcaea81..c82faeb 100644
--- a/fpdfsdk/fpdf_save.cpp
+++ b/fpdfsdk/fpdf_save.cpp
@@ -75,10 +75,10 @@
iDataSetsIndex = i + 1;
}
- CPDF_Stream* pFormStream = nullptr;
+ RetainPtr<CPDF_Stream> pFormStream;
if (iFormIndex != -1) {
// Get form CPDF_Stream
- CPDF_Object* pFormPDFObj = pArray->GetObjectAt(iFormIndex);
+ RetainPtr<CPDF_Object> pFormPDFObj = pArray->GetMutableObjectAt(iFormIndex);
if (pFormPDFObj->IsReference()) {
CPDF_Object* pFormDirectObj = pFormPDFObj->GetDirect();
if (pFormDirectObj && pFormDirectObj->IsStream()) {
@@ -89,10 +89,11 @@
}
}
- CPDF_Stream* pDataSetsStream = nullptr;
+ RetainPtr<CPDF_Stream> pDataSetsStream;
if (iDataSetsIndex != -1) {
// Get datasets CPDF_Stream
- CPDF_Object* pDataSetsPDFObj = pArray->GetObjectAt(iDataSetsIndex);
+ RetainPtr<CPDF_Object> pDataSetsPDFObj =
+ pArray->GetMutableObjectAt(iDataSetsIndex);
if (pDataSetsPDFObj->IsReference()) {
CPDF_Reference* pDataSetsRefObj = pDataSetsPDFObj->AsReference();
CPDF_Object* pDataSetsDirectObj = pDataSetsRefObj->GetDirect();