Pl_MD5.hh
1.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#ifndef PL_MD5_HH
#define PL_MD5_HH
#include <qpdf/MD5.hh>
#include <qpdf/Pipeline.hh>
#include <stdexcept>
// This pipeline sends its output to its successor unmodified. After calling finish, the MD5
// checksum of the data that passed through the pipeline is available.
// This pipeline is reusable; i.e., it is safe to call write() after calling finish(). The first
// call to write() after a call to finish() initializes a new MD5 object.
class Pl_MD5 final: public Pipeline
{
public:
Pl_MD5(char const* identifier, Pipeline* next = nullptr) :
Pipeline(identifier, next)
{
}
~Pl_MD5() final = default;
void write(unsigned char const*, size_t) final;
void
finish() final
{
if (next()) {
next()->finish();
}
if (!persist_across_finish) {
in_progress = false;
}
}
std::string
getHexDigest()
{
if (!enabled) {
throw std::logic_error("digest requested for a disabled MD5 Pipeline");
}
in_progress = false;
return md5.unparse();
}
// Enable/disable. Disabling the pipeline causes it to become a pass-through. This makes it
// possible to stick an MD5 pipeline in a pipeline when it may or may not be required. Disabling
// it avoids incurring the runtime overhead of doing needless digest computation.
void
enable(bool val)
{
enabled = val;
}
// If persistAcrossFinish is called, calls to finish do not finalize the underlying md5 object.
// In this case, the object is not finalized until getHexDigest() is called.
void
persistAcrossFinish(bool val)
{
persist_across_finish = val;
}
private:
bool in_progress{false};
MD5 md5;
bool enabled{true};
bool persist_across_finish{false};
};
#endif // PL_MD5_HH