Got instance loading working.

This commit is contained in:
Andrew 2013-02-20 19:45:00 -06:00
parent dd2e836b4c
commit f3b6eeeac4
6 changed files with 46 additions and 16 deletions

View File

@ -51,6 +51,7 @@ public:
* - InstExists is returned by createInstance() if the given instance directory is already an instance. * - 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. * - 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. * - 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 enum InstTypeError
{ {
@ -62,7 +63,8 @@ public:
TypeNotRegistered, TypeNotRegistered,
InstExists, InstExists,
NotAnInstance, NotAnInstance,
WrongInstType WrongInstType,
CantCreateDir
}; };
/*! /*!
@ -83,8 +85,9 @@ public:
* \return An InstTypeError error code. * \return An InstTypeError error code.
* - TypeNotRegistered if the given type is not registered with the InstanceLoader. * - TypeNotRegistered if the given type is not registered with the InstanceLoader.
* - InstExists if the given instance directory is already an instance. * - 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); InstTypeError createInstance(Instance *&inst, const InstanceTypeInterface *type, const QString &instDir);
/*! /*!
* \brief Loads an instance from the given directory. * \brief Loads an instance from the given directory.
@ -97,7 +100,7 @@ public:
* - NotAnInstance if the given instance directory isn't a valid instance. * - 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. * - 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); InstTypeError loadInstance(Instance *&inst, const InstanceTypeInterface *type, const QString &instDir);
/*! /*!
* \brief Loads an instance from the given directory. * \brief Loads an instance from the given directory.
@ -108,7 +111,7 @@ public:
* - TypeNotRegistered if the instance's type is not registered with the InstanceLoader. * - TypeNotRegistered if the instance's type is not registered with the InstanceLoader.
* - NotAnInstance if the given instance directory isn't a valid instance. * - NotAnInstance if the given instance directory isn't a valid instance.
*/ */
InstTypeError loadInstance(Instance *inst, const QString &instDir); InstTypeError loadInstance(Instance *&inst, const QString &instDir);
/*! /*!
* \brief Finds an instance type with the given ID. * \brief Finds an instance type with the given ID.

View File

@ -67,7 +67,7 @@ protected:
* TypeNotRegistered if the given type is not registered with the InstanceLoader. * TypeNotRegistered if the given type is not registered with the InstanceLoader.
* InstExists if the given instance directory is already an instance. * InstExists if the given instance directory is already an instance.
*/ */
virtual InstanceLoader::InstTypeError createInstance(Instance *inst, const QString &instDir) const = 0; virtual InstanceLoader::InstTypeError createInstance(Instance *&inst, const QString &instDir) const = 0;
/*! /*!
* \brief Loads an instance from the given directory. * \brief Loads an instance from the given directory.
@ -78,7 +78,7 @@ protected:
* NotAnInstance if the given instance directory isn't a valid instance. * NotAnInstance if the given instance directory isn't a valid instance.
* WrongInstType if the given instance directory's type isn't an instance of this type. * WrongInstType if the given instance directory's type isn't an instance of this type.
*/ */
virtual InstanceLoader::InstTypeError loadInstance(Instance *inst, const QString &instDir) const = 0; virtual InstanceLoader::InstTypeError loadInstance(Instance *&inst, const QString &instDir) const = 0;
}; };
Q_DECLARE_INTERFACE(InstanceTypeInterface, InstanceTypeInterface_IID) Q_DECLARE_INTERFACE(InstanceTypeInterface, InstanceTypeInterface_IID)

View File

@ -43,9 +43,10 @@ InstanceList::InstListError InstanceList::loadList()
QString subDir = iter.next(); QString subDir = iter.next();
if (QFileInfo(PathCombine(subDir, "instance.cfg")).exists()) if (QFileInfo(PathCombine(subDir, "instance.cfg")).exists())
{ {
QSharedPointer<Instance> inst; Instance *instPtr = NULL;
InstanceLoader::InstTypeError error = InstanceLoader::get(). InstanceLoader::InstTypeError error = InstanceLoader::get().
loadInstance(inst.data(), subDir); loadInstance(instPtr, subDir);
if (error != InstanceLoader::NoError && if (error != InstanceLoader::NoError &&
error != InstanceLoader::NotAnInstance) error != InstanceLoader::NotAnInstance)
@ -66,13 +67,15 @@ InstanceList::InstListError InstanceList::loadList()
} }
qDebug(errorMsg.toUtf8()); qDebug(errorMsg.toUtf8());
} }
else if (!inst.data()) else if (!instPtr)
{ {
qDebug(QString("Error loading instance %1. Instance loader returned null."). qDebug(QString("Error loading instance %1. Instance loader returned null.").
arg(QFileInfo(subDir).baseName()).toUtf8()); arg(QFileInfo(subDir).baseName()).toUtf8());
} }
else else
{ {
QSharedPointer<Instance> inst(instPtr);
qDebug(QString("Loaded instance %1").arg(inst->name()).toUtf8()); qDebug(QString("Loaded instance %1").arg(inst->name()).toUtf8());
inst->setParent(this); inst->setParent(this);
append(QSharedPointer<Instance>(inst)); append(QSharedPointer<Instance>(inst));

View File

@ -49,7 +49,7 @@ InstanceLoader::InstTypeError InstanceLoader::registerInstanceType(InstanceTypeI
return NoError; return NoError;
} }
InstanceLoader::InstTypeError InstanceLoader::createInstance(Instance *inst, InstanceLoader::InstTypeError InstanceLoader::createInstance(Instance *&inst,
const InstanceTypeInterface *type, const InstanceTypeInterface *type,
const QString &instDir) const QString &instDir)
{ {
@ -61,7 +61,7 @@ InstanceLoader::InstTypeError InstanceLoader::createInstance(Instance *inst,
return type->createInstance(inst, instDir); return type->createInstance(inst, instDir);
} }
InstanceLoader::InstTypeError InstanceLoader::loadInstance(Instance *inst, InstanceLoader::InstTypeError InstanceLoader::loadInstance(Instance *&inst,
const InstanceTypeInterface *type, const InstanceTypeInterface *type,
const QString &instDir) const QString &instDir)
{ {
@ -72,7 +72,7 @@ InstanceLoader::InstTypeError InstanceLoader::loadInstance(Instance *inst,
return type->loadInstance(inst, instDir); return type->loadInstance(inst, instDir);
} }
InstanceLoader::InstTypeError InstanceLoader::loadInstance(Instance *inst, InstanceLoader::InstTypeError InstanceLoader::loadInstance(Instance *&inst,
const QString &instDir) const QString &instDir)
{ {
QFileInfo instConfig(PathCombine(instDir, "instance.cfg")); QFileInfo instConfig(PathCombine(instDir, "instance.cfg"));

View File

@ -15,20 +15,44 @@
#include "stdinstancetype.h" #include "stdinstancetype.h"
#include <QDir>
#include <QFileInfo>
#include "stdinstance.h"
StdInstanceType::StdInstanceType(QObject *parent) : StdInstanceType::StdInstanceType(QObject *parent) :
QObject(parent) QObject(parent)
{ {
} }
InstanceLoader::InstTypeError StdInstanceType::createInstance(Instance *inst, InstanceLoader::InstTypeError StdInstanceType::createInstance(Instance *&inst,
const QString &instDir) const const QString &instDir) const
{ {
QFileInfo rootDir(instDir);
if (!rootDir.exists() && !QDir().mkdir(rootDir.path()))
{
return InstanceLoader::CantCreateDir;
}
StdInstance *stdInst = new StdInstance(instDir);
// TODO: Verify that the instance is valid.
inst = stdInst;
return InstanceLoader::NoError; return InstanceLoader::NoError;
} }
InstanceLoader::InstTypeError StdInstanceType::loadInstance(Instance *inst, InstanceLoader::InstTypeError StdInstanceType::loadInstance(Instance *&inst,
const QString &instDir) const const QString &instDir) const
{ {
StdInstance *stdInst = new StdInstance(instDir);
// TODO: Verify that the instance is valid.
inst = stdInst;
return InstanceLoader::NoError; return InstanceLoader::NoError;
} }

View File

@ -34,9 +34,9 @@ public:
virtual QString description() const { return "A standard Minecraft instance."; } virtual QString description() const { return "A standard Minecraft instance."; }
virtual InstanceLoader::InstTypeError createInstance(Instance *inst, const QString &instDir) const; virtual InstanceLoader::InstTypeError createInstance(Instance *&inst, const QString &instDir) const;
virtual InstanceLoader::InstTypeError loadInstance(Instance *inst, const QString &instDir) const; virtual InstanceLoader::InstTypeError loadInstance(Instance *&inst, const QString &instDir) const;
}; };
#endif // STDINSTANCETYPE_H #endif // STDINSTANCETYPE_H