Commit 44fa03c64e66426981403ff2102613a0865cadd4
1 parent
3575c062
Refactor `QPDFWriter`: move methods `setMinimumPDFVersion`, `parseVersion`,`disa…
…bleIncompatibleEncryption` and `compareVersions` to `QPDFWriter::Members`. Remove outdated test coverage entries.
Showing
3 changed files
with
38 additions
and
40 deletions
include/qpdf/QPDFWriter.hh
| @@ -505,9 +505,6 @@ class QPDFWriter | @@ -505,9 +505,6 @@ class QPDFWriter | ||
| 505 | bool allow_modify_other, | 505 | bool allow_modify_other, |
| 506 | qpdf_r3_print_e print, | 506 | qpdf_r3_print_e print, |
| 507 | qpdf_r3_modify_e modify); | 507 | qpdf_r3_modify_e modify); |
| 508 | - void disableIncompatibleEncryption(int major, int minor, int extension_level); | ||
| 509 | - void parseVersion(std::string const& version, int& major, int& minor) const; | ||
| 510 | - int compareVersions(int major1, int minor1, int major2, int minor2) const; | ||
| 511 | void setEncryptionParameters(char const* user_password, char const* owner_password); | 508 | void setEncryptionParameters(char const* user_password, char const* owner_password); |
| 512 | void setEncryptionMinimumVersion(); | 509 | void setEncryptionMinimumVersion(); |
| 513 | void setDataKey(int objid); | 510 | void setDataKey(int objid); |
libqpdf/QPDFWriter.cc
| @@ -284,6 +284,12 @@ class QPDFWriter::Members | @@ -284,6 +284,12 @@ class QPDFWriter::Members | ||
| 284 | delete output_buffer; | 284 | delete output_buffer; |
| 285 | } | 285 | } |
| 286 | 286 | ||
| 287 | + void setMinimumPDFVersion(std::string const& version, int extension_level); | ||
| 288 | + | ||
| 289 | + void disableIncompatibleEncryption(int major, int minor, int extension_level); | ||
| 290 | + void parseVersion(std::string const& version, int& major, int& minor) const; | ||
| 291 | + int compareVersions(int major1, int minor1, int major2, int minor2) const; | ||
| 292 | + | ||
| 287 | private: | 293 | private: |
| 288 | QPDFWriter& w; | 294 | QPDFWriter& w; |
| 289 | QPDF& pdf; | 295 | QPDF& pdf; |
| @@ -381,11 +387,9 @@ QPDFWriter::setOutputFilename(char const* filename) | @@ -381,11 +387,9 @@ QPDFWriter::setOutputFilename(char const* filename) | ||
| 381 | bool close_file = false; | 387 | bool close_file = false; |
| 382 | if (filename == nullptr) { | 388 | if (filename == nullptr) { |
| 383 | description = "standard output"; | 389 | description = "standard output"; |
| 384 | - QTC::TC("qpdf", "QPDFWriter write to stdout"); | ||
| 385 | f = stdout; | 390 | f = stdout; |
| 386 | QUtil::binary_stdout(); | 391 | QUtil::binary_stdout(); |
| 387 | } else { | 392 | } else { |
| 388 | - QTC::TC("qpdf", "QPDFWriter write to file"); | ||
| 389 | f = QUtil::safe_fopen(filename, "wb+"); | 393 | f = QUtil::safe_fopen(filename, "wb+"); |
| 390 | close_file = true; | 394 | close_file = true; |
| 391 | } | 395 | } |
| @@ -508,9 +512,15 @@ QPDFWriter::setNewlineBeforeEndstream(bool val) | @@ -508,9 +512,15 @@ QPDFWriter::setNewlineBeforeEndstream(bool val) | ||
| 508 | void | 512 | void |
| 509 | QPDFWriter::setMinimumPDFVersion(std::string const& version, int extension_level) | 513 | QPDFWriter::setMinimumPDFVersion(std::string const& version, int extension_level) |
| 510 | { | 514 | { |
| 515 | + m->setMinimumPDFVersion(version, extension_level); | ||
| 516 | +} | ||
| 517 | + | ||
| 518 | +void | ||
| 519 | +QPDFWriter::Members::setMinimumPDFVersion(std::string const& version, int extension_level) | ||
| 520 | +{ | ||
| 511 | bool set_version = false; | 521 | bool set_version = false; |
| 512 | bool set_extension_level = false; | 522 | bool set_extension_level = false; |
| 513 | - if (m->min_pdf_version.empty()) { | 523 | + if (min_pdf_version.empty()) { |
| 514 | set_version = true; | 524 | set_version = true; |
| 515 | set_extension_level = true; | 525 | set_extension_level = true; |
| 516 | } else { | 526 | } else { |
| @@ -519,25 +529,24 @@ QPDFWriter::setMinimumPDFVersion(std::string const& version, int extension_level | @@ -519,25 +529,24 @@ QPDFWriter::setMinimumPDFVersion(std::string const& version, int extension_level | ||
| 519 | int min_major = 0; | 529 | int min_major = 0; |
| 520 | int min_minor = 0; | 530 | int min_minor = 0; |
| 521 | parseVersion(version, old_major, old_minor); | 531 | parseVersion(version, old_major, old_minor); |
| 522 | - parseVersion(m->min_pdf_version, min_major, min_minor); | 532 | + parseVersion(min_pdf_version, min_major, min_minor); |
| 523 | int compare = compareVersions(old_major, old_minor, min_major, min_minor); | 533 | int compare = compareVersions(old_major, old_minor, min_major, min_minor); |
| 524 | if (compare > 0) { | 534 | if (compare > 0) { |
| 525 | QTC::TC("qpdf", "QPDFWriter increasing minimum version", extension_level == 0 ? 0 : 1); | 535 | QTC::TC("qpdf", "QPDFWriter increasing minimum version", extension_level == 0 ? 0 : 1); |
| 526 | set_version = true; | 536 | set_version = true; |
| 527 | set_extension_level = true; | 537 | set_extension_level = true; |
| 528 | } else if (compare == 0) { | 538 | } else if (compare == 0) { |
| 529 | - if (extension_level > m->min_extension_level) { | ||
| 530 | - QTC::TC("qpdf", "QPDFWriter increasing extension level"); | 539 | + if (extension_level > min_extension_level) { |
| 531 | set_extension_level = true; | 540 | set_extension_level = true; |
| 532 | } | 541 | } |
| 533 | } | 542 | } |
| 534 | } | 543 | } |
| 535 | 544 | ||
| 536 | if (set_version) { | 545 | if (set_version) { |
| 537 | - m->min_pdf_version = version; | 546 | + min_pdf_version = version; |
| 538 | } | 547 | } |
| 539 | if (set_extension_level) { | 548 | if (set_extension_level) { |
| 540 | - m->min_extension_level = extension_level; | 549 | + min_extension_level = extension_level; |
| 541 | } | 550 | } |
| 542 | } | 551 | } |
| 543 | 552 | ||
| @@ -562,7 +571,6 @@ QPDFWriter::setExtraHeaderText(std::string const& text) | @@ -562,7 +571,6 @@ QPDFWriter::setExtraHeaderText(std::string const& text) | ||
| 562 | { | 571 | { |
| 563 | m->extra_header_text = text; | 572 | m->extra_header_text = text; |
| 564 | if (!m->extra_header_text.empty() && *m->extra_header_text.rbegin() != '\n') { | 573 | if (!m->extra_header_text.empty() && *m->extra_header_text.rbegin() != '\n') { |
| 565 | - QTC::TC("qpdf", "QPDFWriter extra header text add newline"); | ||
| 566 | m->extra_header_text += "\n"; | 574 | m->extra_header_text += "\n"; |
| 567 | } else { | 575 | } else { |
| 568 | QTC::TC("qpdf", "QPDFWriter extra header text no newline"); | 576 | QTC::TC("qpdf", "QPDFWriter extra header text no newline"); |
| @@ -913,44 +921,44 @@ QPDFWriter::copyEncryptionParameters(QPDF& qpdf) | @@ -913,44 +921,44 @@ QPDFWriter::copyEncryptionParameters(QPDF& qpdf) | ||
| 913 | } | 921 | } |
| 914 | 922 | ||
| 915 | void | 923 | void |
| 916 | -QPDFWriter::disableIncompatibleEncryption(int major, int minor, int extension_level) | 924 | +QPDFWriter::Members::disableIncompatibleEncryption(int major, int minor, int extension_level) |
| 917 | { | 925 | { |
| 918 | - if (!m->encryption) { | 926 | + if (!encryption) { |
| 919 | return; | 927 | return; |
| 920 | } | 928 | } |
| 921 | if (compareVersions(major, minor, 1, 3) < 0) { | 929 | if (compareVersions(major, minor, 1, 3) < 0) { |
| 922 | - m->encryption = nullptr; | 930 | + encryption = nullptr; |
| 923 | return; | 931 | return; |
| 924 | } | 932 | } |
| 925 | - int V = m->encryption->getV(); | ||
| 926 | - int R = m->encryption->getR(); | 933 | + int V = encryption->getV(); |
| 934 | + int R = encryption->getR(); | ||
| 927 | if (compareVersions(major, minor, 1, 4) < 0) { | 935 | if (compareVersions(major, minor, 1, 4) < 0) { |
| 928 | if (V > 1 || R > 2) { | 936 | if (V > 1 || R > 2) { |
| 929 | - m->encryption = nullptr; | 937 | + encryption = nullptr; |
| 930 | } | 938 | } |
| 931 | } else if (compareVersions(major, minor, 1, 5) < 0) { | 939 | } else if (compareVersions(major, minor, 1, 5) < 0) { |
| 932 | if (V > 2 || R > 3) { | 940 | if (V > 2 || R > 3) { |
| 933 | - m->encryption = nullptr; | 941 | + encryption = nullptr; |
| 934 | } | 942 | } |
| 935 | } else if (compareVersions(major, minor, 1, 6) < 0) { | 943 | } else if (compareVersions(major, minor, 1, 6) < 0) { |
| 936 | - if (m->encrypt_use_aes) { | ||
| 937 | - m->encryption = nullptr; | 944 | + if (encrypt_use_aes) { |
| 945 | + encryption = nullptr; | ||
| 938 | } | 946 | } |
| 939 | } else if ( | 947 | } else if ( |
| 940 | (compareVersions(major, minor, 1, 7) < 0) || | 948 | (compareVersions(major, minor, 1, 7) < 0) || |
| 941 | ((compareVersions(major, minor, 1, 7) == 0) && extension_level < 3)) { | 949 | ((compareVersions(major, minor, 1, 7) == 0) && extension_level < 3)) { |
| 942 | if (V >= 5 || R >= 5) { | 950 | if (V >= 5 || R >= 5) { |
| 943 | - m->encryption = nullptr; | 951 | + encryption = nullptr; |
| 944 | } | 952 | } |
| 945 | } | 953 | } |
| 946 | 954 | ||
| 947 | - if (!m->encryption) { | 955 | + if (!encryption) { |
| 948 | QTC::TC("qpdf", "QPDFWriter forced version disabled encryption"); | 956 | QTC::TC("qpdf", "QPDFWriter forced version disabled encryption"); |
| 949 | } | 957 | } |
| 950 | } | 958 | } |
| 951 | 959 | ||
| 952 | void | 960 | void |
| 953 | -QPDFWriter::parseVersion(std::string const& version, int& major, int& minor) const | 961 | +QPDFWriter::Members::parseVersion(std::string const& version, int& major, int& minor) const |
| 954 | { | 962 | { |
| 955 | major = QUtil::string_to_int(version.c_str()); | 963 | major = QUtil::string_to_int(version.c_str()); |
| 956 | minor = 0; | 964 | minor = 0; |
| @@ -967,19 +975,18 @@ QPDFWriter::parseVersion(std::string const& version, int& major, int& minor) con | @@ -967,19 +975,18 @@ QPDFWriter::parseVersion(std::string const& version, int& major, int& minor) con | ||
| 967 | } | 975 | } |
| 968 | 976 | ||
| 969 | int | 977 | int |
| 970 | -QPDFWriter::compareVersions(int major1, int minor1, int major2, int minor2) const | 978 | +QPDFWriter::Members::compareVersions(int major1, int minor1, int major2, int minor2) const |
| 971 | { | 979 | { |
| 972 | if (major1 < major2) { | 980 | if (major1 < major2) { |
| 973 | return -1; | 981 | return -1; |
| 974 | - } else if (major1 > major2) { | 982 | + } |
| 983 | + if (major1 > major2) { | ||
| 975 | return 1; | 984 | return 1; |
| 976 | - } else if (minor1 < minor2) { | 985 | + } |
| 986 | + if (minor1 < minor2) { | ||
| 977 | return -1; | 987 | return -1; |
| 978 | - } else if (minor1 > minor2) { | ||
| 979 | - return 1; | ||
| 980 | - } else { | ||
| 981 | - return 0; | ||
| 982 | } | 988 | } |
| 989 | + return minor1 > minor2 ? 1 : 0; | ||
| 983 | } | 990 | } |
| 984 | 991 | ||
| 985 | void | 992 | void |
| @@ -2170,10 +2177,9 @@ QPDFWriter::doWriteSetup() | @@ -2170,10 +2177,9 @@ QPDFWriter::doWriteSetup() | ||
| 2170 | if (!m->forced_pdf_version.empty()) { | 2177 | if (!m->forced_pdf_version.empty()) { |
| 2171 | int major = 0; | 2178 | int major = 0; |
| 2172 | int minor = 0; | 2179 | int minor = 0; |
| 2173 | - parseVersion(m->forced_pdf_version, major, minor); | ||
| 2174 | - disableIncompatibleEncryption(major, minor, m->forced_extension_level); | ||
| 2175 | - if (compareVersions(major, minor, 1, 5) < 0) { | ||
| 2176 | - QTC::TC("qpdf", "QPDFWriter forcing object stream disable"); | 2180 | + m->parseVersion(m->forced_pdf_version, major, minor); |
| 2181 | + m->disableIncompatibleEncryption(major, minor, m->forced_extension_level); | ||
| 2182 | + if (m->compareVersions(major, minor, 1, 5) < 0) { | ||
| 2177 | m->object_stream_mode = qpdf_o_disable; | 2183 | m->object_stream_mode = qpdf_o_disable; |
| 2178 | } | 2184 | } |
| 2179 | } | 2185 | } |
qpdf/qpdf.testcov
| @@ -40,8 +40,6 @@ main QTest array indirect 1 | @@ -40,8 +40,6 @@ main QTest array indirect 1 | ||
| 40 | main QTest dictionary 0 | 40 | main QTest dictionary 0 |
| 41 | main QTest dictionary indirect 1 | 41 | main QTest dictionary indirect 1 |
| 42 | main QTest stream 0 | 42 | main QTest stream 0 |
| 43 | -QPDFWriter write to stdout 0 | ||
| 44 | -QPDFWriter write to file 0 | ||
| 45 | QPDF lin write nshared_total > nshared_first_page 1 | 43 | QPDF lin write nshared_total > nshared_first_page 1 |
| 46 | QPDFWriter encrypted hint stream 0 | 44 | QPDFWriter encrypted hint stream 0 |
| 47 | QPDF opt inherited scalar 0 | 45 | QPDF opt inherited scalar 0 |
| @@ -142,7 +140,6 @@ qpdf-c called qpdf_init_write multiple times 0 | @@ -142,7 +140,6 @@ qpdf-c called qpdf_init_write multiple times 0 | ||
| 142 | QPDF_encryption rc4 decode string 0 | 140 | QPDF_encryption rc4 decode string 0 |
| 143 | QPDFWriter not compressing metadata 0 | 141 | QPDFWriter not compressing metadata 0 |
| 144 | QPDF_encryption aes decode string 0 | 142 | QPDF_encryption aes decode string 0 |
| 145 | -QPDFWriter forcing object stream disable 0 | ||
| 146 | QPDFWriter forced version disabled encryption 0 | 143 | QPDFWriter forced version disabled encryption 0 |
| 147 | qpdf-c called qpdf_set_r4_encryption_parameters_insecure 0 | 144 | qpdf-c called qpdf_set_r4_encryption_parameters_insecure 0 |
| 148 | qpdf-c called qpdf_set_static_aes_IV 0 | 145 | qpdf-c called qpdf_set_static_aes_IV 0 |
| @@ -203,10 +200,8 @@ QPDFJob pages encryption password 0 | @@ -203,10 +200,8 @@ QPDFJob pages encryption password 0 | ||
| 203 | QPDFTokenizer EOF reading token 0 | 200 | QPDFTokenizer EOF reading token 0 |
| 204 | QPDFTokenizer EOF reading appendable token 0 | 201 | QPDFTokenizer EOF reading appendable token 0 |
| 205 | QPDFWriter extra header text no newline 0 | 202 | QPDFWriter extra header text no newline 0 |
| 206 | -QPDFWriter extra header text add newline 0 | ||
| 207 | QPDF bogus 0 offset 0 | 203 | QPDF bogus 0 offset 0 |
| 208 | QPDF global offset 0 | 204 | QPDF global offset 0 |
| 209 | -QPDFWriter increasing extension level 0 | ||
| 210 | QPDFWriter make Extensions direct 0 | 205 | QPDFWriter make Extensions direct 0 |
| 211 | QPDFWriter make ADBE direct 1 | 206 | QPDFWriter make ADBE direct 1 |
| 212 | QPDFWriter preserve Extensions 0 | 207 | QPDFWriter preserve Extensions 0 |