summaryrefslogtreecommitdiffstats
path: root/src/corelib/plugin/qlibrary_p.h
blob: b4e29a79e2884cbedaa5046ee9fba82b4a2e39eb (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
// Copyright (C) 2020 The Qt Company Ltd.// Copyright (C) 2021 Intel Corporation.// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only#ifndef QLIBRARY_P_H#define QLIBRARY_P_H//// W A R N I N G// -------------//// This file is not part of the Qt API. It exists for the convenience// of the QLibrary class. This header file may change from// version to version without notice, or even be removed.//// We mean it.//#include"QtCore/qlibrary.h"#include"QtCore/private/qplugin_p.h"#include"QtCore/qloggingcategory.h"#include"QtCore/qmutex.h"#include"QtCore/qplugin.h"#include"QtCore/qpointer.h"#include"QtCore/qstringlist.h"#ifdef Q_OS_WIN# include"QtCore/qt_windows.h"#endif#include <memory>QT_REQUIRE_CONFIG(library); QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(qt_lcDebugPlugins)struct QLibraryScanResult { qsizetype pos; qsizetype length;#if defined(Q_OF_MACH_O)bool isEncrypted =false;#endif};class QLibraryStore;class QLibraryPrivate {public:#ifdef Q_OS_WINusing Handle = HINSTANCE;#elseusing Handle =void*;#endifenum UnloadFlag { UnloadSys, NoUnloadSys };struct Deleter {// QLibraryPrivate::release() is not, yet, and cannot easily be made, noexcept:voidoperator()(QLibraryPrivate *p)const{ p->release(); }};using UniquePtr =std::unique_ptr<QLibraryPrivate, Deleter>;const QString fileName;const QString fullVersion;boolload(); QtPluginInstanceFunction loadPlugin();// loads and resolves instanceboolunload(UnloadFlag flag = UnloadSys);voidrelease(); QFunctionPointer resolve(const char*);QLibrary::LoadHints loadHints()const{returnQLibrary::LoadHints(loadHintsInt.loadRelaxed()); }voidsetLoadHints(QLibrary::LoadHints lh); QObject *pluginInstance();static QLibraryPrivate *findOrCreate(const QString &fileName,const QString &version =QString(),QLibrary::LoadHints loadHints = { });static QStringList suffixes_sys(const QString &fullVersion);staticconstexpr QStringView prefix_sys(){#ifdef Q_OS_WINreturn{};#elif defined(Q_OS_CYGWIN)return u"cyg";#elsereturn u"lib";#endif} QAtomicPointer<std::remove_pointer<QtPluginInstanceFunction>::type> instanceFactory; QAtomicPointer<std::remove_pointer<Handle>::type> pHnd;// the mutex protects the fields below QMutex mutex; QPointer<QObject> inst;// used by QFactoryLoader QPluginParsedMetaData metaData; QString errorString; QString qualifiedFileName;voidupdatePluginState();boolisPlugin();private:explicitQLibraryPrivate(const QString &canonicalFileName,const QString &version,QLibrary::LoadHints loadHints);~QLibraryPrivate();voidmergeLoadHints(QLibrary::LoadHints loadHints);boolload_sys();boolunload_sys(); QFunctionPointer resolve_sys(const char*); QAtomicInt loadHintsInt;/// counts how many QLibrary or QPluginLoader are attached to us, plus 1 if it's loaded QAtomicInt libraryRefCount;/// counts how many times load() or loadPlugin() were called QAtomicInt libraryUnloadCount;enum{ IsAPlugin, IsNotAPlugin, MightBeAPlugin } pluginState;friend class QLibraryStore;}; QT_END_NAMESPACE #endif// QLIBRARY_P_H
close