Commit eee05a0c18e4432e9d7e02ec252052ac479ee539

Authored by m-holger
1 parent 4257c7bd

Refactor: replace `getArrayNItems` with `size`, simplify array traversal, centra…

…lize type conversions, and improve clarity across multiple modules.
libqpdf/QPDF_encryption.cc
@@ -664,7 +664,7 @@ QPDF::EncryptionParameters::initialize(QPDF& qpdf) @@ -664,7 +664,7 @@ QPDF::EncryptionParameters::initialize(QPDF& qpdf)
664 664
665 std::string id1; 665 std::string id1;
666 auto id_obj = trailer.getKey("/ID"); 666 auto id_obj = trailer.getKey("/ID");
667 - if (!id_obj.isArray() || id_obj.getArrayNItems() != 2 || !id_obj.getArrayItem(0).isString()) { 667 + if (id_obj.size() != 2 || !id_obj.getArrayItem(0).isString()) {
668 // Treating a missing ID as the empty string enables qpdf to decrypt some invalid encrypted 668 // Treating a missing ID as the empty string enables qpdf to decrypt some invalid encrypted
669 // files with no /ID that poppler can read but Adobe Reader can't. 669 // files with no /ID that poppler can read but Adobe Reader can't.
670 qpdf.warn(qpdf.damagedPDF("trailer", "invalid /ID in trailer dictionary")); 670 qpdf.warn(qpdf.damagedPDF("trailer", "invalid /ID in trailer dictionary"));
@@ -961,19 +961,21 @@ QPDF::decryptStream( @@ -961,19 +961,21 @@ QPDF::decryptStream(
961 } else if ( 961 } else if (
962 stream_dict.getKey("/DecodeParms").isArray() && 962 stream_dict.getKey("/DecodeParms").isArray() &&
963 stream_dict.getKey("/Filter").isArray()) { 963 stream_dict.getKey("/Filter").isArray()) {
964 - QPDFObjectHandle filter = stream_dict.getKey("/Filter");  
965 - QPDFObjectHandle decode = stream_dict.getKey("/DecodeParms");  
966 - if (filter.getArrayNItems() == decode.getArrayNItems()) {  
967 - for (int i = 0; i < filter.getArrayNItems(); ++i) {  
968 - if (filter.getArrayItem(i).isNameAndEquals("/Crypt")) {  
969 - QPDFObjectHandle crypt_params = decode.getArrayItem(i); 964 + auto filter = stream_dict.getKey("/Filter");
  965 + auto decode = stream_dict.getKey("/DecodeParms");
  966 + if (filter.size() == decode.size()) {
  967 + int i = 0;
  968 + for (auto const& item: filter.as_array()) {
  969 + if (item.isNameAndEquals("/Crypt")) {
  970 + auto crypt_params = decode.getArrayItem(i);
970 if (crypt_params.isDictionary() && 971 if (crypt_params.isDictionary() &&
971 crypt_params.getKey("/Name").isName()) { 972 crypt_params.getKey("/Name").isName()) {
972 - QTC::TC("qpdf", "QPDF_encrypt crypt array");  
973 method = encp->interpretCF(crypt_params.getKey("/Name")); 973 method = encp->interpretCF(crypt_params.getKey("/Name"));
974 method_source = "stream's Crypt decode parameters (array)"; 974 method_source = "stream's Crypt decode parameters (array)";
975 } 975 }
  976 + break;
976 } 977 }
  978 + ++i;
977 } 979 }
978 } 980 }
979 } 981 }
libqpdf/QPDF_linearization.cc
@@ -174,14 +174,13 @@ QPDF::readLinearizationData() @@ -174,14 +174,13 @@ QPDF::readLinearizationData()
174 } 174 }
175 175
176 // Hint table array: offset length [ offset length ] 176 // Hint table array: offset length [ offset length ]
177 - size_t n_H_items = toS(H.getArrayNItems());  
178 - if (!((n_H_items == 2) || (n_H_items == 4))) { 177 + size_t n_H_items = H.size();
  178 + if (!(n_H_items == 2 || n_H_items == 4)) {
179 throw damagedPDF("linearization dictionary", "H has the wrong number of items"); 179 throw damagedPDF("linearization dictionary", "H has the wrong number of items");
180 } 180 }
181 181
182 std::vector<int> H_items; 182 std::vector<int> H_items;
183 - for (size_t i = 0; i < n_H_items; ++i) {  
184 - QPDFObjectHandle oh(H.getArrayItem(toI(i))); 183 + for (auto const& oh: H.as_array()) {
185 if (oh.isInteger()) { 184 if (oh.isInteger()) {
186 H_items.push_back(oh.getIntValueAsInt()); 185 H_items.push_back(oh.getIntValueAsInt());
187 } else { 186 } else {
libqpdf/QPDF_objects.cc
@@ -782,7 +782,7 @@ std::pair&lt;int, std::array&lt;int, 3&gt;&gt; @@ -782,7 +782,7 @@ std::pair&lt;int, std::array&lt;int, 3&gt;&gt;
782 QPDF::processXRefW(QPDFObjectHandle& dict, std::function<QPDFExc(std::string_view)> damaged) 782 QPDF::processXRefW(QPDFObjectHandle& dict, std::function<QPDFExc(std::string_view)> damaged)
783 { 783 {
784 auto W_obj = dict.getKey("/W"); 784 auto W_obj = dict.getKey("/W");
785 - if (!(W_obj.isArray() && (W_obj.getArrayNItems() >= 3) && W_obj.getArrayItem(0).isInteger() && 785 + if (!(W_obj.size() >= 3 && W_obj.getArrayItem(0).isInteger() &&
786 W_obj.getArrayItem(1).isInteger() && W_obj.getArrayItem(2).isInteger())) { 786 W_obj.getArrayItem(1).isInteger() && W_obj.getArrayItem(2).isInteger())) {
787 throw damaged("Cross-reference stream does not have a proper /W key"); 787 throw damaged("Cross-reference stream does not have a proper /W key");
788 } 788 }
libqpdf/QPDF_pages.cc
@@ -313,7 +313,7 @@ QPDF::insertPage(QPDFObjectHandle newpage, int pos) @@ -313,7 +313,7 @@ QPDF::insertPage(QPDFObjectHandle newpage, int pos)
313 313
314 newpage.replaceKey("/Parent", pages); 314 newpage.replaceKey("/Parent", pages);
315 kids.insertItem(pos, newpage); 315 kids.insertItem(pos, newpage);
316 - int npages = kids.getArrayNItems(); 316 + int npages = static_cast<int>(kids.size());
317 pages.replaceKey("/Count", QPDFObjectHandle::newInteger(npages)); 317 pages.replaceKey("/Count", QPDFObjectHandle::newInteger(npages));
318 m->all_pages.insert(m->all_pages.begin() + pos, newpage); 318 m->all_pages.insert(m->all_pages.begin() + pos, newpage);
319 for (int i = pos + 1; i < npages; ++i) { 319 for (int i = pos + 1; i < npages; ++i) {
@@ -337,7 +337,7 @@ QPDF::removePage(QPDFObjectHandle page) @@ -337,7 +337,7 @@ QPDF::removePage(QPDFObjectHandle page)
337 QPDFObjectHandle kids = pages.getKey("/Kids"); 337 QPDFObjectHandle kids = pages.getKey("/Kids");
338 338
339 kids.eraseItem(pos); 339 kids.eraseItem(pos);
340 - int npages = kids.getArrayNItems(); 340 + int npages = static_cast<int>(kids.size());
341 pages.replaceKey("/Count", QPDFObjectHandle::newInteger(npages)); 341 pages.replaceKey("/Count", QPDFObjectHandle::newInteger(npages));
342 m->all_pages.erase(m->all_pages.begin() + pos); 342 m->all_pages.erase(m->all_pages.begin() + pos);
343 m->pageobj_to_pages_pos.erase(page.getObjGen()); 343 m->pageobj_to_pages_pos.erase(page.getObjGen());
qpdf/qpdf.testcov
@@ -237,7 +237,6 @@ QPDFWriter remove ADBE 0 @@ -237,7 +237,6 @@ QPDFWriter remove ADBE 0
237 QPDFWriter remove existing Extensions 0 237 QPDFWriter remove existing Extensions 0
238 QPDFWriter preserve ADBE 0 238 QPDFWriter preserve ADBE 0
239 QPDF_encryption skip 0x28 0 239 QPDF_encryption skip 0x28 0
240 -QPDF_encrypt crypt array 0  
241 QPDF_encryption CFM AESV3 0 240 QPDF_encryption CFM AESV3 0
242 qpdf-c called qpdf_get_pdf_extension_level 0 241 qpdf-c called qpdf_get_pdf_extension_level 0
243 qpdf-c called qpdf_set_r5_encryption_parameters 0 242 qpdf-c called qpdf_set_r5_encryption_parameters 0