Commit c06653c3ab1ec3241b66e708750813a380378fad

Authored by m-holger
1 parent b9bc0535

Refactor QPDF::writeJSON

Showing 1 changed file with 52 additions and 101 deletions
libqpdf/QPDF_json.cc
@@ -849,48 +849,6 @@ writeJSONStreamFile( @@ -849,48 +849,6 @@ writeJSONStreamFile(
849 } 849 }
850 850
851 void 851 void
852 -writeJSONStream(  
853 - int version,  
854 - Pipeline* p,  
855 - bool& first,  
856 - std::string const& key,  
857 - QPDF_Stream& stream,  
858 - int id,  
859 - qpdf_stream_decode_level_e decode_level,  
860 - qpdf_json_stream_data_e json_stream_data,  
861 - std::string const& file_prefix)  
862 -{  
863 - if (first) {  
864 - *p << "\n \"" << key << "\": {\n \"stream\": ";  
865 - first = false;  
866 - } else {  
867 - *p << ",\n \"" << key << "\": {\n \"stream\": ";  
868 - }  
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, "");  
874 - }  
875 - *p << "\n }";  
876 -}  
877 -  
878 -void  
879 -writeJSONObject(  
880 - int version, Pipeline* p, bool& first, std::string const& key, QPDFObjectHandle& obj)  
881 -{  
882 - if (first) {  
883 - *p << "\n \"" << key << "\": {\n \"value\": ";  
884 - first = false;  
885 - } else {  
886 - *p << ",\n \"" << key << "\": {\n \"value\": ";  
887 - }  
888 - auto w = JSON::Writer(p, 4);  
889 - obj.writeJSON(version, w, true);  
890 - *p << "\n }";  
891 -}  
892 -  
893 -void  
894 QPDF::writeJSON( 852 QPDF::writeJSON(
895 int version, 853 int version,
896 Pipeline* p, 854 Pipeline* p,
@@ -914,82 +872,75 @@ QPDF::writeJSON( @@ -914,82 +872,75 @@ QPDF::writeJSON(
914 std::string const& file_prefix, 872 std::string const& file_prefix,
915 std::set<std::string> wanted_objects) 873 std::set<std::string> wanted_objects)
916 { 874 {
917 - int const depth_outer = 1;  
918 - int const depth_top = 1;  
919 - int const depth_qpdf = 2;  
920 - int const depth_qpdf_inner = 3;  
921 -  
922 if (version != 2) { 875 if (version != 2) {
923 throw std::runtime_error("QPDF::writeJSON: only version 2 is supported"); 876 throw std::runtime_error("QPDF::writeJSON: only version 2 is supported");
924 } 877 }
925 - bool first = true; 878 + JSON::Writer jw{p, 4};
926 if (complete) { 879 if (complete) {
927 - JSON::writeDictionaryOpen(p, first, depth_outer);  
928 - } else {  
929 - first = first_key;  
930 - }  
931 - JSON::writeDictionaryKey(p, first, "qpdf", depth_top);  
932 - bool first_qpdf = true;  
933 - JSON::writeArrayOpen(p, first_qpdf, depth_top);  
934 - JSON::writeNext(p, first_qpdf, depth_qpdf);  
935 - bool first_qpdf_inner = true;  
936 - JSON::writeDictionaryOpen(p, first_qpdf_inner, depth_qpdf);  
937 - JSON::writeDictionaryItem(  
938 - p, first_qpdf_inner, "jsonversion", JSON::makeInt(version), depth_qpdf_inner);  
939 - JSON::writeDictionaryItem(  
940 - p, first_qpdf_inner, "pdfversion", JSON::makeString(getPDFVersion()), depth_qpdf_inner);  
941 - JSON::writeDictionaryItem(  
942 - p,  
943 - first_qpdf_inner,  
944 - "pushedinheritedpageresources",  
945 - JSON::makeBool(everPushedInheritedAttributesToPages()),  
946 - depth_qpdf_inner);  
947 - JSON::writeDictionaryItem(  
948 - p,  
949 - first_qpdf_inner,  
950 - "calledgetallpages",  
951 - JSON::makeBool(everCalledGetAllPages()),  
952 - depth_qpdf_inner);  
953 - JSON::writeDictionaryItem(  
954 - p,  
955 - first_qpdf_inner,  
956 - "maxobjectid",  
957 - JSON::makeInt(QIntC::to_longlong(getObjectCount())),  
958 - depth_qpdf_inner);  
959 - JSON::writeDictionaryClose(p, first_qpdf_inner, depth_qpdf);  
960 - JSON::writeNext(p, first_qpdf, depth_qpdf);  
961 - JSON::writeDictionaryOpen(p, first_qpdf_inner, depth_qpdf); 880 + jw << "{";
  881 + } else if (!first_key) {
  882 + jw << ",";
  883 + }
  884 + first_key = false;
  885 +
  886 + /* clang-format off */
  887 + jw << "\n"
  888 + " \"qpdf\": [\n"
  889 + " {\n"
  890 + " \"jsonversion\": " << std::to_string(version) << ",\n"
  891 + " \"pdfversion\": \"" << getPDFVersion() << "\",\n"
  892 + " \"pushedinheritedpageresources\": " << (everPushedInheritedAttributesToPages() ? "true" : "false") << ",\n"
  893 + " \"calledgetallpages\": " << (everCalledGetAllPages() ? "true" : "false") << ",\n"
  894 + " \"maxobjectid\": " << std::to_string(getObjectCount()) << "\n"
  895 + " },\n"
  896 + " {";
  897 + /* clang-format on */
  898 +
962 bool all_objects = wanted_objects.empty(); 899 bool all_objects = wanted_objects.empty();
  900 + bool first = true;
963 for (auto& obj: getAllObjects()) { 901 for (auto& obj: getAllObjects()) {
964 auto const og = obj.getObjGen(); 902 auto const og = obj.getObjGen();
965 std::string key = "obj:" + og.unparse(' ') + " R"; 903 std::string key = "obj:" + og.unparse(' ') + " R";
966 if (all_objects || wanted_objects.count(key)) { 904 if (all_objects || wanted_objects.count(key)) {
  905 + if (first) {
  906 + jw << "\n \"" << key;
  907 + first = false;
  908 + } else {
  909 + jw << "\n },\n \"" << key;
  910 + }
967 if (auto* stream = obj.getObjectPtr()->as<QPDF_Stream>()) { 911 if (auto* stream = obj.getObjectPtr()->as<QPDF_Stream>()) {
968 - writeJSONStream(  
969 - version,  
970 - p,  
971 - first_qpdf_inner,  
972 - key,  
973 - *stream,  
974 - og.getObj(),  
975 - decode_level,  
976 - json_stream_data,  
977 - file_prefix); 912 + jw << "\": {\n \"stream\": ";
  913 + if (json_stream_data == qpdf_sj_file) {
  914 + writeJSONStreamFile(
  915 + version, jw, *stream, og.getObj(), decode_level, file_prefix);
  916 + } else {
  917 + stream->writeStreamJSON(
  918 + version, jw, json_stream_data, decode_level, nullptr, "");
  919 + }
978 } else { 920 } else {
979 - writeJSONObject(version, p, first_qpdf_inner, key, obj); 921 + jw << "\": {\n \"value\": ";
  922 + obj.writeJSON(version, jw, true);
980 } 923 }
981 } 924 }
982 } 925 }
983 if (all_objects || wanted_objects.count("trailer")) { 926 if (all_objects || wanted_objects.count("trailer")) {
984 - auto trailer = getTrailer();  
985 - writeJSONObject(version, p, first_qpdf_inner, "trailer", trailer); 927 + if (!first) {
  928 + jw << "\n },";
  929 + }
  930 + jw << "\n \"trailer\": {\n \"value\": ";
  931 + getTrailer().writeJSON(version, jw, true);
  932 + first = false;
986 } 933 }
987 - JSON::writeDictionaryClose(p, first_qpdf_inner, depth_qpdf);  
988 - JSON::writeArrayClose(p, first_qpdf, depth_top); 934 + if (!first) {
  935 + jw << "\n }";
  936 + }
  937 + /* clang-format off */
  938 + jw << "\n"
  939 + " }\n"
  940 + " ]";
  941 + /* clang-format on */
989 if (complete) { 942 if (complete) {
990 - JSON::writeDictionaryClose(p, first, 0);  
991 - *p << "\n"; 943 + jw << "\n}\n";
992 p->finish(); 944 p->finish();
993 } 945 }
994 - first_key = false;  
995 } 946 }