Commit 8a6b35827fb57b5ed72a695de713c668a268060d

Authored by m-holger
1 parent c436f035

Refactor `QPDF_Stream` and related classes to replace `Buffer` usage with `std::…

…string`, improving performance, simplifying stream data handling, and reducing dependency on `BufferInputSource`.
libqpdf/QPDF_Stream.cc
@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
3 #include <qpdf/ContentNormalizer.hh> 3 #include <qpdf/ContentNormalizer.hh>
4 #include <qpdf/JSON_writer.hh> 4 #include <qpdf/JSON_writer.hh>
5 #include <qpdf/Pipeline.hh> 5 #include <qpdf/Pipeline.hh>
  6 +#include <qpdf/Pipeline_private.hh>
6 #include <qpdf/Pl_Base64.hh> 7 #include <qpdf/Pl_Base64.hh>
7 #include <qpdf/Pl_Buffer.hh> 8 #include <qpdf/Pl_Buffer.hh>
8 #include <qpdf/Pl_Count.hh> 9 #include <qpdf/Pl_Count.hh>
@@ -319,10 +320,11 @@ qpdf::Stream::setDictDescription() @@ -319,10 +320,11 @@ qpdf::Stream::setDictDescription()
319 } 320 }
320 } 321 }
321 322
322 -std::shared_ptr<Buffer> 323 +std::string
323 Stream::getStreamData(qpdf_stream_decode_level_e decode_level) 324 Stream::getStreamData(qpdf_stream_decode_level_e decode_level)
324 { 325 {
325 - Pl_Buffer buf("stream data buffer"); 326 + std::string result;
  327 + pl::String buf(result);
326 bool filtered; 328 bool filtered;
327 pipeStreamData(&buf, &filtered, 0, decode_level, false, false); 329 pipeStreamData(&buf, &filtered, 0, decode_level, false, false);
328 if (!filtered) { 330 if (!filtered) {
@@ -334,13 +336,14 @@ Stream::getStreamData(qpdf_stream_decode_level_e decode_level) @@ -334,13 +336,14 @@ Stream::getStreamData(qpdf_stream_decode_level_e decode_level)
334 "getStreamData called on unfilterable stream"); 336 "getStreamData called on unfilterable stream");
335 } 337 }
336 QTC::TC("qpdf", "QPDF_Stream getStreamData"); 338 QTC::TC("qpdf", "QPDF_Stream getStreamData");
337 - return buf.getBufferSharedPointer(); 339 + return result;
338 } 340 }
339 341
340 -std::shared_ptr<Buffer> 342 +std::string
341 Stream::getRawStreamData() 343 Stream::getRawStreamData()
342 { 344 {
343 - Pl_Buffer buf("stream data buffer"); 345 + std::string result;
  346 + pl::String buf(result);
344 if (!pipeStreamData(&buf, nullptr, 0, qpdf_dl_none, false, false)) { 347 if (!pipeStreamData(&buf, nullptr, 0, qpdf_dl_none, false, false)) {
345 throw QPDFExc( 348 throw QPDFExc(
346 qpdf_e_unsupported, 349 qpdf_e_unsupported,
@@ -350,7 +353,7 @@ Stream::getRawStreamData() @@ -350,7 +353,7 @@ Stream::getRawStreamData()
350 "error getting raw stream data"); 353 "error getting raw stream data");
351 } 354 }
352 QTC::TC("qpdf", "QPDF_Stream getRawStreamData"); 355 QTC::TC("qpdf", "QPDF_Stream getRawStreamData");
353 - return buf.getBufferSharedPointer(); 356 + return result;
354 } 357 }
355 358
356 bool 359 bool
@@ -683,13 +686,13 @@ QPDFObjectHandle::isRootMetadata() const @@ -683,13 +686,13 @@ QPDFObjectHandle::isRootMetadata() const
683 std::shared_ptr<Buffer> 686 std::shared_ptr<Buffer>
684 QPDFObjectHandle::getStreamData(qpdf_stream_decode_level_e level) 687 QPDFObjectHandle::getStreamData(qpdf_stream_decode_level_e level)
685 { 688 {
686 - return as_stream(error).getStreamData(level); 689 + return std::make_shared<Buffer>(as_stream(error).getStreamData(level));
687 } 690 }
688 691
689 std::shared_ptr<Buffer> 692 std::shared_ptr<Buffer>
690 QPDFObjectHandle::getRawStreamData() 693 QPDFObjectHandle::getRawStreamData()
691 { 694 {
692 - return as_stream(error).getRawStreamData(); 695 + return std::make_shared<Buffer>(as_stream(error).getRawStreamData());
693 } 696 }
694 697
695 bool 698 bool
libqpdf/QPDF_objects.cc
@@ -2,18 +2,7 @@ @@ -2,18 +2,7 @@
2 2
3 #include <qpdf/QPDF_private.hh> 3 #include <qpdf/QPDF_private.hh>
4 4
5 -#include <array>  
6 -#include <atomic>  
7 -#include <cstring>  
8 -#include <limits>  
9 -#include <map>  
10 -#include <regex>  
11 -#include <sstream>  
12 -#include <vector>  
13 -  
14 -#include <qpdf/BufferInputSource.hh>  
15 #include <qpdf/InputSource_private.hh> 5 #include <qpdf/InputSource_private.hh>
16 -#include <qpdf/OffsetInputSource.hh>  
17 #include <qpdf/Pipeline.hh> 6 #include <qpdf/Pipeline.hh>
18 #include <qpdf/QPDFExc.hh> 7 #include <qpdf/QPDFExc.hh>
19 #include <qpdf/QPDFLogger.hh> 8 #include <qpdf/QPDFLogger.hh>
@@ -24,6 +13,13 @@ @@ -24,6 +13,13 @@
24 #include <qpdf/QUtil.hh> 13 #include <qpdf/QUtil.hh>
25 #include <qpdf/Util.hh> 14 #include <qpdf/Util.hh>
26 15
  16 +#include <array>
  17 +#include <atomic>
  18 +#include <cstring>
  19 +#include <limits>
  20 +#include <map>
  21 +#include <vector>
  22 +
27 using namespace qpdf; 23 using namespace qpdf;
28 using namespace std::literals; 24 using namespace std::literals;
29 25
@@ -1675,13 +1671,13 @@ QPDF::resolveObjectsInStream(int obj_stream_number) @@ -1675,13 +1671,13 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1675 // id, offset, size 1671 // id, offset, size
1676 std::vector<std::tuple<int, qpdf_offset_t, size_t>> offsets; 1672 std::vector<std::tuple<int, qpdf_offset_t, size_t>> offsets;
1677 1673
1678 - auto bp = obj_stream.getStreamData(qpdf_dl_specialized); 1674 + auto stream_data = obj_stream.getStreamData(qpdf_dl_specialized);
1679 1675
1680 - BufferInputSource input("", bp.get()); 1676 + is::OffsetBuffer input("", stream_data);
1681 1677
1682 - const auto b_size = bp->getSize(); 1678 + const auto b_size = stream_data.size();
1683 const auto end_offset = static_cast<qpdf_offset_t>(b_size); 1679 const auto end_offset = static_cast<qpdf_offset_t>(b_size);
1684 - auto b_start = bp->getBuffer(); 1680 + auto b_start = stream_data.data();
1685 1681
1686 if (first >= end_offset) { 1682 if (first >= end_offset) {
1687 throw damagedPDF( 1683 throw damagedPDF(
@@ -1762,8 +1758,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number) @@ -1762,8 +1758,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1762 auto entry = m->xref_table.find(og); 1758 auto entry = m->xref_table.find(og);
1763 if (entry != m->xref_table.end() && entry->second.getType() == 2 && 1759 if (entry != m->xref_table.end() && entry->second.getType() == 2 &&
1764 entry->second.getObjStreamNumber() == obj_stream_number) { 1760 entry->second.getObjStreamNumber() == obj_stream_number) {
1765 - Buffer obj_buffer{b_start + obj_offset, obj_size};  
1766 - is::OffsetBuffer in("", &obj_buffer, obj_offset); 1761 + is::OffsetBuffer in("", {b_start + obj_offset, obj_size}, obj_offset);
1767 auto oh = readObjectInStream(in, obj_stream_number, obj_id); 1762 auto oh = readObjectInStream(in, obj_stream_number, obj_id);
1768 updateCache(og, oh.getObj(), end_before_space, end_after_space); 1763 updateCache(og, oh.getObj(), end_before_space, end_after_space);
1769 } else { 1764 } else {
libqpdf/qpdf/QPDFObjectHandle_private.hh
@@ -254,8 +254,8 @@ namespace qpdf @@ -254,8 +254,8 @@ namespace qpdf
254 qpdf_stream_decode_level_e decode_level, 254 qpdf_stream_decode_level_e decode_level,
255 bool suppress_warnings, 255 bool suppress_warnings,
256 bool will_retry); 256 bool will_retry);
257 - std::shared_ptr<Buffer> getStreamData(qpdf_stream_decode_level_e level);  
258 - std::shared_ptr<Buffer> getRawStreamData(); 257 + std::string getStreamData(qpdf_stream_decode_level_e level);
  258 + std::string getRawStreamData();
259 void replaceStreamData( 259 void replaceStreamData(
260 std::shared_ptr<Buffer> data, 260 std::shared_ptr<Buffer> data,
261 QPDFObjectHandle const& filter, 261 QPDFObjectHandle const& filter,