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