cpp/poppler-document-private.h | 21 +----------- cpp/poppler-document.cpp | 69 ++++++++--------------------------------- cpp/poppler-global.cpp | 2 - cpp/poppler-private.cpp | 2 - cpp/poppler-private.h | 2 - glib/poppler-document.cc | 31 +++++++----------- glib/poppler-private.h | 3 + glib/poppler.cc | 21 +++--------- poppler/CairoOutputDev.cc | 3 - poppler/Error.cc | 11 +----- poppler/Error.h | 6 +-- poppler/GlobalParams.cc | 52 ++++++++++++++++++++++++++++++ poppler/GlobalParams.h | 23 +++++++++++++ qt5/src/poppler-document.cc | 3 - qt5/src/poppler-private.cc | 30 +---------------- qt5/src/poppler-private.h | 12 +++---- test/perf-test.cc | 4 +- 17 files changed, 134 insertions(+), 161 deletions(-)
New commits: commit 9349ed71f9fabc8961cc1dd9ca57aca8be7939db Author: Adam Reichold <[email protected]> Date: Sat Jan 4 09:40:03 2020 +0100 Make use of the memoizing UTF-8 UnicodemMap getter in CairoOutputDev::drawChar. diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc index eac8ed09..52b05cd4 100644 --- a/poppler/CairoOutputDev.cc +++ b/poppler/CairoOutputDev.cc @@ -1402,8 +1402,7 @@ void CairoOutputDev::drawChar(GfxState *state, double x, double y, glyphs[glyphCount].y = y - originY; glyphCount++; if (use_show_text_glyphs) { - GooString enc("UTF-8"); - UnicodeMap *utf8Map = globalParams->getUnicodeMap(&enc); + const UnicodeMap *utf8Map = globalParams->getUtf8Map(); if (utf8Max - utf8Count < uLen*6) { // utf8 encoded characters can be up to 6 bytes if (utf8Max > uLen*6) commit 5c7ec727e059738828ae61bafb5fe5f8b482b267 Author: Adam Reichold <[email protected]> Date: Fri Jan 3 22:12:20 2020 +0100 Remove the error callback data pointer as none of the frontends make use of it. diff --git a/cpp/poppler-document.cpp b/cpp/poppler-document.cpp index 15b83454..c62fe80b 100644 --- a/cpp/poppler-document.cpp +++ b/cpp/poppler-document.cpp @@ -85,7 +85,7 @@ document_private::document_private(const char *file_data, int file_data_length, } document_private::document_private() - : GlobalParamsIniter(detail::error_function, nullptr) + : GlobalParamsIniter(detail::error_function) , doc(nullptr) , raw_doc_data(nullptr) , raw_doc_data_length(0) diff --git a/cpp/poppler-private.cpp b/cpp/poppler-private.cpp index a532b350..4eb360fd 100644 --- a/cpp/poppler-private.cpp +++ b/cpp/poppler-private.cpp @@ -40,7 +40,7 @@ static void stderr_debug_function(const std::string &msg, void * /*data*/) debug_func detail::user_debug_function = stderr_debug_function; void *detail::debug_closure = nullptr; -void detail::error_function(void * /*data*/, ErrorCategory /*category*/, Goffset pos, const char *msg) +void detail::error_function(ErrorCategory /*category*/, Goffset pos, const char *msg) { std::ostringstream oss; if (pos >= 0) { diff --git a/cpp/poppler-private.h b/cpp/poppler-private.h index 7f2ca383..b5f6599e 100644 --- a/cpp/poppler-private.h +++ b/cpp/poppler-private.h @@ -47,7 +47,7 @@ namespace detail extern debug_func user_debug_function; extern void *debug_closure; -void error_function(void *data, ErrorCategory category, Goffset pos, const char *msg); +void error_function(ErrorCategory category, Goffset pos, const char *msg); rectf pdfrectangle_to_rectf(const PDFRectangle &pdfrect); diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc index 26621365..6615334c 100644 --- a/glib/poppler-document.cc +++ b/glib/poppler-document.cc @@ -193,7 +193,7 @@ poppler_document_new_from_file (const char *uri, GooString *password_g; char *filename; - auto initer = new GlobalParamsIniter(_poppler_error_cb, nullptr); + auto initer = new GlobalParamsIniter(_poppler_error_cb); filename = g_filename_from_uri (uri, nullptr, error); if (!filename) @@ -253,7 +253,7 @@ poppler_document_new_from_data (char *data, MemStream *str; GooString *password_g; - auto initer = new GlobalParamsIniter(_poppler_error_cb, nullptr); + auto initer = new GlobalParamsIniter(_poppler_error_cb); // create stream str = new MemStream(data, 0, length, Object(objNull)); @@ -305,7 +305,7 @@ poppler_document_new_from_bytes (GBytes *bytes, g_return_val_if_fail(bytes != nullptr, nullptr); g_return_val_if_fail(error == nullptr || *error == nullptr, nullptr); - auto initer = new GlobalParamsIniter(_poppler_error_cb, nullptr); + auto initer = new GlobalParamsIniter(_poppler_error_cb); // create stream str = new BytesStream(bytes, Object(objNull)); @@ -356,7 +356,7 @@ poppler_document_new_from_stream (GInputStream *stream, g_return_val_if_fail(G_IS_INPUT_STREAM(stream), NULL); g_return_val_if_fail(length == (goffset)-1 || length > 0, NULL); - auto initer = new GlobalParamsIniter(_poppler_error_cb, nullptr); + auto initer = new GlobalParamsIniter(_poppler_error_cb); if (!G_IS_SEEKABLE(stream) || !g_seekable_can_seek(G_SEEKABLE(stream))) { g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, diff --git a/glib/poppler-private.h b/glib/poppler-private.h index cba1de76..86b587fd 100644 --- a/glib/poppler-private.h +++ b/glib/poppler-private.h @@ -163,6 +163,6 @@ type_name##_get_type (void) return g_define_type_id__volatile; \ } -void _poppler_error_cb (void *data, ErrorCategory category, Goffset pos, const char *message); +void _poppler_error_cb (ErrorCategory category, Goffset pos, const char *message); #endif diff --git a/glib/poppler.cc b/glib/poppler.cc index 31183372..5fffcbbb 100644 --- a/glib/poppler.cc +++ b/glib/poppler.cc @@ -84,8 +84,7 @@ poppler_get_version (void) */ void -_poppler_error_cb (void *data G_GNUC_UNUSED, - ErrorCategory category, +_poppler_error_cb (ErrorCategory category, Goffset pos, const char *message) { diff --git a/poppler/Error.cc b/poppler/Error.cc index f38666da..f161c4d7 100644 --- a/poppler/Error.cc +++ b/poppler/Error.cc @@ -46,11 +46,9 @@ static const char *errorCategoryNames[] = { }; static ErrorCallback errorCbk = nullptr; -static void *errorCbkData = nullptr; -void setErrorCallback(ErrorCallback cbk, void *data) { +void setErrorCallback(ErrorCallback cbk) { errorCbk = cbk; - errorCbkData = data; } void CDECL error(ErrorCategory category, Goffset pos, const char *msg, ...) { @@ -76,7 +74,7 @@ void CDECL error(ErrorCategory category, Goffset pos, const char *msg, ...) { } if (errorCbk) { - (*errorCbk)(errorCbkData, category, pos, sanitized->c_str()); + (*errorCbk)(category, pos, sanitized->c_str()); } else { if (pos >= 0) { fprintf(stderr, "%s (%lld): %s\n", diff --git a/poppler/Error.h b/poppler/Error.h index 52ac80f0..22329c7e 100644 --- a/poppler/Error.h +++ b/poppler/Error.h @@ -47,9 +47,9 @@ enum ErrorCategory { errInternal // internal error - malfunction within the Xpdf code }; -using ErrorCallback = void (*)(void *data, ErrorCategory category, Goffset pos, const char *msg); +using ErrorCallback = void (*)(ErrorCategory category, Goffset pos, const char *msg); -extern void setErrorCallback(ErrorCallback cbk, void *data); +extern void setErrorCallback(ErrorCallback cbk); extern void CDECL error(ErrorCategory category, Goffset pos, const char *msg, ...) GOOSTRING_FORMAT; diff --git a/poppler/GlobalParams.cc b/poppler/GlobalParams.cc index 3c82bd48..ae0a1b6f 100644 --- a/poppler/GlobalParams.cc +++ b/poppler/GlobalParams.cc @@ -1258,14 +1258,14 @@ void GlobalParams::setErrQuiet(bool errQuietA) { errQuiet = errQuietA; } -GlobalParamsIniter::GlobalParamsIniter(ErrorCallback errorCallback, void *errorCallbackData) +GlobalParamsIniter::GlobalParamsIniter(ErrorCallback errorCallback) { std::lock_guard<std::mutex> lock{mutex}; if (count == 0) { globalParams = std::make_unique<GlobalParams>(!customDataDir.empty() ? customDataDir.c_str() : nullptr); - setErrorCallback(errorCallback, errorCallbackData); + setErrorCallback(errorCallback); } count++; diff --git a/poppler/GlobalParams.h b/poppler/GlobalParams.h index 5ac536e2..eac31ade 100644 --- a/poppler/GlobalParams.h +++ b/poppler/GlobalParams.h @@ -223,7 +223,7 @@ private: class GlobalParamsIniter { public: - GlobalParamsIniter(ErrorCallback errorCallback, void *errorCallbackData); + GlobalParamsIniter(ErrorCallback errorCallback); ~GlobalParamsIniter(); GlobalParamsIniter(const GlobalParamsIniter &) = delete; diff --git a/qt5/src/poppler-private.cc b/qt5/src/poppler-private.cc index b1346ad1..35ebbda6 100644 --- a/qt5/src/poppler-private.cc +++ b/qt5/src/poppler-private.cc @@ -60,7 +60,7 @@ namespace Debug { Debug::debugClosure = closure; } - void qt5ErrorFunction(void * /*data*/, ErrorCategory /*category*/, Goffset pos, const char *msg) + void qt5ErrorFunction(ErrorCategory /*category*/, Goffset pos, const char *msg) { QString emsg; diff --git a/qt5/src/poppler-private.h b/qt5/src/poppler-private.h index 3fc7f7ec..63158461 100644 --- a/qt5/src/poppler-private.h +++ b/qt5/src/poppler-private.h @@ -75,7 +75,7 @@ namespace Poppler { GooString *QDateTimeToUnicodeGooString(const QDateTime &dt); - void qt5ErrorFunction(void * /*data*/, ErrorCategory /*category*/, Goffset pos, const char *msg); + void qt5ErrorFunction(ErrorCategory /*category*/, Goffset pos, const char *msg); Annot::AdditionalActionsType toPopplerAdditionalActionType(Annotation::AdditionalActionType type); @@ -96,7 +96,7 @@ namespace Poppler { class DocumentData : private GlobalParamsIniter { public: DocumentData(const QString &filePath, GooString *ownerPassword, GooString *userPassword) : - GlobalParamsIniter(qt5ErrorFunction, nullptr) + GlobalParamsIniter(qt5ErrorFunction) { init(); m_filePath = filePath; @@ -113,7 +113,7 @@ namespace Poppler { } DocumentData(const QByteArray &data, GooString *ownerPassword, GooString *userPassword) : - GlobalParamsIniter(qt5ErrorFunction, nullptr) + GlobalParamsIniter(qt5ErrorFunction) { fileContents = data; MemStream *str = new MemStream((char*)fileContents.data(), 0, fileContents.length(), Object(objNull)); diff --git a/test/perf-test.cc b/test/perf-test.cc index 70220cd3..03f78788 100644 --- a/test/perf-test.cc +++ b/test/perf-test.cc @@ -739,7 +739,7 @@ static void StrList_Destroy(StrList **root) *root = nullptr; } -static void my_error(void *, ErrorCategory, Goffset pos, const char *msg) { +static void my_error(ErrorCategory, Goffset pos, const char *msg) { #if 0 char buf[4096], *p = buf; @@ -1230,7 +1230,7 @@ static void RenderCmdLineArg(char *cmdLineArg) int main(int argc, char **argv) { - setErrorCallback(my_error, nullptr); + setErrorCallback(my_error); ParseCommandLine(argc, argv); if (0 == StrList_Len(&gArgsListRoot)) PrintUsageAndExit(argc, argv); commit 6de0bba0b7d064195b27619667dbbcb7cd810647 Author: Adam Reichold <[email protected]> Date: Fri Jan 3 22:05:53 2020 +0100 Make use of the GlobalParamsIniter to make the glib frontend initialization thread safe. diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc index e1b422a7..26621365 100644 --- a/glib/poppler-document.cc +++ b/glib/poppler-document.cc @@ -100,8 +100,9 @@ struct _PopplerDocumentClass G_DEFINE_TYPE (PopplerDocument, poppler_document, G_TYPE_OBJECT) static PopplerDocument * -_poppler_document_new_from_pdfdoc (PDFDoc *newDoc, - GError **error) +_poppler_document_new_from_pdfdoc (GlobalParamsIniter *initer, + PDFDoc *newDoc, + GError **error) { PopplerDocument *document; @@ -145,6 +146,7 @@ _poppler_document_new_from_pdfdoc (PDFDoc *newDoc, } document = (PopplerDocument *) g_object_new (POPPLER_TYPE_DOCUMENT, nullptr); + document->initer = initer; document->doc = newDoc; document->output_dev = new CairoOutputDev (); @@ -191,9 +193,7 @@ poppler_document_new_from_file (const char *uri, GooString *password_g; char *filename; - if (!globalParams) { - globalParams = std::make_unique<GlobalParams>(); - } + auto initer = new GlobalParamsIniter(_poppler_error_cb, nullptr); filename = g_filename_from_uri (uri, nullptr, error); if (!filename) @@ -224,7 +224,7 @@ poppler_document_new_from_file (const char *uri, delete password_g; - return _poppler_document_new_from_pdfdoc (newDoc, error); + return _poppler_document_new_from_pdfdoc (initer, newDoc, error); } /** @@ -253,9 +253,7 @@ poppler_document_new_from_data (char *data, MemStream *str; GooString *password_g; - if (!globalParams) { - globalParams = std::make_unique<GlobalParams>(); - } + auto initer = new GlobalParamsIniter(_poppler_error_cb, nullptr); // create stream str = new MemStream(data, 0, length, Object(objNull)); @@ -264,7 +262,7 @@ poppler_document_new_from_data (char *data, newDoc = new PDFDoc(str, password_g, password_g); delete password_g; - return _poppler_document_new_from_pdfdoc (newDoc, error); + return _poppler_document_new_from_pdfdoc (initer, newDoc, error); } class BytesStream : public MemStream @@ -307,9 +305,7 @@ poppler_document_new_from_bytes (GBytes *bytes, g_return_val_if_fail(bytes != nullptr, nullptr); g_return_val_if_fail(error == nullptr || *error == nullptr, nullptr); - if (!globalParams) { - globalParams = std::make_unique<GlobalParams>(); - } + auto initer = new GlobalParamsIniter(_poppler_error_cb, nullptr); // create stream str = new BytesStream(bytes, Object(objNull)); @@ -318,7 +314,7 @@ poppler_document_new_from_bytes (GBytes *bytes, newDoc = new PDFDoc(str, password_g, password_g); delete password_g; - return _poppler_document_new_from_pdfdoc (newDoc, error); + return _poppler_document_new_from_pdfdoc (initer, newDoc, error); } static inline gboolean @@ -360,9 +356,7 @@ poppler_document_new_from_stream (GInputStream *stream, g_return_val_if_fail(G_IS_INPUT_STREAM(stream), NULL); g_return_val_if_fail(length == (goffset)-1 || length > 0, NULL); - if (!globalParams) { - globalParams = std::make_unique<GlobalParams>(); - } + auto initer = new GlobalParamsIniter(_poppler_error_cb, nullptr); if (!G_IS_SEEKABLE(stream) || !g_seekable_can_seek(G_SEEKABLE(stream))) { g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, @@ -388,7 +382,7 @@ poppler_document_new_from_stream (GInputStream *stream, newDoc = new PDFDoc(str, password_g, password_g); delete password_g; - return _poppler_document_new_from_pdfdoc (newDoc, error); + return _poppler_document_new_from_pdfdoc (initer, newDoc, error); } /** @@ -548,6 +542,7 @@ poppler_document_finalize (GObject *object) poppler_document_layers_free (document); delete document->output_dev; delete document->doc; + delete document->initer; G_OBJECT_CLASS (poppler_document_parent_class)->finalize (object); } diff --git a/glib/poppler-private.h b/glib/poppler-private.h index 3e6b4b17..cba1de76 100644 --- a/glib/poppler-private.h +++ b/glib/poppler-private.h @@ -24,6 +24,7 @@ struct _PopplerDocument { /*< private >*/ GObject parent_instance; + GlobalParamsIniter *initer; PDFDoc *doc; GList *layers; @@ -162,4 +163,6 @@ type_name##_get_type (void) return g_define_type_id__volatile; \ } +void _poppler_error_cb (void *data, ErrorCategory category, Goffset pos, const char *message); + #endif diff --git a/glib/poppler.cc b/glib/poppler.cc index 55347c2d..31183372 100644 --- a/glib/poppler.cc +++ b/glib/poppler.cc @@ -23,6 +23,8 @@ #include <Error.h> #endif +#include "poppler-private.h" + /** * SECTION: poppler-errors * @title: Error handling @@ -76,18 +78,16 @@ poppler_get_version (void) return poppler_version; } -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) - /* We want to install an error callback so that PDF syntax warnings etc * can be redirected through the GLib logging API instead of always just * going to stderr. */ -static void -error_cb (void *data G_GNUC_UNUSED, - ErrorCategory category, - Goffset pos, - const char *message) +void +_poppler_error_cb (void *data G_GNUC_UNUSED, + ErrorCategory category, + Goffset pos, + const char *message) { static const char * const cat_str[] = { "Syntax warning", @@ -110,11 +110,3 @@ error_cb (void *data G_GNUC_UNUSED, "%s at position %" G_GOFFSET_FORMAT ": %s", cat_str[category], (goffset) pos, message); } - -static void __attribute__((__constructor__)) -poppler_constructor () -{ - setErrorCallback (error_cb, nullptr); -} - -#endif /* GNUC */ commit a8220105f964ee4102e4ee886df2d0b162b42ae6 Author: Adam Reichold <[email protected]> Date: Fri Jan 3 21:51:25 2020 +0100 Reuse the GlobalParamsIniter in the qt5 frontend. diff --git a/poppler/GlobalParams.cc b/poppler/GlobalParams.cc index d091ce4e..3c82bd48 100644 --- a/poppler/GlobalParams.cc +++ b/poppler/GlobalParams.cc @@ -414,6 +414,8 @@ GlobalParams::GlobalParams(const char *customPopplerDataDir) unicodeMapCache = new UnicodeMapCache(); cMapCache = new CMapCache(); + utf8Map = nullptr; + baseFontsInitialized = false; // set up the initial nameToUnicode tables @@ -1132,6 +1134,16 @@ std::string GlobalParams::getTextEncodingName() const { return textEncoding->toStr(); } +const UnicodeMap *GlobalParams::getUtf8Map() { + if (!utf8Map) { + GooString enc("UTF-8"); + utf8Map = globalParams->getUnicodeMap(&enc); + utf8Map->incRefCnt(); + } + + return utf8Map; +} + bool GlobalParams::getPrintCommands() { globalParamsLocker(); return printCommands; diff --git a/poppler/GlobalParams.h b/poppler/GlobalParams.h index 415cae4e..5ac536e2 100644 --- a/poppler/GlobalParams.h +++ b/poppler/GlobalParams.h @@ -139,6 +139,8 @@ public: CMap *getCMap(const GooString *collection, const GooString *cMapName, Stream *stream = nullptr); UnicodeMap *getTextEncoding(); + const UnicodeMap *getUtf8Map(); + std::vector<GooString*> *getEncodingNames(); //----- functions to set parameters @@ -208,6 +210,8 @@ private: CharCodeToUnicodeCache *unicodeToUnicodeCache; UnicodeMapCache *unicodeMapCache; CMapCache *cMapCache; + + UnicodeMap *utf8Map; mutable std::recursive_mutex mutex; mutable std::recursive_mutex unicodeMapCacheMutex; diff --git a/qt5/src/poppler-document.cc b/qt5/src/poppler-document.cc index ba9b86cd..658cba0f 100644 --- a/qt5/src/poppler-document.cc +++ b/qt5/src/poppler-document.cc @@ -57,9 +57,6 @@ namespace Poppler { - int DocumentData::count = 0; - QMutex DocumentData::mutex; - Document *Document::load(const QString &filePath, const QByteArray &ownerPassword, const QByteArray &userPassword) { diff --git a/qt5/src/poppler-private.cc b/qt5/src/poppler-private.cc index 3c9bf512..b1346ad1 100644 --- a/qt5/src/poppler-private.cc +++ b/qt5/src/poppler-private.cc @@ -54,15 +54,13 @@ namespace Debug { } - static UnicodeMap *utf8Map = nullptr; - void setDebugErrorFunction(PopplerDebugFunc function, const QVariant &closure) { Debug::debugFunction = function ? function : Debug::qDebugDebugFunction; Debug::debugClosure = closure; } - static void qt5ErrorFunction(void * /*data*/, ErrorCategory /*category*/, Goffset pos, const char *msg) + void qt5ErrorFunction(void * /*data*/, ErrorCategory /*category*/, Goffset pos, const char *msg) { QString emsg; @@ -79,12 +77,7 @@ namespace Debug { } QString unicodeToQString(const Unicode* u, int len) { - if (!utf8Map) - { - GooString enc("UTF-8"); - utf8Map = globalParams->getUnicodeMap(&enc); - utf8Map->incRefCnt(); - } + const UnicodeMap *utf8Map = globalParams->getUtf8Map(); // ignore the last character if it is 0x0 if ((len > 0) && (u[len - 1] == 0)) @@ -242,15 +235,6 @@ namespace Debug { qDeleteAll(m_embeddedFiles); delete (OptContentModel *)m_optContentModel; delete doc; - - QMutexLocker locker{&mutex}; - - count --; - if ( count == 0 ) - { - utf8Map = nullptr; - globalParams.reset(); - } } void DocumentData::init() @@ -259,16 +243,6 @@ namespace Debug { paperColor = Qt::white; m_hints = 0; m_optContentModel = nullptr; - - QMutexLocker locker{&mutex}; - - if ( count == 0 ) - { - utf8Map = nullptr; - globalParams = std::make_unique<GlobalParams>(); - setErrorCallback(qt5ErrorFunction, nullptr); - } - count ++; } diff --git a/qt5/src/poppler-private.h b/qt5/src/poppler-private.h index 28b5ca30..3fc7f7ec 100644 --- a/qt5/src/poppler-private.h +++ b/qt5/src/poppler-private.h @@ -75,7 +75,7 @@ namespace Poppler { GooString *QDateTimeToUnicodeGooString(const QDateTime &dt); - void qt5ErrorFunction(int pos, char *msg, va_list args); + void qt5ErrorFunction(void * /*data*/, ErrorCategory /*category*/, Goffset pos, const char *msg); Annot::AdditionalActionsType toPopplerAdditionalActionType(Annotation::AdditionalActionType type); @@ -93,9 +93,10 @@ namespace Poppler { bool externalDest; }; - class DocumentData { + class DocumentData : private GlobalParamsIniter { public: - DocumentData(const QString &filePath, GooString *ownerPassword, GooString *userPassword) + DocumentData(const QString &filePath, GooString *ownerPassword, GooString *userPassword) : + GlobalParamsIniter(qt5ErrorFunction, nullptr) { init(); m_filePath = filePath; @@ -111,7 +112,8 @@ namespace Poppler { delete userPassword; } - DocumentData(const QByteArray &data, GooString *ownerPassword, GooString *userPassword) + DocumentData(const QByteArray &data, GooString *ownerPassword, GooString *userPassword) : + GlobalParamsIniter(qt5ErrorFunction, nullptr) { fileContents = data; MemStream *str = new MemStream((char*)fileContents.data(), 0, fileContents.length(), Object(objNull)); @@ -158,8 +160,6 @@ namespace Poppler { QPointer<OptContentModel> m_optContentModel; QColor paperColor; int m_hints; - static int count; - static QMutex mutex; }; class FontInfoData commit 7daaa2925858ef1740ec38b25be7bf74c0aefa33 Author: Adam Reichold <[email protected]> Date: Fri Jan 3 21:29:23 2020 +0100 Move the initer of the cpp frontend into the core to able to reuse it for the qt5 and glib frontends. diff --git a/cpp/poppler-document-private.h b/cpp/poppler-document-private.h index fbf330e8..7af13658 100644 --- a/cpp/poppler-document-private.h +++ b/cpp/poppler-document-private.h @@ -26,6 +26,7 @@ #include "poppler-config.h" #include "GooString.h" #include "PDFDoc.h" +#include "GlobalParams.h" #include <vector> @@ -35,24 +36,7 @@ namespace poppler class document; class embedded_file; -class initer -{ -public: - initer(); - ~initer(); - - initer(const initer &) = delete; - initer& operator=(const initer &) = delete; - - static bool set_data_dir(const std::string &new_data_dir); - -private: - static std::mutex mutex; - static unsigned int count; - static std::string data_dir; -}; - -class document_private : private initer +class document_private : private GlobalParamsIniter { public: document_private(GooString *file_path, const std::string &owner_password, @@ -62,6 +46,7 @@ public: document_private(const char *file_data, int file_data_length, const std::string &owner_password, const std::string &user_password); + document_private(); ~document_private(); static document* check_document(document_private *doc, byte_array *file_data); diff --git a/cpp/poppler-document.cpp b/cpp/poppler-document.cpp index 7023c0f4..15b83454 100644 --- a/cpp/poppler-document.cpp +++ b/cpp/poppler-document.cpp @@ -50,53 +50,9 @@ using namespace poppler; -std::mutex poppler::initer::mutex; -unsigned int poppler::initer::count = 0U; -std::string poppler::initer::data_dir; - -initer::initer() -{ - std::lock_guard<std::mutex> lock{mutex}; - - if (!count) { - globalParams = std::make_unique<GlobalParams>(!data_dir.empty() ? data_dir.c_str() : nullptr); - setErrorCallback(detail::error_function, nullptr); - } - count++; -} - -initer::~initer() -{ - std::lock_guard<std::mutex> lock{mutex}; - - if (count > 0) { - --count; - if (!count) { - globalParams.reset(); - } - } -} - -bool initer::set_data_dir(const std::string &new_data_dir) -{ - std::lock_guard<std::mutex> lock{mutex}; - - if (count == 0) { - data_dir = new_data_dir; - return true; - } - - return false; -} - - document_private::document_private(GooString *file_path, const std::string &owner_password, const std::string &user_password) - : initer() - , doc(nullptr) - , raw_doc_data(nullptr) - , raw_doc_data_length(0) - , is_locked(false) + : document_private() { GooString goo_owner_password(owner_password.c_str()); GooString goo_user_password(user_password.c_str()); @@ -106,11 +62,7 @@ document_private::document_private(GooString *file_path, const std::string &owne document_private::document_private(byte_array *file_data, const std::string &owner_password, const std::string &user_password) - : initer() - , doc(nullptr) - , raw_doc_data(nullptr) - , raw_doc_data_length(0) - , is_locked(false) + : document_private() { file_data->swap(doc_data); MemStream *memstr = new MemStream(&doc_data[0], 0, doc_data.size(), Object(objNull)); @@ -122,18 +74,25 @@ document_private::document_private(byte_array *file_data, document_private::document_private(const char *file_data, int file_data_length, const std::string &owner_password, const std::string &user_password) - : initer() - , doc(nullptr) - , raw_doc_data(file_data) - , raw_doc_data_length(file_data_length) - , is_locked(false) + : document_private() { + raw_doc_data = file_data; + raw_doc_data_length = file_data_length; MemStream *memstr = new MemStream(const_cast<char *>(raw_doc_data), 0, raw_doc_data_length, Object(objNull)); GooString goo_owner_password(owner_password.c_str()); GooString goo_user_password(user_password.c_str()); doc = new PDFDoc(memstr, &goo_owner_password, &goo_user_password); } +document_private::document_private() + : GlobalParamsIniter(detail::error_function, nullptr) + , doc(nullptr) + , raw_doc_data(nullptr) + , raw_doc_data_length(0) + , is_locked(false) +{ +} + document_private::~document_private() { delete_all(embedded_files); diff --git a/cpp/poppler-global.cpp b/cpp/poppler-global.cpp index 41ce08f7..adca42ba 100644 --- a/cpp/poppler-global.cpp +++ b/cpp/poppler-global.cpp @@ -374,7 +374,7 @@ std::ostream& poppler::operator<<(std::ostream& stream, const byte_array &array) */ bool poppler::set_data_dir(const std::string &new_data_dir) { - return initer::set_data_dir(new_data_dir); + return GlobalParamsIniter::setCustomDataDir(new_data_dir); } /** diff --git a/poppler/GlobalParams.cc b/poppler/GlobalParams.cc index 71824bc2..d091ce4e 100644 --- a/poppler/GlobalParams.cc +++ b/poppler/GlobalParams.cc @@ -1245,3 +1245,43 @@ void GlobalParams::setErrQuiet(bool errQuietA) { globalParamsLocker(); errQuiet = errQuietA; } + +GlobalParamsIniter::GlobalParamsIniter(ErrorCallback errorCallback, void *errorCallbackData) +{ + std::lock_guard<std::mutex> lock{mutex}; + + if (count == 0) { + globalParams = std::make_unique<GlobalParams>(!customDataDir.empty() ? customDataDir.c_str() : nullptr); + + setErrorCallback(errorCallback, errorCallbackData); + } + + count++; +} + +GlobalParamsIniter::~GlobalParamsIniter() +{ + std::lock_guard<std::mutex> lock{mutex}; + + --count; + + if (count == 0) { + globalParams.reset(); + } +} + +bool GlobalParamsIniter::setCustomDataDir(const std::string &dir) +{ + std::lock_guard<std::mutex> lock{mutex}; + + if (count == 0) { + customDataDir = dir; + return true; + } + + return false; +} + +std::mutex GlobalParamsIniter::mutex; +int GlobalParamsIniter::count = 0; +std::string GlobalParamsIniter::customDataDir; diff --git a/poppler/GlobalParams.h b/poppler/GlobalParams.h index 2e72982a..415cae4e 100644 --- a/poppler/GlobalParams.h +++ b/poppler/GlobalParams.h @@ -42,6 +42,7 @@ #include <cstdio> #include "CharTypes.h" #include "UnicodeMap.h" +#include "Error.h" #include <unordered_map> #include <string> #include <memory> @@ -215,4 +216,22 @@ private: const char *popplerDataDir; }; +class GlobalParamsIniter +{ +public: + GlobalParamsIniter(ErrorCallback errorCallback, void *errorCallbackData); + ~GlobalParamsIniter(); + + GlobalParamsIniter(const GlobalParamsIniter &) = delete; + GlobalParamsIniter &operator=(const GlobalParamsIniter &) = delete; + + static bool setCustomDataDir(const std::string &dir); + +private: + static std::mutex mutex; + static int count; + + static std::string customDataDir; +}; + #endif commit f2197842c8e7a8c4f7ee15eba1bd42379803e229 Author: Adam Reichold <[email protected]> Date: Fri Jan 3 21:22:44 2020 +0100 Improve readability of Error module by using a type alias for the error callback function pointer. diff --git a/poppler/Error.cc b/poppler/Error.cc index d8817b95..f38666da 100644 --- a/poppler/Error.cc +++ b/poppler/Error.cc @@ -45,13 +45,10 @@ static const char *errorCategoryNames[] = { "Internal Error" }; -static void (*errorCbk)(void *data, ErrorCategory category, - Goffset pos, const char *msg) = nullptr; +static ErrorCallback errorCbk = nullptr; static void *errorCbkData = nullptr; -void setErrorCallback(void (*cbk)(void *data, ErrorCategory category, - Goffset pos, const char *msg), - void *data) { +void setErrorCallback(ErrorCallback cbk, void *data) { errorCbk = cbk; errorCbkData = data; } diff --git a/poppler/Error.h b/poppler/Error.h index e6df4461..52ac80f0 100644 --- a/poppler/Error.h +++ b/poppler/Error.h @@ -47,9 +47,9 @@ enum ErrorCategory { errInternal // internal error - malfunction within the Xpdf code }; -extern void setErrorCallback(void (*cbk)(void *data, ErrorCategory category, - Goffset pos, const char *msg), - void *data); +using ErrorCallback = void (*)(void *data, ErrorCategory category, Goffset pos, const char *msg); + +extern void setErrorCallback(ErrorCallback cbk, void *data); extern void CDECL error(ErrorCategory category, Goffset pos, const char *msg, ...) GOOSTRING_FORMAT; _______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
