Commit c0cd72a3eef996e597ba82b784de029ec6d88707
1 parent
23d50a2f
Add private methods QPDF::isCached and QPDF::isUnresolved
Showing
4 changed files
with
25 additions
and
8 deletions
include/qpdf/QPDF.hh
| ... | ... | @@ -1175,6 +1175,8 @@ class QPDF |
| 1175 | 1175 | QPDFObjectHandle reserveStream(QPDFObjGen const& og); |
| 1176 | 1176 | QPDFObjectHandle |
| 1177 | 1177 | newIndirect(QPDFObjGen const&, std::shared_ptr<QPDFObject> const&); |
| 1178 | + bool isCached(QPDFObjGen const& og); | |
| 1179 | + bool isUnresolved(QPDFObjGen const& og); | |
| 1178 | 1180 | |
| 1179 | 1181 | // Calls finish() on the pipeline when done but does not delete it |
| 1180 | 1182 | bool pipeStreamData( | ... | ... |
include/qpdf/QPDFObject.hh
libqpdf/QPDF.cc
| ... | ... | @@ -1425,8 +1425,7 @@ QPDF::fixDanglingReferences(bool force) |
| 1425 | 1425 | for (auto sub: to_check) { |
| 1426 | 1426 | if (sub.isIndirect()) { |
| 1427 | 1427 | if (sub.getOwningQPDF() == this) { |
| 1428 | - QPDFObjGen og(sub.getObjGen()); | |
| 1429 | - if (this->m->obj_cache.count(og) == 0) { | |
| 1428 | + if (!isCached(sub.getObjGen())) { | |
| 1430 | 1429 | QTC::TC("qpdf", "QPDF detected dangling ref"); |
| 1431 | 1430 | queue.push_back(sub); |
| 1432 | 1431 | } |
| ... | ... | @@ -1886,7 +1885,7 @@ QPDF::readObjectAtOffset( |
| 1886 | 1885 | "expected endobj"); |
| 1887 | 1886 | } |
| 1888 | 1887 | |
| 1889 | - if (!this->m->obj_cache.count(og)) { | |
| 1888 | + if (!isCached(og)) { | |
| 1890 | 1889 | // Store the object in the cache here so it gets cached |
| 1891 | 1890 | // whether we first know the offset or whether we first know |
| 1892 | 1891 | // the object ID and generation (in which we case we would get |
| ... | ... | @@ -1947,7 +1946,7 @@ QPDF::resolve(QPDFObjGen const& og) |
| 1947 | 1946 | } |
| 1948 | 1947 | ResolveRecorder rr(this, og); |
| 1949 | 1948 | |
| 1950 | - if ((!this->m->obj_cache.count(og)) && this->m->xref_table.count(og)) { | |
| 1949 | + if ((!isCached(og)) && this->m->xref_table.count(og)) { | |
| 1951 | 1950 | QPDFXRefEntry const& entry = this->m->xref_table[og]; |
| 1952 | 1951 | try { |
| 1953 | 1952 | switch (entry.getType()) { |
| ... | ... | @@ -1985,7 +1984,7 @@ QPDF::resolve(QPDFObjGen const& og) |
| 1985 | 1984 | ": error reading object: " + e.what())); |
| 1986 | 1985 | } |
| 1987 | 1986 | } |
| 1988 | - if (this->m->obj_cache.count(og) == 0) { | |
| 1987 | + if (!isCached(og)) { | |
| 1989 | 1988 | // PDF spec says unknown objects resolve to the null object. |
| 1990 | 1989 | QTC::TC("qpdf", "QPDF resolve failure to null"); |
| 1991 | 1990 | QPDFObjectHandle oh = QPDFObjectHandle::newNull(); |
| ... | ... | @@ -2112,6 +2111,18 @@ QPDF::newIndirect(QPDFObjGen const& og, std::shared_ptr<QPDFObject> const& obj) |
| 2112 | 2111 | return QPDFObjectHandle::Factory::newIndirect(this, og, obj); |
| 2113 | 2112 | } |
| 2114 | 2113 | |
| 2114 | +bool | |
| 2115 | +QPDF::isCached(QPDFObjGen const& og) | |
| 2116 | +{ | |
| 2117 | + return m->obj_cache.count(og) != 0; | |
| 2118 | +} | |
| 2119 | + | |
| 2120 | +bool | |
| 2121 | +QPDF::isUnresolved(QPDFObjGen const& og) | |
| 2122 | +{ | |
| 2123 | + return !isCached(og) || m->obj_cache[og].object->isUnresolved(); | |
| 2124 | +} | |
| 2125 | + | |
| 2115 | 2126 | QPDFObjectHandle |
| 2116 | 2127 | QPDF::makeIndirectObject(QPDFObjectHandle oh) |
| 2117 | 2128 | { |
| ... | ... | @@ -2129,7 +2140,7 @@ QPDF::makeIndirectObject(QPDFObjectHandle oh) |
| 2129 | 2140 | QPDFObjectHandle |
| 2130 | 2141 | QPDF::reserveObjectIfNotExists(QPDFObjGen const& og) |
| 2131 | 2142 | { |
| 2132 | - if ((!m->obj_cache.count(og)) && (!m->xref_table.count(og))) { | |
| 2143 | + if (!isCached(og) && !m->xref_table.count(og)) { | |
| 2133 | 2144 | resolve(og); |
| 2134 | 2145 | m->obj_cache[og].object = QPDF_Reserved::create(); |
| 2135 | 2146 | return newIndirect(og, m->obj_cache[og].object); | ... | ... |
libqpdf/QPDFObjectHandle.cc
| ... | ... | @@ -2609,7 +2609,7 @@ QPDFObjectHandle::dereference() |
| 2609 | 2609 | if (!isInitialized()) { |
| 2610 | 2610 | return false; |
| 2611 | 2611 | } |
| 2612 | - if (this->obj->getTypeCode() == QPDFObject::ot_unresolved) { | |
| 2612 | + if (this->obj->isUnresolved()) { | |
| 2613 | 2613 | this->obj = QPDF::Resolver::resolve(this->qpdf, getObjGen()); |
| 2614 | 2614 | } |
| 2615 | 2615 | return true; | ... | ... |