Commit 92a8c888ba45f33db212f22d9082f2051e00c6d5

Authored by m-holger
1 parent 05e52843

Refactor `Pl_Base64` to add static `encode` and `decode` methods, streamline enc…

…oding/decoding logic, and simplify usage in `JSON_writer` and `QPDF_json`.
libqpdf/Pl_Base64.cc
... ... @@ -33,9 +33,6 @@ Pl_Base64::Pl_Base64(char const* identifier, Pipeline* next, action_e action) :
33 33 Pipeline(identifier, next),
34 34 action(action)
35 35 {
36   - if (!next) {
37   - throw std::logic_error("Attempt to create Pl_Base64 with nullptr as next");
38   - }
39 36 }
40 37  
41 38 void
... ... @@ -44,9 +41,25 @@ Pl_Base64::write(unsigned char const* data, size_t len)
44 41 in_buffer.append(reinterpret_cast<const char*>(data), len);
45 42 }
46 43  
47   -void
  44 +std::string
48 45 Pl_Base64::decode(std::string_view data)
49 46 {
  47 + Pl_Base64 p("base64-decode", nullptr, a_decode);
  48 + p.decode_internal(data);
  49 + return std::move(p.out_buffer);
  50 +}
  51 +
  52 +std::string
  53 +Pl_Base64::encode(std::string_view data)
  54 +{
  55 + Pl_Base64 p("base64-encode", nullptr, a_encode);
  56 + p.encode_internal(data);
  57 + return std::move(p.out_buffer);
  58 +}
  59 +
  60 +void
  61 +Pl_Base64::decode_internal(std::string_view data)
  62 +{
50 63 auto len = data.size();
51 64 auto res = (len / 4u + 1u) * 3u;
52 65 out_buffer.reserve(res);
... ... @@ -71,7 +84,7 @@ Pl_Base64::decode(std::string_view data)
71 84 }
72 85  
73 86 void
74   -Pl_Base64::encode(std::string_view data)
  87 +Pl_Base64::encode_internal(std::string_view data)
75 88 {
76 89 auto len = data.size();
77 90 static const size_t max_len = (std::string().max_size() / 4u - 1u) * 3u;
... ... @@ -177,17 +190,19 @@ void
177 190 Pl_Base64::finish()
178 191 {
179 192 if (action == a_decode) {
180   - decode(in_buffer);
  193 + decode_internal(in_buffer);
181 194  
182 195 } else {
183   - encode(in_buffer);
  196 + encode_internal(in_buffer);
  197 + }
  198 + if (next()) {
  199 + in_buffer.clear();
  200 + in_buffer.shrink_to_fit();
  201 + next()->write(reinterpret_cast<unsigned char const*>(out_buffer.data()), out_buffer.size());
  202 + out_buffer.clear();
  203 + out_buffer.shrink_to_fit();
  204 + next()->finish();
184 205 }
185   - in_buffer.clear();
186   - in_buffer.shrink_to_fit();
187   - next()->write(reinterpret_cast<unsigned char const*>(out_buffer.data()), out_buffer.size());
188   - out_buffer.clear();
189   - out_buffer.shrink_to_fit();
190   - next()->finish();
191 206 }
192 207  
193 208 void
... ...
libqpdf/QPDF_json.cc
... ... @@ -216,10 +216,10 @@ static std::function&lt;void(Pipeline*)&gt;
216 216 provide_data(std::shared_ptr<InputSource> is, qpdf_offset_t start, qpdf_offset_t end)
217 217 {
218 218 return [is, start, end](Pipeline* p) {
219   - Pl_Base64 decode("base64-decode", p, Pl_Base64::a_decode);
220 219 auto data = is->read(QIntC::to_size(end - start), start);
221   - decode.write(reinterpret_cast<const unsigned char*>(data.data()), data.size());
222   - decode.finish();
  220 + data = Pl_Base64::decode(data);
  221 + p->write(reinterpret_cast<const unsigned char*>(data.data()), data.size());
  222 + p->finish();
223 223 };
224 224 }
225 225  
... ...
libqpdf/qpdf/JSON_writer.hh
... ... @@ -32,10 +32,8 @@ class JSON::Writer
32 32 Writer&
33 33 writeBase64(std::string_view sv)
34 34 {
35   - Pl_Concatenate cat{"writer concat", p};
36   - Pl_Base64 base{"writer base64", &cat, Pl_Base64::a_encode};
37   - base.write(reinterpret_cast<unsigned char const*>(sv.data()), sv.size());
38   - base.finish();
  35 + auto encoded = Pl_Base64::encode(sv);
  36 + p->write(reinterpret_cast<unsigned char const*>(encoded.data()), encoded.size());
39 37 return *this;
40 38 }
41 39  
... ...
libqpdf/qpdf/Pl_Base64.hh
... ... @@ -12,9 +12,12 @@ class Pl_Base64 final: public Pipeline
12 12 void write(unsigned char const* buf, size_t len) final;
13 13 void finish() final;
14 14  
  15 + static std::string encode(std::string_view data);
  16 + static std::string decode(std::string_view data);
  17 +
15 18 private:
16   - void decode(std::string_view data);
17   - void encode(std::string_view data);
  19 + void decode_internal(std::string_view data);
  20 + void encode_internal(std::string_view data);
18 21 void flush_decode();
19 22 void flush_encode();
20 23 void reset();
... ...