From d207f6151c106c7830821db75e709a7423db4bc6 Mon Sep 17 00:00:00 2001 From: m-holger Date: Wed, 1 Oct 2025 16:28:29 +0100 Subject: [PATCH] Refactor `QPDFObjectHandle::copyStream`: move stream copying logic to `Stream`. --- libqpdf/QPDFObjectHandle.cc | 18 ------------------ libqpdf/QPDF_Stream.cc | 21 +++++++++++++++++++++ libqpdf/qpdf/QPDFObjectHandle_private.hh | 2 ++ libqpdf/qpdf/QPDF_private.hh | 23 +++++++---------------- 4 files changed, 30 insertions(+), 34 deletions(-) diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index cfbfe8d..2abb4db 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -1935,24 +1935,6 @@ QPDFObjectHandle::makeDirect(QPDFObjGen::set& visited, bool stop_at_streams) visited.erase(cur_og); } -QPDFObjectHandle -QPDFObjectHandle::copyStream() -{ - assertStream(); - QPDFObjectHandle result = newStream(getOwningQPDF()); - QPDFObjectHandle dict = result.getDict(); - QPDFObjectHandle old_dict = getDict(); - for (auto& iter: QPDFDictItems(old_dict)) { - if (iter.second.isIndirect()) { - dict.replaceKey(iter.first, iter.second); - } else { - dict.replaceKey(iter.first, iter.second.shallowCopy()); - } - } - QPDF::Doc::StreamCopier::copyStreamData(getOwningQPDF(), result, *this); - return result; -} - void QPDFObjectHandle::makeDirect(bool allow_streams) { diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index ce13611..d140e13 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -44,6 +44,12 @@ class QPDF::Doc::Streams return qpdf->pipeStreamData( og, offset, length, dict, is_root_metadata, pipeline, suppress_warnings, will_retry); } + + static void + copyStreamData(QPDF* qpdf, QPDFObjectHandle const& dest, QPDFObjectHandle const& src) + { + qpdf->copyStreamData(dest, src); + } }; namespace @@ -206,6 +212,15 @@ Stream::Stream( setDictDescription(); } +Stream +Stream::copy() const +{ + Stream result = qpdf()->newStream(); + result.stream()->stream_dict = getDict().copy(); + QPDF::Doc::Streams::copyStreamData(qpdf(), result, *this); + return result; +} + void Stream::registerStreamFilter( std::string const& filter_name, std::function()> factory) @@ -850,3 +865,9 @@ QPDFObjectHandle::getStreamJSON( { return as_stream(error).getStreamJSON(json_version, json_data, decode_level, p, data_filename); } + +QPDFObjectHandle +QPDFObjectHandle::copyStream() +{ + return as_stream(error).copy(); +} diff --git a/libqpdf/qpdf/QPDFObjectHandle_private.hh b/libqpdf/qpdf/QPDFObjectHandle_private.hh index b9d2623..a97472d 100644 --- a/libqpdf/qpdf/QPDFObjectHandle_private.hh +++ b/libqpdf/qpdf/QPDFObjectHandle_private.hh @@ -469,6 +469,8 @@ namespace qpdf qpdf_offset_t offset, size_t length); + Stream copy() const; + Dictionary getDict() const { diff --git a/libqpdf/qpdf/QPDF_private.hh b/libqpdf/qpdf/QPDF_private.hh index c8982c9..356f756 100644 --- a/libqpdf/qpdf/QPDF_private.hh +++ b/libqpdf/qpdf/QPDF_private.hh @@ -13,10 +13,14 @@ using namespace qpdf; -namespace qpdf::is +namespace qpdf { - class OffsetBuffer; -} // namespace qpdf::is + class Stream; + namespace is + { + class OffsetBuffer; + } // namespace is +} // namespace qpdf class BitStream; class BitWriter; @@ -700,19 +704,6 @@ class QPDF::Doc QPDF::Members* m; }; // class QPDF::Doc::Pages - // StreamCopier class is restricted to QPDFObjectHandle so it can copy stream data. - class StreamCopier - { - friend class QPDFObjectHandle; - - private: - static void - copyStreamData(QPDF* qpdf, QPDFObjectHandle const& dest, QPDFObjectHandle const& src) - { - qpdf->copyStreamData(dest, src); - } - }; - Doc() = delete; Doc(Doc const&) = delete; Doc(Doc&&) = delete; -- libgit2 0.21.4