Commit 1cc532dc9121d02d92ac6ce5abb9376b4842c05f
1 parent
4e9da59e
QPDFJob: move some helpers from ArgParser to QPDFJob
Showing
3 changed files
with
105 additions
and
99 deletions
include/qpdf/QPDFJob.hh
| @@ -422,9 +422,17 @@ class QPDFJob | @@ -422,9 +422,17 @@ class QPDFJob | ||
| 422 | bool check_requires_password; | 422 | bool check_requires_password; |
| 423 | std::shared_ptr<char> infilename; | 423 | std::shared_ptr<char> infilename; |
| 424 | std::shared_ptr<char> outfilename; | 424 | std::shared_ptr<char> outfilename; |
| 425 | + | ||
| 426 | + // Helper functions | ||
| 427 | + void parseRotationParameter(std::string const&); | ||
| 428 | + std::vector<int> parseNumrange(char const* range, int max, | ||
| 429 | + bool throw_error = false); | ||
| 430 | + | ||
| 431 | + | ||
| 425 | // QXXXQ END-PUBLIC | 432 | // QXXXQ END-PUBLIC |
| 426 | 433 | ||
| 427 | private: | 434 | private: |
| 435 | + | ||
| 428 | // Basic file processing | 436 | // Basic file processing |
| 429 | std::shared_ptr<QPDF> processFile( | 437 | std::shared_ptr<QPDF> processFile( |
| 430 | char const* filename, char const* password); | 438 | char const* filename, char const* password); |
libqpdf/QPDFJob.cc
| @@ -465,6 +465,94 @@ QPDFJob::config() | @@ -465,6 +465,94 @@ QPDFJob::config() | ||
| 465 | } | 465 | } |
| 466 | 466 | ||
| 467 | void | 467 | void |
| 468 | +QPDFJob::parseRotationParameter(std::string const& parameter) | ||
| 469 | +{ | ||
| 470 | + QPDFJob& o = *this; // QXXXQ | ||
| 471 | + std::string angle_str; | ||
| 472 | + std::string range; | ||
| 473 | + size_t colon = parameter.find(':'); | ||
| 474 | + int relative = 0; | ||
| 475 | + if (colon != std::string::npos) | ||
| 476 | + { | ||
| 477 | + if (colon > 0) | ||
| 478 | + { | ||
| 479 | + angle_str = parameter.substr(0, colon); | ||
| 480 | + } | ||
| 481 | + if (colon + 1 < parameter.length()) | ||
| 482 | + { | ||
| 483 | + range = parameter.substr(colon + 1); | ||
| 484 | + } | ||
| 485 | + } | ||
| 486 | + else | ||
| 487 | + { | ||
| 488 | + angle_str = parameter; | ||
| 489 | + } | ||
| 490 | + if (angle_str.length() > 0) | ||
| 491 | + { | ||
| 492 | + char first = angle_str.at(0); | ||
| 493 | + if ((first == '+') || (first == '-')) | ||
| 494 | + { | ||
| 495 | + relative = ((first == '+') ? 1 : -1); | ||
| 496 | + angle_str = angle_str.substr(1); | ||
| 497 | + } | ||
| 498 | + else if (! QUtil::is_digit(angle_str.at(0))) | ||
| 499 | + { | ||
| 500 | + angle_str = ""; | ||
| 501 | + } | ||
| 502 | + } | ||
| 503 | + if (range.empty()) | ||
| 504 | + { | ||
| 505 | + range = "1-z"; | ||
| 506 | + } | ||
| 507 | + bool range_valid = false; | ||
| 508 | + try | ||
| 509 | + { | ||
| 510 | + parseNumrange(range.c_str(), 0, true); | ||
| 511 | + range_valid = true; | ||
| 512 | + } | ||
| 513 | + catch (std::runtime_error const&) | ||
| 514 | + { | ||
| 515 | + // ignore | ||
| 516 | + } | ||
| 517 | + if (range_valid && | ||
| 518 | + ((angle_str == "0") ||(angle_str == "90") || | ||
| 519 | + (angle_str == "180") || (angle_str == "270"))) | ||
| 520 | + { | ||
| 521 | + int angle = QUtil::string_to_int(angle_str.c_str()); | ||
| 522 | + if (relative == -1) | ||
| 523 | + { | ||
| 524 | + angle = -angle; | ||
| 525 | + } | ||
| 526 | + o.rotations[range] = RotationSpec(angle, (relative != 0)); | ||
| 527 | + } | ||
| 528 | + else | ||
| 529 | + { | ||
| 530 | + throw ConfigError("invalid parameter to rotate: " + parameter); | ||
| 531 | + } | ||
| 532 | +} | ||
| 533 | + | ||
| 534 | +std::vector<int> | ||
| 535 | +QPDFJob::parseNumrange(char const* range, int max, bool throw_error) | ||
| 536 | +{ | ||
| 537 | + try | ||
| 538 | + { | ||
| 539 | + return QUtil::parse_numrange(range, max); | ||
| 540 | + } | ||
| 541 | + catch (std::runtime_error& e) | ||
| 542 | + { | ||
| 543 | + if (throw_error) | ||
| 544 | + { | ||
| 545 | + throw(e); | ||
| 546 | + } | ||
| 547 | + else | ||
| 548 | + { | ||
| 549 | + throw ConfigError(e.what()); | ||
| 550 | + } | ||
| 551 | + } | ||
| 552 | + return std::vector<int>(); | ||
| 553 | +} | ||
| 554 | + | ||
| 555 | +void | ||
| 468 | QPDFJob::run() | 556 | QPDFJob::run() |
| 469 | { | 557 | { |
| 470 | QPDFJob& o = *this; // QXXXQ | 558 | QPDFJob& o = *this; // QXXXQ |
| @@ -1072,7 +1160,7 @@ QPDFJob::getWantedJSONObjects() | @@ -1072,7 +1160,7 @@ QPDFJob::getWantedJSONObjects() | ||
| 1072 | bool trailer; | 1160 | bool trailer; |
| 1073 | int obj = 0; | 1161 | int obj = 0; |
| 1074 | int gen = 0; | 1162 | int gen = 0; |
| 1075 | - QPDFJob::parse_object_id(iter, trailer, obj, gen); | 1163 | + parse_object_id(iter, trailer, obj, gen); |
| 1076 | if (obj) | 1164 | if (obj) |
| 1077 | { | 1165 | { |
| 1078 | wanted_og.insert(QPDFObjGen(obj, gen)); | 1166 | wanted_og.insert(QPDFObjGen(obj, gen)); |
| @@ -1806,7 +1894,7 @@ QPDFJob::doJSON(QPDF& pdf) | @@ -1806,7 +1894,7 @@ QPDFJob::doJSON(QPDF& pdf) | ||
| 1806 | 1894 | ||
| 1807 | // Check against schema | 1895 | // Check against schema |
| 1808 | 1896 | ||
| 1809 | - JSON schema = QPDFJob::json_schema(&o.json_keys); | 1897 | + JSON schema = json_schema(&o.json_keys); |
| 1810 | std::list<std::string> errors; | 1898 | std::list<std::string> errors; |
| 1811 | if (! j.checkSchema(schema, errors)) | 1899 | if (! j.checkSchema(schema, errors)) |
| 1812 | { | 1900 | { |
| @@ -2029,7 +2117,7 @@ QPDFJob::processInputSource( | @@ -2029,7 +2117,7 @@ QPDFJob::processInputSource( | ||
| 2029 | } | 2117 | } |
| 2030 | 2118 | ||
| 2031 | void | 2119 | void |
| 2032 | -QPDFJob::validateUnderOverlay(QPDF& pdf, QPDFJob::UnderOverlay* uo) | 2120 | +QPDFJob::validateUnderOverlay(QPDF& pdf, UnderOverlay* uo) |
| 2033 | { | 2121 | { |
| 2034 | if (uo->filename.empty()) | 2122 | if (uo->filename.empty()) |
| 2035 | { | 2123 | { |
| @@ -2089,7 +2177,7 @@ static QPDFAcroFormDocumentHelper* get_afdh_for_qpdf( | @@ -2089,7 +2177,7 @@ static QPDFAcroFormDocumentHelper* get_afdh_for_qpdf( | ||
| 2089 | void | 2177 | void |
| 2090 | QPDFJob::doUnderOverlayForPage( | 2178 | QPDFJob::doUnderOverlayForPage( |
| 2091 | QPDF& pdf, | 2179 | QPDF& pdf, |
| 2092 | - QPDFJob::UnderOverlay& uo, | 2180 | + UnderOverlay& uo, |
| 2093 | std::map<int, std::vector<int> >& pagenos, | 2181 | std::map<int, std::vector<int> >& pagenos, |
| 2094 | size_t page_idx, | 2182 | size_t page_idx, |
| 2095 | std::map<int, QPDFObjectHandle>& fo, | 2183 | std::map<int, QPDFObjectHandle>& fo, |
libqpdf/QPDFJob_argv.cc
| @@ -37,9 +37,6 @@ namespace | @@ -37,9 +37,6 @@ namespace | ||
| 37 | void initOptionTables(); | 37 | void initOptionTables(); |
| 38 | void doFinalChecks(); | 38 | void doFinalChecks(); |
| 39 | void parseUnderOverlayOptions(QPDFJob::UnderOverlay*); | 39 | void parseUnderOverlayOptions(QPDFJob::UnderOverlay*); |
| 40 | - void parseRotationParameter(std::string const&); | ||
| 41 | - std::vector<int> parseNumrange(char const* range, int max, | ||
| 42 | - bool throw_error = false); | ||
| 43 | 40 | ||
| 44 | QPDFArgParser ap; | 41 | QPDFArgParser ap; |
| 45 | QPDFJob& o; | 42 | QPDFJob& o; |
| @@ -324,7 +321,7 @@ ArgParser::argPagesPositional(char* arg) | @@ -324,7 +321,7 @@ ArgParser::argPagesPositional(char* arg) | ||
| 324 | { | 321 | { |
| 325 | try | 322 | try |
| 326 | { | 323 | { |
| 327 | - parseNumrange(range, 0, true); | 324 | + o.parseNumrange(range, 0, true); |
| 328 | } | 325 | } |
| 329 | catch (std::runtime_error& e1) | 326 | catch (std::runtime_error& e1) |
| 330 | { | 327 | { |
| @@ -384,7 +381,7 @@ ArgParser::argOverlay() | @@ -384,7 +381,7 @@ ArgParser::argOverlay() | ||
| 384 | void | 381 | void |
| 385 | ArgParser::argRotate(char* parameter) | 382 | ArgParser::argRotate(char* parameter) |
| 386 | { | 383 | { |
| 387 | - parseRotationParameter(parameter); | 384 | + o.parseRotationParameter(parameter); |
| 388 | } | 385 | } |
| 389 | 386 | ||
| 390 | void | 387 | void |
| @@ -592,7 +589,7 @@ ArgParser::argUOPositional(char* arg) | @@ -592,7 +589,7 @@ ArgParser::argUOPositional(char* arg) | ||
| 592 | void | 589 | void |
| 593 | ArgParser::argUOTo(char* parameter) | 590 | ArgParser::argUOTo(char* parameter) |
| 594 | { | 591 | { |
| 595 | - parseNumrange(parameter, 0); | 592 | + o.parseNumrange(parameter, 0); |
| 596 | o.under_overlay->to_nr = parameter; | 593 | o.under_overlay->to_nr = parameter; |
| 597 | } | 594 | } |
| 598 | 595 | ||
| @@ -601,7 +598,7 @@ ArgParser::argUOFrom(char* parameter) | @@ -601,7 +598,7 @@ ArgParser::argUOFrom(char* parameter) | ||
| 601 | { | 598 | { |
| 602 | if (strlen(parameter)) | 599 | if (strlen(parameter)) |
| 603 | { | 600 | { |
| 604 | - parseNumrange(parameter, 0); | 601 | + o.parseNumrange(parameter, 0); |
| 605 | } | 602 | } |
| 606 | o.under_overlay->from_nr = parameter; | 603 | o.under_overlay->from_nr = parameter; |
| 607 | } | 604 | } |
| @@ -611,7 +608,7 @@ ArgParser::argUORepeat(char* parameter) | @@ -611,7 +608,7 @@ ArgParser::argUORepeat(char* parameter) | ||
| 611 | { | 608 | { |
| 612 | if (strlen(parameter)) | 609 | if (strlen(parameter)) |
| 613 | { | 610 | { |
| 614 | - parseNumrange(parameter, 0); | 611 | + o.parseNumrange(parameter, 0); |
| 615 | } | 612 | } |
| 616 | o.under_overlay->repeat_nr = parameter; | 613 | o.under_overlay->repeat_nr = parameter; |
| 617 | } | 614 | } |
| @@ -670,27 +667,6 @@ ArgParser::usage(std::string const& message) | @@ -670,27 +667,6 @@ ArgParser::usage(std::string const& message) | ||
| 670 | this->ap.usage(message); | 667 | this->ap.usage(message); |
| 671 | } | 668 | } |
| 672 | 669 | ||
| 673 | -std::vector<int> | ||
| 674 | -ArgParser::parseNumrange(char const* range, int max, bool throw_error) | ||
| 675 | -{ | ||
| 676 | - try | ||
| 677 | - { | ||
| 678 | - return QUtil::parse_numrange(range, max); | ||
| 679 | - } | ||
| 680 | - catch (std::runtime_error& e) | ||
| 681 | - { | ||
| 682 | - if (throw_error) | ||
| 683 | - { | ||
| 684 | - throw(e); | ||
| 685 | - } | ||
| 686 | - else | ||
| 687 | - { | ||
| 688 | - usage(e.what()); | ||
| 689 | - } | ||
| 690 | - } | ||
| 691 | - return std::vector<int>(); | ||
| 692 | -} | ||
| 693 | - | ||
| 694 | void | 670 | void |
| 695 | ArgParser::parseUnderOverlayOptions(QPDFJob::UnderOverlay* uo) | 671 | ArgParser::parseUnderOverlayOptions(QPDFJob::UnderOverlay* uo) |
| 696 | { | 672 | { |
| @@ -699,72 +675,6 @@ ArgParser::parseUnderOverlayOptions(QPDFJob::UnderOverlay* uo) | @@ -699,72 +675,6 @@ ArgParser::parseUnderOverlayOptions(QPDFJob::UnderOverlay* uo) | ||
| 699 | } | 675 | } |
| 700 | 676 | ||
| 701 | void | 677 | void |
| 702 | -ArgParser::parseRotationParameter(std::string const& parameter) | ||
| 703 | -{ | ||
| 704 | - std::string angle_str; | ||
| 705 | - std::string range; | ||
| 706 | - size_t colon = parameter.find(':'); | ||
| 707 | - int relative = 0; | ||
| 708 | - if (colon != std::string::npos) | ||
| 709 | - { | ||
| 710 | - if (colon > 0) | ||
| 711 | - { | ||
| 712 | - angle_str = parameter.substr(0, colon); | ||
| 713 | - } | ||
| 714 | - if (colon + 1 < parameter.length()) | ||
| 715 | - { | ||
| 716 | - range = parameter.substr(colon + 1); | ||
| 717 | - } | ||
| 718 | - } | ||
| 719 | - else | ||
| 720 | - { | ||
| 721 | - angle_str = parameter; | ||
| 722 | - } | ||
| 723 | - if (angle_str.length() > 0) | ||
| 724 | - { | ||
| 725 | - char first = angle_str.at(0); | ||
| 726 | - if ((first == '+') || (first == '-')) | ||
| 727 | - { | ||
| 728 | - relative = ((first == '+') ? 1 : -1); | ||
| 729 | - angle_str = angle_str.substr(1); | ||
| 730 | - } | ||
| 731 | - else if (! QUtil::is_digit(angle_str.at(0))) | ||
| 732 | - { | ||
| 733 | - angle_str = ""; | ||
| 734 | - } | ||
| 735 | - } | ||
| 736 | - if (range.empty()) | ||
| 737 | - { | ||
| 738 | - range = "1-z"; | ||
| 739 | - } | ||
| 740 | - bool range_valid = false; | ||
| 741 | - try | ||
| 742 | - { | ||
| 743 | - parseNumrange(range.c_str(), 0, true); | ||
| 744 | - range_valid = true; | ||
| 745 | - } | ||
| 746 | - catch (std::runtime_error const&) | ||
| 747 | - { | ||
| 748 | - // ignore | ||
| 749 | - } | ||
| 750 | - if (range_valid && | ||
| 751 | - ((angle_str == "0") ||(angle_str == "90") || | ||
| 752 | - (angle_str == "180") || (angle_str == "270"))) | ||
| 753 | - { | ||
| 754 | - int angle = QUtil::string_to_int(angle_str.c_str()); | ||
| 755 | - if (relative == -1) | ||
| 756 | - { | ||
| 757 | - angle = -angle; | ||
| 758 | - } | ||
| 759 | - o.rotations[range] = QPDFJob::RotationSpec(angle, (relative != 0)); | ||
| 760 | - } | ||
| 761 | - else | ||
| 762 | - { | ||
| 763 | - usage("invalid parameter to rotate: " + parameter); | ||
| 764 | - } | ||
| 765 | -} | ||
| 766 | - | ||
| 767 | -void | ||
| 768 | ArgParser::parseOptions() | 678 | ArgParser::parseOptions() |
| 769 | { | 679 | { |
| 770 | try | 680 | try |