diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index a549eed..5a03fac 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -20,6 +20,7 @@ #include #include #include +#include std::string QPDF::qpdf_version = "8.4.2"; @@ -1349,13 +1350,10 @@ QPDF::fixDanglingReferences(bool force) } else if (obj.isArray()) { - std::vector elements = obj.getArrayAsVector(); - for (std::vector::iterator iter = - elements.begin(); - iter != elements.end(); ++iter) - { - to_check.push_back(*iter); - } + QPDF_Array* arr = + dynamic_cast( + QPDFObjectHandle::ObjAccessor::getObject(obj).getPointer()); + arr->addExplicitElementsToList(to_check); } for (std::list::iterator iter = to_check.begin(); iter != to_check.end(); ++iter) diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc index 31cd2db..99a75dc 100644 --- a/libqpdf/QPDF_Array.cc +++ b/libqpdf/QPDF_Array.cc @@ -142,3 +142,14 @@ QPDF_Array::getElementsForShallowCopy() const { return this->elements; } + +void +QPDF_Array::addExplicitElementsToList(std::list& l) const +{ + for (std::map::const_iterator iter = + this->elements.begin(); + iter != this->elements.end(); ++iter) + { + l.push_back((*iter).second); + } +} diff --git a/libqpdf/SparseOHArray.cc b/libqpdf/SparseOHArray.cc index 2c525ca..76c7c22 100644 --- a/libqpdf/SparseOHArray.cc +++ b/libqpdf/SparseOHArray.cc @@ -141,3 +141,15 @@ SparseOHArray::insert(size_t idx, QPDFObjectHandle oh) ++this->n_elements; } } + +SparseOHArray::const_iterator +SparseOHArray::begin() const +{ + return this->elements.begin(); +} + +SparseOHArray::const_iterator +SparseOHArray::end() const +{ + return this->elements.end(); +} diff --git a/libqpdf/qpdf/QPDF_Array.hh b/libqpdf/qpdf/QPDF_Array.hh index eb0b594..7ea111a 100644 --- a/libqpdf/qpdf/QPDF_Array.hh +++ b/libqpdf/qpdf/QPDF_Array.hh @@ -4,6 +4,7 @@ #include #include +#include #include class QPDF_Array: public QPDFObject @@ -28,7 +29,11 @@ class QPDF_Array: public QPDFObject void appendItem(QPDFObjectHandle const& item); void eraseItem(int at); + // Helper methods for QPDF and QPDFObjectHandle -- these are + // public methods since the whole class is not part of the public + // API. Otherwise, these would be wrapped in accessor classes. SparseOHArray const& getElementsForShallowCopy() const; + void addExplicitElementsToList(std::list&) const; protected: virtual void releaseResolved(); diff --git a/libqpdf/qpdf/SparseOHArray.hh b/libqpdf/qpdf/SparseOHArray.hh index 2e3f334..6cd30ec 100644 --- a/libqpdf/qpdf/SparseOHArray.hh +++ b/libqpdf/qpdf/SparseOHArray.hh @@ -26,6 +26,12 @@ class SparseOHArray QPDF_DLL void insert(size_t idx, QPDFObjectHandle oh); + typedef std::map::const_iterator const_iterator; + QPDF_DLL + const_iterator begin() const; + QPDF_DLL + const_iterator end() const; + private: std::map elements; size_t n_elements;