Commit abc300f05c00de72081203d89d9065b25f1ccb3c

Authored by Jay Berkenbilt
1 parent f0c2e0ef

Replace containers of PointerHolder with containers of std::shared_ptr

None of these are in the public API.
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&lt;EncryptionParameters&gt; encp, @@ -2910,7 +2910,7 @@ QPDF::pipeStreamData(PointerHolder&lt;EncryptionParameters&gt; 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&lt;EncryptionParameters&gt; encp, @@ -1238,7 +1238,7 @@ QPDF::decryptStream(PointerHolder&lt;EncryptionParameters&gt; 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&lt;EncryptionParameters&gt; encp, @@ -1343,21 +1343,25 @@ QPDF::decryptStream(PointerHolder&lt;EncryptionParameters&gt; 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