Commit eef51d0c5ac88f96ac79831c0a32d9eca88a651b

Authored by m-holger
Committed by GitHub
2 parents 5e5e7650 a3f164f7

Merge pull request #1673 from m-holger/referenced

Add referenced_object method to BaseHandle for retrieving referenced …
include/qpdf/ObjectHandle.hh
@@ -132,11 +132,9 @@ namespace qpdf @@ -132,11 +132,9 @@ namespace qpdf
132 132
133 inline void assign(qpdf_object_type_e required, BaseHandle const& other); 133 inline void assign(qpdf_object_type_e required, BaseHandle const& other);
134 inline void assign(qpdf_object_type_e required, BaseHandle&& other); 134 inline void assign(qpdf_object_type_e required, BaseHandle&& other);
135 -  
136 inline void nullify(); 135 inline void nullify();
137 136
138 std::string description() const; 137 std::string description() const;
139 -  
140 inline QPDFObjectHandle const& get(std::string const& key) const; 138 inline QPDFObjectHandle const& get(std::string const& key) const;
141 139
142 void no_ci_warn_if(bool condition, std::string const& warning) const; 140 void no_ci_warn_if(bool condition, std::string const& warning) const;
@@ -148,6 +146,9 @@ namespace qpdf @@ -148,6 +146,9 @@ namespace qpdf
148 char const* type_name() const; 146 char const* type_name() const;
149 147
150 std::shared_ptr<QPDFObject> obj; 148 std::shared_ptr<QPDFObject> obj;
  149 +
  150 + private:
  151 + inline QPDFObjectHandle referenced_object() const;
151 }; 152 };
152 153
153 } // namespace qpdf 154 } // namespace qpdf
libqpdf/QPDFObjectHandle.cc
@@ -322,7 +322,7 @@ BaseHandle::copy(bool shallow) const @@ -322,7 +322,7 @@ BaseHandle::copy(bool shallow) const
322 throw std::logic_error("attempted to shallow copy QPDFObjectHandle from destroyed QPDF"); 322 throw std::logic_error("attempted to shallow copy QPDFObjectHandle from destroyed QPDF");
323 return {}; // does not return 323 return {}; // does not return
324 case ::ot_reference: 324 case ::ot_reference:
325 - return obj->qpdf->getObject(obj->og).obj_sp(); 325 + return referenced_object().obj_sp();
326 } 326 }
327 return {}; // unreachable 327 return {}; // unreachable
328 } 328 }
libqpdf/qpdf/QPDFObjectHandle_private.hh
@@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
6 #include <qpdf/QPDFObject_private.hh> 6 #include <qpdf/QPDFObject_private.hh>
7 #include <qpdf/QPDF_private.hh> 7 #include <qpdf/QPDF_private.hh>
8 #include <qpdf/QUtil.hh> 8 #include <qpdf/QUtil.hh>
  9 +#include <qpdf/Util.hh>
9 10
10 #include <concepts> 11 #include <concepts>
11 #include <utility> 12 #include <utility>
@@ -757,6 +758,33 @@ namespace qpdf @@ -757,6 +758,33 @@ namespace qpdf
757 return {obj}; 758 return {obj};
758 } 759 }
759 760
  761 + /// @brief Retrieve the QPDFObjectHandle for the object referenced by a reference object.
  762 + ///
  763 + /// Look up and return the object from the document's object table using QPDF::getObject(). The
  764 + /// returned value is a QPDFObjectHandle that wraps the shared pointer to the underlying
  765 + /// QPDFObject held in the document's cache.
  766 + ///
  767 + /// @note We must perform the lookup because qpdf represents certain replacements using
  768 + /// QPDF_Reference. In particular, `QPDF::makeIndirectObject` used to make the input
  769 + /// object indirect and then return the original input object. To replicate that
  770 + /// existing behavior the implementation now makes the input object indirect and
  771 + /// returns it, while modifying the input object to become a reference to the
  772 + /// newly-created indirect object. Looking up the resulting indirect object in the
  773 + /// document's object table via `QPDF::getObject()` ensures callers receive the
  774 + /// cached object and avoids surprises if the indirect object is subsequently
  775 + /// replaced.
  776 + ///
  777 + /// @return The QPDFObjectHandle for the object referenced by a reference object.
  778 + ///
  779 + /// @since 12.3.3
  780 + inline QPDFObjectHandle
  781 + BaseHandle::referenced_object() const
  782 + {
  783 + qpdf_expect(resolved_type_code() == ::ot_reserved);
  784 + qpdf_expect(obj->qpdf);
  785 + return obj->qpdf->getObject(obj->og);
  786 + }
  787 +
760 inline void 788 inline void
761 BaseHandle::assign(qpdf_object_type_e required, BaseHandle const& other) 789 BaseHandle::assign(qpdf_object_type_e required, BaseHandle const& other)
762 { 790 {