[libcalamares] Switch to using KPluginFactory
- this is not entirely straightfoward, since we need different constructor arguments for the objects Calamares creates (no QVariantList& args, in particular). Implement our own registerPlugin() and createInstance() for that. - work around a bug in K_PLUGIN_FACTORY_DECLARATION_WITH_BASEFACTORY
This commit is contained in:
parent
9098f8d741
commit
0716a46eb2
@ -44,6 +44,7 @@ set( libSources
|
|||||||
utils/CommandList.cpp
|
utils/CommandList.cpp
|
||||||
utils/Dirs.cpp
|
utils/Dirs.cpp
|
||||||
utils/Logger.cpp
|
utils/Logger.cpp
|
||||||
|
utils/PluginFactory.cpp
|
||||||
utils/Retranslator.cpp
|
utils/Retranslator.cpp
|
||||||
utils/String.cpp
|
utils/String.cpp
|
||||||
utils/UMask.cpp
|
utils/UMask.cpp
|
||||||
|
11
src/libcalamares/utils/PluginFactory.cpp
Normal file
11
src/libcalamares/utils/PluginFactory.cpp
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/* === This file is part of Calamares - <https://github.com/calamares> ===
|
||||||
|
*
|
||||||
|
* Copyright 2019, Adriaan de Groot <groot@kde.org>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "PluginFactory.h"
|
||||||
|
|
||||||
|
CalamaresPluginFactory::~CalamaresPluginFactory()
|
||||||
|
{
|
||||||
|
}
|
@ -28,10 +28,75 @@
|
|||||||
|
|
||||||
#define CalamaresPluginFactory_iid "io.calamares.PluginFactory"
|
#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<class impl, class ParentType>
|
||||||
|
static QObject *createInstance(QWidget *parentWidget, QObject *parent, const QVariantList &args)
|
||||||
|
{
|
||||||
|
Q_UNUSED(parentWidget);
|
||||||
|
Q_UNUSED(args);
|
||||||
|
ParentType *p = nullptr;
|
||||||
|
if (parent) {
|
||||||
|
p = qobject_cast<ParentType *>(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<class T>
|
||||||
|
void registerPlugin()
|
||||||
|
{
|
||||||
|
KPluginFactory::registerPlugin<T>(QString(), &createInstance<T, QObject>);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** @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) \
|
#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) \
|
#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 )
|
// Q_DECLARE_INTERFACE( Calamares::PluginFactory, CalamaresPluginFactory_iid )
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ CppJobModule::loadSelf()
|
|||||||
{
|
{
|
||||||
if ( m_loader )
|
if ( m_loader )
|
||||||
{
|
{
|
||||||
PluginFactory* pf = qobject_cast< PluginFactory* >( m_loader->instance() );
|
CalamaresPluginFactory* pf = qobject_cast< CalamaresPluginFactory* >( m_loader->instance() );
|
||||||
if ( !pf )
|
if ( !pf )
|
||||||
{
|
{
|
||||||
cDebug() << Q_FUNC_INFO << m_loader->errorString();
|
cDebug() << Q_FUNC_INFO << m_loader->errorString();
|
||||||
|
@ -50,7 +50,7 @@ ViewModule::loadSelf()
|
|||||||
{
|
{
|
||||||
if ( m_loader )
|
if ( m_loader )
|
||||||
{
|
{
|
||||||
PluginFactory* pf = qobject_cast< PluginFactory* >( m_loader->instance() );
|
CalamaresPluginFactory* pf = qobject_cast< CalamaresPluginFactory* >( m_loader->instance() );
|
||||||
if ( !pf )
|
if ( !pf )
|
||||||
{
|
{
|
||||||
cWarning() << Q_FUNC_INFO << "No factory:" << m_loader->errorString();
|
cWarning() << Q_FUNC_INFO << "No factory:" << m_loader->errorString();
|
||||||
|
Loading…
Reference in New Issue
Block a user