Commit b1d845e708f99f5a77a27b2c0ca088f2f69ea4dd

Authored by m-holger
1 parent db06e075

Split QPDF member file into file and file_sp to facilitate aliasing

To be encapsulated later.
libqpdf/QPDF.cc
@@ -198,7 +198,8 @@ QPDF::EncryptionParameters::EncryptionParameters() : @@ -198,7 +198,8 @@ QPDF::EncryptionParameters::EncryptionParameters() :
198 198
199 QPDF::Members::Members(QPDF& qpdf) : 199 QPDF::Members::Members(QPDF& qpdf) :
200 log(QPDFLogger::defaultLogger()), 200 log(QPDFLogger::defaultLogger()),
201 - file(new InvalidInputSource()), 201 + file_sp(new InvalidInputSource()),
  202 + file(file_sp.get()),
202 encp(new EncryptionParameters), 203 encp(new EncryptionParameters),
203 xref_table(qpdf) 204 xref_table(qpdf)
204 { 205 {
@@ -272,14 +273,16 @@ QPDF::processMemoryFile( @@ -272,14 +273,16 @@ QPDF::processMemoryFile(
272 void 273 void
273 QPDF::processInputSource(std::shared_ptr<InputSource> source, char const* password) 274 QPDF::processInputSource(std::shared_ptr<InputSource> source, char const* password)
274 { 275 {
275 - m->file = source; 276 + m->file_sp = source;
  277 + m->file = source.get();
276 parse(password); 278 parse(password);
277 } 279 }
278 280
279 void 281 void
280 QPDF::closeInputSource() 282 QPDF::closeInputSource()
281 { 283 {
282 - m->file = std::shared_ptr<InputSource>(new InvalidInputSource()); 284 + m->file_sp = std::shared_ptr<InputSource>(new InvalidInputSource());
  285 + m->file = m->file_sp.get();
283 } 286 }
284 287
285 void 288 void
@@ -412,7 +415,9 @@ QPDF::findHeader() @@ -412,7 +415,9 @@ QPDF::findHeader()
412 // PDF header, all explicit offsets in the file are such that 0 points to the beginning 415 // PDF header, all explicit offsets in the file are such that 0 points to the beginning
413 // of the header. 416 // of the header.
414 QTC::TC("qpdf", "QPDF global offset"); 417 QTC::TC("qpdf", "QPDF global offset");
415 - m->file = std::shared_ptr<InputSource>(new OffsetInputSource(m->file, global_offset)); 418 + m->file_sp =
  419 + std::shared_ptr<InputSource>(new OffsetInputSource(m->file_sp, global_offset));
  420 + m->file = m->file_sp.get();
416 } 421 }
417 } 422 }
418 return valid; 423 return valid;
@@ -1541,7 +1546,7 @@ QPDF::readStream(QPDFObjectHandle&amp; object, QPDFObjGen og, qpdf_offset_t offset) @@ -1541,7 +1546,7 @@ QPDF::readStream(QPDFObjectHandle&amp; object, QPDFObjGen og, qpdf_offset_t offset)
1541 } catch (QPDFExc& e) { 1546 } catch (QPDFExc& e) {
1542 if (m->attempt_recovery) { 1547 if (m->attempt_recovery) {
1543 warn(e); 1548 warn(e);
1544 - length = recoverStreamLength(m->file, og, stream_offset); 1549 + length = recoverStreamLength(m->file_sp, og, stream_offset);
1545 } else { 1550 } else {
1546 throw; 1551 throw;
1547 } 1552 }
@@ -2452,7 +2457,7 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign) @@ -2452,7 +2457,7 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign)
2452 } else { 2457 } else {
2453 auto foreign_stream_data = std::make_shared<ForeignStreamData>( 2458 auto foreign_stream_data = std::make_shared<ForeignStreamData>(
2454 foreign_stream_qpdf.m->encp, 2459 foreign_stream_qpdf.m->encp,
2455 - foreign_stream_qpdf.m->file, 2460 + foreign_stream_qpdf.m->file_sp,
2456 foreign.getObjGen(), 2461 foreign.getObjGen(),
2457 stream->getParsedOffset(), 2462 stream->getParsedOffset(),
2458 stream->getLength(), 2463 stream->getLength(),
@@ -2776,7 +2781,7 @@ QPDF::pipeStreamData( @@ -2776,7 +2781,7 @@ QPDF::pipeStreamData(
2776 { 2781 {
2777 return pipeStreamData( 2782 return pipeStreamData(
2778 m->encp, 2783 m->encp,
2779 - m->file, 2784 + m->file_sp,
2780 *this, 2785 *this,
2781 og, 2786 og,
2782 offset, 2787 offset,
libqpdf/qpdf/QPDF_private.hh
@@ -528,7 +528,9 @@ class QPDF::Members @@ -528,7 +528,9 @@ class QPDF::Members
528 std::shared_ptr<QPDFLogger> log; 528 std::shared_ptr<QPDFLogger> log;
529 unsigned long long unique_id{0}; 529 unsigned long long unique_id{0};
530 QPDFTokenizer tokenizer; 530 QPDFTokenizer tokenizer;
531 - std::shared_ptr<InputSource> file; 531 + // If file_sp is updated, file must also be updated.
  532 + std::shared_ptr<InputSource> file_sp;
  533 + InputSource* file;
532 std::string last_object_description; 534 std::string last_object_description;
533 bool provided_password_is_hex_key{false}; 535 bool provided_password_is_hex_key{false};
534 bool suppress_warnings{false}; 536 bool suppress_warnings{false};