Commit 38f45c7321a34b37d6e8346b215c17ed7f0558b9

Authored by m-holger
1 parent 9c3deb93

Refactor `ObjectHandle` to introduce `offset()` method

Replace `getParsedOffset()` with the new `offset()` method across `QPDFObjectHandle` and related classes for consistent offset handling. Simplify logic and remove redundant `getParsedOffset()` implementation.
include/qpdf/ObjectHandle.hh
@@ -94,6 +94,7 @@ namespace qpdf @@ -94,6 +94,7 @@ namespace qpdf
94 inline QPDFObjGen id_gen() const; 94 inline QPDFObjGen id_gen() const;
95 inline bool indirect() const; 95 inline bool indirect() const;
96 inline bool null() const; 96 inline bool null() const;
  97 + inline qpdf_offset_t offset() const;
97 inline QPDF* qpdf() const; 98 inline QPDF* qpdf() const;
98 inline qpdf_object_type_e raw_type_code() const; 99 inline qpdf_object_type_e raw_type_code() const;
99 inline qpdf_object_type_e resolved_type_code() const; 100 inline qpdf_object_type_e resolved_type_code() const;
libqpdf/QPDF.cc
@@ -567,7 +567,7 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign) @@ -567,7 +567,7 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign)
567 if (!obj_copier.object_map.contains(og)) { 567 if (!obj_copier.object_map.contains(og)) {
568 warn(damagedPDF( 568 warn(damagedPDF(
569 other.getFilename() + " object " + og.unparse(' '), 569 other.getFilename() + " object " + og.unparse(' '),
570 - foreign.getParsedOffset(), 570 + foreign.offset(),
571 "unexpected reference to /Pages object while copying foreign object; replacing with " 571 "unexpected reference to /Pages object while copying foreign object; replacing with "
572 "null")); 572 "null"));
573 return QPDFObjectHandle::newNull(); 573 return QPDFObjectHandle::newNull();
@@ -732,7 +732,7 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign) @@ -732,7 +732,7 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign)
732 foreign_stream_qpdf.m->encp, 732 foreign_stream_qpdf.m->encp,
733 foreign_stream_qpdf.m->file, 733 foreign_stream_qpdf.m->file,
734 foreign, 734 foreign,
735 - foreign.getParsedOffset(), 735 + foreign.offset(),
736 stream.getLength(), 736 stream.getLength(),
737 dict, 737 dict,
738 stream.isRootMetadata()); 738 stream.isRootMetadata());
libqpdf/QPDFObjectHandle.cc
@@ -1690,7 +1690,7 @@ QPDFObjectHandle::parse( @@ -1690,7 +1690,7 @@ QPDFObjectHandle::parse(
1690 qpdf_offset_t 1690 qpdf_offset_t
1691 QPDFObjectHandle::getParsedOffset() const 1691 QPDFObjectHandle::getParsedOffset() const
1692 { 1692 {
1693 - return obj ? obj->getParsedOffset() : -1; 1693 + return offset();
1694 } 1694 }
1695 1695
1696 QPDFObjectHandle 1696 QPDFObjectHandle
libqpdf/QPDF_Stream.cc
@@ -350,12 +350,11 @@ Stream::getStreamData(qpdf_stream_decode_level_e decode_level) @@ -350,12 +350,11 @@ Stream::getStreamData(qpdf_stream_decode_level_e decode_level)
350 if (!filtered) { 350 if (!filtered) {
351 throw QPDFExc( 351 throw QPDFExc(
352 qpdf_e_unsupported, 352 qpdf_e_unsupported,
353 - obj->getQPDF()->getFilename(), 353 + qpdf()->getFilename(),
354 "", 354 "",
355 - obj->getParsedOffset(), 355 + offset(),
356 "getStreamData called on unfilterable stream"); 356 "getStreamData called on unfilterable stream");
357 } 357 }
358 - QTC::TC("qpdf", "QPDF_Stream getStreamData");  
359 return result; 358 return result;
360 } 359 }
361 360
@@ -367,12 +366,11 @@ Stream::getRawStreamData() @@ -367,12 +366,11 @@ Stream::getRawStreamData()
367 if (!pipeStreamData(&buf, nullptr, 0, qpdf_dl_none, false, false)) { 366 if (!pipeStreamData(&buf, nullptr, 0, qpdf_dl_none, false, false)) {
368 throw QPDFExc( 367 throw QPDFExc(
369 qpdf_e_unsupported, 368 qpdf_e_unsupported,
370 - obj->getQPDF()->getFilename(), 369 + qpdf()->getFilename(),
371 "", 370 "",
372 - obj->getParsedOffset(), 371 + offset(),
373 "error getting raw stream data"); 372 "error getting raw stream data");
374 } 373 }
375 - QTC::TC("qpdf", "QPDF_Stream getRawStreamData");  
376 return result; 374 return result;
377 } 375 }
378 376
@@ -579,15 +577,13 @@ Stream::pipeStreamData( @@ -579,15 +577,13 @@ Stream::pipeStreamData(
579 s->stream_dict.replaceKey("/Length", QPDFObjectHandle::newInteger(actual_length)); 577 s->stream_dict.replaceKey("/Length", QPDFObjectHandle::newInteger(actual_length));
580 } 578 }
581 } else { 579 } else {
582 - if (obj->getParsedOffset() == 0) {  
583 - QTC::TC("qpdf", "QPDF_Stream pipe no stream data"); 580 + if (offset() == 0) {
584 throw std::logic_error("pipeStreamData called for stream with no data"); 581 throw std::logic_error("pipeStreamData called for stream with no data");
585 } 582 }
586 - QTC::TC("qpdf", "QPDF_Stream pipe original stream data");  
587 if (!QPDF::Doc::Streams::pipeStreamData( 583 if (!QPDF::Doc::Streams::pipeStreamData(
588 - obj->getQPDF(),  
589 - obj->getObjGen(),  
590 - obj->getParsedOffset(), 584 + qpdf(),
  585 + id_gen(),
  586 + offset(),
591 s->length, 587 s->length,
592 s->stream_dict, 588 s->stream_dict,
593 isRootMetadata(), 589 isRootMetadata(),
@@ -664,7 +660,7 @@ Stream::replaceFilterData( @@ -664,7 +660,7 @@ Stream::replaceFilterData(
664 void 660 void
665 Stream::warn(std::string const& message) 661 Stream::warn(std::string const& message)
666 { 662 {
667 - obj->getQPDF()->warn(qpdf_e_damaged_pdf, "", obj->getParsedOffset(), message); 663 + qpdf()->warn(qpdf_e_damaged_pdf, "", offset(), message);
668 } 664 }
669 665
670 QPDFObjectHandle 666 QPDFObjectHandle
libqpdf/QPDF_json.cc
@@ -424,8 +424,7 @@ QPDF::JSONReactor::replaceObject(QPDFObjectHandle&& replacement, JSON const& val @@ -424,8 +424,7 @@ QPDF::JSONReactor::replaceObject(QPDFObjectHandle&& replacement, JSON const& val
424 auto og = tos.object.getObjGen(); 424 auto og = tos.object.getObjGen();
425 if (replacement.isIndirect() && !(replacement.isStream() && replacement.getObjGen() == og)) { 425 if (replacement.isIndirect() && !(replacement.isStream() && replacement.getObjGen() == og)) {
426 error( 426 error(
427 - replacement.getParsedOffset(),  
428 - "the value of an object may not be an indirect object reference"); 427 + replacement.offset(), "the value of an object may not be an indirect object reference");
429 return; 428 return;
430 } 429 }
431 pdf.replaceObject(og, replacement); 430 pdf.replaceObject(og, replacement);
libqpdf/qpdf/QPDFObjectHandle_private.hh
@@ -657,6 +657,12 @@ namespace qpdf @@ -657,6 +657,12 @@ namespace qpdf
657 return !obj || type_code() == ::ot_null; 657 return !obj || type_code() == ::ot_null;
658 } 658 }
659 659
  660 + inline qpdf_offset_t
  661 + BaseHandle::offset() const
  662 + {
  663 + return obj ? obj->parsed_offset : -1;
  664 + }
  665 +
660 inline QPDF* 666 inline QPDF*
661 BaseHandle::qpdf() const 667 BaseHandle::qpdf() const
662 { 668 {
libqpdf/qpdf/QPDFObject_private.hh
@@ -438,11 +438,6 @@ class QPDFObject @@ -438,11 +438,6 @@ class QPDFObject
438 parsed_offset = offset; 438 parsed_offset = offset;
439 } 439 }
440 } 440 }
441 - qpdf_offset_t  
442 - getParsedOffset()  
443 - {  
444 - return parsed_offset;  
445 - }  
446 QPDF* 441 QPDF*
447 getQPDF() 442 getQPDF()
448 { 443 {
qpdf/qpdf.testcov
@@ -98,16 +98,12 @@ qpdf-c called qpdf_set_r4_encryption_parameters_insecure 0 @@ -98,16 +98,12 @@ qpdf-c called qpdf_set_r4_encryption_parameters_insecure 0
98 qpdf-c called qpdf_set_static_aes_IV 0 98 qpdf-c called qpdf_set_static_aes_IV 0
99 qpdf-c called qpdf_has_error 0 99 qpdf-c called qpdf_has_error 0
100 qpdf-c called qpdf_get_qpdf_version 0 100 qpdf-c called qpdf_get_qpdf_version 0
101 -QPDF_Stream pipe original stream data 0  
102 QPDF_Stream pipe replaced stream data 0 101 QPDF_Stream pipe replaced stream data 0
103 QPDF_Stream provider length mismatch 0 102 QPDF_Stream provider length mismatch 0
104 QPDFObjectHandle newStream 0 103 QPDFObjectHandle newStream 0
105 QPDFObjectHandle newStream with data 0 104 QPDFObjectHandle newStream with data 0
106 -QPDF_Stream pipe no stream data 0  
107 QPDFObjectHandle prepend page contents 0 105 QPDFObjectHandle prepend page contents 0
108 QPDFObjectHandle append page contents 0 106 QPDFObjectHandle append page contents 0
109 -QPDF_Stream getRawStreamData 0  
110 -QPDF_Stream getStreamData 0  
111 qpdf-c called qpdf_read_memory 0 107 qpdf-c called qpdf_read_memory 0
112 QPDF stream with CRNL 0 108 QPDF stream with CRNL 0
113 QPDFWriter copy encrypt metadata 1 109 QPDFWriter copy encrypt metadata 1