diff options
author | Andrew <forkk@forkk.net> | 2013-02-20 08:32:26 -0600 |
---|---|---|
committer | Andrew <forkk@forkk.net> | 2013-02-20 08:32:59 -0600 |
commit | f71479ec33562c9a0ebbdb335bef5e2824a12710 (patch) | |
tree | 198479995279a2a9eaa04fce405ee05b0c7df482 /data/plugin | |
parent | 6e5017e48b633e20bbba61ac2e7cd58e693aec4e (diff) | |
download | MultiMC-f71479ec33562c9a0ebbdb335bef5e2824a12710.tar MultiMC-f71479ec33562c9a0ebbdb335bef5e2824a12710.tar.gz MultiMC-f71479ec33562c9a0ebbdb335bef5e2824a12710.tar.lz MultiMC-f71479ec33562c9a0ebbdb335bef5e2824a12710.tar.xz MultiMC-f71479ec33562c9a0ebbdb335bef5e2824a12710.zip |
Added stdinstance plugin and a ton of plugin stuff.
Diffstat (limited to 'data/plugin')
-rw-r--r-- | data/plugin/instancetypeplugin.h | 41 | ||||
-rw-r--r-- | data/plugin/pluginmanager.cpp | 96 | ||||
-rw-r--r-- | data/plugin/pluginmanager.h | 71 |
3 files changed, 208 insertions, 0 deletions
diff --git a/data/plugin/instancetypeplugin.h b/data/plugin/instancetypeplugin.h new file mode 100644 index 00000000..8e3febdb --- /dev/null +++ b/data/plugin/instancetypeplugin.h @@ -0,0 +1,41 @@ +/* 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 new file mode 100644 index 00000000..cd33b285 --- /dev/null +++ b/data/plugin/pluginmanager.cpp @@ -0,0 +1,96 @@ +/* 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. + */ + +#include "pluginmanager.h" + +#include <QDir> +#include <QDirIterator> +#include <QFileInfo> + +#include <QtPlugin> + +#include "data/plugin/instancetypeplugin.h" + +PluginManager PluginManager::manager; + +PluginManager::PluginManager() : + QObject(NULL) +{ + +} + +bool PluginManager::loadPlugins(QString pluginDir) +{ + m_plugins.clear(); + + QDir dir(pluginDir); + QDirIterator iter(dir); + + while (iter.hasNext()) + { + QFileInfo pluginFile(dir.absoluteFilePath(iter.next())); + + 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 + { + qWarning(QString("Error loading plugin %1. Not a valid plugin."). + arg(pluginFile.baseName()).toUtf8()); + } + } + } + + return true; +} + +bool PluginManager::initInstanceTypes() +{ + for (int i = 0; i < m_plugins.count(); i++) + { + InstanceTypePlugin *plugin = qobject_cast<InstanceTypePlugin *>(m_plugins[i]); + if (plugin) + { + 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()); + } + } + } + } + + return true; +} + +QObject *PluginManager::getPlugin(int index) +{ + return m_plugins[index]; +} diff --git a/data/plugin/pluginmanager.h b/data/plugin/pluginmanager.h new file mode 100644 index 00000000..8e2dba0d --- /dev/null +++ b/data/plugin/pluginmanager.h @@ -0,0 +1,71 @@ +/* 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 PLUGINMANAGER_H +#define PLUGINMANAGER_H + +#include <QObject> +#include <QList> +#include <QPluginLoader> + +/*! + * \brief This class is a singleton that manages loading plugins. + */ +class PluginManager : public QObject +{ + Q_OBJECT +public: + /*! + * \brief Gets the plugin manager instance. + */ + static PluginManager &get() { return manager; } + + /*! + * \brief Loads plugins from the given directory. + * This function does \e not initialize the plugins. It simply loads their + * classes. Use the init functions to initialize the various plugin types. + * \param The directory to load plugins from. + * \return True if successful. False on failure. + */ + 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. + */ + int count() { return m_plugins.count(); } + + /*! + * \brief Gets the plugin at the given index. + * \param index The index of the plugin to get. + * \return The plugin at the given index. + */ + QObject *getPlugin(int index); + +private: + PluginManager(); + + QList<QObject *> m_plugins; + + static PluginManager manager; +}; + +#endif // PLUGINMANAGER_H |