summaryrefslogtreecommitdiffstats
path: root/libinstance/include/instanceloader.h
blob: 96be36fb3405a24f79394fdb749a3b5a8d02e3c4 (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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/* 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 INSTANCELOADER_H
#define INSTANCELOADER_H

#include <QObject>
#include <QMap>
#include <QList>

#include "libinstance_config.h"

class InstanceTypeInterface;
class Instance;

typedef QList<const InstanceTypeInterface *> InstTypeList;

/*!
 * \brief The InstanceLoader is a singleton that manages all of the instance types and handles loading and creating instances.
 * Instance types are registered with the instance loader through its registerInstType() function. 
 * Creating instances is done through the InstanceLoader's createInstance() function. This function takes 
 */
class LIBMMCINST_EXPORT InstanceLoader : public QObject
{
	Q_OBJECT
public:
	/*!
	 * \brief Gets a reference to the instance loader.
	 */
	static InstanceLoader &get() { return loader; }
	
	/*!
	 * \brief Error codes returned by functions in the InstanceLoader and InstanceType classes.
	 *
	 * - NoError indicates that no error occurred.
	 * - OtherError indicates that an unspecified error occurred.
	 * - TypeIDExists is returned	by registerInstanceType() if the ID of the type being registered already exists.
	 * - TypeNotRegistered is returned by createInstance() and loadInstance() when the given type is not registered.
	 * - InstExists is returned by createInstance() if the given instance directory is already an instance.
	 * - NotAnInstance is returned by loadInstance() if the given instance directory is not a valid instance.
	 * - WrongInstType is returned by loadInstance() if the given instance directory's type doesn't match the given type.
	 * - CantCreateDir is returned by createInstance( if the given instance directory can't be created.)
	 */
	enum InstTypeError
	{
		NoError = 0,
		OtherError,
		
		TypeIDExists,
		
		TypeNotRegistered,
		InstExists,
		NotAnInstance,
		WrongInstType,
		CantCreateDir
	};
	
	/*!
	 * \brief Registers the given InstanceType with the instance loader.
	 *
	 * \param type The InstanceType to register.
	 * \return An InstTypeError error code.
	 * - TypeIDExists if the given type's is already registered to another instance type.
	 */
	InstTypeError registerInstanceType(InstanceTypeInterface *type);
	
	/*!
	 * \brief Creates an instance with the given type and stores it in inst.
	 *
	 * \param inst Pointer to store the created instance in.
	 * \param type The type of instance to create.
	 * \param instDir The instance's directory.
	 * \return An InstTypeError error code.
	 * - TypeNotRegistered if the given type is not registered with the InstanceLoader.
	 * - InstExists if the given instance directory is already an instance.
	 * - CantCreateDir if the given instance directory cannot be created.
	 */
	InstTypeError createInstance(Instance *&inst, const InstanceTypeInterface *type, const QString &instDir);
	
	/*!
	 * \brief Loads an instance from the given directory.
	 *
	 * \param inst Pointer to store the loaded instance in.
	 * \param type The type of instance to load.
	 * \param instDir The instance's directory.
	 * \return An InstTypeError error code.
	 * - TypeNotRegistered if the given type is not registered with the InstanceLoader.
	 * - NotAnInstance if the given instance directory isn't a valid instance.
	 * - WrongInstType if the given instance directory's type isn't the same as the given type.
	 */
	InstTypeError loadInstance(Instance *&inst, const InstanceTypeInterface *type, const QString &instDir);
	
	/*!
	 * \brief Loads an instance from the given directory.
	 * Checks the instance's INI file to figure out what the instance's type is first.
	 * \param inst Pointer to store the loaded instance in.
	 * \param instDir The instance's directory.
	 * \return An InstTypeError error code.
	 * - TypeNotRegistered if the instance's type is not registered with the InstanceLoader.
	 * - NotAnInstance if the given instance directory isn't a valid instance.
	 */
	InstTypeError loadInstance(Instance *&inst, const QString &instDir);
	
	/*!
	 * \brief Finds an instance type with the given ID.
	 * If one cannot be found, returns NULL.
	 *
	 * \param id The ID of the type to find.
	 * \return The type with the given ID. NULL if none were found.
	 */
	const InstanceTypeInterface *findType(const QString &id);
	
	/*!
	 * \brief Gets a list of the registered instance types.
	 *
	 * \return A list of instance types.
	 */
	InstTypeList typeList();
	
private:
	InstanceLoader();
	
	QMap<QString, InstanceTypeInterface *> m_typeMap;
	
	static InstanceLoader loader;
};

#endif // INSTANCELOADER_H