diff options
Diffstat (limited to 'libqpdf/Pl_MD5.cc')
-rw-r--r-- | libqpdf/Pl_MD5.cc | 61 |
1 files changed, 41 insertions, 20 deletions
diff --git a/libqpdf/Pl_MD5.cc b/libqpdf/Pl_MD5.cc index 3a78cb33..0510e50e 100644 --- a/libqpdf/Pl_MD5.cc +++ b/libqpdf/Pl_MD5.cc @@ -3,7 +3,9 @@ Pl_MD5::Pl_MD5(char const* identifier, Pipeline* next) : Pipeline(identifier, next), - in_progress(false) + in_progress(false), + enabled(true), + persist_across_finish(false) { } @@ -14,24 +16,27 @@ Pl_MD5::~Pl_MD5() void Pl_MD5::write(unsigned char* buf, size_t len) { - if (! this->in_progress) + if (this->enabled) { - this->md5.reset(); - this->in_progress = true; - } + if (! this->in_progress) + { + this->md5.reset(); + this->in_progress = true; + } - // Write in chunks in case len is too big to fit in an int. - // Assume int is at least 32 bits. - static size_t const max_bytes = 1 << 30; - size_t bytes_left = len; - unsigned char* data = buf; - while (bytes_left > 0) - { - size_t bytes = (bytes_left >= max_bytes ? max_bytes : bytes_left); - this->md5.encodeDataIncrementally( - reinterpret_cast<char*>(data), bytes); - bytes_left -= bytes; - data += bytes; + // Write in chunks in case len is too big to fit in an int. + // Assume int is at least 32 bits. + static size_t const max_bytes = 1 << 30; + size_t bytes_left = len; + unsigned char* data = buf; + while (bytes_left > 0) + { + size_t bytes = (bytes_left >= max_bytes ? max_bytes : bytes_left); + this->md5.encodeDataIncrementally( + reinterpret_cast<char*>(data), bytes); + bytes_left -= bytes; + data += bytes; + } } this->getNext()->write(buf, len); @@ -41,16 +46,32 @@ void Pl_MD5::finish() { this->getNext()->finish(); - this->in_progress = false; + if (! this->persist_across_finish) + { + this->in_progress = false; + } +} + +void +Pl_MD5::enable(bool enabled) +{ + this->enabled = enabled; +} + +void +Pl_MD5::persistAcrossFinish(bool persist) +{ + this->persist_across_finish = persist; } std::string Pl_MD5::getHexDigest() { - if (this->in_progress) + if (! this->enabled) { throw std::logic_error( - "digest requested for in-progress MD5 Pipeline"); + "digest requested for a disabled MD5 Pipeline"); } + this->in_progress = false; return this->md5.unparse(); } |