diff options
Diffstat (limited to 'libqpdf')
-rw-r--r-- | libqpdf/QPDF.cc | 7 | ||||
-rw-r--r-- | libqpdf/QPDFObjectHandle.cc | 16 | ||||
-rw-r--r-- | libqpdf/QPDF_Array.cc | 10 | ||||
-rw-r--r-- | libqpdf/QPDF_Dictionary.cc | 11 | ||||
-rw-r--r-- | libqpdf/qpdf/QPDF_Array.hh | 3 | ||||
-rw-r--r-- | libqpdf/qpdf/QPDF_Dictionary.hh | 3 |
6 files changed, 50 insertions, 0 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 44ea7d24..f68efc83 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -277,6 +277,13 @@ QPDF::QPDF() : QPDF::~QPDF() { + this->xref_table.clear(); + for (std::map<ObjGen, ObjCache>::iterator iter = this->obj_cache.begin(); + iter != obj_cache.end(); ++iter) + { + QPDFObject::ObjAccessor::releaseResolved( + (*iter).second.object.getPointer()); + } } void diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 6fb66d9c..022c9e05 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -41,6 +41,22 @@ QPDFObjectHandle::QPDFObjectHandle(QPDFObject* data) : { } +void +QPDFObjectHandle::releaseResolved() +{ + if (isIndirect()) + { + if (this->obj.getPointer()) + { + this->obj = 0; + } + } + else + { + QPDFObject::ObjAccessor::releaseResolved(this->obj.getPointer()); + } +} + bool QPDFObjectHandle::isInitialized() const { diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc index b7227f0d..ae70bd67 100644 --- a/libqpdf/QPDF_Array.cc +++ b/libqpdf/QPDF_Array.cc @@ -10,6 +10,16 @@ QPDF_Array::~QPDF_Array() { } +void +QPDF_Array::releaseResolved() +{ + for (std::vector<QPDFObjectHandle>::iterator iter = this->items.begin(); + iter != this->items.end(); ++iter) + { + QPDFObjectHandle::ReleaseResolver::releaseResolved(*iter); + } +} + std::string QPDF_Array::unparse() { diff --git a/libqpdf/QPDF_Dictionary.cc b/libqpdf/QPDF_Dictionary.cc index 36c4590d..ccaab4a8 100644 --- a/libqpdf/QPDF_Dictionary.cc +++ b/libqpdf/QPDF_Dictionary.cc @@ -13,6 +13,17 @@ QPDF_Dictionary::~QPDF_Dictionary() { } +void +QPDF_Dictionary::releaseResolved() +{ + for (std::map<std::string, QPDFObjectHandle>::iterator iter = + this->items.begin(); + iter != this->items.end(); ++iter) + { + QPDFObjectHandle::ReleaseResolver::releaseResolved((*iter).second); + } +} + std::string QPDF_Dictionary::unparse() { diff --git a/libqpdf/qpdf/QPDF_Array.hh b/libqpdf/qpdf/QPDF_Array.hh index fce36a4c..490df723 100644 --- a/libqpdf/qpdf/QPDF_Array.hh +++ b/libqpdf/qpdf/QPDF_Array.hh @@ -16,6 +16,9 @@ class QPDF_Array: public QPDFObject QPDFObjectHandle getItem(int n) const; void setItem(int, QPDFObjectHandle const&); + protected: + virtual void releaseResolved(); + private: std::vector<QPDFObjectHandle> items; }; diff --git a/libqpdf/qpdf/QPDF_Dictionary.hh b/libqpdf/qpdf/QPDF_Dictionary.hh index a6b1e77b..e75de01b 100644 --- a/libqpdf/qpdf/QPDF_Dictionary.hh +++ b/libqpdf/qpdf/QPDF_Dictionary.hh @@ -27,6 +27,9 @@ class QPDF_Dictionary: public QPDFObject // Remove key, doing nothing if key does not exist void removeKey(std::string const& key); + protected: + virtual void releaseResolved(); + private: std::map<std::string, QPDFObjectHandle> items; }; |