Commit 6c9903062ff10d35f6fb387f983e02b0134ecb82
1 parent
83443c11
Add new method Objects::get
Showing
5 changed files
with
42 additions
and
27 deletions
libqpdf/QPDF.cc
| ... | ... | @@ -575,32 +575,25 @@ QPDF::newStream(std::string const& data) |
| 575 | 575 | QPDFObjectHandle |
| 576 | 576 | QPDF::getObject(QPDFObjGen const& og) |
| 577 | 577 | { |
| 578 | - if (auto it = m->objects.obj_cache.find(og); it != m->objects.obj_cache.end()) { | |
| 579 | - return {it->second.object}; | |
| 580 | - } else if (m->objects.xref_table().initialized() && !m->objects.xref_table().type(og)) { | |
| 581 | - return QPDF_Null::create(); | |
| 582 | - } else { | |
| 583 | - auto result = m->objects.obj_cache.try_emplace(og, QPDF_Unresolved::create(this, og)); | |
| 584 | - return {result.first->second.object}; | |
| 585 | - } | |
| 578 | + return m->objects.get(og); | |
| 586 | 579 | } |
| 587 | 580 | |
| 588 | 581 | QPDFObjectHandle |
| 589 | -QPDF::getObject(int objid, int generation) | |
| 582 | +QPDF::getObject(int id, int gen) | |
| 590 | 583 | { |
| 591 | - return getObject(QPDFObjGen(objid, generation)); | |
| 584 | + return m->objects.get(id, gen); | |
| 592 | 585 | } |
| 593 | 586 | |
| 594 | 587 | QPDFObjectHandle |
| 595 | 588 | QPDF::getObjectByObjGen(QPDFObjGen const& og) |
| 596 | 589 | { |
| 597 | - return getObject(og); | |
| 590 | + return m->objects.get(og); | |
| 598 | 591 | } |
| 599 | 592 | |
| 600 | 593 | QPDFObjectHandle |
| 601 | -QPDF::getObjectByID(int objid, int generation) | |
| 594 | +QPDF::getObjectByID(int id, int gen) | |
| 602 | 595 | { |
| 603 | - return getObject(QPDFObjGen(objid, generation)); | |
| 596 | + return m->objects.get(id, gen); | |
| 604 | 597 | } |
| 605 | 598 | |
| 606 | 599 | void | ... | ... |
libqpdf/QPDF_linearization.cc
| ... | ... | @@ -130,7 +130,7 @@ QPDF::isLinearized() |
| 130 | 130 | return false; |
| 131 | 131 | } |
| 132 | 132 | |
| 133 | - auto candidate = getObjectByID(lindict_obj, 0); | |
| 133 | + auto candidate = m->objects.get(lindict_obj, 0); | |
| 134 | 134 | if (!candidate.isDictionary()) { |
| 135 | 135 | return false; |
| 136 | 136 | } |
| ... | ... | @@ -563,11 +563,11 @@ QPDF::getLinearizationOffset(QPDFObjGen const& og) |
| 563 | 563 | QPDFObjectHandle |
| 564 | 564 | QPDF::getUncompressedObject(QPDFObjectHandle& obj, std::map<int, int> const& object_stream_data) |
| 565 | 565 | { |
| 566 | - if (obj.isNull() || (object_stream_data.count(obj.getObjectID()) == 0)) { | |
| 566 | + if (obj.isNull() || !object_stream_data.count(obj.getObjectID())) { | |
| 567 | 567 | return obj; |
| 568 | 568 | } else { |
| 569 | 569 | int repl = (*(object_stream_data.find(obj.getObjectID()))).second; |
| 570 | - return getObject(repl, 0); | |
| 570 | + return m->objects.get(repl, 0); | |
| 571 | 571 | } |
| 572 | 572 | } |
| 573 | 573 | |
| ... | ... | @@ -578,7 +578,7 @@ QPDF::getUncompressedObject(QPDFObjectHandle& obj, Objects const& objects) |
| 578 | 578 | if (obj.isNull() || objects.xref_table().type(og) != 2) { |
| 579 | 579 | return obj; |
| 580 | 580 | } |
| 581 | - return getObject(objects.xref_table().stream_number(og.getObj()), 0); | |
| 581 | + return m->objects.get(objects.xref_table().stream_number(og.getObj()), 0); | |
| 582 | 582 | } |
| 583 | 583 | |
| 584 | 584 | QPDFObjectHandle |
| ... | ... | @@ -586,7 +586,7 @@ QPDF::getUncompressedObject(QPDFObjectHandle& oh, QPDFWriter::ObjTable const& ob |
| 586 | 586 | { |
| 587 | 587 | if (obj.contains(oh)) { |
| 588 | 588 | if (auto id = obj[oh].object_stream; id > 0) { |
| 589 | - return oh.isNull() ? oh : getObject(id, 0); | |
| 589 | + return oh.isNull() ? oh : m->objects.get(id, 0); | |
| 590 | 590 | } |
| 591 | 591 | } |
| 592 | 592 | return oh; |
| ... | ... | @@ -1430,9 +1430,9 @@ QPDF::pushOutlinesToPart( |
| 1430 | 1430 | m->c_outline_data.first_object = outlines_og.getObj(); |
| 1431 | 1431 | m->c_outline_data.nobjects = 1; |
| 1432 | 1432 | lc_outlines.erase(outlines_og); |
| 1433 | - part.push_back(outlines); | |
| 1433 | + part.emplace_back(outlines); | |
| 1434 | 1434 | for (auto const& og: lc_outlines) { |
| 1435 | - part.push_back(getObject(og)); | |
| 1435 | + part.emplace_back(m->objects.get(og)); | |
| 1436 | 1436 | ++m->c_outline_data.nobjects; |
| 1437 | 1437 | } |
| 1438 | 1438 | } | ... | ... |
libqpdf/QPDF_objects.cc
| ... | ... | @@ -201,7 +201,7 @@ Xref_table::reconstruct(QPDFExc& e) |
| 201 | 201 | } |
| 202 | 202 | } |
| 203 | 203 | |
| 204 | - std::vector<std::tuple<int, int, qpdf_offset_t>> objects; | |
| 204 | + std::vector<std::tuple<int, int, qpdf_offset_t>> found_objects; | |
| 205 | 205 | std::vector<qpdf_offset_t> trailers; |
| 206 | 206 | int max_found = 0; |
| 207 | 207 | |
| ... | ... | @@ -220,7 +220,7 @@ Xref_table::reconstruct(QPDFExc& e) |
| 220 | 220 | int obj = QUtil::string_to_int(t1.getValue().c_str()); |
| 221 | 221 | int gen = QUtil::string_to_int(t2.getValue().c_str()); |
| 222 | 222 | if (obj <= max_id_) { |
| 223 | - objects.emplace_back(obj, gen, token_start); | |
| 223 | + found_objects.emplace_back(obj, gen, token_start); | |
| 224 | 224 | if (obj > max_found) { |
| 225 | 225 | max_found = obj; |
| 226 | 226 | } |
| ... | ... | @@ -249,8 +249,8 @@ Xref_table::reconstruct(QPDFExc& e) |
| 249 | 249 | check_warnings(); |
| 250 | 250 | } |
| 251 | 251 | |
| 252 | - auto rend = objects.rend(); | |
| 253 | - for (auto it = objects.rbegin(); it != rend; it++) { | |
| 252 | + auto rend = found_objects.rend(); | |
| 253 | + for (auto it = found_objects.rbegin(); it != rend; it++) { | |
| 254 | 254 | auto [obj, gen, token_start] = *it; |
| 255 | 255 | insert(obj, 1, token_start, gen); |
| 256 | 256 | check_warnings(); |
| ... | ... | @@ -265,7 +265,7 @@ Xref_table::reconstruct(QPDFExc& e) |
| 265 | 265 | if (item.type() != 1) { |
| 266 | 266 | continue; |
| 267 | 267 | } |
| 268 | - auto oh = qpdf.getObject(i, item.gen()); | |
| 268 | + auto oh = objects.get(i, item.gen()); | |
| 269 | 269 | try { |
| 270 | 270 | if (!oh.isStreamOfType("/XRef")) { |
| 271 | 271 | continue; |
| ... | ... | @@ -1598,7 +1598,7 @@ Objects::resolveObjectsInStream(int obj_stream_number) |
| 1598 | 1598 | } |
| 1599 | 1599 | m->resolved_object_streams.insert(obj_stream_number); |
| 1600 | 1600 | // Force resolution of object stream |
| 1601 | - QPDFObjectHandle obj_stream = qpdf.getObject(obj_stream_number, 0); | |
| 1601 | + QPDFObjectHandle obj_stream = get(obj_stream_number, 0); | |
| 1602 | 1602 | if (!obj_stream.isStream()) { |
| 1603 | 1603 | throw qpdf.damagedPDF( |
| 1604 | 1604 | "supposed object stream " + std::to_string(obj_stream_number) + " is not a stream"); | ... | ... |
libqpdf/qpdf-c.cc
| ... | ... | @@ -905,7 +905,7 @@ qpdf_oh |
| 905 | 905 | qpdf_get_object_by_id(qpdf_data qpdf, int objid, int generation) |
| 906 | 906 | { |
| 907 | 907 | QTC::TC("qpdf", "qpdf-c called qpdf_get_object_by_id"); |
| 908 | - return new_object(qpdf, qpdf->qpdf->getObjectByID(objid, generation)); | |
| 908 | + return new_object(qpdf, qpdf->qpdf->getObject(objid, generation)); | |
| 909 | 909 | } |
| 910 | 910 | |
| 911 | 911 | template <class RET> | ... | ... |
libqpdf/qpdf/QPDF_objects.hh
| ... | ... | @@ -3,6 +3,9 @@ |
| 3 | 3 | |
| 4 | 4 | #include <qpdf/QPDF.hh> |
| 5 | 5 | |
| 6 | +#include <qpdf/QPDF_Null.hh> | |
| 7 | +#include <qpdf/QPDF_Unresolved.hh> | |
| 8 | + | |
| 6 | 9 | #include <variant> |
| 7 | 10 | |
| 8 | 11 | // The Objects class is responsible for keeping track of all objects belonging to a QPDF instance, |
| ... | ... | @@ -419,6 +422,25 @@ class QPDF::Objects |
| 419 | 422 | return xref.trailer(); |
| 420 | 423 | } |
| 421 | 424 | |
| 425 | + QPDFObjectHandle | |
| 426 | + get(QPDFObjGen og) | |
| 427 | + { | |
| 428 | + if (auto it = obj_cache.find(og); it != obj_cache.end()) { | |
| 429 | + return {it->second.object}; | |
| 430 | + } else if (xref.initialized() && !xref.type(og)) { | |
| 431 | + return QPDF_Null::create(); | |
| 432 | + } else { | |
| 433 | + auto result = obj_cache.try_emplace(og, QPDF_Unresolved::create(&qpdf, og)); | |
| 434 | + return {result.first->second.object}; | |
| 435 | + } | |
| 436 | + } | |
| 437 | + | |
| 438 | + QPDFObjectHandle | |
| 439 | + get(int id, int gen) | |
| 440 | + { | |
| 441 | + return get(QPDFObjGen(id, gen)); | |
| 442 | + } | |
| 443 | + | |
| 422 | 444 | std::map<QPDFObjGen, Entry> obj_cache; |
| 423 | 445 | |
| 424 | 446 | QPDFObjectHandle readObjectInStream(std::shared_ptr<InputSource>& input, int obj); | ... | ... |