Commit abc300f05c00de72081203d89d9065b25f1ccb3c
1 parent
f0c2e0ef
Replace containers of PointerHolder with containers of std::shared_ptr
None of these are in the public API.
Showing
7 changed files
with
45 additions
and
31 deletions
examples/pdf-create.cc
| @@ -16,6 +16,7 @@ | @@ -16,6 +16,7 @@ | ||
| 16 | #include <qpdf/Pl_DCT.hh> | 16 | #include <qpdf/Pl_DCT.hh> |
| 17 | #include <qpdf/QIntC.hh> | 17 | #include <qpdf/QIntC.hh> |
| 18 | #include <iostream> | 18 | #include <iostream> |
| 19 | +#include <memory> | ||
| 19 | #include <string.h> | 20 | #include <string.h> |
| 20 | #include <stdlib.h> | 21 | #include <stdlib.h> |
| 21 | 22 | ||
| @@ -105,22 +106,25 @@ void | @@ -105,22 +106,25 @@ void | ||
| 105 | ImageProvider::provideStreamData(int objid, int generation, | 106 | ImageProvider::provideStreamData(int objid, int generation, |
| 106 | Pipeline* pipeline) | 107 | Pipeline* pipeline) |
| 107 | { | 108 | { |
| 108 | - std::vector<PointerHolder<Pipeline> > to_delete; | 109 | + std::vector<std::shared_ptr<Pipeline>> to_delete; |
| 109 | Pipeline* p = pipeline; | 110 | Pipeline* p = pipeline; |
| 111 | + std::shared_ptr<Pipeline> p_new; | ||
| 110 | 112 | ||
| 111 | if (filter == "/DCTDecode") | 113 | if (filter == "/DCTDecode") |
| 112 | { | 114 | { |
| 113 | - p = new Pl_DCT( | 115 | + p_new = std::make_shared<Pl_DCT>( |
| 114 | "image encoder", pipeline, | 116 | "image encoder", pipeline, |
| 115 | QIntC::to_uint(width), QIntC::to_uint(getHeight()), | 117 | QIntC::to_uint(width), QIntC::to_uint(getHeight()), |
| 116 | QIntC::to_int(stripes[0].length()), j_color_space); | 118 | QIntC::to_int(stripes[0].length()), j_color_space); |
| 117 | - to_delete.push_back(p); | 119 | + to_delete.push_back(p_new); |
| 120 | + p = p_new.get(); | ||
| 118 | } | 121 | } |
| 119 | else if (filter == "/RunLengthDecode") | 122 | else if (filter == "/RunLengthDecode") |
| 120 | { | 123 | { |
| 121 | - p = new Pl_RunLength( | 124 | + p_new = std::make_shared<Pl_RunLength>( |
| 122 | "image encoder", pipeline, Pl_RunLength::a_encode); | 125 | "image encoder", pipeline, Pl_RunLength::a_encode); |
| 123 | - to_delete.push_back(p); | 126 | + to_delete.push_back(p_new); |
| 127 | + p = p_new.get(); | ||
| 124 | } | 128 | } |
| 125 | 129 | ||
| 126 | for (size_t i = 0; i < n_stripes; ++i) | 130 | for (size_t i = 0; i < n_stripes; ++i) |
include/qpdf/QPDF.hh
| @@ -1024,7 +1024,7 @@ class QPDF | @@ -1024,7 +1024,7 @@ class QPDF | ||
| 1024 | QPDF& qpdf_for_warning, Pipeline*& pipeline, | 1024 | QPDF& qpdf_for_warning, Pipeline*& pipeline, |
| 1025 | int objid, int generation, | 1025 | int objid, int generation, |
| 1026 | QPDFObjectHandle& stream_dict, | 1026 | QPDFObjectHandle& stream_dict, |
| 1027 | - std::vector<PointerHolder<Pipeline> >& heap); | 1027 | + std::vector<std::shared_ptr<Pipeline>>& heap); |
| 1028 | 1028 | ||
| 1029 | // Methods to support object copying | 1029 | // Methods to support object copying |
| 1030 | void reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, | 1030 | void reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, |
include/qpdf/QPDFWriter.hh
| @@ -35,6 +35,7 @@ | @@ -35,6 +35,7 @@ | ||
| 35 | #include <vector> | 35 | #include <vector> |
| 36 | #include <set> | 36 | #include <set> |
| 37 | #include <map> | 37 | #include <map> |
| 38 | +#include <memory> | ||
| 38 | 39 | ||
| 39 | #include <qpdf/Constants.h> | 40 | #include <qpdf/Constants.h> |
| 40 | 41 | ||
| @@ -684,7 +685,7 @@ class QPDFWriter | @@ -684,7 +685,7 @@ class QPDFWriter | ||
| 684 | std::string extra_header_text; | 685 | std::string extra_header_text; |
| 685 | int encryption_dict_objid; | 686 | int encryption_dict_objid; |
| 686 | std::string cur_data_key; | 687 | std::string cur_data_key; |
| 687 | - std::list<PointerHolder<Pipeline> > to_delete; | 688 | + std::list<std::shared_ptr<Pipeline>> to_delete; |
| 688 | Pl_Count* pipeline; | 689 | Pl_Count* pipeline; |
| 689 | std::list<QPDFObjectHandle> object_queue; | 690 | std::list<QPDFObjectHandle> object_queue; |
| 690 | std::map<QPDFObjGen, int> obj_renumber; | 691 | std::map<QPDFObjGen, int> obj_renumber; |
libqpdf/QPDF.cc
| @@ -2910,7 +2910,7 @@ QPDF::pipeStreamData(PointerHolder<EncryptionParameters> encp, | @@ -2910,7 +2910,7 @@ QPDF::pipeStreamData(PointerHolder<EncryptionParameters> encp, | ||
| 2910 | bool suppress_warnings, | 2910 | bool suppress_warnings, |
| 2911 | bool will_retry) | 2911 | bool will_retry) |
| 2912 | { | 2912 | { |
| 2913 | - std::vector<PointerHolder<Pipeline> > to_delete; | 2913 | + std::vector<std::shared_ptr<Pipeline>> to_delete; |
| 2914 | if (encp->encrypted) | 2914 | if (encp->encrypted) |
| 2915 | { | 2915 | { |
| 2916 | decryptStream(encp, file, qpdf_for_warning, | 2916 | decryptStream(encp, file, qpdf_for_warning, |
libqpdf/QPDFWriter.cc
| @@ -132,9 +132,10 @@ QPDFWriter::setOutputFile(char const* description, FILE* file, bool close_file) | @@ -132,9 +132,10 @@ QPDFWriter::setOutputFile(char const* description, FILE* file, bool close_file) | ||
| 132 | this->m->filename = description; | 132 | this->m->filename = description; |
| 133 | this->m->file = file; | 133 | this->m->file = file; |
| 134 | this->m->close_file = close_file; | 134 | this->m->close_file = close_file; |
| 135 | - Pipeline* p = new Pl_StdioFile("qpdf output", file); | 135 | + std::shared_ptr<Pipeline> p = std::make_shared<Pl_StdioFile>( |
| 136 | + "qpdf output", file); | ||
| 136 | this->m->to_delete.push_back(p); | 137 | this->m->to_delete.push_back(p); |
| 137 | - initializePipelineStack(p); | 138 | + initializePipelineStack(p.get()); |
| 138 | } | 139 | } |
| 139 | 140 | ||
| 140 | void | 141 | void |
| @@ -142,7 +143,8 @@ QPDFWriter::setOutputMemory() | @@ -142,7 +143,8 @@ QPDFWriter::setOutputMemory() | ||
| 142 | { | 143 | { |
| 143 | this->m->filename = "memory buffer"; | 144 | this->m->filename = "memory buffer"; |
| 144 | this->m->buffer_pipeline = new Pl_Buffer("qpdf output"); | 145 | this->m->buffer_pipeline = new Pl_Buffer("qpdf output"); |
| 145 | - this->m->to_delete.push_back(this->m->buffer_pipeline); | 146 | + this->m->to_delete.push_back( |
| 147 | + std::shared_ptr<Pipeline>(this->m->buffer_pipeline)); | ||
| 146 | initializePipelineStack(this->m->buffer_pipeline); | 148 | initializePipelineStack(this->m->buffer_pipeline); |
| 147 | } | 149 | } |
| 148 | 150 | ||
| @@ -1051,7 +1053,8 @@ void | @@ -1051,7 +1053,8 @@ void | ||
| 1051 | QPDFWriter::initializePipelineStack(Pipeline *p) | 1053 | QPDFWriter::initializePipelineStack(Pipeline *p) |
| 1052 | { | 1054 | { |
| 1053 | this->m->pipeline = new Pl_Count("pipeline stack base", p); | 1055 | this->m->pipeline = new Pl_Count("pipeline stack base", p); |
| 1054 | - this->m->to_delete.push_back(this->m->pipeline); | 1056 | + this->m->to_delete.push_back( |
| 1057 | + std::shared_ptr<Pipeline>(this->m->pipeline)); | ||
| 1055 | this->m->pipeline_stack.push_back(this->m->pipeline); | 1058 | this->m->pipeline_stack.push_back(this->m->pipeline); |
| 1056 | } | 1059 | } |
| 1057 | 1060 |
libqpdf/QPDF_Stream.cc
| @@ -463,34 +463,36 @@ QPDF_Stream::pipeStreamData(Pipeline* pipeline, bool* filterp, | @@ -463,34 +463,36 @@ QPDF_Stream::pipeStreamData(Pipeline* pipeline, bool* filterp, | ||
| 463 | // create to be deleted when this function finishes. Pipelines | 463 | // create to be deleted when this function finishes. Pipelines |
| 464 | // created by QPDFStreamFilter objects will be deleted by those | 464 | // created by QPDFStreamFilter objects will be deleted by those |
| 465 | // objects. | 465 | // objects. |
| 466 | - std::vector<PointerHolder<Pipeline>> to_delete; | 466 | + std::vector<std::shared_ptr<Pipeline>> to_delete; |
| 467 | 467 | ||
| 468 | PointerHolder<ContentNormalizer> normalizer; | 468 | PointerHolder<ContentNormalizer> normalizer; |
| 469 | + std::shared_ptr<Pipeline> new_pipeline; | ||
| 469 | if (filter) | 470 | if (filter) |
| 470 | { | 471 | { |
| 471 | if (encode_flags & qpdf_ef_compress) | 472 | if (encode_flags & qpdf_ef_compress) |
| 472 | { | 473 | { |
| 473 | - pipeline = new Pl_Flate("compress stream", pipeline, | ||
| 474 | - Pl_Flate::a_deflate); | ||
| 475 | - to_delete.push_back(pipeline); | 474 | + new_pipeline = std::make_shared<Pl_Flate>( |
| 475 | + "compress stream", pipeline, Pl_Flate::a_deflate); | ||
| 476 | + to_delete.push_back(new_pipeline); | ||
| 477 | + pipeline = new_pipeline.get(); | ||
| 476 | } | 478 | } |
| 477 | 479 | ||
| 478 | if (encode_flags & qpdf_ef_normalize) | 480 | if (encode_flags & qpdf_ef_normalize) |
| 479 | { | 481 | { |
| 480 | normalizer = new ContentNormalizer(); | 482 | normalizer = new ContentNormalizer(); |
| 481 | - pipeline = new Pl_QPDFTokenizer( | 483 | + new_pipeline = std::make_shared<Pl_QPDFTokenizer>( |
| 482 | "normalizer", normalizer.get(), pipeline); | 484 | "normalizer", normalizer.get(), pipeline); |
| 483 | - to_delete.push_back(pipeline); | 485 | + to_delete.push_back(new_pipeline); |
| 486 | + pipeline = new_pipeline.get(); | ||
| 484 | } | 487 | } |
| 485 | 488 | ||
| 486 | - for (std::vector<PointerHolder< | ||
| 487 | - QPDFObjectHandle::TokenFilter> >::reverse_iterator iter = | ||
| 488 | - this->token_filters.rbegin(); | 489 | + for (auto iter = this->token_filters.rbegin(); |
| 489 | iter != this->token_filters.rend(); ++iter) | 490 | iter != this->token_filters.rend(); ++iter) |
| 490 | { | 491 | { |
| 491 | - pipeline = new Pl_QPDFTokenizer( | 492 | + new_pipeline = std::make_shared<Pl_QPDFTokenizer>( |
| 492 | "token filter", (*iter).get(), pipeline); | 493 | "token filter", (*iter).get(), pipeline); |
| 493 | - to_delete.push_back(pipeline); | 494 | + to_delete.push_back(new_pipeline); |
| 495 | + pipeline = new_pipeline.get(); | ||
| 494 | } | 496 | } |
| 495 | 497 | ||
| 496 | for (auto f_iter = filters.rbegin(); | 498 | for (auto f_iter = filters.rbegin(); |
libqpdf/QPDF_encryption.cc
| @@ -1238,7 +1238,7 @@ QPDF::decryptStream(PointerHolder<EncryptionParameters> encp, | @@ -1238,7 +1238,7 @@ QPDF::decryptStream(PointerHolder<EncryptionParameters> encp, | ||
| 1238 | QPDF& qpdf_for_warning, Pipeline*& pipeline, | 1238 | QPDF& qpdf_for_warning, Pipeline*& pipeline, |
| 1239 | int objid, int generation, | 1239 | int objid, int generation, |
| 1240 | QPDFObjectHandle& stream_dict, | 1240 | QPDFObjectHandle& stream_dict, |
| 1241 | - std::vector<PointerHolder<Pipeline> >& heap) | 1241 | + std::vector<std::shared_ptr<Pipeline>>& heap) |
| 1242 | { | 1242 | { |
| 1243 | std::string type; | 1243 | std::string type; |
| 1244 | if (stream_dict.getKey("/Type").isName()) | 1244 | if (stream_dict.getKey("/Type").isName()) |
| @@ -1343,21 +1343,25 @@ QPDF::decryptStream(PointerHolder<EncryptionParameters> encp, | @@ -1343,21 +1343,25 @@ QPDF::decryptStream(PointerHolder<EncryptionParameters> encp, | ||
| 1343 | } | 1343 | } |
| 1344 | } | 1344 | } |
| 1345 | std::string key = getKeyForObject(encp, objid, generation, use_aes); | 1345 | std::string key = getKeyForObject(encp, objid, generation, use_aes); |
| 1346 | + std::shared_ptr<Pipeline> new_pipeline; | ||
| 1346 | if (use_aes) | 1347 | if (use_aes) |
| 1347 | { | 1348 | { |
| 1348 | QTC::TC("qpdf", "QPDF_encryption aes decode stream"); | 1349 | QTC::TC("qpdf", "QPDF_encryption aes decode stream"); |
| 1349 | - pipeline = new Pl_AES_PDF("AES stream decryption", pipeline, | ||
| 1350 | - false, QUtil::unsigned_char_pointer(key), | ||
| 1351 | - key.length()); | 1350 | + new_pipeline = std::make_shared<Pl_AES_PDF>( |
| 1351 | + "AES stream decryption", pipeline, | ||
| 1352 | + false, QUtil::unsigned_char_pointer(key), | ||
| 1353 | + key.length()); | ||
| 1352 | } | 1354 | } |
| 1353 | else | 1355 | else |
| 1354 | { | 1356 | { |
| 1355 | QTC::TC("qpdf", "QPDF_encryption rc4 decode stream"); | 1357 | QTC::TC("qpdf", "QPDF_encryption rc4 decode stream"); |
| 1356 | - pipeline = new Pl_RC4("RC4 stream decryption", pipeline, | ||
| 1357 | - QUtil::unsigned_char_pointer(key), | ||
| 1358 | - toI(key.length())); | 1358 | + new_pipeline = std::make_shared<Pl_RC4>( |
| 1359 | + "RC4 stream decryption", pipeline, | ||
| 1360 | + QUtil::unsigned_char_pointer(key), | ||
| 1361 | + toI(key.length())); | ||
| 1359 | } | 1362 | } |
| 1360 | - heap.push_back(pipeline); | 1363 | + pipeline = new_pipeline.get(); |
| 1364 | + heap.push_back(new_pipeline); | ||
| 1361 | } | 1365 | } |
| 1362 | 1366 | ||
| 1363 | void | 1367 | void |