Commit 2a2eebcaea2b27bc86390dac2ee27ad5620f5eda
1 parent
16841bec
Modify newIndirect to set QPDFObjectHandle::obj
Showing
4 changed files
with
39 additions
and
19 deletions
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& 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& 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& 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 | } | ... | ... |