summaryrefslogtreecommitdiffstats
path: root/data/plugin/pluginmanager.cpp
blob: cd33b285f2e1c5c96e5d8db56ff6af00c24ec6cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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];
}