Commit b9bc05356ac6823e3e105ea25908e826d7b731fd

Authored by m-holger
1 parent b15d0bf6

Refactor QPDF::writeJSONStream

Use QPDF_Stream::writeStreamJSON.
Factor out the json_stream_data == qpdf_sj_file case.
include/qpdf/QPDF.hh
@@ -1411,19 +1411,6 @@ class QPDF @@ -1411,19 +1411,6 @@ class QPDF
1411 // JSON import 1411 // JSON import
1412 void importJSON(std::shared_ptr<InputSource>, bool must_be_complete); 1412 void importJSON(std::shared_ptr<InputSource>, bool must_be_complete);
1413 1413
1414 - // JSON write  
1415 - void writeJSONStream(  
1416 - int version,  
1417 - Pipeline* p,  
1418 - bool& first,  
1419 - std::string const& key,  
1420 - QPDFObjectHandle&,  
1421 - qpdf_stream_decode_level_e,  
1422 - qpdf_json_stream_data_e,  
1423 - std::string const& file_prefix);  
1424 - void writeJSONObject(  
1425 - int version, Pipeline* p, bool& first, std::string const& key, QPDFObjectHandle&);  
1426 -  
1427 // Type conversion helper methods 1414 // Type conversion helper methods
1428 template <typename T> 1415 template <typename T>
1429 static qpdf_offset_t 1416 static qpdf_offset_t
libqpdf/QPDF_json.cc
@@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
8 #include <qpdf/QPDFObject_private.hh> 8 #include <qpdf/QPDFObject_private.hh>
9 #include <qpdf/QPDFValue.hh> 9 #include <qpdf/QPDFValue.hh>
10 #include <qpdf/QPDF_Null.hh> 10 #include <qpdf/QPDF_Null.hh>
  11 +#include <qpdf/QPDF_Stream.hh>
11 #include <qpdf/QTC.hh> 12 #include <qpdf/QTC.hh>
12 #include <qpdf/QUtil.hh> 13 #include <qpdf/QUtil.hh>
13 #include <algorithm> 14 #include <algorithm>
@@ -443,7 +444,9 @@ void @@ -443,7 +444,9 @@ void
443 QPDF::JSONReactor::replaceObject(QPDFObjectHandle&& replacement, JSON const& value) 444 QPDF::JSONReactor::replaceObject(QPDFObjectHandle&& replacement, JSON const& value)
444 { 445 {
445 if (replacement.isIndirect()) { 446 if (replacement.isIndirect()) {
446 - error(replacement.getParsedOffset(), "the value of an object may not be an indirect object reference"); 447 + error(
  448 + replacement.getParsedOffset(),
  449 + "the value of an object may not be an indirect object reference");
447 return; 450 return;
448 } 451 }
449 auto& tos = stack.back(); 452 auto& tos = stack.back();
@@ -829,40 +832,51 @@ QPDF::importJSON(std::shared_ptr&lt;InputSource&gt; is, bool must_be_complete) @@ -829,40 +832,51 @@ QPDF::importJSON(std::shared_ptr&lt;InputSource&gt; is, bool must_be_complete)
829 } 832 }
830 833
831 void 834 void
832 -QPDF::writeJSONStream( 835 +writeJSONStreamFile(
  836 + int version,
  837 + JSON::Writer& jw,
  838 + QPDF_Stream& stream,
  839 + int id,
  840 + qpdf_stream_decode_level_e decode_level,
  841 + std::string const& file_prefix)
  842 +{
  843 + auto filename = file_prefix + "-" + std::to_string(id);
  844 + auto* f = QUtil::safe_fopen(filename.c_str(), "wb");
  845 + Pl_StdioFile f_pl{"stream data", f};
  846 + stream.writeStreamJSON(version, jw, qpdf_sj_file, decode_level, &f_pl, filename);
  847 + f_pl.finish();
  848 + fclose(f);
  849 +}
  850 +
  851 +void
  852 +writeJSONStream(
833 int version, 853 int version,
834 Pipeline* p, 854 Pipeline* p,
835 bool& first, 855 bool& first,
836 std::string const& key, 856 std::string const& key,
837 - QPDFObjectHandle& obj, 857 + QPDF_Stream& stream,
  858 + int id,
838 qpdf_stream_decode_level_e decode_level, 859 qpdf_stream_decode_level_e decode_level,
839 qpdf_json_stream_data_e json_stream_data, 860 qpdf_json_stream_data_e json_stream_data,
840 std::string const& file_prefix) 861 std::string const& file_prefix)
841 { 862 {
842 - Pipeline* stream_p = nullptr;  
843 - FILE* f = nullptr;  
844 - std::shared_ptr<Pl_StdioFile> f_pl;  
845 - std::string filename;  
846 - if (json_stream_data == qpdf_sj_file) {  
847 - filename = file_prefix + "-" + std::to_string(obj.getObjectID());  
848 - f = QUtil::safe_fopen(filename.c_str(), "wb");  
849 - f_pl = std::make_shared<Pl_StdioFile>("stream data", f);  
850 - stream_p = f_pl.get(); 863 + if (first) {
  864 + *p << "\n \"" << key << "\": {\n \"stream\": ";
  865 + first = false;
  866 + } else {
  867 + *p << ",\n \"" << key << "\": {\n \"stream\": ";
851 } 868 }
852 - auto j = JSON::makeDictionary();  
853 - j.addDictionaryMember(  
854 - "stream", obj.getStreamJSON(version, json_stream_data, decode_level, stream_p, filename));  
855 -  
856 - JSON::writeDictionaryItem(p, first, key, j, 3);  
857 - if (f) {  
858 - f_pl->finish();  
859 - f_pl = nullptr;  
860 - fclose(f); 869 + JSON::Writer jw{p, 4};
  870 + if (json_stream_data == qpdf_sj_file) {
  871 + writeJSONStreamFile(version, jw, stream, id, decode_level, file_prefix);
  872 + } else {
  873 + stream.writeStreamJSON(version, jw, json_stream_data, decode_level, nullptr, "");
861 } 874 }
  875 + *p << "\n }";
862 } 876 }
863 877
864 void 878 void
865 -QPDF::writeJSONObject( 879 +writeJSONObject(
866 int version, Pipeline* p, bool& first, std::string const& key, QPDFObjectHandle& obj) 880 int version, Pipeline* p, bool& first, std::string const& key, QPDFObjectHandle& obj)
867 { 881 {
868 if (first) { 882 if (first) {
@@ -947,15 +961,17 @@ QPDF::writeJSON( @@ -947,15 +961,17 @@ QPDF::writeJSON(
947 JSON::writeDictionaryOpen(p, first_qpdf_inner, depth_qpdf); 961 JSON::writeDictionaryOpen(p, first_qpdf_inner, depth_qpdf);
948 bool all_objects = wanted_objects.empty(); 962 bool all_objects = wanted_objects.empty();
949 for (auto& obj: getAllObjects()) { 963 for (auto& obj: getAllObjects()) {
950 - std::string key = "obj:" + obj.unparse(); 964 + auto const og = obj.getObjGen();
  965 + std::string key = "obj:" + og.unparse(' ') + " R";
951 if (all_objects || wanted_objects.count(key)) { 966 if (all_objects || wanted_objects.count(key)) {
952 - if (obj.isStream()) { 967 + if (auto* stream = obj.getObjectPtr()->as<QPDF_Stream>()) {
953 writeJSONStream( 968 writeJSONStream(
954 version, 969 version,
955 p, 970 p,
956 first_qpdf_inner, 971 first_qpdf_inner,
957 key, 972 key,
958 - obj, 973 + *stream,
  974 + og.getObj(),
959 decode_level, 975 decode_level,
960 json_stream_data, 976 json_stream_data,
961 file_prefix); 977 file_prefix);