From 15c7efffa1af8c7b4fba710c30c53b6126bfa9db Mon Sep 17 00:00:00 2001
From: Andrew <forkk@forkk.net>
Date: Mon, 18 Feb 2013 14:50:11 -0600
Subject: Added InstanceLoader and InstanceType headers.

---
 data/inst/instance.cpp       |  2 +-
 data/inst/instance.h         |  4 +-
 data/inst/instanceloader.cpp | 21 ++++++++++
 data/inst/instanceloader.h   | 94 ++++++++++++++++++++++++++++++++++++++++++++
 data/inst/instancetype.cpp   | 21 ++++++++++
 data/inst/instancetype.h     | 81 ++++++++++++++++++++++++++++++++++++++
 6 files changed, 221 insertions(+), 2 deletions(-)
 create mode 100644 data/inst/instanceloader.cpp
 create mode 100644 data/inst/instanceloader.h
 create mode 100644 data/inst/instancetype.cpp
 create mode 100644 data/inst/instancetype.h

(limited to 'data/inst')

diff --git a/data/inst/instance.cpp b/data/inst/instance.cpp
index 5cde2233..d2240bc5 100644
--- a/data/inst/instance.cpp
+++ b/data/inst/instance.cpp
@@ -15,7 +15,7 @@
 
 #include "instance.h"
 
-Instance::Instance(QObject *parent) :
+Instance::Instance(const QString &rootDir, QObject *parent) :
 	SettingsBase(parent)
 {
 }
diff --git a/data/inst/instance.h b/data/inst/instance.h
index 6b1991b6..1b282b03 100644
--- a/data/inst/instance.h
+++ b/data/inst/instance.h
@@ -42,7 +42,7 @@ class Instance : public SettingsBase
 {
 	Q_OBJECT
 public:
-	explicit Instance(QObject *parent = 0);
+	explicit Instance(const QString &rootDir, QObject *parent = 0);
 	
 	// Please, for the sake of my (and everyone else's) sanity, at least keep this shit
 	// *somewhat* organized. Also, documentation is semi-important here. Please don't
@@ -315,6 +315,8 @@ protected:
 	
 private:
 	QString m_group;
+	
+	QString m_rootDir;
 };
 
 #endif // INSTANCE_H
diff --git a/data/inst/instanceloader.cpp b/data/inst/instanceloader.cpp
new file mode 100644
index 00000000..59fed951
--- /dev/null
+++ b/data/inst/instanceloader.cpp
@@ -0,0 +1,21 @@
+/* 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 "instanceloader.h"
+
+InstanceLoader::InstanceLoader(QObject *parent) :
+	QObject(parent)
+{
+}
diff --git a/data/inst/instanceloader.h b/data/inst/instanceloader.h
new file mode 100644
index 00000000..943a9b2c
--- /dev/null
+++ b/data/inst/instanceloader.h
@@ -0,0 +1,94 @@
+/* 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>
+
+class InstanceType;
+class Instance;
+
+/*!
+ * \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 InstanceLoader : public QObject
+{
+	Q_OBJECT
+public:
+	static InstanceLoader instLoader;
+	
+	/*!
+	 * \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.
+	 */
+	enum InstTypeError
+	{
+		NoError = 0,
+		OtherError,
+		
+		TypeIDExists,
+		
+		TypeNotRegistered,
+		InstExists,
+		NotAnInstance
+	};
+	
+	/*!
+	 * \brief Registers the given InstanceType with the instance loader.
+	 *        This causes the instance loader to take ownership of the given 
+	 *        instance type (meaning the instance type's parent will be set to 
+	 *        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(InstanceType *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.
+	 */
+	InstTypeError createInstance(Instance *inst, const InstanceType *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.
+	 */
+	InstTypeError loadInstance(Instance *inst, const InstanceType *type, const QString &instDir);
+	
+private:
+	explicit InstanceLoader(QObject *parent = 0);
+};
+
+#endif // INSTANCELOADER_H
diff --git a/data/inst/instancetype.cpp b/data/inst/instancetype.cpp
new file mode 100644
index 00000000..4f27542d
--- /dev/null
+++ b/data/inst/instancetype.cpp
@@ -0,0 +1,21 @@
+/* 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 "instancetype.h"
+
+InstanceType::InstanceType(QObject *parent) :
+	QObject(parent)
+{
+}
diff --git a/data/inst/instancetype.h b/data/inst/instancetype.h
new file mode 100644
index 00000000..1f187310
--- /dev/null
+++ b/data/inst/instancetype.h
@@ -0,0 +1,81 @@
+/* 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 INSTANCETYPE_H
+#define INSTANCETYPE_H
+
+#include <QObject>
+
+#include "instanceloader.h"
+
+/*!
+ * \brief The InstanceType class is a base class for all instance types.
+ * It handles loading and creating instances of a certain type. There should be 
+ * one of these for each type of instance and they should be registered with the 
+ * InstanceLoader.
+ * To create an instance, the InstanceLoader calls the type's createInstance() 
+ * function. Loading is done through the loadInstance() function.
+ */
+class InstanceType : public QObject
+{
+	Q_OBJECT
+public:
+	explicit InstanceType(QObject *parent = 0);
+	
+	/*!
+	 * \brief Gets the ID for this instance type.
+	 *        By default this is the name of the Instance class that this type 
+	 *        creates, but this can be changed by overriding this function. 
+	 *        The type ID should be unique as it is used to identify the type 
+	 *        of instances when they are loaded.
+	 *        Changing this value at runtime results in undefined behavior.
+	 * \return This instance type's ID string. 
+	 */
+	virtual QString typeID() const = 0;
+	
+	/*!
+	 * \brief Gets the name of this instance type as it is displayed to the user.
+	 * \return The instance type's display name.
+	 */
+	virtual QString displayName() const = 0;
+	
+	/*!
+	 * \brief Gets a longer, more detailed description of this instance type.
+	 * \return The instance type's description.
+	 */
+	virtual QString description() const	= 0;
+	
+	/*!
+	 * \brief Creates an instance and stores it in inst.
+	 * \param inst Pointer to store the created instance in.
+	 * \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.
+	 */
+	virtual InstanceLoader::InstTypeError createInstance(Instance *inst, const QString &instDir) = 0;
+	
+	/*!
+	 * \brief Loads an instance from the given directory.
+	 * \param inst Pointer to store the loaded instance in.
+	 * \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.
+	 */
+	virtual InstanceLoader::InstTypeError loadInstance(Instance *inst, const QString &instDir) = 0;
+};
+
+#endif // INSTANCETYPE_H
-- 
cgit