diff --git a/CMakeLists.txt b/CMakeLists.txt index 569da980..226e6a2e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -108,7 +108,7 @@ if(NOT (BUILD_STATIC_LIBS OR BUILD_SHARED_LIBS)) FATAL_ERROR "At least one of static or shared libraries must be built") endif() -add_compile_definitions($<$:POINTERHOLDER_TRANSITION=2>) +add_compile_definitions($<$:POINTERHOLDER_TRANSITION=3>) enable_testing() set(RUN_QTEST perl ${qpdf_SOURCE_DIR}/run-qtest) diff --git a/examples/pdf-create.cc b/examples/pdf-create.cc index b070b3aa..a7b7557e 100644 --- a/examples/pdf-create.cc +++ b/examples/pdf-create.cc @@ -176,7 +176,7 @@ add_page( // with /FlateDecode if we don't provide any other form of // compression. ImageProvider* p = new ImageProvider(color_space, filter); - PointerHolder provider(p); + std::shared_ptr provider(p); size_t width = p->getWidth(); size_t height = p->getHeight(); QPDFObjectHandle image = QPDFObjectHandle::newStream(&pdf); @@ -296,10 +296,10 @@ check( // Check image data auto actual_data = image.getStreamData(qpdf_dl_all); ImageProvider* p = new ImageProvider(desired_color_space, "null"); - PointerHolder provider(p); + std::shared_ptr provider(p); Pl_Buffer b_p("get image data"); provider->provideStreamData(0, 0, &b_p); - PointerHolder desired_data(b_p.getBuffer()); + std::shared_ptr desired_data(b_p.getBuffer()); if (desired_data->getSize() != actual_data->getSize()) { std::cout << "page " << pageno << ": image data length mismatch" diff --git a/examples/pdf-custom-filter.cc b/examples/pdf-custom-filter.cc index b6d88684..72aa93b5 100644 --- a/examples/pdf-custom-filter.cc +++ b/examples/pdf-custom-filter.cc @@ -205,7 +205,7 @@ class StreamReplacer: public QPDFObjectHandle::StreamDataProvider void registerStream( QPDFObjectHandle stream, - PointerHolder self); + std::shared_ptr self); private: bool maybeReplace( @@ -283,7 +283,7 @@ StreamReplacer::maybeReplace( // make all its decisions from the stream dictionary. However, // it's a good idea to make sure we can retrieve the filtered data // if we are going to need it later. - PointerHolder out; + std::shared_ptr out; try { out = stream.getStreamData(); } catch (...) { @@ -321,7 +321,7 @@ StreamReplacer::maybeReplace( void StreamReplacer::registerStream( QPDFObjectHandle stream, - PointerHolder self) + std::shared_ptr self) { QPDFObjGen og(stream.getObjGen()); @@ -409,10 +409,10 @@ process( qpdf.processFile(infilename); // Create a single StreamReplacer instance. The interface requires - // a PointerHolder in various places, so allocate a StreamReplacer - // and stash it in a PointerHolder. + // a std::shared_ptr in various places, so allocate a StreamReplacer + // and stash it in a std::shared_ptr. StreamReplacer* replacer = new StreamReplacer(&qpdf); - PointerHolder p(replacer); + std::shared_ptr p(replacer); for (auto& o : qpdf.getAllObjects()) { if (o.isStream()) { diff --git a/examples/pdf-filter-tokens.cc b/examples/pdf-filter-tokens.cc index 39950752..eee90c33 100644 --- a/examples/pdf-filter-tokens.cc +++ b/examples/pdf-filter-tokens.cc @@ -207,10 +207,11 @@ main(int argc, char* argv[]) // details. QPDFPageObjectHelper& page(*iter); page.addContentTokenFilter( - PointerHolder( + std::shared_ptr( new StringReverser)); page.addContentTokenFilter( - PointerHolder(new ColorToGray)); + std::shared_ptr( + new ColorToGray)); } QPDFWriter w(pdf, outfilename); diff --git a/examples/pdf-invert-images.cc b/examples/pdf-invert-images.cc index df9e7362..033e3622 100644 --- a/examples/pdf-invert-images.cc +++ b/examples/pdf-invert-images.cc @@ -41,7 +41,7 @@ class ImageInverter: public QPDFObjectHandle::StreamDataProvider void registerImage( QPDFObjectHandle image, - PointerHolder self); + std::shared_ptr self); private: std::map copied_images; @@ -50,14 +50,14 @@ class ImageInverter: public QPDFObjectHandle::StreamDataProvider void ImageInverter::registerImage( QPDFObjectHandle image, - PointerHolder self) + std::shared_ptr self) { // replaceStreamData requires a pointer holder to the stream data // provider, but there's no way for us to generate one ourselves, // so we have to have it handed to us. Don't be tempted to have - // the class contain a PointerHolder to itself as a member. Doing + // the class contain a std::shared_ptr to itself as a member. Doing // this will prevent the class from ever being deleted since the - // reference count will never drop to zero (and PointerHolder + // reference count will never drop to zero (and std::shared_ptr // doesn't have weak references). QPDFObjGen og(image.getObjGen()); @@ -90,7 +90,7 @@ ImageInverter::provideStreamData(int objid, int generation, Pipeline* pipeline) // image data. Then invert the image data and write the inverted // data to the pipeline. QPDFObjGen og(objid, generation); - PointerHolder data = + std::shared_ptr data = this->copied_images[og].getStreamData(qpdf_dl_all); size_t size = data->getSize(); unsigned char* buf = data->getBuffer(); @@ -128,7 +128,7 @@ main(int argc, char* argv[]) qpdf.processFile(infilename, password); ImageInverter* inv = new ImageInverter; - auto p = PointerHolder(inv); + auto p = std::shared_ptr(inv); // For each page... std::vector pages = diff --git a/fuzz/qpdf_fuzzer.cc b/fuzz/qpdf_fuzzer.cc index 3c76bbc9..15469782 100644 --- a/fuzz/qpdf_fuzzer.cc +++ b/fuzz/qpdf_fuzzer.cc @@ -34,9 +34,9 @@ class FuzzHelper void run(); private: - PointerHolder getQpdf(); - PointerHolder getWriter(PointerHolder); - void doWrite(PointerHolder w); + std::shared_ptr getQpdf(); + std::shared_ptr getWriter(std::shared_ptr); + void doWrite(std::shared_ptr w); void testWrite(); void testPages(); void testOutlines(); @@ -52,27 +52,27 @@ FuzzHelper::FuzzHelper(unsigned char const* data, size_t size) : { } -PointerHolder +std::shared_ptr FuzzHelper::getQpdf() { - auto is = PointerHolder( + auto is = std::shared_ptr( new BufferInputSource("fuzz input", &this->input_buffer)); - auto qpdf = make_pointer_holder(); + auto qpdf = std::make_shared(); qpdf->processInputSource(is); return qpdf; } -PointerHolder -FuzzHelper::getWriter(PointerHolder qpdf) +std::shared_ptr +FuzzHelper::getWriter(std::shared_ptr qpdf) { - auto w = make_pointer_holder(*qpdf); + auto w = std::make_shared(*qpdf); w->setOutputPipeline(&this->discard); w->setDecodeLevel(qpdf_dl_all); return w; } void -FuzzHelper::doWrite(PointerHolder w) +FuzzHelper::doWrite(std::shared_ptr w) { try { w->write(); @@ -88,8 +88,8 @@ FuzzHelper::testWrite() { // Write in various ways to exercise QPDFWriter - PointerHolder q; - PointerHolder w; + std::shared_ptr q; + std::shared_ptr w; q = getQpdf(); w = getWriter(q); @@ -126,7 +126,7 @@ FuzzHelper::testPages() { // Parse all content streams, and exercise some helpers that // operate on pages. - PointerHolder q = getQpdf(); + std::shared_ptr q = getQpdf(); QPDFPageDocumentHelper pdh(*q); QPDFPageLabelDocumentHelper pldh(*q); QPDFOutlineDocumentHelper odh(*q); @@ -168,7 +168,7 @@ FuzzHelper::testPages() void FuzzHelper::testOutlines() { - PointerHolder q = getQpdf(); + std::shared_ptr q = getQpdf(); std::list> queue; QPDFOutlineDocumentHelper odh(*q); queue.push_back(odh.getTopLevelOutlines()); diff --git a/fuzz/standalone_fuzz_target_runner.cc b/fuzz/standalone_fuzz_target_runner.cc index 066764a2..143f4e6f 100644 --- a/fuzz/standalone_fuzz_target_runner.cc +++ b/fuzz/standalone_fuzz_target_runner.cc @@ -8,7 +8,7 @@ int main(int argc, char** argv) { for (int i = 1; i < argc; i++) { - PointerHolder file_buf; + std::shared_ptr file_buf; size_t size = 0; QUtil::read_file_into_memory(argv[i], file_buf, size); LLVMFuzzerTestOneInput( diff --git a/libtests/input_source.cc b/libtests/input_source.cc index cb62daea..a32428be 100644 --- a/libtests/input_source.cc +++ b/libtests/input_source.cc @@ -5,11 +5,11 @@ #include #include -static PointerHolder +static std::shared_ptr get_buffer() { size_t size = 3172; - PointerHolder b(new Buffer(size)); + std::shared_ptr b(new Buffer(size)); unsigned char* p = b->getBuffer(); for (size_t i = 0; i < size; ++i) { p[i] = static_cast(i & 0xff); @@ -20,7 +20,7 @@ get_buffer() class Finder: public InputSource::Finder { public: - Finder(PointerHolder is, std::string const& after) : + Finder(std::shared_ptr is, std::string const& after) : is(is), after(after) { @@ -31,7 +31,7 @@ class Finder: public InputSource::Finder virtual bool check(); private: - PointerHolder is; + std::shared_ptr is; std::string after; }; @@ -57,14 +57,14 @@ check(char const* description, bool expected, bool actual) int main() { - PointerHolder b1 = get_buffer(); + std::shared_ptr b1 = get_buffer(); unsigned char* b = b1->getBuffer(); // Straddle block boundaries memcpy(b + 1022, "potato", 6); // Overlap so that the first check() would advance past the start // of the next match memcpy(b + 2037, "potato potato salad ", 20); - auto is = PointerHolder( + auto is = std::shared_ptr( new BufferInputSource("test buffer input source", b1.get())); Finder f1(is, "salad"); check("find potato salad", true, is->findFirst("potato", 0, 0, f1)); diff --git a/libtests/json_parse.cc b/libtests/json_parse.cc index 13d29b65..77692eab 100644 --- a/libtests/json_parse.cc +++ b/libtests/json_parse.cc @@ -11,7 +11,7 @@ main(int argc, char* argv[]) } char const* filename = argv[1]; try { - PointerHolder buf; + std::shared_ptr buf; size_t size; QUtil::read_file_into_memory(filename, buf, size); std::string s(buf.get(), size); diff --git a/libtests/qutil.cc b/libtests/qutil.cc index fea9fca1..dda49898 100644 --- a/libtests/qutil.cc +++ b/libtests/qutil.cc @@ -529,7 +529,7 @@ read_from_file_test() fclose(fp); } - PointerHolder buf; + std::shared_ptr buf; size_t size = 0; QUtil::read_file_into_memory("other-file", buf, size); std::cout << "read " << size << " bytes" << std::endl; @@ -595,7 +595,7 @@ assert_no_file(char const* filename) void rename_delete_test() { - PointerHolder buf; + std::shared_ptr buf; size_t size = 0; try { diff --git a/qpdf/test_driver.cc b/qpdf/test_driver.cc index c697bdc9..8a93721f 100644 --- a/qpdf/test_driver.cc +++ b/qpdf/test_driver.cc @@ -49,7 +49,7 @@ usage() class Provider: public QPDFObjectHandle::StreamDataProvider { public: - Provider(PointerHolder b) : + Provider(std::shared_ptr b) : b(b), bad_length(false) { @@ -74,7 +74,7 @@ class Provider: public QPDFObjectHandle::StreamDataProvider } private: - PointerHolder b; + std::shared_ptr b; bool bad_length; }; @@ -151,7 +151,7 @@ class TokenFilter: public QPDFObjectHandle::TokenFilter static std::string getPageContents(QPDFObjectHandle page) { - PointerHolder b1 = page.getKey("/Contents").getStreamData(); + std::shared_ptr b1 = page.getKey("/Contents").getStreamData(); return std::string( reinterpret_cast(b1->getBuffer()), b1->getSize()) + "\0"; @@ -271,14 +271,14 @@ test_0_1(QPDF& pdf, char const* arg2) std::cout << "Raw stream data:" << std::endl; std::cout.flush(); QUtil::binary_stdout(); - auto out = make_pointer_holder("raw", stdout); + auto out = std::make_shared("raw", stdout); qtest.pipeStreamData(out.get(), 0, qpdf_dl_none); std::cout << std::endl << "Uncompressed stream data:" << std::endl; if (qtest.pipeStreamData(0, 0, qpdf_dl_all)) { std::cout.flush(); QUtil::binary_stdout(); - out = make_pointer_holder("filtered", stdout); + out = std::make_shared("filtered", stdout); qtest.pipeStreamData(out.get(), 0, qpdf_dl_all); std::cout << std::endl << "End of stream data" << std::endl; } else { @@ -316,7 +316,7 @@ test_2(QPDF& pdf, char const* arg2) QPDFObjectHandle page = kids.getArrayItem(1); // second page QPDFObjectHandle contents = page.getKey("/Contents"); QUtil::binary_stdout(); - auto out = make_pointer_holder("filtered", stdout); + auto out = std::make_shared("filtered", stdout); contents.pipeStreamData(out.get(), 0, qpdf_dl_generalized); } @@ -329,8 +329,7 @@ test_3(QPDF& pdf, char const* arg2) std::cout << "-- stream " << i << " --" << std::endl; std::cout.flush(); QUtil::binary_stdout(); - auto out = - make_pointer_holder("tokenized stream", stdout); + auto out = std::make_shared("tokenized stream", stdout); stream.pipeStreamData( out.get(), qpdf_ef_normalize, qpdf_dl_generalized); } @@ -503,7 +502,7 @@ test_8(QPDF& pdf, char const* arg2) // This is a bogus way to use StreamDataProvider, but it does // adequately test its functionality. Provider* provider = new Provider(b); - auto p = PointerHolder(provider); + auto p = std::shared_ptr(provider); qstream.replaceStreamData( p, QPDFObjectHandle::newName("/FlateDecode"), @@ -532,7 +531,7 @@ test_9(QPDF& pdf, char const* arg2) { QPDFObjectHandle root = pdf.getRoot(); // Explicitly exercise the Buffer version of newStream - auto buf = make_pointer_holder(20U); + auto buf = std::make_shared(20U); unsigned char* bp = buf->getBuffer(); memcpy(bp, "data for new stream\n", 20); // no null! QPDFObjectHandle qstream = QPDFObjectHandle::newStream(&pdf, buf); @@ -581,8 +580,8 @@ test_11(QPDF& pdf, char const* arg2) { QPDFObjectHandle root = pdf.getRoot(); QPDFObjectHandle qstream = root.getKey("/QStream"); - PointerHolder b1 = qstream.getStreamData(); - PointerHolder b2 = qstream.getRawStreamData(); + std::shared_ptr b1 = qstream.getStreamData(); + std::shared_ptr b2 = qstream.getRawStreamData(); if ((b1->getSize() == 7) && (memcmp(b1->getBuffer(), "potato\n", 7) == 0)) { std::cout << "filtered stream data okay" << std::endl; } @@ -815,7 +814,7 @@ test_17(QPDF& pdf, char const* arg2) QPDFObjectHandle(pages.at(1)).getKey("/Contents").getObjGen()); pdf.removePage(pages.at(0)); assert(pages.size() == 2); - PointerHolder b = + std::shared_ptr b = QPDFObjectHandle(pages.at(0)).getKey("/Contents").getStreamData(); std::string contents = std::string( reinterpret_cast(b->getBuffer()), b->getSize()); @@ -1039,7 +1038,7 @@ test_27(QPDF& pdf, char const* arg2) // also exercise setImmediateCopyFrom. // Create a provider. The provider stays in scope. - PointerHolder p1; + std::shared_ptr p1; { // Local scope Pl_Buffer pl("buffer"); @@ -1065,7 +1064,7 @@ test_27(QPDF& pdf, char const* arg2) // Make sure some source PDFs are out of scope when we // write. - PointerHolder p2; + std::shared_ptr p2; // Create another provider. This one will go out of scope // along with its containing qpdf, which has // setImmediateCopyFrom(true). @@ -1266,7 +1265,7 @@ test_35(QPDF& pdf, char const* arg2) { // Extract attachments - std::map> attachments; + std::map> attachments; QPDFObjectHandle root = pdf.getRoot(); QPDFObjectHandle names = root.getKey("/Names"); QPDFObjectHandle embeddedFiles = names.getKey("/EmbeddedFiles"); @@ -1282,7 +1281,7 @@ test_35(QPDF& pdf, char const* arg2) attachments[filename] = stream.getStreamData(); } } - for (std::map>::iterator iter = + for (std::map>::iterator iter = attachments.begin(); iter != attachments.end(); ++iter) { @@ -1421,7 +1420,7 @@ test_41(QPDF& pdf, char const* arg2) iter != pages.end(); ++iter) { (*iter).addContentTokenFilter( - PointerHolder(new TokenFilter())); + std::shared_ptr(new TokenFilter())); } QPDFWriter w(pdf, "a.pdf"); w.setQDFMode(true); @@ -2468,12 +2467,12 @@ test_68(QPDF& pdf, char const* arg2) } catch (std::exception& e) { std::cout << "get unfilterable stream: " << e.what() << std::endl; } - PointerHolder b1 = qstream.getStreamData(qpdf_dl_all); + std::shared_ptr b1 = qstream.getStreamData(qpdf_dl_all); if ((b1->getSize() > 10) && (memcmp(b1->getBuffer(), "wwwwwwwww", 9) == 0)) { std::cout << "filtered stream data okay" << std::endl; } - PointerHolder b2 = qstream.getRawStreamData(); + std::shared_ptr b2 = qstream.getRawStreamData(); if ((b2->getSize() > 10) && (memcmp( b2->getBuffer(), "\xff\xd8\xff\xe0\x00\x10\x4a\x46\x49\x46", 10) == @@ -2578,11 +2577,11 @@ test_72(QPDF& pdf, char const* arg2) Pl_Buffer b("buffer"); if (i == 0) { fx1.addContentTokenFilter( - PointerHolder( + std::shared_ptr( new TokenFilter())); } else { fx1.getObjectHandle().addTokenFilter( - PointerHolder( + std::shared_ptr( new TokenFilter())); } fx1.pipeContents(&b); @@ -2999,7 +2998,7 @@ test_83(QPDF& pdf, char const* arg2) // partial = true, we just use qpdf --job-json-file. QPDFJob j; - PointerHolder file_buf; + std::shared_ptr file_buf; size_t size; QUtil::read_file_into_memory(arg2, file_buf, size); try { @@ -3201,7 +3200,7 @@ runtest(int n, char const* filename1, char const* arg2) } QPDF pdf; - PointerHolder file_buf; + std::shared_ptr file_buf; FILE* filep = 0; if (n == 0) { pdf.setAttemptRecovery(false); diff --git a/qpdf/test_large_file.cc b/qpdf/test_large_file.cc index 0a81dcc7..24fc9e11 100644 --- a/qpdf/test_large_file.cc +++ b/qpdf/test_large_file.cc @@ -231,7 +231,7 @@ create_pdf(char const* filename) image_dict.replaceKey("/Width", newInteger(width)); image_dict.replaceKey("/Height", newInteger(height)); ImageProvider* p = new ImageProvider(pageno); - PointerHolder provider(p); + std::shared_ptr provider(p); image.replaceStreamData( provider, QPDFObjectHandle::newNull(), QPDFObjectHandle::newNull()); @@ -265,7 +265,7 @@ create_pdf(char const* filename) static void check_page_contents(size_t pageno, QPDFObjectHandle page) { - PointerHolder buf = page.getKey("/Contents").getStreamData(); + std::shared_ptr buf = page.getKey("/Contents").getStreamData(); std::string actual_contents = std::string(reinterpret_cast(buf->getBuffer()), buf->getSize()); std::string expected_contents = generate_page_contents(pageno); diff --git a/qpdf/test_tokenizer.cc b/qpdf/test_tokenizer.cc index c609d848..5b99888c 100644 --- a/qpdf/test_tokenizer.cc +++ b/qpdf/test_tokenizer.cc @@ -25,7 +25,7 @@ usage() class Finder: public InputSource::Finder { public: - Finder(PointerHolder is, std::string const& str) : + Finder(std::shared_ptr is, std::string const& str) : is(is), str(str) { @@ -36,7 +36,7 @@ class Finder: public InputSource::Finder virtual bool check(); private: - PointerHolder is; + std::shared_ptr is; std::string str; }; @@ -117,7 +117,7 @@ sanitize(std::string const& value) static void try_skipping( QPDFTokenizer& tokenizer, - PointerHolder is, + std::shared_ptr is, size_t max_len, char const* what, Finder& f) @@ -132,7 +132,7 @@ try_skipping( static void dump_tokens( - PointerHolder is, + std::shared_ptr is, std::string const& label, size_t max_len, bool include_ignorable, @@ -191,12 +191,12 @@ dump_tokens( static void process(char const* filename, bool include_ignorable, size_t max_len) { - PointerHolder is; + std::shared_ptr is; // Tokenize file, skipping streams FileInputSource* fis = new FileInputSource(); fis->setFilename(filename); - is = PointerHolder(fis); + is = std::shared_ptr(fis); dump_tokens(is, "FILE", max_len, include_ignorable, true, false); // Tokenize content streams, skipping inline images @@ -214,7 +214,7 @@ process(char const* filename, bool include_ignorable, size_t max_len) auto content_data = plb.getBufferSharedPointer(); BufferInputSource* bis = new BufferInputSource("content data", content_data.get()); - is = PointerHolder(bis); + is = std::shared_ptr(bis); dump_tokens( is, "PAGE " + QUtil::int_to_string(pageno), @@ -231,11 +231,11 @@ process(char const* filename, bool include_ignorable, size_t max_len) ++iter) { if ((*iter).isStream() && (*iter).getDict().getKey("/Type").isName() && (*iter).getDict().getKey("/Type").getName() == "/ObjStm") { - PointerHolder b = + std::shared_ptr b = (*iter).getStreamData(qpdf_dl_specialized); BufferInputSource* bis = new BufferInputSource("object stream data", b.get()); - is = PointerHolder(bis); + is = std::shared_ptr(bis); dump_tokens( is, "OBJECT STREAM " + QUtil::int_to_string((*iter).getObjectID()), diff --git a/zlib-flate/zlib-flate.cc b/zlib-flate/zlib-flate.cc index 671227b1..f7d0c807 100644 --- a/zlib-flate/zlib-flate.cc +++ b/zlib-flate/zlib-flate.cc @@ -59,8 +59,8 @@ main(int argc, char* argv[]) QUtil::binary_stdout(); QUtil::binary_stdin(); - auto out = make_pointer_holder("stdout", stdout); - auto flate = make_pointer_holder("flate", out.get(), action); + auto out = std::make_shared("stdout", stdout); + auto flate = std::make_shared("flate", out.get(), action); bool warn = false; flate->setWarnCallback([&warn](char const* msg, int code) { warn = true;