Commit 6c9903062ff10d35f6fb387f983e02b0134ecb82

Authored by m-holger
1 parent 83443c11

Add new method Objects::get

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&amp; obj, Objects const&amp; 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&amp; oh, QPDFWriter::ObjTable const&amp; 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&amp; 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&amp; 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&amp; 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&amp; 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);
... ...