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,32 +575,25 @@ QPDF::newStream(std::string const& data)
575 QPDFObjectHandle 575 QPDFObjectHandle
576 QPDF::getObject(QPDFObjGen const& og) 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 QPDFObjectHandle 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 QPDFObjectHandle 587 QPDFObjectHandle
595 QPDF::getObjectByObjGen(QPDFObjGen const& og) 588 QPDF::getObjectByObjGen(QPDFObjGen const& og)
596 { 589 {
597 - return getObject(og); 590 + return m->objects.get(og);
598 } 591 }
599 592
600 QPDFObjectHandle 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 void 599 void
libqpdf/QPDF_linearization.cc
@@ -130,7 +130,7 @@ QPDF::isLinearized() @@ -130,7 +130,7 @@ QPDF::isLinearized()
130 return false; 130 return false;
131 } 131 }
132 132
133 - auto candidate = getObjectByID(lindict_obj, 0); 133 + auto candidate = m->objects.get(lindict_obj, 0);
134 if (!candidate.isDictionary()) { 134 if (!candidate.isDictionary()) {
135 return false; 135 return false;
136 } 136 }
@@ -563,11 +563,11 @@ QPDF::getLinearizationOffset(QPDFObjGen const& og) @@ -563,11 +563,11 @@ QPDF::getLinearizationOffset(QPDFObjGen const& og)
563 QPDFObjectHandle 563 QPDFObjectHandle
564 QPDF::getUncompressedObject(QPDFObjectHandle& obj, std::map<int, int> const& object_stream_data) 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 return obj; 567 return obj;
568 } else { 568 } else {
569 int repl = (*(object_stream_data.find(obj.getObjectID()))).second; 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,7 +578,7 @@ QPDF::getUncompressedObject(QPDFObjectHandle&amp; obj, Objects const&amp; objects)
578 if (obj.isNull() || objects.xref_table().type(og) != 2) { 578 if (obj.isNull() || objects.xref_table().type(og) != 2) {
579 return obj; 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 QPDFObjectHandle 584 QPDFObjectHandle
@@ -586,7 +586,7 @@ QPDF::getUncompressedObject(QPDFObjectHandle&amp; oh, QPDFWriter::ObjTable const&amp; ob @@ -586,7 +586,7 @@ QPDF::getUncompressedObject(QPDFObjectHandle&amp; oh, QPDFWriter::ObjTable const&amp; ob
586 { 586 {
587 if (obj.contains(oh)) { 587 if (obj.contains(oh)) {
588 if (auto id = obj[oh].object_stream; id > 0) { 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 return oh; 592 return oh;
@@ -1430,9 +1430,9 @@ QPDF::pushOutlinesToPart( @@ -1430,9 +1430,9 @@ QPDF::pushOutlinesToPart(
1430 m->c_outline_data.first_object = outlines_og.getObj(); 1430 m->c_outline_data.first_object = outlines_og.getObj();
1431 m->c_outline_data.nobjects = 1; 1431 m->c_outline_data.nobjects = 1;
1432 lc_outlines.erase(outlines_og); 1432 lc_outlines.erase(outlines_og);
1433 - part.push_back(outlines); 1433 + part.emplace_back(outlines);
1434 for (auto const& og: lc_outlines) { 1434 for (auto const& og: lc_outlines) {
1435 - part.push_back(getObject(og)); 1435 + part.emplace_back(m->objects.get(og));
1436 ++m->c_outline_data.nobjects; 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,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 std::vector<qpdf_offset_t> trailers; 205 std::vector<qpdf_offset_t> trailers;
206 int max_found = 0; 206 int max_found = 0;
207 207
@@ -220,7 +220,7 @@ Xref_table::reconstruct(QPDFExc&amp; e) @@ -220,7 +220,7 @@ Xref_table::reconstruct(QPDFExc&amp; e)
220 int obj = QUtil::string_to_int(t1.getValue().c_str()); 220 int obj = QUtil::string_to_int(t1.getValue().c_str());
221 int gen = QUtil::string_to_int(t2.getValue().c_str()); 221 int gen = QUtil::string_to_int(t2.getValue().c_str());
222 if (obj <= max_id_) { 222 if (obj <= max_id_) {
223 - objects.emplace_back(obj, gen, token_start); 223 + found_objects.emplace_back(obj, gen, token_start);
224 if (obj > max_found) { 224 if (obj > max_found) {
225 max_found = obj; 225 max_found = obj;
226 } 226 }
@@ -249,8 +249,8 @@ Xref_table::reconstruct(QPDFExc&amp; e) @@ -249,8 +249,8 @@ Xref_table::reconstruct(QPDFExc&amp; e)
249 check_warnings(); 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 auto [obj, gen, token_start] = *it; 254 auto [obj, gen, token_start] = *it;
255 insert(obj, 1, token_start, gen); 255 insert(obj, 1, token_start, gen);
256 check_warnings(); 256 check_warnings();
@@ -265,7 +265,7 @@ Xref_table::reconstruct(QPDFExc&amp; e) @@ -265,7 +265,7 @@ Xref_table::reconstruct(QPDFExc&amp; e)
265 if (item.type() != 1) { 265 if (item.type() != 1) {
266 continue; 266 continue;
267 } 267 }
268 - auto oh = qpdf.getObject(i, item.gen()); 268 + auto oh = objects.get(i, item.gen());
269 try { 269 try {
270 if (!oh.isStreamOfType("/XRef")) { 270 if (!oh.isStreamOfType("/XRef")) {
271 continue; 271 continue;
@@ -1598,7 +1598,7 @@ Objects::resolveObjectsInStream(int obj_stream_number) @@ -1598,7 +1598,7 @@ Objects::resolveObjectsInStream(int obj_stream_number)
1598 } 1598 }
1599 m->resolved_object_streams.insert(obj_stream_number); 1599 m->resolved_object_streams.insert(obj_stream_number);
1600 // Force resolution of object stream 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 if (!obj_stream.isStream()) { 1602 if (!obj_stream.isStream()) {
1603 throw qpdf.damagedPDF( 1603 throw qpdf.damagedPDF(
1604 "supposed object stream " + std::to_string(obj_stream_number) + " is not a stream"); 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,7 +905,7 @@ qpdf_oh
905 qpdf_get_object_by_id(qpdf_data qpdf, int objid, int generation) 905 qpdf_get_object_by_id(qpdf_data qpdf, int objid, int generation)
906 { 906 {
907 QTC::TC("qpdf", "qpdf-c called qpdf_get_object_by_id"); 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 template <class RET> 911 template <class RET>
libqpdf/qpdf/QPDF_objects.hh
@@ -3,6 +3,9 @@ @@ -3,6 +3,9 @@
3 3
4 #include <qpdf/QPDF.hh> 4 #include <qpdf/QPDF.hh>
5 5
  6 +#include <qpdf/QPDF_Null.hh>
  7 +#include <qpdf/QPDF_Unresolved.hh>
  8 +
6 #include <variant> 9 #include <variant>
7 10
8 // The Objects class is responsible for keeping track of all objects belonging to a QPDF instance, 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,6 +422,25 @@ class QPDF::Objects
419 return xref.trailer(); 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 std::map<QPDFObjGen, Entry> obj_cache; 444 std::map<QPDFObjGen, Entry> obj_cache;
423 445
424 QPDFObjectHandle readObjectInStream(std::shared_ptr<InputSource>& input, int obj); 446 QPDFObjectHandle readObjectInStream(std::shared_ptr<InputSource>& input, int obj);