Commit 49010866f86d07978ca9f2c726a3b20bc9ea381b
1 parent
4ba6377f
Refactor `QPDF` configuration: encapsulate related fields in `Doc::Config`, upda…
…te usage throughout the codebase, and streamline configurations.
Showing
8 changed files
with
125 additions
and
105 deletions
libqpdf/QPDF.cc
| ... | ... | @@ -27,9 +27,9 @@ |
| 27 | 27 | using namespace qpdf; |
| 28 | 28 | using namespace std::literals; |
| 29 | 29 | |
| 30 | -using Doc = QPDF::Doc; | |
| 31 | -using Common = Doc::Common; | |
| 32 | -using Objects = Doc::Objects; | |
| 30 | +using QDoc = QPDF::Doc; | |
| 31 | +using Common = QDoc::Common; | |
| 32 | +using Objects = QDoc::Objects; | |
| 33 | 33 | using Foreign = Objects::Foreign; |
| 34 | 34 | using Streams = Objects::Streams; |
| 35 | 35 | |
| ... | ... | @@ -133,7 +133,6 @@ QPDF::Members::Members(QPDF& qpdf) : |
| 133 | 133 | lin(*this), |
| 134 | 134 | objects(*this), |
| 135 | 135 | pages(*this), |
| 136 | - log(QPDFLogger::defaultLogger()), | |
| 137 | 136 | file(std::make_shared<InvalidInputSource>()), |
| 138 | 137 | encp(std::make_shared<EncryptionParameters>()) |
| 139 | 138 | { |
| ... | ... | @@ -232,7 +231,7 @@ QPDF::closeInputSource() |
| 232 | 231 | void |
| 233 | 232 | QPDF::setPasswordIsHexKey(bool val) |
| 234 | 233 | { |
| 235 | - m->provided_password_is_hex_key = val; | |
| 234 | + m->cf.provided_password_is_hex_key_ = val; | |
| 236 | 235 | } |
| 237 | 236 | |
| 238 | 237 | void |
| ... | ... | @@ -251,56 +250,56 @@ QPDF::registerStreamFilter( |
| 251 | 250 | void |
| 252 | 251 | QPDF::setIgnoreXRefStreams(bool val) |
| 253 | 252 | { |
| 254 | - m->ignore_xref_streams = val; | |
| 253 | + m->cf.ignore_xref_streams_ = val; | |
| 255 | 254 | } |
| 256 | 255 | |
| 257 | 256 | std::shared_ptr<QPDFLogger> |
| 258 | 257 | QPDF::getLogger() |
| 259 | 258 | { |
| 260 | - return m->log; | |
| 259 | + return m->cf.log_; | |
| 261 | 260 | } |
| 262 | 261 | |
| 263 | 262 | void |
| 264 | 263 | QPDF::setLogger(std::shared_ptr<QPDFLogger> l) |
| 265 | 264 | { |
| 266 | - m->log = l; | |
| 265 | + m->cf.log_ = l; | |
| 267 | 266 | } |
| 268 | 267 | |
| 269 | 268 | void |
| 270 | 269 | QPDF::setOutputStreams(std::ostream* out, std::ostream* err) |
| 271 | 270 | { |
| 272 | 271 | setLogger(QPDFLogger::create()); |
| 273 | - m->log->setOutputStreams(out, err); | |
| 272 | + m->cf.log_->setOutputStreams(out, err); | |
| 274 | 273 | } |
| 275 | 274 | |
| 276 | 275 | void |
| 277 | 276 | QPDF::setSuppressWarnings(bool val) |
| 278 | 277 | { |
| 279 | - m->suppress_warnings = val; | |
| 278 | + m->cf.suppress_warnings_ = val; | |
| 280 | 279 | } |
| 281 | 280 | |
| 282 | 281 | void |
| 283 | 282 | QPDF::setMaxWarnings(size_t val) |
| 284 | 283 | { |
| 285 | - m->max_warnings = val; | |
| 284 | + m->cf.max_warnings_ = val; | |
| 286 | 285 | } |
| 287 | 286 | |
| 288 | 287 | void |
| 289 | 288 | QPDF::setAttemptRecovery(bool val) |
| 290 | 289 | { |
| 291 | - m->attempt_recovery = val; | |
| 290 | + m->cf.attempt_recovery_ = val; | |
| 292 | 291 | } |
| 293 | 292 | |
| 294 | 293 | void |
| 295 | 294 | QPDF::setImmediateCopyFrom(bool val) |
| 296 | 295 | { |
| 297 | - m->immediate_copy_from = val; | |
| 296 | + m->cf.immediate_copy_from_ = val; | |
| 298 | 297 | } |
| 299 | 298 | |
| 300 | 299 | std::vector<QPDFExc> |
| 301 | 300 | QPDF::getWarnings() |
| 302 | 301 | { |
| 303 | - std::vector<QPDFExc> result = m->warnings; | |
| 302 | + std::vector<QPDFExc> result = std::move(m->warnings); | |
| 304 | 303 | m->warnings.clear(); |
| 305 | 304 | return result; |
| 306 | 305 | } |
| ... | ... | @@ -372,12 +371,12 @@ QPDF::warn(QPDFExc const& e) |
| 372 | 371 | void |
| 373 | 372 | Common::warn(QPDFExc const& e) |
| 374 | 373 | { |
| 375 | - if (m->max_warnings > 0 && m->warnings.size() >= m->max_warnings) { | |
| 374 | + if (m->cf.max_warnings_ > 0 && m->warnings.size() >= m->cf.max_warnings_) { | |
| 376 | 375 | stopOnError("Too many warnings - file is too badly damaged"); |
| 377 | 376 | } |
| 378 | - m->warnings.push_back(e); | |
| 379 | - if (!m->suppress_warnings) { | |
| 380 | - *m->log->getWarn() << "WARNING: " << m->warnings.back().what() << "\n"; | |
| 377 | + m->warnings.emplace_back(e); | |
| 378 | + if (!m->cf.suppress_warnings_) { | |
| 379 | + *m->cf.log_->getWarn() << "WARNING: " << m->warnings.back().what() << "\n"; | |
| 381 | 380 | } |
| 382 | 381 | } |
| 383 | 382 | |
| ... | ... | @@ -715,7 +714,7 @@ QPDF::getRoot() |
| 715 | 714 | } else if ( |
| 716 | 715 | // Check_mode is an interim solution to request #810 pending a more comprehensive review of |
| 717 | 716 | // the approach to more extensive checks and warning levels. |
| 718 | - m->check_mode && !root.getKey("/Type").isNameAndEquals("/Catalog")) { | |
| 717 | + m->cf.check_mode_ && !root.getKey("/Type").isNameAndEquals("/Catalog")) { | |
| 719 | 718 | warn(m->c.damagedPDF("", -1, "catalog /Type entry missing or invalid")); |
| 720 | 719 | root.replaceKey("/Type", "/Catalog"_qpdf); |
| 721 | 720 | } | ... | ... |
libqpdf/QPDFJob.cc
| ... | ... | @@ -30,18 +30,18 @@ |
| 30 | 30 | |
| 31 | 31 | using namespace qpdf; |
| 32 | 32 | |
| 33 | -using Doc = QPDF::Doc; | |
| 34 | -using Pages = Doc::Pages; | |
| 33 | +using QDoc = QPDF::Doc; | |
| 34 | +using Pages = QDoc::Pages; | |
| 35 | 35 | |
| 36 | 36 | // JobSetter class is restricted to QPDFJob. |
| 37 | -class Doc::JobSetter | |
| 37 | +class QDoc::JobSetter | |
| 38 | 38 | { |
| 39 | 39 | public: |
| 40 | 40 | // Enable enhanced warnings for pdf file checking. |
| 41 | 41 | static void |
| 42 | 42 | setCheckMode(QPDF& qpdf, bool val) |
| 43 | 43 | { |
| 44 | - qpdf.m->check_mode = val; | |
| 44 | + qpdf.m->cf.check_mode_ = val; | |
| 45 | 45 | } |
| 46 | 46 | }; |
| 47 | 47 | |
| ... | ... | @@ -749,7 +749,7 @@ QPDFJob::doCheck(QPDF& pdf) |
| 749 | 749 | bool okay = true; |
| 750 | 750 | auto& cout = *m->log->getInfo(); |
| 751 | 751 | cout << "checking " << m->infile_name() << "\n"; |
| 752 | - Doc::JobSetter::setCheckMode(pdf, true); | |
| 752 | + QDoc::JobSetter::setCheckMode(pdf, true); | |
| 753 | 753 | try { |
| 754 | 754 | int extension_level = pdf.getExtensionLevel(); |
| 755 | 755 | cout << "PDF Version: " << pdf.getPDFVersion(); | ... | ... |
libqpdf/QPDFWriter.cc
| ... | ... | @@ -27,8 +27,8 @@ |
| 27 | 27 | using namespace std::literals; |
| 28 | 28 | using namespace qpdf; |
| 29 | 29 | |
| 30 | -using Doc = QPDF::Doc; | |
| 31 | -using Encryption = Doc::Encryption; | |
| 30 | +using QDoc = QPDF::Doc; | |
| 31 | +using Encryption = QDoc::Encryption; | |
| 32 | 32 | |
| 33 | 33 | QPDFWriter::ProgressReporter::~ProgressReporter() // NOLINT (modernize-use-equals-default) |
| 34 | 34 | { |
| ... | ... | @@ -263,7 +263,7 @@ Pl_stack::Popper::pop() |
| 263 | 263 | } |
| 264 | 264 | |
| 265 | 265 | // Writer class is restricted to QPDFWriter so that only it can call certain methods. |
| 266 | -class Doc::Writer: Doc::Common | |
| 266 | +class QPDF::Doc::Writer: QPDF::Doc::Common | |
| 267 | 267 | { |
| 268 | 268 | friend class QPDFWriter; |
| 269 | 269 | Writer(QPDF& qpdf) : | ... | ... |
libqpdf/QPDF_Stream.cc
| ... | ... | @@ -30,7 +30,7 @@ using Streams = QPDF::Doc::Objects::Streams; |
| 30 | 30 | bool |
| 31 | 31 | Streams::immediate_copy_from() const |
| 32 | 32 | { |
| 33 | - return qpdf.m->immediate_copy_from; | |
| 33 | + return qpdf.m->cf.immediate_copy_from_; | |
| 34 | 34 | } |
| 35 | 35 | |
| 36 | 36 | class Streams::Copier final: public QPDFObjectHandle::StreamDataProvider | ... | ... |
libqpdf/QPDF_encryption.cc
| ... | ... | @@ -904,7 +904,7 @@ QPDF::EncryptionParameters::initialize(QPDF& qpdf) |
| 904 | 904 | } |
| 905 | 905 | |
| 906 | 906 | Encryption data(V, R, Length / 8, p, O, U, OE, UE, Perms, id1, encrypt_metadata); |
| 907 | - if (qm.provided_password_is_hex_key) { | |
| 907 | + if (qm.cf.provided_password_is_hex_key_) { | |
| 908 | 908 | // ignore passwords in file |
| 909 | 909 | encryption_key = QUtil::hex_decode(provided_password); |
| 910 | 910 | return; | ... | ... |
libqpdf/QPDF_linearization.cc
| ... | ... | @@ -1095,25 +1095,27 @@ QPDF::showLinearizationData() |
| 1095 | 1095 | void |
| 1096 | 1096 | Lin::dumpLinearizationDataInternal() |
| 1097 | 1097 | { |
| 1098 | - *m->log->getInfo() << m->file->getName() << ": linearization data:\n\n"; | |
| 1099 | - | |
| 1100 | - *m->log->getInfo() << "file_size: " << m->linp.file_size << "\n" | |
| 1101 | - << "first_page_object: " << m->linp.first_page_object << "\n" | |
| 1102 | - << "first_page_end: " << m->linp.first_page_end << "\n" | |
| 1103 | - << "npages: " << m->linp.npages << "\n" | |
| 1104 | - << "xref_zero_offset: " << m->linp.xref_zero_offset << "\n" | |
| 1105 | - << "first_page: " << m->linp.first_page << "\n" | |
| 1106 | - << "H_offset: " << m->linp.H_offset << "\n" | |
| 1107 | - << "H_length: " << m->linp.H_length << "\n" | |
| 1108 | - << "\n"; | |
| 1109 | - | |
| 1110 | - *m->log->getInfo() << "Page Offsets Hint Table\n\n"; | |
| 1098 | + auto& info = *m->cf.log_->getInfo(); | |
| 1099 | + | |
| 1100 | + info << m->file->getName() << ": linearization data:\n\n"; | |
| 1101 | + | |
| 1102 | + info << "file_size: " << m->linp.file_size << "\n" | |
| 1103 | + << "first_page_object: " << m->linp.first_page_object << "\n" | |
| 1104 | + << "first_page_end: " << m->linp.first_page_end << "\n" | |
| 1105 | + << "npages: " << m->linp.npages << "\n" | |
| 1106 | + << "xref_zero_offset: " << m->linp.xref_zero_offset << "\n" | |
| 1107 | + << "first_page: " << m->linp.first_page << "\n" | |
| 1108 | + << "H_offset: " << m->linp.H_offset << "\n" | |
| 1109 | + << "H_length: " << m->linp.H_length << "\n" | |
| 1110 | + << "\n"; | |
| 1111 | + | |
| 1112 | + info << "Page Offsets Hint Table\n\n"; | |
| 1111 | 1113 | dumpHPageOffset(); |
| 1112 | - *m->log->getInfo() << "\nShared Objects Hint Table\n\n"; | |
| 1114 | + info << "\nShared Objects Hint Table\n\n"; | |
| 1113 | 1115 | dumpHSharedObject(); |
| 1114 | 1116 | |
| 1115 | 1117 | if (m->outline_hints.nobjects > 0) { |
| 1116 | - *m->log->getInfo() << "\nOutlines Hint Table\n\n"; | |
| 1118 | + info << "\nOutlines Hint Table\n\n"; | |
| 1117 | 1119 | dumpHGeneric(m->outline_hints); |
| 1118 | 1120 | } |
| 1119 | 1121 | } |
| ... | ... | @@ -1132,38 +1134,35 @@ Lin::adjusted_offset(qpdf_offset_t offset) |
| 1132 | 1134 | void |
| 1133 | 1135 | Lin::dumpHPageOffset() |
| 1134 | 1136 | { |
| 1137 | + auto& info = *m->cf.log_->getInfo(); | |
| 1135 | 1138 | HPageOffset& t = m->page_offset_hints; |
| 1136 | - *m->log->getInfo() << "min_nobjects: " << t.min_nobjects << "\n" | |
| 1137 | - << "first_page_offset: " << adjusted_offset(t.first_page_offset) << "\n" | |
| 1138 | - << "nbits_delta_nobjects: " << t.nbits_delta_nobjects << "\n" | |
| 1139 | - << "min_page_length: " << t.min_page_length << "\n" | |
| 1140 | - << "nbits_delta_page_length: " << t.nbits_delta_page_length << "\n" | |
| 1141 | - << "min_content_offset: " << t.min_content_offset << "\n" | |
| 1142 | - << "nbits_delta_content_offset: " << t.nbits_delta_content_offset << "\n" | |
| 1143 | - << "min_content_length: " << t.min_content_length << "\n" | |
| 1144 | - << "nbits_delta_content_length: " << t.nbits_delta_content_length << "\n" | |
| 1145 | - << "nbits_nshared_objects: " << t.nbits_nshared_objects << "\n" | |
| 1146 | - << "nbits_shared_identifier: " << t.nbits_shared_identifier << "\n" | |
| 1147 | - << "nbits_shared_numerator: " << t.nbits_shared_numerator << "\n" | |
| 1148 | - << "shared_denominator: " << t.shared_denominator << "\n"; | |
| 1139 | + info << "min_nobjects: " << t.min_nobjects << "\n" | |
| 1140 | + << "first_page_offset: " << adjusted_offset(t.first_page_offset) << "\n" | |
| 1141 | + << "nbits_delta_nobjects: " << t.nbits_delta_nobjects << "\n" | |
| 1142 | + << "min_page_length: " << t.min_page_length << "\n" | |
| 1143 | + << "nbits_delta_page_length: " << t.nbits_delta_page_length << "\n" | |
| 1144 | + << "min_content_offset: " << t.min_content_offset << "\n" | |
| 1145 | + << "nbits_delta_content_offset: " << t.nbits_delta_content_offset << "\n" | |
| 1146 | + << "min_content_length: " << t.min_content_length << "\n" | |
| 1147 | + << "nbits_delta_content_length: " << t.nbits_delta_content_length << "\n" | |
| 1148 | + << "nbits_nshared_objects: " << t.nbits_nshared_objects << "\n" | |
| 1149 | + << "nbits_shared_identifier: " << t.nbits_shared_identifier << "\n" | |
| 1150 | + << "nbits_shared_numerator: " << t.nbits_shared_numerator << "\n" | |
| 1151 | + << "shared_denominator: " << t.shared_denominator << "\n"; | |
| 1149 | 1152 | |
| 1150 | 1153 | for (size_t i1 = 0; i1 < m->linp.npages; ++i1) { |
| 1151 | 1154 | HPageOffsetEntry& pe = t.entries.at(i1); |
| 1152 | - *m->log->getInfo() << "Page " << i1 << ":\n" | |
| 1153 | - << " nobjects: " << pe.delta_nobjects + t.min_nobjects << "\n" | |
| 1154 | - << " length: " << pe.delta_page_length + t.min_page_length | |
| 1155 | - << "\n" | |
| 1156 | - // content offset is relative to page, not file | |
| 1157 | - << " content_offset: " << pe.delta_content_offset + t.min_content_offset | |
| 1158 | - << "\n" | |
| 1159 | - << " content_length: " << pe.delta_content_length + t.min_content_length | |
| 1160 | - << "\n" | |
| 1161 | - << " nshared_objects: " << pe.nshared_objects << "\n"; | |
| 1155 | + info << "Page " << i1 << ":\n" | |
| 1156 | + << " nobjects: " << pe.delta_nobjects + t.min_nobjects << "\n" | |
| 1157 | + << " length: " << pe.delta_page_length + t.min_page_length | |
| 1158 | + << "\n" | |
| 1159 | + // content offset is relative to page, not file | |
| 1160 | + << " content_offset: " << pe.delta_content_offset + t.min_content_offset << "\n" | |
| 1161 | + << " content_length: " << pe.delta_content_length + t.min_content_length << "\n" | |
| 1162 | + << " nshared_objects: " << pe.nshared_objects << "\n"; | |
| 1162 | 1163 | for (size_t i2 = 0; i2 < toS(pe.nshared_objects); ++i2) { |
| 1163 | - *m->log->getInfo() << " identifier " << i2 << ": " << pe.shared_identifiers.at(i2) | |
| 1164 | - << "\n"; | |
| 1165 | - *m->log->getInfo() << " numerator " << i2 << ": " << pe.shared_numerators.at(i2) | |
| 1166 | - << "\n"; | |
| 1164 | + info << " identifier " << i2 << ": " << pe.shared_identifiers.at(i2) << "\n"; | |
| 1165 | + info << " numerator " << i2 << ": " << pe.shared_numerators.at(i2) << "\n"; | |
| 1167 | 1166 | } |
| 1168 | 1167 | } |
| 1169 | 1168 | } |
| ... | ... | @@ -1171,27 +1170,27 @@ Lin::dumpHPageOffset() |
| 1171 | 1170 | void |
| 1172 | 1171 | Lin::dumpHSharedObject() |
| 1173 | 1172 | { |
| 1173 | + auto& info = *m->cf.log_->getInfo(); | |
| 1174 | 1174 | HSharedObject& t = m->shared_object_hints; |
| 1175 | - *m->log->getInfo() << "first_shared_obj: " << t.first_shared_obj << "\n" | |
| 1176 | - << "first_shared_offset: " << adjusted_offset(t.first_shared_offset) << "\n" | |
| 1177 | - << "nshared_first_page: " << t.nshared_first_page << "\n" | |
| 1178 | - << "nshared_total: " << t.nshared_total << "\n" | |
| 1179 | - << "nbits_nobjects: " << t.nbits_nobjects << "\n" | |
| 1180 | - << "min_group_length: " << t.min_group_length << "\n" | |
| 1181 | - << "nbits_delta_group_length: " << t.nbits_delta_group_length << "\n"; | |
| 1175 | + info << "first_shared_obj: " << t.first_shared_obj << "\n" | |
| 1176 | + << "first_shared_offset: " << adjusted_offset(t.first_shared_offset) << "\n" | |
| 1177 | + << "nshared_first_page: " << t.nshared_first_page << "\n" | |
| 1178 | + << "nshared_total: " << t.nshared_total << "\n" | |
| 1179 | + << "nbits_nobjects: " << t.nbits_nobjects << "\n" | |
| 1180 | + << "min_group_length: " << t.min_group_length << "\n" | |
| 1181 | + << "nbits_delta_group_length: " << t.nbits_delta_group_length << "\n"; | |
| 1182 | 1182 | |
| 1183 | 1183 | for (size_t i = 0; i < toS(t.nshared_total); ++i) { |
| 1184 | 1184 | HSharedObjectEntry& se = t.entries.at(i); |
| 1185 | - *m->log->getInfo() << "Shared Object " << i << ":\n" | |
| 1186 | - << " group length: " << se.delta_group_length + t.min_group_length | |
| 1187 | - << "\n"; | |
| 1185 | + info << "Shared Object " << i << ":\n" | |
| 1186 | + << " group length: " << se.delta_group_length + t.min_group_length << "\n"; | |
| 1188 | 1187 | // PDF spec says signature present nobjects_minus_one are always 0, so print them only if |
| 1189 | 1188 | // they have a non-zero value. |
| 1190 | 1189 | if (se.signature_present) { |
| 1191 | - *m->log->getInfo() << " signature present\n"; | |
| 1190 | + info << " signature present\n"; | |
| 1192 | 1191 | } |
| 1193 | 1192 | if (se.nobjects_minus_one != 0) { |
| 1194 | - *m->log->getInfo() << " nobjects: " << se.nobjects_minus_one + 1 << "\n"; | |
| 1193 | + info << " nobjects: " << se.nobjects_minus_one + 1 << "\n"; | |
| 1195 | 1194 | } |
| 1196 | 1195 | } |
| 1197 | 1196 | } |
| ... | ... | @@ -1199,10 +1198,11 @@ Lin::dumpHSharedObject() |
| 1199 | 1198 | void |
| 1200 | 1199 | Lin::dumpHGeneric(HGeneric& t) |
| 1201 | 1200 | { |
| 1202 | - *m->log->getInfo() << "first_object: " << t.first_object << "\n" | |
| 1203 | - << "first_object_offset: " << adjusted_offset(t.first_object_offset) << "\n" | |
| 1204 | - << "nobjects: " << t.nobjects << "\n" | |
| 1205 | - << "group_length: " << t.group_length << "\n"; | |
| 1201 | + *m->cf.log_->getInfo() << "first_object: " << t.first_object << "\n" | |
| 1202 | + << "first_object_offset: " << adjusted_offset(t.first_object_offset) | |
| 1203 | + << "\n" | |
| 1204 | + << "nobjects: " << t.nobjects << "\n" | |
| 1205 | + << "group_length: " << t.group_length << "\n"; | |
| 1206 | 1206 | } |
| 1207 | 1207 | |
| 1208 | 1208 | template <typename T> | ... | ... |
libqpdf/QPDF_objects.cc
| ... | ... | @@ -157,7 +157,7 @@ Objects::parse(char const* password) |
| 157 | 157 | throw damagedPDF("", -1, std::string("error reading xref: ") + e.what()); |
| 158 | 158 | } |
| 159 | 159 | } catch (QPDFExc& e) { |
| 160 | - if (m->attempt_recovery) { | |
| 160 | + if (m->cf.attempt_recovery_) { | |
| 161 | 161 | reconstruct_xref(e, xref_offset > 0); |
| 162 | 162 | } else { |
| 163 | 163 | throw; |
| ... | ... | @@ -736,7 +736,7 @@ Objects::read_xrefTable(qpdf_offset_t xref_offset) |
| 736 | 736 | } |
| 737 | 737 | |
| 738 | 738 | if (cur_trailer.hasKey("/XRefStm")) { |
| 739 | - if (m->ignore_xref_streams) { | |
| 739 | + if (m->cf.ignore_xref_streams_) { | |
| 740 | 740 | QTC::TC("qpdf", "QPDF ignoring XRefStm in trailer"); |
| 741 | 741 | } else { |
| 742 | 742 | if (cur_trailer.getKey("/XRefStm").isInteger()) { |
| ... | ... | @@ -763,7 +763,7 @@ Objects::read_xrefTable(qpdf_offset_t xref_offset) |
| 763 | 763 | qpdf_offset_t |
| 764 | 764 | Objects::read_xrefStream(qpdf_offset_t xref_offset, bool in_stream_recovery) |
| 765 | 765 | { |
| 766 | - if (!m->ignore_xref_streams) { | |
| 766 | + if (!m->cf.ignore_xref_streams_) { | |
| 767 | 767 | QPDFObjectHandle xref_obj; |
| 768 | 768 | try { |
| 769 | 769 | m->in_read_xref_stream = true; |
| ... | ... | @@ -1073,7 +1073,7 @@ Objects::insertFreeXrefEntry(QPDFObjGen og) |
| 1073 | 1073 | void |
| 1074 | 1074 | QPDF::showXRefTable() |
| 1075 | 1075 | { |
| 1076 | - auto& cout = *m->log->getInfo(); | |
| 1076 | + auto& cout = *m->cf.log_->getInfo(); | |
| 1077 | 1077 | for (auto const& iter: m->xref_table) { |
| 1078 | 1078 | QPDFObjGen const& og = iter.first; |
| 1079 | 1079 | QPDFXRefEntry const& entry = iter.second; |
| ... | ... | @@ -1084,15 +1084,15 @@ QPDF::showXRefTable() |
| 1084 | 1084 | break; |
| 1085 | 1085 | |
| 1086 | 1086 | case 2: |
| 1087 | - *m->log->getInfo() << "compressed; stream = " << entry.getObjStreamNumber() | |
| 1088 | - << ", index = " << entry.getObjStreamIndex(); | |
| 1087 | + *m->cf.log_->getInfo() << "compressed; stream = " << entry.getObjStreamNumber() | |
| 1088 | + << ", index = " << entry.getObjStreamIndex(); | |
| 1089 | 1089 | break; |
| 1090 | 1090 | |
| 1091 | 1091 | default: |
| 1092 | 1092 | throw std::logic_error("unknown cross-reference table type while showing xref_table"); |
| 1093 | 1093 | break; |
| 1094 | 1094 | } |
| 1095 | - m->log->info("\n"); | |
| 1095 | + m->cf.log_->info("\n"); | |
| 1096 | 1096 | } |
| 1097 | 1097 | } |
| 1098 | 1098 | |
| ... | ... | @@ -1248,7 +1248,7 @@ Objects::readStream(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset_t offse |
| 1248 | 1248 | throw damagedPDF("expected endstream"); |
| 1249 | 1249 | } |
| 1250 | 1250 | } catch (QPDFExc& e) { |
| 1251 | - if (m->attempt_recovery) { | |
| 1251 | + if (m->cf.attempt_recovery_) { | |
| 1252 | 1252 | warn(e); |
| 1253 | 1253 | length = recoverStreamLength(m->file, og, stream_offset); |
| 1254 | 1254 | } else { |
| ... | ... | @@ -1431,7 +1431,7 @@ Objects::readObjectAtOffset( |
| 1431 | 1431 | QPDFObjGen og; |
| 1432 | 1432 | setLastObjectDescription(description, exp_og); |
| 1433 | 1433 | |
| 1434 | - if (!m->attempt_recovery) { | |
| 1434 | + if (!m->cf.attempt_recovery_) { | |
| 1435 | 1435 | try_recovery = false; |
| 1436 | 1436 | } |
| 1437 | 1437 | ... | ... |
libqpdf/qpdf/QPDF_private.hh
| ... | ... | @@ -5,6 +5,7 @@ |
| 5 | 5 | |
| 6 | 6 | #include <qpdf/QPDFAcroFormDocumentHelper.hh> |
| 7 | 7 | #include <qpdf/QPDFEmbeddedFileDocumentHelper.hh> |
| 8 | +#include <qpdf/QPDFLogger.hh> | |
| 8 | 9 | #include <qpdf/QPDFObject_private.hh> |
| 9 | 10 | #include <qpdf/QPDFOutlineDocumentHelper.hh> |
| 10 | 11 | #include <qpdf/QPDFPageDocumentHelper.hh> |
| ... | ... | @@ -20,6 +21,31 @@ namespace qpdf |
| 20 | 21 | { |
| 21 | 22 | class OffsetBuffer; |
| 22 | 23 | } // namespace is |
| 24 | + | |
| 25 | + class Doc: public QPDF | |
| 26 | + { | |
| 27 | + public: | |
| 28 | + class Config | |
| 29 | + { | |
| 30 | + friend class QPDF; | |
| 31 | + | |
| 32 | + Config() : | |
| 33 | + log_(QPDFLogger::defaultLogger()) | |
| 34 | + { | |
| 35 | + } | |
| 36 | + | |
| 37 | + std::shared_ptr<QPDFLogger> log_; | |
| 38 | + | |
| 39 | + size_t max_warnings_{0}; | |
| 40 | + | |
| 41 | + bool provided_password_is_hex_key_{false}; | |
| 42 | + bool ignore_xref_streams_{false}; | |
| 43 | + bool suppress_warnings_{false}; | |
| 44 | + bool attempt_recovery_{true}; | |
| 45 | + bool check_mode_{false}; | |
| 46 | + bool immediate_copy_from_{false}; | |
| 47 | + }; // Class Config | |
| 48 | + }; // class Doc | |
| 23 | 49 | } // namespace qpdf |
| 24 | 50 | |
| 25 | 51 | class BitStream; |
| ... | ... | @@ -421,10 +447,13 @@ class QPDF::Doc |
| 421 | 447 | return *page_labels_; |
| 422 | 448 | } |
| 423 | 449 | |
| 424 | - private: | |
| 450 | + protected: | |
| 425 | 451 | QPDF& qpdf; |
| 426 | 452 | QPDF::Members* m; |
| 427 | 453 | |
| 454 | + qpdf::Doc::Config cf; | |
| 455 | + | |
| 456 | + private: | |
| 428 | 457 | // Document Helpers; |
| 429 | 458 | std::unique_ptr<QPDFAcroFormDocumentHelper> acroform_; |
| 430 | 459 | std::unique_ptr<QPDFEmbeddedFileDocumentHelper> embedded_files_; |
| ... | ... | @@ -969,18 +998,11 @@ class QPDF::Members: Doc |
| 969 | 998 | Doc::Linearization lin; |
| 970 | 999 | Doc::Objects objects; |
| 971 | 1000 | Doc::Pages pages; |
| 972 | - std::shared_ptr<QPDFLogger> log; | |
| 973 | 1001 | unsigned long long unique_id{0}; |
| 974 | 1002 | qpdf::Tokenizer tokenizer; |
| 975 | 1003 | std::shared_ptr<InputSource> file; |
| 976 | 1004 | std::string last_object_description; |
| 977 | 1005 | std::shared_ptr<QPDFObject::Description> last_ostream_description; |
| 978 | - bool provided_password_is_hex_key{false}; | |
| 979 | - bool ignore_xref_streams{false}; | |
| 980 | - bool suppress_warnings{false}; | |
| 981 | - size_t max_warnings{0}; | |
| 982 | - bool attempt_recovery{true}; | |
| 983 | - bool check_mode{false}; | |
| 984 | 1006 | std::shared_ptr<EncryptionParameters> encp; |
| 985 | 1007 | std::string pdf_version; |
| 986 | 1008 | std::map<QPDFObjGen, QPDFXRefEntry> xref_table; |
| ... | ... | @@ -995,7 +1017,6 @@ class QPDF::Members: Doc |
| 995 | 1017 | bool reconstructed_xref{false}; |
| 996 | 1018 | bool in_read_xref_stream{false}; |
| 997 | 1019 | bool fixed_dangling_refs{false}; |
| 998 | - bool immediate_copy_from{false}; | |
| 999 | 1020 | bool in_parse{false}; |
| 1000 | 1021 | bool parsed{false}; |
| 1001 | 1022 | std::set<int> resolved_object_streams; | ... | ... |