diff --git a/src/libcalamares/CMakeLists.txt b/src/libcalamares/CMakeLists.txt index c6f8cd0d2..f2063813c 100644 --- a/src/libcalamares/CMakeLists.txt +++ b/src/libcalamares/CMakeLists.txt @@ -44,6 +44,7 @@ set( libSources utils/CommandList.cpp utils/Dirs.cpp utils/Logger.cpp + utils/PluginFactory.cpp utils/Retranslator.cpp utils/String.cpp utils/UMask.cpp diff --git a/src/libcalamares/utils/PluginFactory.cpp b/src/libcalamares/utils/PluginFactory.cpp new file mode 100644 index 000000000..7e1b29921 --- /dev/null +++ b/src/libcalamares/utils/PluginFactory.cpp @@ -0,0 +1,11 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + */ + +#include "PluginFactory.h" + +CalamaresPluginFactory::~CalamaresPluginFactory() +{ +} diff --git a/src/libcalamares/utils/PluginFactory.h b/src/libcalamares/utils/PluginFactory.h index 2ba9fd3cd..20c82c464 100644 --- a/src/libcalamares/utils/PluginFactory.h +++ b/src/libcalamares/utils/PluginFactory.h @@ -28,10 +28,75 @@ #define CalamaresPluginFactory_iid "io.calamares.PluginFactory" +/** @brief Plugin factory for Calamares + * + * Try to re-use KPluginFactory as much as possible (since the + * old code for PluginFactory was a fork of an old version of + * exactly that). + * + * The current createInstance() method passes more arguments + * to the job and viewstep constructors than we want; chasing + * that change means modifying each Calamares module. This class + * implements a version of createInstance() with fewer arguments + * and overloads registerPlugin() to use that. + */ +class CalamaresPluginFactory : public KPluginFactory +{ + Q_OBJECT +public: + explicit CalamaresPluginFactory() : KPluginFactory() {} + ~CalamaresPluginFactory() override; + + /** @brief Create an object from the factory. + * + * Ignores all the @p args since they are not used. Calls + * Calamares constructors for the Jobs and ViewSteps. + */ + template + static QObject *createInstance(QWidget *parentWidget, QObject *parent, const QVariantList &args) + { + Q_UNUSED(parentWidget); + Q_UNUSED(args); + ParentType *p = nullptr; + if (parent) { + p = qobject_cast(parent); + Q_ASSERT(p); + } + return new impl(p); + } + + /** @brief register a plugin + * + * The Calamares version doesn't accept keywords, and uses + * the Calamares createInstance() version which ignores + * the QVariantList of arguments. + */ + template + void registerPlugin() + { + KPluginFactory::registerPlugin(QString(), &createInstance); + } +}; + +/** @brief declare a Calamares Plugin Factory + * + * This would be defined as K_PLUGIN_FACTORY_DECLARATION_WITH_BASEFACTORY, + * except that does not actually use the base factory class that is + * passed in. + */ #define CALAMARES_PLUGIN_FACTORY_DECLARATION(name) \ - K_PLUGIN_FACTORY_DECLARATION_WITH_BASEFACTORY_SKEL(name,KPluginFactory,Q_PLUGIN_METADATA(IID CalamaresPluginFactory_iid)) + class name : public CalamaresPluginFactory \ + { \ + Q_OBJECT \ + Q_INTERFACES(KPluginFactory) \ + Q_PLUGIN_METADATA(IID CalamaresPluginFactory_iid) \ + public: \ + explicit name(); \ + ~name(); \ + }; #define CALAMARES_PLUGIN_FACTORY_DEFINITION(name, pluginRegistrations) \ - K_PLUGIN_FACTORY_DEFINITION(name, pluginRegistrations ) + K_PLUGIN_FACTORY_DEFINITION_WITH_BASEFACTORY(name,CalamaresPluginFactory,pluginRegistrations) + // Q_DECLARE_INTERFACE( Calamares::PluginFactory, CalamaresPluginFactory_iid ) diff --git a/src/libcalamaresui/modulesystem/CppJobModule.cpp b/src/libcalamaresui/modulesystem/CppJobModule.cpp index 17c191024..c6571dbf6 100644 --- a/src/libcalamaresui/modulesystem/CppJobModule.cpp +++ b/src/libcalamaresui/modulesystem/CppJobModule.cpp @@ -49,7 +49,7 @@ CppJobModule::loadSelf() { if ( m_loader ) { - PluginFactory* pf = qobject_cast< PluginFactory* >( m_loader->instance() ); + CalamaresPluginFactory* pf = qobject_cast< CalamaresPluginFactory* >( m_loader->instance() ); if ( !pf ) { cDebug() << Q_FUNC_INFO << m_loader->errorString(); diff --git a/src/libcalamaresui/modulesystem/ViewModule.cpp b/src/libcalamaresui/modulesystem/ViewModule.cpp index 5cd2fe7d9..7506e5348 100644 --- a/src/libcalamaresui/modulesystem/ViewModule.cpp +++ b/src/libcalamaresui/modulesystem/ViewModule.cpp @@ -50,7 +50,7 @@ ViewModule::loadSelf() { if ( m_loader ) { - PluginFactory* pf = qobject_cast< PluginFactory* >( m_loader->instance() ); + CalamaresPluginFactory* pf = qobject_cast< CalamaresPluginFactory* >( m_loader->instance() ); if ( !pf ) { cWarning() << Q_FUNC_INFO << "No factory:" << m_loader->errorString();