// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0 WITH Qt-GPL-exception-1.0 #pragma once #include "extensionsystem_global.h" #include #include #include #include QT_BEGIN_NAMESPACE class QTextStream; QT_END_NAMESPACE namespace ExtensionSystem { class IPlugin; class PluginSpec; namespace Internal { class PluginManagerPrivate; } class EXTENSIONSYSTEM_EXPORT PluginManager : public QObject { Q_OBJECT public: static PluginManager *instance(); PluginManager(); ~PluginManager() override; // Object pool operations static void addObject(QObject *obj); static void removeObject(QObject *obj); static QVector allObjects(); static QReadWriteLock *listLock(); // This is useful for soft dependencies using pure interfaces. template static T *getObject() { QReadLocker lock(listLock()); const QVector all = allObjects(); for (QObject *obj : all) { if (T *result = qobject_cast(obj)) return result; } return nullptr; } template static T *getObject(Predicate predicate) { QReadLocker lock(listLock()); const QVector all = allObjects(); for (QObject *obj : all) { if (T *result = qobject_cast(obj)) if (predicate(result)) return result; } return 0; } static QObject *getObjectByName(const QString &name); // Plugin operations static QVector loadQueue(); static void loadPlugins(); static QStringList pluginPaths(); static void setPluginPaths(const QStringList &paths); static QString pluginIID(); static void setPluginIID(const QString &iid); static const QVector plugins(); static QHash> pluginCollections(); static bool hasError(); static const QStringList allErrors(); static const QSet pluginsRequiringPlugin(PluginSpec *spec); static const QSet pluginsRequiredByPlugin(PluginSpec *spec); static void checkForProblematicPlugins(); // Settings static void setSettings(Utils::QtcSettings *settings); static Utils::QtcSettings *settings(); static void setGlobalSettings(Utils::QtcSettings *settings); static Utils::QtcSettings *globalSettings(); static void writeSettings(); // command line arguments static QStringList arguments(); static QStringList argumentsForRestart(); static bool parseOptions(const QStringList &args, const QMap &appOptions, QMap *foundAppOptions, QString *errorString); static void formatOptions(QTextStream &str, int optionIndentation, int descriptionIndentation); static void formatPluginOptions(QTextStream &str, int optionIndentation, int descriptionIndentation); static void formatPluginVersions(QTextStream &str); static QString serializedArguments(); static bool testRunRequested(); #ifdef WITH_TESTS static bool registerScenario(const QString &scenarioId, std::function scenarioStarter); static bool isScenarioRequested(); static bool runScenario(); static bool isScenarioRunning(const QString &scenarioId); // static void triggerScenarioPoint(const QVariant pointData); // ?? called from scenario point static bool finishScenario(); static void waitForScenarioFullyInitialized(); // signals: // void scenarioPointTriggered(const QVariant pointData); // ?? e.g. in StringTable::GC() -> post a call to quit into main thread and sleep for 5 seconds in the GC thread #endif struct ProcessData { QString m_executable; QStringList m_args; QString m_workingPath; QString m_settingsPath; }; static void setCreatorProcessData(const ProcessData &data); static ProcessData creatorProcessData(); static void profilingReport(const char *what, const PluginSpec *spec = nullptr); static QString platformName(); static bool isInitializationDone(); static void remoteArguments(const QString &serializedArguments, QObject *socket); static void shutdown(); static QString systemInformation(); signals: void objectAdded(QObject *obj); void aboutToRemoveObject(QObject *obj); void pluginsChanged(); void initializationDone(); void testsFinished(int failedTests); void scenarioFinished(int exitCode); friend class Internal::PluginManagerPrivate; }; } // namespace ExtensionSystem