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,6 +1180,8 @@ class QPDF
1180 void stopOnError(std::string const& message); 1180 void stopOnError(std::string const& message);
1181 QPDFObjectHandle reserveObjectIfNotExists(QPDFObjGen const& og); 1181 QPDFObjectHandle reserveObjectIfNotExists(QPDFObjGen const& og);
1182 QPDFObjectHandle reserveStream(QPDFObjGen const& og); 1182 QPDFObjectHandle reserveStream(QPDFObjGen const& og);
  1183 + QPDFObjectHandle
  1184 + newIndirect(QPDFObjGen const&, std::shared_ptr<QPDFObject> const&);
1183 1185
1184 // Calls finish() on the pipeline when done but does not delete it 1186 // Calls finish() on the pipeline when done but does not delete it
1185 bool pipeStreamData( 1187 bool pipeStreamData(
include/qpdf/QPDFObjectHandle.hh
@@ -1443,9 +1443,12 @@ class QPDFObjectHandle @@ -1443,9 +1443,12 @@ class QPDFObjectHandle
1443 1443
1444 private: 1444 private:
1445 static QPDFObjectHandle 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 static QPDFObjectHandle 1453 static QPDFObjectHandle
1451 newStream( 1454 newStream(
@@ -1557,7 +1560,16 @@ class QPDFObjectHandle @@ -1557,7 +1560,16 @@ class QPDFObjectHandle
1557 bool isImage(bool exclude_imagemask = true); 1560 bool isImage(bool exclude_imagemask = true);
1558 1561
1559 private: 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 QPDFObjectHandle(std::shared_ptr<QPDFObject> const&); 1573 QPDFObjectHandle(std::shared_ptr<QPDFObject> const&);
1562 1574
1563 // Private object factory methods 1575 // Private object factory methods
libqpdf/QPDF.cc
@@ -1463,8 +1463,7 @@ QPDF::getAllObjects() @@ -1463,8 +1463,7 @@ QPDF::getAllObjects()
1463 fixDanglingReferences(true); 1463 fixDanglingReferences(true);
1464 std::vector<QPDFObjectHandle> result; 1464 std::vector<QPDFObjectHandle> result;
1465 for (auto const& iter: this->m->obj_cache) { 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 return result; 1468 return result;
1470 } 1469 }
@@ -2129,6 +2128,15 @@ QPDF::resolveObjectsInStream(int obj_stream_number) @@ -2129,6 +2128,15 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
2129 } 2128 }
2130 2129
2131 QPDFObjectHandle 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 QPDF::makeIndirectObject(QPDFObjectHandle oh) 2140 QPDF::makeIndirectObject(QPDFObjectHandle oh)
2133 { 2141 {
2134 int max_objid = toI(getObjectCount()); 2142 int max_objid = toI(getObjectCount());
@@ -2137,9 +2145,9 @@ QPDF::makeIndirectObject(QPDFObjectHandle oh) @@ -2137,9 +2145,9 @@ QPDF::makeIndirectObject(QPDFObjectHandle oh)
2137 "max object id is too high to create new objects"); 2145 "max object id is too high to create new objects");
2138 } 2146 }
2139 QPDFObjGen next(max_objid + 1, 0); 2147 QPDFObjGen next(max_objid + 1, 0);
2140 - this->m->obj_cache[next] = 2148 + m->obj_cache[next] =
2141 ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), -1, -1); 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 QPDFObjectHandle 2153 QPDFObjectHandle
@@ -2148,8 +2156,10 @@ QPDF::reserveObjectIfNotExists(QPDFObjGen const&amp; og) @@ -2148,8 +2156,10 @@ QPDF::reserveObjectIfNotExists(QPDFObjGen const&amp; og)
2148 if ((!m->obj_cache.count(og)) && (!m->xref_table.count(og))) { 2156 if ((!m->obj_cache.count(og)) && (!m->xref_table.count(og))) {
2149 resolve(og); 2157 resolve(og);
2150 m->obj_cache[og].object = QPDF_Reserved::create(); 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 QPDFObjectHandle 2165 QPDFObjectHandle
@@ -2162,7 +2172,8 @@ QPDF::reserveStream(QPDFObjGen const&amp; og) @@ -2162,7 +2172,8 @@ QPDF::reserveStream(QPDFObjGen const&amp; og)
2162 QPDFObjectHandle 2172 QPDFObjectHandle
2163 QPDF::getObject(QPDFObjGen const& og) 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 QPDFObjectHandle 2179 QPDFObjectHandle
libqpdf/QPDFObjectHandle.cc
@@ -21,6 +21,7 @@ @@ -21,6 +21,7 @@
21 #include <qpdf/QPDF_Reserved.hh> 21 #include <qpdf/QPDF_Reserved.hh>
22 #include <qpdf/QPDF_Stream.hh> 22 #include <qpdf/QPDF_Stream.hh>
23 #include <qpdf/QPDF_String.hh> 23 #include <qpdf/QPDF_String.hh>
  24 +#include <qpdf/QPDF_Unresolved.hh>
24 #include <qpdf/SparseOHArray.hh> 25 #include <qpdf/SparseOHArray.hh>
25 26
26 #include <qpdf/QIntC.hh> 27 #include <qpdf/QIntC.hh>
@@ -240,13 +241,6 @@ QPDFObjectHandle::QPDFObjectHandle() : @@ -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 QPDFObjectHandle::QPDFObjectHandle(std::shared_ptr<QPDFObject> const& data) : 244 QPDFObjectHandle::QPDFObjectHandle(std::shared_ptr<QPDFObject> const& data) :
251 initialized(true), 245 initialized(true),
252 qpdf(nullptr), 246 qpdf(nullptr),
@@ -1953,7 +1947,7 @@ QPDFObjectHandle::newIndirect(QPDF* qpdf, QPDFObjGen const&amp; og) @@ -1953,7 +1947,7 @@ QPDFObjectHandle::newIndirect(QPDF* qpdf, QPDFObjGen const&amp; og)
1953 return newNull(); 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 QPDFObjectHandle 1953 QPDFObjectHandle
@@ -2553,10 +2547,11 @@ QPDFObjectHandle::dereference() @@ -2553,10 +2547,11 @@ QPDFObjectHandle::dereference()
2553 if (!this->initialized) { 2547 if (!this->initialized) {
2554 return false; 2548 return false;
2555 } 2549 }
2556 - if (this->obj() == nullptr || 2550 + if ((this->obj->getTypeCode() == QPDFObject::ot_unresolved) ||
2557 (getObjectID() && 2551 (getObjectID() &&
2558 QPDF::Resolver::objectChanged(this->qpdf, getObjGen(), this->obj))) { 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 return true; 2556 return true;
2562 } 2557 }