diff options
-rw-r--r-- | CMakeLists.txt | 4 | ||||
-rw-r--r-- | data/inst/instance.cpp | 2 | ||||
-rw-r--r-- | data/inst/instance.h | 4 | ||||
-rw-r--r-- | data/inst/instanceloader.cpp | 21 | ||||
-rw-r--r-- | data/inst/instanceloader.h | 94 | ||||
-rw-r--r-- | data/inst/instancetype.cpp | 21 | ||||
-rw-r--r-- | data/inst/instancetype.h | 81 |
7 files changed, 225 insertions, 2 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 50961ef7..3916d089 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -104,6 +104,8 @@ data/version.cpp data/userinfo.cpp data/loginresponse.cpp +data/inst/instanceloader.cpp +data/inst/instancetype.cpp data/inst/instance.cpp data/inst/instancelist.cpp @@ -144,6 +146,8 @@ data/loginresponse.h data/siglist.h data/siglist_impl.h +data/inst/instanceloader.h +data/inst/instancetype.h data/inst/instance.h data/inst/instancelist.h 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 |