summaryrefslogtreecommitdiffstats
path: root/data/plugin
diff options
context:
space:
mode:
authorAndrew <forkk@forkk.net>2013-02-20 19:10:09 -0600
committerAndrew <forkk@forkk.net>2013-02-20 19:10:09 -0600
commitdd2e836b4cf4cfa043f9ea2911f58f1d22d4e282 (patch)
tree07e99dd9c2858e2e46075a649751049c3195b437 /data/plugin
parentf71479ec33562c9a0ebbdb335bef5e2824a12710 (diff)
downloadMultiMC-dd2e836b4cf4cfa043f9ea2911f58f1d22d4e282.tar
MultiMC-dd2e836b4cf4cfa043f9ea2911f58f1d22d4e282.tar.gz
MultiMC-dd2e836b4cf4cfa043f9ea2911f58f1d22d4e282.tar.lz
MultiMC-dd2e836b4cf4cfa043f9ea2911f58f1d22d4e282.tar.xz
MultiMC-dd2e836b4cf4cfa043f9ea2911f58f1d22d4e282.zip
Split MultiMC up into a few separate libraries.
Fixed plugin system. Tons of other stuff...
Diffstat (limited to 'data/plugin')
-rw-r--r--data/plugin/instancetypeplugin.h41
-rw-r--r--data/plugin/pluginmanager.cpp81
-rw-r--r--data/plugin/pluginmanager.h17
3 files changed, 54 insertions, 85 deletions
diff --git a/data/plugin/instancetypeplugin.h b/data/plugin/instancetypeplugin.h
deleted file mode 100644
index 8e3febdb..00000000
--- a/data/plugin/instancetypeplugin.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Copyright 2013 MultiMC Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef INSTANCETYPEPLUGIN_H
-#define INSTANCETYPEPLUGIN_H
-
-#include <QList>
-
-#include "data/inst/instancetype.h"
-
-/*!
- * \brief Interface for plugins that want to provide custom instance types.
- */
-class InstanceTypePlugin
-{
-public:
- /*!
- * \brief Gets a QList containing the instance types that this plugin provides.
- * These instance types are then registered with the InstanceLoader.
- * The InstanceType objects should \e not be deleted by the plugin. Once they
- * are registered, they belong to the InstanceLoader.
- * \return A QList containing this plugin's instance types.
- */
- virtual QList<InstanceType *> getInstanceTypes() = 0;
-};
-
-Q_DECLARE_INTERFACE(InstanceTypePlugin, "net.forkk.MultiMC.InstanceTypePlugin/0.1")
-
-#endif // INSTANCETYPEPLUGIN_H
diff --git a/data/plugin/pluginmanager.cpp b/data/plugin/pluginmanager.cpp
index cd33b285..2f066293 100644
--- a/data/plugin/pluginmanager.cpp
+++ b/data/plugin/pluginmanager.cpp
@@ -18,10 +18,17 @@
#include <QDir>
#include <QDirIterator>
#include <QFileInfo>
+#include <QVariant>
+
+#include <QJsonObject>
#include <QtPlugin>
-#include "data/plugin/instancetypeplugin.h"
+#include "instancetypeinterface.h"
+
+// MultiMC's API version. This must match the "api" field in each plugin's
+// metadata or MultiMC won't consider them valid MultiMC plugin.
+#define MMC_API_VERSION "MultiMC5-API-1"
PluginManager PluginManager::manager;
@@ -33,8 +40,16 @@ PluginManager::PluginManager() :
bool PluginManager::loadPlugins(QString pluginDir)
{
+ // Delete the loaded plugins and clear the list.
+ for (int i = 0; i < m_plugins.count(); i++)
+ {
+ delete m_plugins[i];
+ }
m_plugins.clear();
+ qDebug(QString("Loading plugins from directory: %1").
+ arg(pluginDir).toUtf8());
+
QDir dir(pluginDir);
QDirIterator iter(dir);
@@ -44,53 +59,47 @@ bool PluginManager::loadPlugins(QString pluginDir)
if (pluginFile.exists() && pluginFile.isFile())
{
- QPluginLoader pluginLoader(pluginFile.absoluteFilePath());
- pluginLoader.load();
- QObject *plugin = pluginLoader.instance();
- if (plugin)
- {
- qDebug(QString("Loaded plugin %1.").
- arg(pluginFile.baseName()).toUtf8());
- m_plugins.push_back(plugin);
- }
- else
+ qDebug(QString("Attempting to load plugin: %1").
+ arg(pluginFile.canonicalFilePath()).toUtf8());
+
+ QPluginLoader *pluginLoader = new QPluginLoader(pluginFile.absoluteFilePath());
+
+ QJsonObject pluginInfo = pluginLoader->metaData();
+ QJsonObject pluginMetadata = pluginInfo.value("MetaData").toObject();
+
+ if (pluginMetadata.value("api").toString("") != MMC_API_VERSION)
{
- qWarning(QString("Error loading plugin %1. Not a valid plugin.").
- arg(pluginFile.baseName()).toUtf8());
+ // If "api" is not specified, it's not a MultiMC plugin.
+ qDebug(QString("Not loading plugin %1. Not a valid MultiMC plugin. "
+ "API: %2").
+ arg(pluginFile.canonicalFilePath(), pluginMetadata.value("api").toString("")).toUtf8());
+ continue;
}
+
+ qDebug(QString("Loaded plugin: %1").
+ arg(pluginInfo.value("IID").toString()).toUtf8());
+ m_plugins.push_back(pluginLoader);
}
}
return true;
}
-bool PluginManager::initInstanceTypes()
+QPluginLoader *PluginManager::getPlugin(int index)
+{
+ return m_plugins[index];
+}
+
+void PluginManager::initInstanceTypes()
{
for (int i = 0; i < m_plugins.count(); i++)
{
- InstanceTypePlugin *plugin = qobject_cast<InstanceTypePlugin *>(m_plugins[i]);
- if (plugin)
+ InstanceTypeInterface *instType = qobject_cast<InstanceTypeInterface *>(m_plugins[i]->instance());
+
+ if (instType)
{
- QList<InstanceType *> instanceTypes = plugin->getInstanceTypes();
-
- for (int i = 0; i < instanceTypes.count(); i++)
- {
- InstanceLoader::InstTypeError error =
- InstanceLoader::loader.registerInstanceType(instanceTypes[i]);
- switch (error)
- {
- case InstanceLoader::TypeIDExists:
- qWarning(QString("Instance type %1 already registered.").
- arg(instanceTypes[i]->typeID()).toUtf8());
- }
- }
+ // TODO: Handle errors
+ InstanceLoader::get().registerInstanceType(instType);
}
}
-
- return true;
-}
-
-QObject *PluginManager::getPlugin(int index)
-{
- return m_plugins[index];
}
diff --git a/data/plugin/pluginmanager.h b/data/plugin/pluginmanager.h
index 8e2dba0d..b93fd6d2 100644
--- a/data/plugin/pluginmanager.h
+++ b/data/plugin/pluginmanager.h
@@ -42,12 +42,6 @@ public:
bool loadPlugins(QString pluginDir);
/*!
- * \brief Initializes the instance type plugins.
- * \return True if successful. False on failure.
- */
- bool initInstanceTypes();
-
- /*!
* \brief Checks how many plugins are loaded.
* \return The number of plugins.
*/
@@ -58,12 +52,19 @@ public:
* \param index The index of the plugin to get.
* \return The plugin at the given index.
*/
- QObject *getPlugin(int index);
+ QPluginLoader *getPlugin(int index);
+
+ /*!
+ * \brief Initializes and registers all the instance types.
+ * This is done by going through the plugin list and registering all of the
+ * plugins that derive from the InstanceTypeInterface with the InstanceLoader.
+ */
+ void initInstanceTypes();
private:
PluginManager();
- QList<QObject *> m_plugins;
+ QList<QPluginLoader *> m_plugins;
static PluginManager manager;
};