Commit 0fae76cfd7f7c2bf390bc7effb8119075b8fdaff
1 parent
0f67d851
Refactor `QPDFJob`: move `selections` to `Inputs`, update related logic in `hand…
…lePageSpecs` and `new_selection`, and simplify page specification handling.
Showing
3 changed files
with
23 additions
and
19 deletions
libqpdf/QPDFJob.cc
| ... | ... | @@ -425,9 +425,7 @@ QPDFJob::createQPDF() |
| 425 | 425 | pdf.updateFromJSON(m->update_from_json); |
| 426 | 426 | } |
| 427 | 427 | |
| 428 | - if (!m->selections.empty()) { | |
| 429 | - handlePageSpecs(pdf); | |
| 430 | - } | |
| 428 | + handlePageSpecs(pdf); | |
| 431 | 429 | if (!m->rotations.empty()) { |
| 432 | 430 | handleRotations(pdf); |
| 433 | 431 | } |
| ... | ... | @@ -2351,10 +2349,10 @@ QPDFJob::Input::initialize(Inputs& in, QPDF* a_qpdf) |
| 2351 | 2349 | } |
| 2352 | 2350 | |
| 2353 | 2351 | void |
| 2354 | -QPDFJob::new_selection( | |
| 2352 | +QPDFJob::Inputs::new_selection( | |
| 2355 | 2353 | std::string const& filename, std::string const& password, std::string const& range) |
| 2356 | 2354 | { |
| 2357 | - m->selections.emplace_back(filename, password, range); | |
| 2355 | + selections.emplace_back(filename, password, range); | |
| 2358 | 2356 | } |
| 2359 | 2357 | |
| 2360 | 2358 | void |
| ... | ... | @@ -2430,11 +2428,14 @@ QPDFJob::Inputs::clear() |
| 2430 | 2428 | void |
| 2431 | 2429 | QPDFJob::handlePageSpecs(QPDF& pdf) |
| 2432 | 2430 | { |
| 2431 | + if (m->inputs.selections.empty()) { | |
| 2432 | + return; | |
| 2433 | + } | |
| 2433 | 2434 | auto& main_input = m->inputs.files[m->infilename]; |
| 2434 | 2435 | main_input.initialize(m->inputs, &pdf); |
| 2435 | 2436 | |
| 2436 | 2437 | // Handle "." as a shortcut for the input file. |
| 2437 | - for (auto& selection: m->selections) { | |
| 2438 | + for (auto& selection: m->inputs.selections) { | |
| 2438 | 2439 | if (selection.filename == ".") { |
| 2439 | 2440 | selection.filename = m->infilename; |
| 2440 | 2441 | } else { |
| ... | ... | @@ -2452,7 +2453,7 @@ QPDFJob::handlePageSpecs(QPDF& pdf) |
| 2452 | 2453 | m->inputs.process_all(); |
| 2453 | 2454 | |
| 2454 | 2455 | std::map<unsigned long long, std::set<QPDFObjGen>> copied_pages; |
| 2455 | - for (auto& selection: m->selections) { | |
| 2456 | + for (auto& selection: m->inputs.selections) { | |
| 2456 | 2457 | // Read original pages from the PDF, and parse the page range associated with this |
| 2457 | 2458 | // occurrence of the file. |
| 2458 | 2459 | auto const& input = m->inputs.files[selection.filename]; |
| ... | ... | @@ -2476,7 +2477,7 @@ QPDFJob::handlePageSpecs(QPDF& pdf) |
| 2476 | 2477 | } |
| 2477 | 2478 | |
| 2478 | 2479 | auto n_collate = m->collate.size(); |
| 2479 | - auto n_specs = m->selections.size(); | |
| 2480 | + auto n_specs = m->inputs.selections.size(); | |
| 2480 | 2481 | if (!(n_collate == 0 || n_collate == 1 || n_collate == n_specs)) { |
| 2481 | 2482 | usage( |
| 2482 | 2483 | "--pages: if --collate has more than one value, it must have one value per page " |
| ... | ... | @@ -2497,7 +2498,7 @@ QPDFJob::handlePageSpecs(QPDF& pdf) |
| 2497 | 2498 | while (got_pages) { |
| 2498 | 2499 | got_pages = false; |
| 2499 | 2500 | for (size_t i = 0; i < n_specs; ++i) { |
| 2500 | - auto& page_data = m->selections.at(i); | |
| 2501 | + auto& page_data = m->inputs.selections.at(i); | |
| 2501 | 2502 | for (size_t j = 0; j < m->collate.at(i); ++j) { |
| 2502 | 2503 | if (cur_page.at(i) + j < page_data.selected_pages.size()) { |
| 2503 | 2504 | got_pages = true; |
| ... | ... | @@ -2518,7 +2519,7 @@ QPDFJob::handlePageSpecs(QPDF& pdf) |
| 2518 | 2519 | int out_pageno = 0; |
| 2519 | 2520 | auto& this_afdh = pdf.acroform(); |
| 2520 | 2521 | std::set<QPDFObjGen> referenced_fields; |
| 2521 | - for (auto& selection: new_specs.empty() ? m->selections : new_specs) { | |
| 2522 | + for (auto& selection: new_specs.empty() ? m->inputs.selections : new_specs) { | |
| 2522 | 2523 | auto& input = m->inputs.files[selection.filename]; |
| 2523 | 2524 | if (input.cfis) { |
| 2524 | 2525 | input.cfis->stayOpen(true); | ... | ... |
libqpdf/QPDFJob_config.cc
| ... | ... | @@ -978,7 +978,7 @@ QPDFJob::PagesConfig::PagesConfig(Config* c) : |
| 978 | 978 | std::shared_ptr<QPDFJob::PagesConfig> |
| 979 | 979 | QPDFJob::Config::pages() |
| 980 | 980 | { |
| 981 | - if (!o.m->selections.empty()) { | |
| 981 | + if (!o.m->inputs.selections.empty()) { | |
| 982 | 982 | usage("--pages may only be specified one time"); |
| 983 | 983 | } |
| 984 | 984 | return std::shared_ptr<PagesConfig>(new PagesConfig(this)); |
| ... | ... | @@ -987,7 +987,7 @@ QPDFJob::Config::pages() |
| 987 | 987 | QPDFJob::Config* |
| 988 | 988 | QPDFJob::PagesConfig::endPages() |
| 989 | 989 | { |
| 990 | - auto n_specs = config->o.m->selections.size(); | |
| 990 | + auto n_specs = config->o.m->inputs.selections.size(); | |
| 991 | 991 | if (n_specs == 0) { |
| 992 | 992 | usage("--pages: no page specifications given"); |
| 993 | 993 | } |
| ... | ... | @@ -998,24 +998,24 @@ QPDFJob::PagesConfig* |
| 998 | 998 | QPDFJob::PagesConfig::pageSpec( |
| 999 | 999 | std::string const& filename, std::string const& range, char const* password) |
| 1000 | 1000 | { |
| 1001 | - config->o.new_selection(filename, {password ? password : ""}, range); | |
| 1001 | + config->o.m->inputs.new_selection(filename, {password ? password : ""}, range); | |
| 1002 | 1002 | return this; |
| 1003 | 1003 | } |
| 1004 | 1004 | |
| 1005 | 1005 | QPDFJob::PagesConfig* |
| 1006 | 1006 | QPDFJob::PagesConfig::file(std::string const& arg) |
| 1007 | 1007 | { |
| 1008 | - config->o.new_selection(arg, {}, {}); | |
| 1008 | + config->o.m->inputs.new_selection(arg, {}, {}); | |
| 1009 | 1009 | return this; |
| 1010 | 1010 | } |
| 1011 | 1011 | |
| 1012 | 1012 | QPDFJob::PagesConfig* |
| 1013 | 1013 | QPDFJob::PagesConfig::range(std::string const& arg) |
| 1014 | 1014 | { |
| 1015 | - if (config->o.m->selections.empty()) { | |
| 1015 | + if (config->o.m->inputs.selections.empty()) { | |
| 1016 | 1016 | usage("in --range must follow a file name"); |
| 1017 | 1017 | } |
| 1018 | - auto& last = config->o.m->selections.back(); | |
| 1018 | + auto& last = config->o.m->inputs.selections.back(); | |
| 1019 | 1019 | if (!last.range.empty()) { |
| 1020 | 1020 | usage("--range already specified for this file"); |
| 1021 | 1021 | } |
| ... | ... | @@ -1026,10 +1026,10 @@ QPDFJob::PagesConfig::range(std::string const& arg) |
| 1026 | 1026 | QPDFJob::PagesConfig* |
| 1027 | 1027 | QPDFJob::PagesConfig::password(std::string const& arg) |
| 1028 | 1028 | { |
| 1029 | - if (config->o.m->selections.empty()) { | |
| 1029 | + if (config->o.m->inputs.selections.empty()) { | |
| 1030 | 1030 | usage("in --pages, --password must follow a file name"); |
| 1031 | 1031 | } |
| 1032 | - auto& last = config->o.m->selections.back(); | |
| 1032 | + auto& last = config->o.m->inputs.selections.back(); | |
| 1033 | 1033 | if (!last.password.empty()) { |
| 1034 | 1034 | usage("--password already specified for this file"); |
| 1035 | 1035 | } | ... | ... |
libqpdf/qpdf/QPDFJob_private.hh
| ... | ... | @@ -66,6 +66,9 @@ struct QPDFJob::Inputs |
| 66 | 66 | // Destroy all owned QPDF objects. Return false if any of the QPDF objects recorded warnings. |
| 67 | 67 | bool clear(); |
| 68 | 68 | |
| 69 | + void new_selection( | |
| 70 | + std::string const& filename, std::string const& password, std::string const& range); | |
| 71 | + | |
| 69 | 72 | std::string encryption_file; |
| 70 | 73 | std::string encryption_file_password; |
| 71 | 74 | bool keep_files_open{true}; |
| ... | ... | @@ -73,6 +76,7 @@ struct QPDFJob::Inputs |
| 73 | 76 | size_t keep_files_open_threshold{DEFAULT_KEEP_FILES_OPEN_THRESHOLD}; |
| 74 | 77 | |
| 75 | 78 | std::map<std::string, Input> files; |
| 79 | + std::vector<Selection> selections; | |
| 76 | 80 | |
| 77 | 81 | private: |
| 78 | 82 | QPDFJob& job; |
| ... | ... | @@ -263,7 +267,6 @@ class QPDFJob::Members |
| 263 | 267 | std::vector<UnderOverlay> overlay; |
| 264 | 268 | UnderOverlay* under_overlay{nullptr}; |
| 265 | 269 | Inputs inputs; |
| 266 | - std::vector<Selection> selections; | |
| 267 | 270 | std::map<std::string, RotationSpec> rotations; |
| 268 | 271 | bool require_outfile{true}; |
| 269 | 272 | bool replace_input{false}; | ... | ... |