Commit d207f6151c106c7830821db75e709a7423db4bc6

Authored by m-holger
1 parent f797de7b

Refactor `QPDFObjectHandle::copyStream`: move stream copying logic to `Stream`.

libqpdf/QPDFObjectHandle.cc
... ... @@ -1935,24 +1935,6 @@ QPDFObjectHandle::makeDirect(QPDFObjGen::set& visited, bool stop_at_streams)
1935 1935 visited.erase(cur_og);
1936 1936 }
1937 1937  
1938   -QPDFObjectHandle
1939   -QPDFObjectHandle::copyStream()
1940   -{
1941   - assertStream();
1942   - QPDFObjectHandle result = newStream(getOwningQPDF());
1943   - QPDFObjectHandle dict = result.getDict();
1944   - QPDFObjectHandle old_dict = getDict();
1945   - for (auto& iter: QPDFDictItems(old_dict)) {
1946   - if (iter.second.isIndirect()) {
1947   - dict.replaceKey(iter.first, iter.second);
1948   - } else {
1949   - dict.replaceKey(iter.first, iter.second.shallowCopy());
1950   - }
1951   - }
1952   - QPDF::Doc::StreamCopier::copyStreamData(getOwningQPDF(), result, *this);
1953   - return result;
1954   -}
1955   -
1956 1938 void
1957 1939 QPDFObjectHandle::makeDirect(bool allow_streams)
1958 1940 {
... ...
libqpdf/QPDF_Stream.cc
... ... @@ -44,6 +44,12 @@ class QPDF::Doc::Streams
44 44 return qpdf->pipeStreamData(
45 45 og, offset, length, dict, is_root_metadata, pipeline, suppress_warnings, will_retry);
46 46 }
  47 +
  48 + static void
  49 + copyStreamData(QPDF* qpdf, QPDFObjectHandle const& dest, QPDFObjectHandle const& src)
  50 + {
  51 + qpdf->copyStreamData(dest, src);
  52 + }
47 53 };
48 54  
49 55 namespace
... ... @@ -206,6 +212,15 @@ Stream::Stream(
206 212 setDictDescription();
207 213 }
208 214  
  215 +Stream
  216 +Stream::copy() const
  217 +{
  218 + Stream result = qpdf()->newStream();
  219 + result.stream()->stream_dict = getDict().copy();
  220 + QPDF::Doc::Streams::copyStreamData(qpdf(), result, *this);
  221 + return result;
  222 +}
  223 +
209 224 void
210 225 Stream::registerStreamFilter(
211 226 std::string const& filter_name, std::function<std::shared_ptr<QPDFStreamFilter>()> factory)
... ... @@ -850,3 +865,9 @@ QPDFObjectHandle::getStreamJSON(
850 865 {
851 866 return as_stream(error).getStreamJSON(json_version, json_data, decode_level, p, data_filename);
852 867 }
  868 +
  869 +QPDFObjectHandle
  870 +QPDFObjectHandle::copyStream()
  871 +{
  872 + return as_stream(error).copy();
  873 +}
... ...
libqpdf/qpdf/QPDFObjectHandle_private.hh
... ... @@ -469,6 +469,8 @@ namespace qpdf
469 469 qpdf_offset_t offset,
470 470 size_t length);
471 471  
  472 + Stream copy() const;
  473 +
472 474 Dictionary
473 475 getDict() const
474 476 {
... ...
libqpdf/qpdf/QPDF_private.hh
... ... @@ -13,10 +13,14 @@
13 13  
14 14 using namespace qpdf;
15 15  
16   -namespace qpdf::is
  16 +namespace qpdf
17 17 {
18   - class OffsetBuffer;
19   -} // namespace qpdf::is
  18 + class Stream;
  19 + namespace is
  20 + {
  21 + class OffsetBuffer;
  22 + } // namespace is
  23 +} // namespace qpdf
20 24  
21 25 class BitStream;
22 26 class BitWriter;
... ... @@ -700,19 +704,6 @@ class QPDF::Doc
700 704 QPDF::Members* m;
701 705 }; // class QPDF::Doc::Pages
702 706  
703   - // StreamCopier class is restricted to QPDFObjectHandle so it can copy stream data.
704   - class StreamCopier
705   - {
706   - friend class QPDFObjectHandle;
707   -
708   - private:
709   - static void
710   - copyStreamData(QPDF* qpdf, QPDFObjectHandle const& dest, QPDFObjectHandle const& src)
711   - {
712   - qpdf->copyStreamData(dest, src);
713   - }
714   - };
715   -
716 707 Doc() = delete;
717 708 Doc(Doc const&) = delete;
718 709 Doc(Doc&&) = delete;
... ...