diff options
Diffstat (limited to 'libqpdf')
-rw-r--r-- | libqpdf/JSON.cc | 11 | ||||
-rw-r--r-- | libqpdf/QPDF.cc | 9 | ||||
-rw-r--r-- | libqpdf/QPDFJob_json.cc | 24 |
3 files changed, 22 insertions, 22 deletions
diff --git a/libqpdf/JSON.cc b/libqpdf/JSON.cc index f6401642..35b8fd76 100644 --- a/libqpdf/JSON.cc +++ b/libqpdf/JSON.cc @@ -410,6 +410,17 @@ JSON::isNull() const return m->value->type_code == vt_null; } +JSON +JSON::getDictItem(std::string const& key) const +{ + if (auto v = dynamic_cast<JSON_dictionary const*>(m->value.get())) { + if (auto it = v->members.find(key); it != v->members.end()) { + return it->second; + } + } + return makeNull(); +} + bool JSON::forEachDictItem(std::function<void(std::string const& key, JSON value)> fn) const { diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 89d4a0a8..8cff3dfd 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -709,10 +709,11 @@ QPDF::read_xref(qpdf_offset_t xref_offset) // Make sure we keep only the highest generation for any object. QPDFObjGen last_og{-1, 0}; - for (auto const& og: m->xref_table) { - if (og.first.getObj() == last_og.getObj()) + for (auto const& item: m->xref_table) { + auto id = item.first.getObj(); + if (id == last_og.getObj() && id > 0) removeObject(last_og); - last_og = og.first; + last_og = item.first; } } @@ -2405,7 +2406,7 @@ QPDF::getCompressibleObjGens() while (!queue.empty()) { auto obj = queue.back(); queue.pop_back(); - if (obj.isIndirect()) { + if (obj.getObjectID() > 0) { QPDFObjGen og = obj.getObjGen(); const size_t id = toS(og.getObj() - 1); if (id >= max_obj) diff --git a/libqpdf/QPDFJob_json.cc b/libqpdf/QPDFJob_json.cc index fefe8fff..83bc856c 100644 --- a/libqpdf/QPDFJob_json.cc +++ b/libqpdf/QPDFJob_json.cc @@ -59,7 +59,7 @@ namespace void beginUnderOverlay(JSON const& j); - std::list<std::shared_ptr<JSONHandler>> json_handlers; + std::vector<std::shared_ptr<JSONHandler>> json_handlers; bool partial; JSONHandler* jh{nullptr}; // points to last of json_handlers std::shared_ptr<QPDFJob::Config> c_main; @@ -100,7 +100,7 @@ Handlers::bindJSON(void (Handlers::*f)(JSON)) void Handlers::initHandlers() { - this->json_handlers.push_back(std::make_shared<JSONHandler>()); + this->json_handlers.emplace_back(std::make_shared<JSONHandler>()); this->jh = this->json_handlers.back().get(); jh->addDictHandlers( [](std::string const&, JSON) {}, @@ -184,8 +184,8 @@ Handlers::pushKey(std::string const& key) { auto new_jh = std::make_shared<JSONHandler>(); this->jh->addDictKeyHandler(key, new_jh); - this->json_handlers.push_back(new_jh); this->jh = new_jh.get(); + this->json_handlers.emplace_back(std::move(new_jh)); } void @@ -205,8 +205,8 @@ Handlers::beginArray(json_handler_t start_fn, bare_handler_t end_fn) [end_fn](std::string const&) { end_fn(); }, item_jh); jh->addFallbackHandler(item_jh); - this->json_handlers.push_back(item_jh); this->jh = item_jh.get(); + this->json_handlers.emplace_back(std::move(item_jh)); } void @@ -232,14 +232,8 @@ void Handlers::beginUnderOverlay(JSON const& j) { // File has to be processed before items, so handle it here. - bool file_seen = false; std::string file; - j.forEachDictItem([&](std::string const& key, JSON const& value) { - if (key == "file") { - file_seen = value.getString(file); - } - }); - if (!file_seen) { + if (!j.getDictItem("file").getString(file)) { QTC::TC("qpdf", "QPDFJob json over/under no file"); usage("file is required in underlay/overlay specification"); } @@ -488,14 +482,8 @@ Handlers::endPagesArray() void Handlers::beginPages(JSON j) { - bool file_seen = false; std::string file; - j.forEachDictItem([&](std::string const& key, JSON const& value) { - if (key == "file") { - file_seen = value.getString(file); - } - }); - if (!file_seen) { + if (!j.getDictItem("file").getString(file)) { QTC::TC("qpdf", "QPDFJob json pages no file"); usage("file is required in page specification"); } |