// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #pragma once #include "extensionsystem_global.h" #include #include #include namespace ExtensionSystem { namespace Internal { class IPluginPrivate; } using TestCreator = std::function; using ObjectCreator = std::function; using ObjectDestructor = std::function; struct EXTENSIONSYSTEM_EXPORT ObjectCreationPolicy { // Can be empty if nothing depends on it. Utils::Id id; // Objects with empty dependencies are created as soon as possible. QList dependsOn; }; class EXTENSIONSYSTEM_EXPORT IPlugin : public QObject { Q_OBJECT public: enum ShutdownFlag { SynchronousShutdown, AsynchronousShutdown }; IPlugin(); ~IPlugin() override; virtual bool initialize(const QStringList &arguments, QString *errorString); virtual void extensionsInitialized() {} virtual bool delayedInitialize() { return false; } virtual ShutdownFlag aboutToShutdown() { return SynchronousShutdown; } virtual QObject *remoteCommand(const QStringList & /* options */, const QString & /* workingDirectory */, const QStringList & /* arguments */) { return nullptr; } // Deprecated in 10.0, use addTest() virtual QVector createTestObjects() const; virtual void tryCreateObjects(); protected: virtual void initialize() {} template void addTest(Args && ...args) { addTestCreator([args...] { return new Test(args...); }); } void addTestCreator(const TestCreator &creator); template void addManaged(const ObjectCreationPolicy &policy = {}) { addManagedHelper([]() -> void * { return new Type(); }, [](void *p) { delete static_cast(p); }, policy); } void addManagedHelper(const ObjectCreator &creator, const ObjectDestructor &destructor, const ObjectCreationPolicy &policy); signals: void asynchronousShutdownFinished(); private: Internal::IPluginPrivate *d; }; } // namespace ExtensionSystem