Commit ab019a96b1fc2a189c34c7e4e627b01586ff2386

Authored by m-holger
1 parent 09c3dc5f

Move QPDFObjectHandle stream methods implementation to QPDF_Stream.cc

include/qpdf/ObjectHandle.hh
@@ -39,7 +39,7 @@ namespace qpdf @@ -39,7 +39,7 @@ namespace qpdf
39 class Dictionary; 39 class Dictionary;
40 class Stream; 40 class Stream;
41 41
42 - enum typed : std::uint8_t { strict = 0, any_flag = 1, optional = 2, any = 3, error = 4}; 42 + enum typed : std::uint8_t { strict = 0, any_flag = 1, optional = 2, any = 3, error = 4 };
43 43
44 // Basehandle is only used as a base-class for QPDFObjectHandle like classes. Currently the only 44 // Basehandle is only used as a base-class for QPDFObjectHandle like classes. Currently the only
45 // methods exposed in public API are operators to convert derived objects to QPDFObjectHandle, 45 // methods exposed in public API are operators to convert derived objects to QPDFObjectHandle,
libqpdf/QPDFObjectHandle.cc
@@ -957,180 +957,7 @@ QPDFObjectHandle::getUniqueResourceName( @@ -957,180 +957,7 @@ QPDFObjectHandle::getUniqueResourceName(
957 957
958 // Dictionary mutators are in QPDF_Dictionary.cc 958 // Dictionary mutators are in QPDF_Dictionary.cc
959 959
960 -// Stream accessors  
961 -  
962 -QPDFObjectHandle  
963 -QPDFObjectHandle::getDict() const  
964 -{  
965 - return as_stream(error).getDict();  
966 -}  
967 -  
968 -void  
969 -QPDFObjectHandle::setFilterOnWrite(bool val)  
970 -{  
971 - as_stream(error).setFilterOnWrite(val);  
972 -}  
973 -  
974 -bool  
975 -QPDFObjectHandle::getFilterOnWrite()  
976 -{  
977 - return as_stream(error).getFilterOnWrite();  
978 -}  
979 -  
980 -bool  
981 -QPDFObjectHandle::isDataModified()  
982 -{  
983 - return as_stream(error).isDataModified();  
984 -}  
985 -  
986 -void  
987 -QPDFObjectHandle::replaceDict(QPDFObjectHandle const& new_dict)  
988 -{  
989 - as_stream(error).replaceDict(new_dict);  
990 -}  
991 -  
992 -std::shared_ptr<Buffer>  
993 -QPDFObjectHandle::getStreamData(qpdf_stream_decode_level_e level)  
994 -{  
995 - return as_stream(error).getStreamData(level);  
996 -}  
997 -  
998 -std::shared_ptr<Buffer>  
999 -QPDFObjectHandle::getRawStreamData()  
1000 -{  
1001 - return as_stream(error).getRawStreamData();  
1002 -}  
1003 -  
1004 -bool  
1005 -QPDFObjectHandle::pipeStreamData(  
1006 - Pipeline* p,  
1007 - bool* filtering_attempted,  
1008 - int encode_flags,  
1009 - qpdf_stream_decode_level_e decode_level,  
1010 - bool suppress_warnings,  
1011 - bool will_retry)  
1012 -{  
1013 - return as_stream(error).pipeStreamData(  
1014 - p, filtering_attempted, encode_flags, decode_level, suppress_warnings, will_retry);  
1015 -}  
1016 -  
1017 -bool  
1018 -QPDFObjectHandle::pipeStreamData(  
1019 - Pipeline* p,  
1020 - int encode_flags,  
1021 - qpdf_stream_decode_level_e decode_level,  
1022 - bool suppress_warnings,  
1023 - bool will_retry)  
1024 -{  
1025 - bool filtering_attempted;  
1026 - as_stream(error).pipeStreamData(  
1027 - p, &filtering_attempted, encode_flags, decode_level, suppress_warnings, will_retry);  
1028 - return filtering_attempted;  
1029 -}  
1030 -  
1031 -bool  
1032 -QPDFObjectHandle::pipeStreamData(Pipeline* p, bool filter, bool normalize, bool compress)  
1033 -{  
1034 - int encode_flags = 0;  
1035 - qpdf_stream_decode_level_e decode_level = qpdf_dl_none;  
1036 - if (filter) {  
1037 - decode_level = qpdf_dl_generalized;  
1038 - if (normalize) {  
1039 - encode_flags |= qpdf_ef_normalize;  
1040 - }  
1041 - if (compress) {  
1042 - encode_flags |= qpdf_ef_compress;  
1043 - }  
1044 - }  
1045 - return pipeStreamData(p, encode_flags, decode_level, false);  
1046 -}  
1047 -  
1048 -void  
1049 -QPDFObjectHandle::replaceStreamData(  
1050 - std::shared_ptr<Buffer> data,  
1051 - QPDFObjectHandle const& filter,  
1052 - QPDFObjectHandle const& decode_parms)  
1053 -{  
1054 - as_stream(error).replaceStreamData(data, filter, decode_parms);  
1055 -}  
1056 -  
1057 -void  
1058 -QPDFObjectHandle::replaceStreamData(  
1059 - std::string const& data, QPDFObjectHandle const& filter, QPDFObjectHandle const& decode_parms)  
1060 -{  
1061 - auto b = std::make_shared<Buffer>(data.length());  
1062 - unsigned char* bp = b->getBuffer();  
1063 - if (bp) {  
1064 - memcpy(bp, data.c_str(), data.length());  
1065 - }  
1066 - as_stream(error).replaceStreamData(b, filter, decode_parms);  
1067 -}  
1068 -  
1069 -void  
1070 -QPDFObjectHandle::replaceStreamData(  
1071 - std::shared_ptr<StreamDataProvider> provider,  
1072 - QPDFObjectHandle const& filter,  
1073 - QPDFObjectHandle const& decode_parms)  
1074 -{  
1075 - as_stream(error).replaceStreamData(provider, filter, decode_parms);  
1076 -}  
1077 -  
1078 -namespace  
1079 -{  
1080 - class FunctionProvider: public QPDFObjectHandle::StreamDataProvider  
1081 - {  
1082 - public:  
1083 - FunctionProvider(std::function<void(Pipeline*)> provider) :  
1084 - StreamDataProvider(false),  
1085 - p1(provider),  
1086 - p2(nullptr)  
1087 - {  
1088 - }  
1089 - FunctionProvider(std::function<bool(Pipeline*, bool, bool)> provider) :  
1090 - StreamDataProvider(true),  
1091 - p1(nullptr),  
1092 - p2(provider)  
1093 - {  
1094 - }  
1095 -  
1096 - void  
1097 - provideStreamData(QPDFObjGen const&, Pipeline* pipeline) override  
1098 - {  
1099 - p1(pipeline);  
1100 - }  
1101 -  
1102 - bool  
1103 - provideStreamData(  
1104 - QPDFObjGen const&, Pipeline* pipeline, bool suppress_warnings, bool will_retry) override  
1105 - {  
1106 - return p2(pipeline, suppress_warnings, will_retry);  
1107 - }  
1108 -  
1109 - private:  
1110 - std::function<void(Pipeline*)> p1;  
1111 - std::function<bool(Pipeline*, bool, bool)> p2;  
1112 - };  
1113 -} // namespace  
1114 -  
1115 -void  
1116 -QPDFObjectHandle::replaceStreamData(  
1117 - std::function<void(Pipeline*)> provider,  
1118 - QPDFObjectHandle const& filter,  
1119 - QPDFObjectHandle const& decode_parms)  
1120 -{  
1121 - auto sdp = std::shared_ptr<StreamDataProvider>(new FunctionProvider(provider));  
1122 - as_stream(error).replaceStreamData(sdp, filter, decode_parms);  
1123 -}  
1124 -  
1125 -void  
1126 -QPDFObjectHandle::replaceStreamData(  
1127 - std::function<bool(Pipeline*, bool, bool)> provider,  
1128 - QPDFObjectHandle const& filter,  
1129 - QPDFObjectHandle const& decode_parms)  
1130 -{  
1131 - auto sdp = std::shared_ptr<StreamDataProvider>(new FunctionProvider(provider));  
1132 - as_stream(error).replaceStreamData(sdp, filter, decode_parms);  
1133 -} 960 +// Stream accessors are in QPDF_Stream.cc
1134 961
1135 std::map<std::string, QPDFObjectHandle> 962 std::map<std::string, QPDFObjectHandle>
1136 QPDFObjectHandle::getPageImages() 963 QPDFObjectHandle::getPageImages()
@@ -1340,17 +1167,6 @@ QPDFObjectHandle::writeJSON( @@ -1340,17 +1167,6 @@ QPDFObjectHandle::writeJSON(
1340 writeJSON(json_version, jw, dereference_indirect); 1167 writeJSON(json_version, jw, dereference_indirect);
1341 } 1168 }
1342 1169
1343 -JSON  
1344 -QPDFObjectHandle::getStreamJSON(  
1345 - int json_version,  
1346 - qpdf_json_stream_data_e json_data,  
1347 - qpdf_stream_decode_level_e decode_level,  
1348 - Pipeline* p,  
1349 - std::string const& data_filename)  
1350 -{  
1351 - return as_stream(error).getStreamJSON(json_version, json_data, decode_level, p, data_filename);  
1352 -}  
1353 -  
1354 QPDFObjectHandle 1170 QPDFObjectHandle
1355 QPDFObjectHandle::wrapInArray() 1171 QPDFObjectHandle::wrapInArray()
1356 { 1172 {
libqpdf/QPDF_Stream.cc
@@ -162,18 +162,6 @@ QPDF_Stream::writeJSON(int json_version, JSON::Writer&amp; jw) @@ -162,18 +162,6 @@ QPDF_Stream::writeJSON(int json_version, JSON::Writer&amp; jw)
162 stream_dict.writeJSON(json_version, jw); 162 stream_dict.writeJSON(json_version, jw);
163 } 163 }
164 164
165 -QPDF_Stream*  
166 -Stream::stream() const  
167 -{  
168 - if (obj) {  
169 - if (auto s = obj->as<QPDF_Stream>()) {  
170 - return s;  
171 - }  
172 - }  
173 - throw std::runtime_error("operation for stream attempted on object of type dictionary");  
174 - return nullptr; // unreachable  
175 -}  
176 -  
177 JSON 165 JSON
178 Stream::getStreamJSON( 166 Stream::getStreamJSON(
179 int json_version, 167 int json_version,
@@ -657,3 +645,187 @@ Stream::warn(std::string const&amp; message) @@ -657,3 +645,187 @@ Stream::warn(std::string const&amp; message)
657 auto s = stream(); 645 auto s = stream();
658 s->qpdf->warn(qpdf_e_damaged_pdf, "", s->parsed_offset, message); 646 s->qpdf->warn(qpdf_e_damaged_pdf, "", s->parsed_offset, message);
659 } 647 }
  648 +
  649 +QPDFObjectHandle
  650 +QPDFObjectHandle::getDict() const
  651 +{
  652 + return as_stream(error).getDict();
  653 +}
  654 +
  655 +void
  656 +QPDFObjectHandle::setFilterOnWrite(bool val)
  657 +{
  658 + as_stream(error).setFilterOnWrite(val);
  659 +}
  660 +
  661 +bool
  662 +QPDFObjectHandle::getFilterOnWrite()
  663 +{
  664 + return as_stream(error).getFilterOnWrite();
  665 +}
  666 +
  667 +bool
  668 +QPDFObjectHandle::isDataModified()
  669 +{
  670 + return as_stream(error).isDataModified();
  671 +}
  672 +
  673 +void
  674 +QPDFObjectHandle::replaceDict(QPDFObjectHandle const& new_dict)
  675 +{
  676 + as_stream(error).replaceDict(new_dict);
  677 +}
  678 +
  679 +std::shared_ptr<Buffer>
  680 +QPDFObjectHandle::getStreamData(qpdf_stream_decode_level_e level)
  681 +{
  682 + return as_stream(error).getStreamData(level);
  683 +}
  684 +
  685 +std::shared_ptr<Buffer>
  686 +QPDFObjectHandle::getRawStreamData()
  687 +{
  688 + return as_stream(error).getRawStreamData();
  689 +}
  690 +
  691 +bool
  692 +QPDFObjectHandle::pipeStreamData(
  693 + Pipeline* p,
  694 + bool* filtering_attempted,
  695 + int encode_flags,
  696 + qpdf_stream_decode_level_e decode_level,
  697 + bool suppress_warnings,
  698 + bool will_retry)
  699 +{
  700 + return as_stream(error).pipeStreamData(
  701 + p, filtering_attempted, encode_flags, decode_level, suppress_warnings, will_retry);
  702 +}
  703 +
  704 +bool
  705 +QPDFObjectHandle::pipeStreamData(
  706 + Pipeline* p,
  707 + int encode_flags,
  708 + qpdf_stream_decode_level_e decode_level,
  709 + bool suppress_warnings,
  710 + bool will_retry)
  711 +{
  712 + bool filtering_attempted;
  713 + as_stream(error).pipeStreamData(
  714 + p, &filtering_attempted, encode_flags, decode_level, suppress_warnings, will_retry);
  715 + return filtering_attempted;
  716 +}
  717 +
  718 +bool
  719 +QPDFObjectHandle::pipeStreamData(Pipeline* p, bool filter, bool normalize, bool compress)
  720 +{
  721 + int encode_flags = 0;
  722 + qpdf_stream_decode_level_e decode_level = qpdf_dl_none;
  723 + if (filter) {
  724 + decode_level = qpdf_dl_generalized;
  725 + if (normalize) {
  726 + encode_flags |= qpdf_ef_normalize;
  727 + }
  728 + if (compress) {
  729 + encode_flags |= qpdf_ef_compress;
  730 + }
  731 + }
  732 + return pipeStreamData(p, encode_flags, decode_level, false);
  733 +}
  734 +
  735 +void
  736 +QPDFObjectHandle::replaceStreamData(
  737 + std::shared_ptr<Buffer> data,
  738 + QPDFObjectHandle const& filter,
  739 + QPDFObjectHandle const& decode_parms)
  740 +{
  741 + as_stream(error).replaceStreamData(data, filter, decode_parms);
  742 +}
  743 +
  744 +void
  745 +QPDFObjectHandle::replaceStreamData(
  746 + std::string const& data, QPDFObjectHandle const& filter, QPDFObjectHandle const& decode_parms)
  747 +{
  748 + auto b = std::make_shared<Buffer>(data.length());
  749 + unsigned char* bp = b->getBuffer();
  750 + if (bp) {
  751 + memcpy(bp, data.c_str(), data.length());
  752 + }
  753 + as_stream(error).replaceStreamData(b, filter, decode_parms);
  754 +}
  755 +
  756 +void
  757 +QPDFObjectHandle::replaceStreamData(
  758 + std::shared_ptr<StreamDataProvider> provider,
  759 + QPDFObjectHandle const& filter,
  760 + QPDFObjectHandle const& decode_parms)
  761 +{
  762 + as_stream(error).replaceStreamData(provider, filter, decode_parms);
  763 +}
  764 +
  765 +namespace
  766 +{
  767 + class FunctionProvider: public QPDFObjectHandle::StreamDataProvider
  768 + {
  769 + public:
  770 + FunctionProvider(std::function<void(Pipeline*)> provider) :
  771 + StreamDataProvider(false),
  772 + p1(provider),
  773 + p2(nullptr)
  774 + {
  775 + }
  776 + FunctionProvider(std::function<bool(Pipeline*, bool, bool)> provider) :
  777 + StreamDataProvider(true),
  778 + p1(nullptr),
  779 + p2(provider)
  780 + {
  781 + }
  782 +
  783 + void
  784 + provideStreamData(QPDFObjGen const&, Pipeline* pipeline) override
  785 + {
  786 + p1(pipeline);
  787 + }
  788 +
  789 + bool
  790 + provideStreamData(
  791 + QPDFObjGen const&, Pipeline* pipeline, bool suppress_warnings, bool will_retry) override
  792 + {
  793 + return p2(pipeline, suppress_warnings, will_retry);
  794 + }
  795 +
  796 + private:
  797 + std::function<void(Pipeline*)> p1;
  798 + std::function<bool(Pipeline*, bool, bool)> p2;
  799 + };
  800 +} // namespace
  801 +
  802 +void
  803 +QPDFObjectHandle::replaceStreamData(
  804 + std::function<void(Pipeline*)> provider,
  805 + QPDFObjectHandle const& filter,
  806 + QPDFObjectHandle const& decode_parms)
  807 +{
  808 + auto sdp = std::shared_ptr<StreamDataProvider>(new FunctionProvider(provider));
  809 + as_stream(error).replaceStreamData(sdp, filter, decode_parms);
  810 +}
  811 +
  812 +void
  813 +QPDFObjectHandle::replaceStreamData(
  814 + std::function<bool(Pipeline*, bool, bool)> provider,
  815 + QPDFObjectHandle const& filter,
  816 + QPDFObjectHandle const& decode_parms)
  817 +{
  818 + auto sdp = std::shared_ptr<StreamDataProvider>(new FunctionProvider(provider));
  819 + as_stream(error).replaceStreamData(sdp, filter, decode_parms);
  820 +}
  821 +
  822 +JSON
  823 +QPDFObjectHandle::getStreamJSON(
  824 + int json_version,
  825 + qpdf_json_stream_data_e json_data,
  826 + qpdf_stream_decode_level_e decode_level,
  827 + Pipeline* p,
  828 + std::string const& data_filename)
  829 +{
  830 + return as_stream(error).getStreamJSON(json_version, json_data, decode_level, p, data_filename);
  831 +}
libqpdf/qpdf/QPDFObjectHandle_private.hh
@@ -182,8 +182,17 @@ namespace qpdf @@ -182,8 +182,17 @@ namespace qpdf
182 std::function<std::shared_ptr<QPDFStreamFilter>()> factory); 182 std::function<std::shared_ptr<QPDFStreamFilter>()> factory);
183 183
184 private: 184 private:
185 - QPDF_Stream* stream() const;  
186 - 185 + QPDF_Stream*
  186 + stream() const
  187 + {
  188 + if (obj) {
  189 + if (auto s = obj->as<QPDF_Stream>()) {
  190 + return s;
  191 + }
  192 + }
  193 + throw std::runtime_error("operation for stream attempted on object of type dictionary");
  194 + return nullptr; // unreachable
  195 + }
187 bool filterable( 196 bool filterable(
188 std::vector<std::shared_ptr<QPDFStreamFilter>>& filters, 197 std::vector<std::shared_ptr<QPDFStreamFilter>>& filters,
189 bool& specialized_compression, 198 bool& specialized_compression,