Commit 0fae76cfd7f7c2bf390bc7effb8119075b8fdaff

Authored by m-holger
1 parent 0f67d851

Refactor `QPDFJob`: move `selections` to `Inputs`, update related logic in `hand…

…lePageSpecs` and `new_selection`, and simplify page specification handling.
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&amp; 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&amp; 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&amp; 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&amp; 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};
... ...