Commit 2a2eebcaea2b27bc86390dac2ee27ad5620f5eda

Authored by m-holger
1 parent 16841bec

Modify newIndirect to set QPDFObjectHandle::obj

include/qpdf/QPDF.hh
... ... @@ -1180,6 +1180,8 @@ class QPDF
1180 1180 void stopOnError(std::string const& message);
1181 1181 QPDFObjectHandle reserveObjectIfNotExists(QPDFObjGen const& og);
1182 1182 QPDFObjectHandle reserveStream(QPDFObjGen const& og);
  1183 + QPDFObjectHandle
  1184 + newIndirect(QPDFObjGen const&, std::shared_ptr<QPDFObject> const&);
1183 1185  
1184 1186 // Calls finish() on the pipeline when done but does not delete it
1185 1187 bool pipeStreamData(
... ...
include/qpdf/QPDFObjectHandle.hh
... ... @@ -1443,9 +1443,12 @@ class QPDFObjectHandle
1443 1443  
1444 1444 private:
1445 1445 static QPDFObjectHandle
1446   - newIndirect(QPDF* qpdf, QPDFObjGen const& og)
  1446 + newIndirect(
  1447 + QPDF* qpdf,
  1448 + QPDFObjGen const& og,
  1449 + std::shared_ptr<QPDFObject> const& obj)
1447 1450 {
1448   - return QPDFObjectHandle::newIndirect(qpdf, og);
  1451 + return QPDFObjectHandle(qpdf, og, obj);
1449 1452 }
1450 1453 static QPDFObjectHandle
1451 1454 newStream(
... ... @@ -1557,7 +1560,16 @@ class QPDFObjectHandle
1557 1560 bool isImage(bool exclude_imagemask = true);
1558 1561  
1559 1562 private:
1560   - QPDFObjectHandle(QPDF*, QPDFObjGen const& og);
  1563 + QPDFObjectHandle(
  1564 + QPDF* qpdf,
  1565 + QPDFObjGen const& og,
  1566 + std::shared_ptr<QPDFObject> const& obj) :
  1567 + initialized(true),
  1568 + qpdf(qpdf),
  1569 + og(og),
  1570 + obj(obj)
  1571 + {
  1572 + }
1561 1573 QPDFObjectHandle(std::shared_ptr<QPDFObject> const&);
1562 1574  
1563 1575 // Private object factory methods
... ...
libqpdf/QPDF.cc
... ... @@ -1463,8 +1463,7 @@ QPDF::getAllObjects()
1463 1463 fixDanglingReferences(true);
1464 1464 std::vector<QPDFObjectHandle> result;
1465 1465 for (auto const& iter: this->m->obj_cache) {
1466   - QPDFObjGen const& og = iter.first;
1467   - result.push_back(getObjectByObjGen(og));
  1466 + result.push_back(newIndirect(iter.first, iter.second.object));
1468 1467 }
1469 1468 return result;
1470 1469 }
... ... @@ -2129,6 +2128,15 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
2129 2128 }
2130 2129  
2131 2130 QPDFObjectHandle
  2131 +QPDF::newIndirect(QPDFObjGen const& og, std::shared_ptr<QPDFObject> const& obj)
  2132 +{
  2133 + if (!obj->hasDescription()) {
  2134 + obj->setDescription(this, "object " + og.unparse(' '));
  2135 + }
  2136 + return QPDFObjectHandle::Factory::newIndirect(this, og, obj);
  2137 +}
  2138 +
  2139 +QPDFObjectHandle
2132 2140 QPDF::makeIndirectObject(QPDFObjectHandle oh)
2133 2141 {
2134 2142 int max_objid = toI(getObjectCount());
... ... @@ -2137,9 +2145,9 @@ QPDF::makeIndirectObject(QPDFObjectHandle oh)
2137 2145 "max object id is too high to create new objects");
2138 2146 }
2139 2147 QPDFObjGen next(max_objid + 1, 0);
2140   - this->m->obj_cache[next] =
  2148 + m->obj_cache[next] =
2141 2149 ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), -1, -1);
2142   - return QPDFObjectHandle::Factory::newIndirect(this, next);
  2150 + return newIndirect(next, m->obj_cache[next].object);
2143 2151 }
2144 2152  
2145 2153 QPDFObjectHandle
... ... @@ -2148,8 +2156,10 @@ QPDF::reserveObjectIfNotExists(QPDFObjGen const&amp; og)
2148 2156 if ((!m->obj_cache.count(og)) && (!m->xref_table.count(og))) {
2149 2157 resolve(og);
2150 2158 m->obj_cache[og].object = QPDF_Reserved::create();
  2159 + return newIndirect(og, m->obj_cache[og].object);
  2160 + } else {
  2161 + return getObject(og);
2151 2162 }
2152   - return getObject(og);
2153 2163 }
2154 2164  
2155 2165 QPDFObjectHandle
... ... @@ -2162,7 +2172,8 @@ QPDF::reserveStream(QPDFObjGen const&amp; og)
2162 2172 QPDFObjectHandle
2163 2173 QPDF::getObject(QPDFObjGen const& og)
2164 2174 {
2165   - return QPDFObjectHandle::Factory::newIndirect(this, og);
  2175 + auto obj = (og.getObj() != 0) ? resolve(og) : QPDF_Null::create();
  2176 + return newIndirect(og, obj);
2166 2177 }
2167 2178  
2168 2179 QPDFObjectHandle
... ...
libqpdf/QPDFObjectHandle.cc
... ... @@ -21,6 +21,7 @@
21 21 #include <qpdf/QPDF_Reserved.hh>
22 22 #include <qpdf/QPDF_Stream.hh>
23 23 #include <qpdf/QPDF_String.hh>
  24 +#include <qpdf/QPDF_Unresolved.hh>
24 25 #include <qpdf/SparseOHArray.hh>
25 26  
26 27 #include <qpdf/QIntC.hh>
... ... @@ -240,13 +241,6 @@ QPDFObjectHandle::QPDFObjectHandle() :
240 241 {
241 242 }
242 243  
243   -QPDFObjectHandle::QPDFObjectHandle(QPDF* qpdf, QPDFObjGen const& og) :
244   - initialized(true),
245   - qpdf(qpdf),
246   - og(og)
247   -{
248   -}
249   -
250 244 QPDFObjectHandle::QPDFObjectHandle(std::shared_ptr<QPDFObject> const& data) :
251 245 initialized(true),
252 246 qpdf(nullptr),
... ... @@ -1953,7 +1947,7 @@ QPDFObjectHandle::newIndirect(QPDF* qpdf, QPDFObjGen const&amp; og)
1953 1947 return newNull();
1954 1948 }
1955 1949  
1956   - return QPDFObjectHandle(qpdf, og);
  1950 + return QPDFObjectHandle(qpdf, og, QPDF_Unresolved::create());
1957 1951 }
1958 1952  
1959 1953 QPDFObjectHandle
... ... @@ -2553,10 +2547,11 @@ QPDFObjectHandle::dereference()
2553 2547 if (!this->initialized) {
2554 2548 return false;
2555 2549 }
2556   - if (this->obj() == nullptr ||
  2550 + if ((this->obj->getTypeCode() == QPDFObject::ot_unresolved) ||
2557 2551 (getObjectID() &&
2558 2552 QPDF::Resolver::objectChanged(this->qpdf, getObjGen(), this->obj))) {
2559   - obj = QPDF::Resolver::resolve(this->qpdf, getObjGen());
  2553 + this->obj = QPDF::Resolver::resolve(this->qpdf, getObjGen());
  2554 +
2560 2555 }
2561 2556 return true;
2562 2557 }
... ...