From b7791566f6645c621eec15f2cf1a8a8eec265f36 Mon Sep 17 00:00:00 2001 From: m-holger Date: Fri, 17 Mar 2023 10:41:12 +0000 Subject: Add new data member QPDFWriter::Members::root_og Also, uninitialize QPDFWriter::Members members. --- include/qpdf/QPDFWriter.hh | 89 +++++++++++++++++++++++----------------------- libqpdf/QPDFWriter.cc | 58 ++++-------------------------- 2 files changed, 52 insertions(+), 95 deletions(-) diff --git a/include/qpdf/QPDFWriter.hh b/include/qpdf/QPDFWriter.hh index 464e20a0..c2896209 100644 --- a/include/qpdf/QPDFWriter.hh +++ b/include/qpdf/QPDFWriter.hh @@ -709,70 +709,71 @@ class QPDFWriter Members(Members const&) = delete; QPDF& pdf; - char const* filename; - FILE* file; - bool close_file; - Pl_Buffer* buffer_pipeline; - Buffer* output_buffer; - bool normalize_content_set; - bool normalize_content; - bool compress_streams; - bool compress_streams_set; - qpdf_stream_decode_level_e stream_decode_level; - bool stream_decode_level_set; - bool recompress_flate; - bool qdf_mode; - bool preserve_unreferenced_objects; - bool newline_before_endstream; - bool static_id; - bool suppress_original_object_ids; - bool direct_stream_lengths; - bool encrypted; - bool preserve_encryption; - bool linearized; - bool pclm; - qpdf_object_stream_e object_stream_mode; + QPDFObjGen root_og{-1, 0}; + char const* filename{"unspecified"}; + FILE* file{nullptr}; + bool close_file{false}; + Pl_Buffer* buffer_pipeline{nullptr}; + Buffer* output_buffer{nullptr}; + bool normalize_content_set{false}; + bool normalize_content{false}; + bool compress_streams{true}; + bool compress_streams_set{false}; + qpdf_stream_decode_level_e stream_decode_level{qpdf_dl_none}; + bool stream_decode_level_set{false}; + bool recompress_flate{false}; + bool qdf_mode{false}; + bool preserve_unreferenced_objects{false}; + bool newline_before_endstream{false}; + bool static_id{false}; + bool suppress_original_object_ids{false}; + bool direct_stream_lengths{true}; + bool encrypted{false}; + bool preserve_encryption{true}; + bool linearized{false}; + bool pclm{false}; + qpdf_object_stream_e object_stream_mode{qpdf_o_preserve}; std::string encryption_key; - bool encrypt_metadata; - bool encrypt_use_aes; + bool encrypt_metadata{true}; + bool encrypt_use_aes{false}; std::map encryption_dictionary; - int encryption_V; - int encryption_R; + int encryption_V{0}; + int encryption_R{0}; std::string id1; // for /ID key of std::string id2; // trailer dictionary std::string final_pdf_version; - int final_extension_level; + int final_extension_level{0}; std::string min_pdf_version; - int min_extension_level; + int min_extension_level{0}; std::string forced_pdf_version; - int forced_extension_level; + int forced_extension_level{0}; std::string extra_header_text; - int encryption_dict_objid; + int encryption_dict_objid{0}; std::string cur_data_key; std::list> to_delete; - Pl_Count* pipeline; + Pl_Count* pipeline{nullptr}; std::vector object_queue; size_t object_queue_front{0}; std::map obj_renumber; std::map xref; std::map lengths; - int next_objid; - int cur_stream_length_id; - size_t cur_stream_length; - bool added_newline; - int max_ostream_index; + int next_objid{1}; + int cur_stream_length_id{0}; + size_t cur_stream_length{0}; + bool added_newline{false}; + int max_ostream_index{0}; std::set normalized_streams; std::map page_object_to_seq; std::map contents_to_page_seq; std::map object_to_object_stream; std::map> object_stream_to_objects; std::list pipeline_stack; - unsigned long long next_stack_id; - bool deterministic_id; - Pl_MD5* md5_pipeline; + unsigned long long next_stack_id{0}; + bool deterministic_id{false}; + Pl_MD5* md5_pipeline{nullptr}; std::string deterministic_id_data; - bool did_write_setup; + bool did_write_setup{false}; // For linearization only std::string lin_pass1_filename; @@ -781,9 +782,9 @@ class QPDFWriter // For progress reporting std::shared_ptr progress_reporter; - int events_expected; - int events_seen; - int next_progress_report; + int events_expected{0}; + int events_seen{0}; + int next_progress_report{0}; }; // Keep all member variables inside the Members object, which we diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 907cc105..8287412c 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -52,50 +52,9 @@ QPDFWriter::FunctionProgressReporter::reportProgress(int progress) QPDFWriter::Members::Members(QPDF& pdf) : pdf(pdf), - filename("unspecified"), - file(nullptr), - close_file(false), - buffer_pipeline(nullptr), - output_buffer(nullptr), - normalize_content_set(false), - normalize_content(false), - compress_streams(true), - compress_streams_set(false), - stream_decode_level(qpdf_dl_none), - stream_decode_level_set(false), - recompress_flate(false), - qdf_mode(false), - preserve_unreferenced_objects(false), - newline_before_endstream(false), - static_id(false), - suppress_original_object_ids(false), - direct_stream_lengths(true), - encrypted(false), - preserve_encryption(true), - linearized(false), - pclm(false), - object_stream_mode(qpdf_o_preserve), - encrypt_metadata(true), - encrypt_use_aes(false), - encryption_V(0), - encryption_R(0), - final_extension_level(0), - min_extension_level(0), - forced_extension_level(0), - encryption_dict_objid(0), - pipeline(nullptr), - next_objid(1), - cur_stream_length_id(0), - cur_stream_length(0), - added_newline(false), - max_ostream_index(0), - next_stack_id(0), - deterministic_id(false), - md5_pipeline(nullptr), - did_write_setup(false), - events_expected(0), - events_seen(0), - next_progress_report(0) + root_og( + pdf.getRoot().getObjGen().isIndirect() ? pdf.getRoot().getObjGen() + : QPDFObjGen(-1, 0)) { } @@ -1534,14 +1493,12 @@ QPDFWriter::unparseObject( // is direct through the ADBE dictionary, so we can modify in // place. - bool is_root = false; + const bool is_root = (old_og == m->root_og); bool have_extensions_other = false; bool have_extensions_adbe = false; QPDFObjectHandle extensions; - if ((old_og.getObj() != 0) && - (old_og == this->m->pdf.getRoot().getObjGen())) { - is_root = true; + if (is_root) { if (object.hasKey("/Extensions") && object.getKey("/Extensions").isDictionary()) { extensions = object.getKey("/Extensions"); @@ -2396,10 +2353,9 @@ QPDFWriter::doWriteSetup() // 8.0.0 has a bug that prevents it from being able to handle // encrypted files with compressed document catalogs, so we // disable them in that case as well. - QPDFObjGen og = this->m->pdf.getRoot().getObjGen(); - if (this->m->object_to_object_stream.count(og)) { + if (m->object_to_object_stream.count(m->root_og)) { QTC::TC("qpdf", "QPDFWriter uncompressing root"); - this->m->object_to_object_stream.erase(og); + this->m->object_to_object_stream.erase(m->root_og); } } -- cgit v1.2.3-54-g00ecf