summaryrefslogtreecommitdiffstats
path: root/libinstance/src/instanceloader.cpp
blob: 9d98230f9b94b06e8af077b3c77b21e25ef3a40c (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
97
98
99
100
101
102
103
104
105
106
107
108
109
/* 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 "include/instanceloader.h"

#include <QFileInfo>

#include "include/instancetypeinterface.h"

#include "inifile.h"

#include "pathutils.h"

InstanceLoader InstanceLoader::loader;

InstanceLoader::InstanceLoader() :
	QObject(NULL)
{
	
}


InstanceLoader::InstTypeError InstanceLoader::registerInstanceType(InstanceTypeInterface *type)
{
	// Check to see if the type ID exists.
	if (m_typeMap.contains(type->typeID()))
		return TypeIDExists;
	
	// Set the parent to this.
	// ((QObject *)type)->setParent(this);
	
	// Add it to the map.
	m_typeMap.insert(type->typeID(), type);
	
	qDebug(QString("Registered instance type %1.").
		   arg(type->typeID()).toUtf8());
	return NoError;
}

InstanceLoader::InstTypeError InstanceLoader::createInstance(Instance *&inst, 
															 const InstanceTypeInterface *type, 
															 const QString &instDir)
{
	// Check if the type is registered.
	if (!type || findType(type->typeID()) != type)
		return TypeNotRegistered;
	
	// Create the instance.
	return type->createInstance(inst, instDir);
}

InstanceLoader::InstTypeError InstanceLoader::loadInstance(Instance *&inst, 
														   const InstanceTypeInterface *type, 
														   const QString &instDir)
{
	// Check if the type is registered.
	if (!type || findType(type->typeID()) != type)
		return TypeNotRegistered;
	
	return type->loadInstance(inst, instDir);
}

InstanceLoader::InstTypeError InstanceLoader::loadInstance(Instance *&inst, 
														   const QString &instDir)
{
	QFileInfo instConfig(PathCombine(instDir, "instance.cfg"));
	
	if (!instConfig.exists())
		return NotAnInstance;
	
	INIFile ini;
	ini.loadFile(instConfig.path());
	QString typeName = ini.get("type", "net.forkk.MultiMC.StdInstance").toString();
	const InstanceTypeInterface *type = findType(typeName);
	
	return loadInstance(inst, type, instDir);
}

const InstanceTypeInterface *InstanceLoader::findType(const QString &id)
{
	if (!m_typeMap.contains(id))
		return NULL;
	else
		return m_typeMap[id];
}

InstTypeList InstanceLoader::typeList()
{
	InstTypeList typeList;
	
	for (QMap<QString, InstanceTypeInterface *>::iterator iter = m_typeMap.begin(); iter != m_typeMap.end(); iter++)
	{
		typeList.append(*iter);
	}
	
	return typeList;
}