From 0ad4e190ffbb85ea2db5a05d43cd4f81d98cfe63 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Fri, 9 Sep 2022 07:03:29 -0400 Subject: [PATCH] Make QPDFLogger() private and provide create method --- include/qpdf/QPDFLogger.hh | 3 +- libqpdf/QPDF.cc | 2 +- libqpdf/QPDFJob.cc | 2 +- libqpdf/QPDFLogger.cc | 8 +++++- libtests/logger.cc | 56 +++++++++++++++++++------------------- 5 files changed, 39 insertions(+), 32 deletions(-) diff --git a/include/qpdf/QPDFLogger.hh b/include/qpdf/QPDFLogger.hh index 655da668..54d91d60 100644 --- a/include/qpdf/QPDFLogger.hh +++ b/include/qpdf/QPDFLogger.hh @@ -31,7 +31,7 @@ class QPDFLogger { public: QPDF_DLL - QPDFLogger(); + static std::shared_ptr create(); // Return the default logger. In general, you should use the // default logger. You can also create your own loggers and use @@ -152,6 +152,7 @@ class QPDFLogger void setOutputStreams(std::ostream* out_stream, std::ostream* err_stream); private: + QPDFLogger(); std::shared_ptr throwIfNull(std::shared_ptr, bool null_okay); diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 454c05ee..8c5e8e13 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -362,7 +362,7 @@ QPDF::setLogger(std::shared_ptr l) void QPDF::setOutputStreams(std::ostream* out, std::ostream* err) { - setLogger(std::make_shared()); + setLogger(QPDFLogger::create()); this->m->log->setOutputStreams(out, err); } diff --git a/libqpdf/QPDFJob.cc b/libqpdf/QPDFJob.cc index df93b859..384af854 100644 --- a/libqpdf/QPDFJob.cc +++ b/libqpdf/QPDFJob.cc @@ -460,7 +460,7 @@ QPDFJob::setLogger(std::shared_ptr l) void QPDFJob::setOutputStreams(std::ostream* out, std::ostream* err) { - setLogger(std::make_shared()); + setLogger(QPDFLogger::create()); this->m->log->setOutputStreams(out, err); } diff --git a/libqpdf/QPDFLogger.cc b/libqpdf/QPDFLogger.cc index 78cb2a32..7fe21c97 100644 --- a/libqpdf/QPDFLogger.cc +++ b/libqpdf/QPDFLogger.cc @@ -64,10 +64,16 @@ QPDFLogger::QPDFLogger() : { } +std::shared_ptr +QPDFLogger::create() +{ + return std::shared_ptr(new QPDFLogger); +} + std::shared_ptr QPDFLogger::defaultLogger() { - static auto l = std::make_shared(); + static auto l = create(); return l; } diff --git a/libtests/logger.cc b/libtests/logger.cc index b968422e..987e15d3 100644 --- a/libtests/logger.cc +++ b/libtests/logger.cc @@ -39,64 +39,64 @@ test2() { // First call saveToStandardOutput. Then use info, which then to // go stderr. - QPDFLogger l; - l.saveToStandardOutput(true); - l.info(std::string("info to stderr\n")); - *(l.getSave()) << "save to stdout\n"; - l.setInfo(nullptr); - l.info("info still to stderr\n"); - l.setSave(nullptr, false); - l.setInfo(nullptr); - l.info("info back to stdout\n"); + auto l = QPDFLogger::create(); + l->saveToStandardOutput(true); + l->info(std::string("info to stderr\n")); + *(l->getSave()) << "save to stdout\n"; + l->setInfo(nullptr); + l->info("info still to stderr\n"); + l->setSave(nullptr, false); + l->setInfo(nullptr); + l->info("info back to stdout\n"); } static void test3() { // Error/warning - QPDFLogger l; + auto l = QPDFLogger::create(); // Warning follows error when error is set explicitly. std::string errors; auto pl_error = std::make_shared("errors", nullptr, errors); - l.setError(pl_error); - l.warn("warn follows error\n"); + l->setError(pl_error); + l->warn("warn follows error\n"); assert(errors == "warn follows error\n"); - l.error("error too\n"); + l->error("error too\n"); assert(errors == "warn follows error\nerror too\n"); // Set warnings -- now they're separate std::string warnings; auto pl_warn = std::make_shared("warnings", nullptr, warnings); - l.setWarn(pl_warn); - l.warn(std::string("warning now separate\n")); - l.error(std::string("new error\n")); + l->setWarn(pl_warn); + l->warn(std::string("warning now separate\n")); + l->error(std::string("new error\n")); assert(warnings == "warning now separate\n"); assert(errors == "warn follows error\nerror too\nnew error\n"); std::string errors2; pl_error = std::make_shared("errors", nullptr, errors2); - l.setError(pl_error); - l.warn("new warning\n"); - l.error("another new error\n"); + l->setError(pl_error); + l->warn("new warning\n"); + l->error("another new error\n"); assert(warnings == "warning now separate\nnew warning\n"); assert(errors == "warn follows error\nerror too\nnew error\n"); assert(errors2 == "another new error\n"); // Restore warnings to default -- follows error again - l.setWarn(nullptr); - l.warn("warning 3\n"); - l.error("error 3\n"); + l->setWarn(nullptr); + l->warn("warning 3\n"); + l->error("error 3\n"); assert(warnings == "warning now separate\nnew warning\n"); assert(errors == "warn follows error\nerror too\nnew error\n"); assert(errors2 == "another new error\nwarning 3\nerror 3\n"); // Restore everything to default - l.setInfo(nullptr); - l.setWarn(nullptr); - l.setError(nullptr); - l.info("after reset, info to stdout\n"); - l.warn("after reset, warn to stderr\n"); - l.error("after reset, error to stderr\n"); + l->setInfo(nullptr); + l->setWarn(nullptr); + l->setError(nullptr); + l->info("after reset, info to stdout\n"); + l->warn("after reset, warn to stderr\n"); + l->error("after reset, error to stderr\n"); } int