/src/qpdf/libqpdf/OffsetInputSource.cc
Line | Count | Source (jump to first uncovered line) |
1 | | #include <qpdf/OffsetInputSource.hh> |
2 | | |
3 | | #include <limits> |
4 | | #include <sstream> |
5 | | #include <stdexcept> |
6 | | |
7 | | OffsetInputSource::OffsetInputSource( |
8 | | std::shared_ptr<InputSource> proxied, qpdf_offset_t global_offset) : |
9 | 0 | proxied(proxied), |
10 | 0 | global_offset(global_offset) |
11 | 0 | { |
12 | 0 | if (global_offset < 0) { |
13 | 0 | throw std::logic_error("OffsetInputSource constructed with negative offset"); |
14 | 0 | } |
15 | 0 | this->max_safe_offset = std::numeric_limits<qpdf_offset_t>::max() - global_offset; |
16 | 0 | } |
17 | | |
18 | | qpdf_offset_t |
19 | | OffsetInputSource::findAndSkipNextEOL() |
20 | 0 | { |
21 | 0 | return this->proxied->findAndSkipNextEOL() - this->global_offset; |
22 | 0 | } |
23 | | |
24 | | std::string const& |
25 | | OffsetInputSource::getName() const |
26 | 0 | { |
27 | 0 | return this->proxied->getName(); |
28 | 0 | } |
29 | | |
30 | | qpdf_offset_t |
31 | | OffsetInputSource::tell() |
32 | 0 | { |
33 | 0 | return this->proxied->tell() - this->global_offset; |
34 | 0 | } |
35 | | |
36 | | void |
37 | | OffsetInputSource::seek(qpdf_offset_t offset, int whence) |
38 | 0 | { |
39 | 0 | if (whence == SEEK_SET) { |
40 | 0 | if (offset > this->max_safe_offset) { |
41 | 0 | std::ostringstream msg; |
42 | 0 | msg.imbue(std::locale::classic()); |
43 | 0 | msg << "seeking to " << offset << " offset by " << global_offset |
44 | 0 | << " would cause an overflow of the offset type"; |
45 | 0 | throw std::range_error(msg.str()); |
46 | 0 | } |
47 | 0 | this->proxied->seek(offset + global_offset, whence); |
48 | 0 | } else { |
49 | 0 | this->proxied->seek(offset, whence); |
50 | 0 | } |
51 | 0 | if (tell() < 0) { |
52 | 0 | throw std::runtime_error("offset input source: seek before beginning of file"); |
53 | 0 | } |
54 | 0 | } |
55 | | |
56 | | void |
57 | | OffsetInputSource::rewind() |
58 | 0 | { |
59 | 0 | seek(0, SEEK_SET); |
60 | 0 | } |
61 | | |
62 | | size_t |
63 | | OffsetInputSource::read(char* buffer, size_t length) |
64 | 0 | { |
65 | 0 | size_t result = this->proxied->read(buffer, length); |
66 | 0 | this->setLastOffset(this->proxied->getLastOffset() - global_offset); |
67 | 0 | return result; |
68 | 0 | } |
69 | | |
70 | | void |
71 | | OffsetInputSource::unreadCh(char ch) |
72 | 0 | { |
73 | 0 | this->proxied->unreadCh(ch); |
74 | 0 | } |