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,24 +1935,6 @@ QPDFObjectHandle::makeDirect(QPDFObjGen::set& visited, bool stop_at_streams)
1935 visited.erase(cur_og); 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 void 1938 void
1957 QPDFObjectHandle::makeDirect(bool allow_streams) 1939 QPDFObjectHandle::makeDirect(bool allow_streams)
1958 { 1940 {
libqpdf/QPDF_Stream.cc
@@ -44,6 +44,12 @@ class QPDF::Doc::Streams @@ -44,6 +44,12 @@ class QPDF::Doc::Streams
44 return qpdf->pipeStreamData( 44 return qpdf->pipeStreamData(
45 og, offset, length, dict, is_root_metadata, pipeline, suppress_warnings, will_retry); 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 namespace 55 namespace
@@ -206,6 +212,15 @@ Stream::Stream( @@ -206,6 +212,15 @@ Stream::Stream(
206 setDictDescription(); 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 void 224 void
210 Stream::registerStreamFilter( 225 Stream::registerStreamFilter(
211 std::string const& filter_name, std::function<std::shared_ptr<QPDFStreamFilter>()> factory) 226 std::string const& filter_name, std::function<std::shared_ptr<QPDFStreamFilter>()> factory)
@@ -850,3 +865,9 @@ QPDFObjectHandle::getStreamJSON( @@ -850,3 +865,9 @@ QPDFObjectHandle::getStreamJSON(
850 { 865 {
851 return as_stream(error).getStreamJSON(json_version, json_data, decode_level, p, data_filename); 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,6 +469,8 @@ namespace qpdf
469 qpdf_offset_t offset, 469 qpdf_offset_t offset,
470 size_t length); 470 size_t length);
471 471
  472 + Stream copy() const;
  473 +
472 Dictionary 474 Dictionary
473 getDict() const 475 getDict() const
474 { 476 {
libqpdf/qpdf/QPDF_private.hh
@@ -13,10 +13,14 @@ @@ -13,10 +13,14 @@
13 13
14 using namespace qpdf; 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 class BitStream; 25 class BitStream;
22 class BitWriter; 26 class BitWriter;
@@ -700,19 +704,6 @@ class QPDF::Doc @@ -700,19 +704,6 @@ class QPDF::Doc
700 QPDF::Members* m; 704 QPDF::Members* m;
701 }; // class QPDF::Doc::Pages 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 Doc() = delete; 707 Doc() = delete;
717 Doc(Doc const&) = delete; 708 Doc(Doc const&) = delete;
718 Doc(Doc&&) = delete; 709 Doc(Doc&&) = delete;