Skip to content

Commit

Permalink
NOISSUE force saving of any outstanding instance component state on exit
Browse files Browse the repository at this point in the history
  • Loading branch information
peterix committed Dec 3, 2017
1 parent e0bea1e commit 95e6f37
Show file tree
Hide file tree
Showing 10 changed files with 42 additions and 15 deletions.
1 change: 1 addition & 0 deletions api/logic/BaseInstance.h
Expand Up @@ -70,6 +70,7 @@ class MULTIMC_LOGIC_EXPORT BaseInstance : public QObject, public std::enable_sha
virtual ~BaseInstance() {};

virtual void init() = 0;
virtual void saveNow() = 0;

/// nuke thoroughly - deletes the instance contents, notifies the list/model which is
/// responsible of cleaning up the husk
Expand Down
8 changes: 8 additions & 0 deletions api/logic/InstanceList.cpp
Expand Up @@ -241,6 +241,14 @@ InstanceList::InstListError InstanceList::loadList(bool complete)
return NoError;
}

void InstanceList::saveNow()
{
for(auto & item: m_instances)
{
item->saveNow();
}
}

void InstanceList::add(const QList<InstancePtr> &t)
{
beginInsertRows(QModelIndex(), m_instances.count(), m_instances.count() + t.size() - 1);
Expand Down
1 change: 1 addition & 0 deletions api/logic/InstanceList.h
Expand Up @@ -73,6 +73,7 @@ class MULTIMC_LOGIC_EXPORT InstanceList : public QAbstractListModel
}

InstListError loadList(bool complete = false);
void saveNow();

/// Add an instance provider. Takes ownership of it. Should only be done before the first load.
void addInstanceProvider(BaseInstanceProvider * provider);
Expand Down
5 changes: 4 additions & 1 deletion api/logic/NullInstance.h
Expand Up @@ -12,7 +12,10 @@ class NullInstance: public BaseInstance
virtual ~NullInstance() {};
virtual void init() override
{
};
}
virtual void saveNow() override
{
}
virtual QString getStatusbarDescription() override
{
return tr("Unknown instance type");
Expand Down
24 changes: 13 additions & 11 deletions api/logic/minecraft/ComponentList.cpp
Expand Up @@ -43,16 +43,12 @@ ComponentList::ComponentList(MinecraftInstance * instance)
d->m_instance = instance;
d->m_saveTimer.setSingleShot(true);
d->m_saveTimer.setInterval(5000);
connect(&d->m_saveTimer, &QTimer::timeout, this, &ComponentList::save);
connect(&d->m_saveTimer, &QTimer::timeout, this, &ComponentList::save_internal);
}

ComponentList::~ComponentList()
{
if(saveIsScheduled())
{
d->m_saveTimer.stop();
save();
}
saveNow();
}

// BEGIN: component file format
Expand Down Expand Up @@ -212,6 +208,15 @@ static bool loadComponentList(ComponentList * parent, const QString & filename,

// BEGIN: save/load logic

void ComponentList::saveNow()
{
if(saveIsScheduled())
{
d->m_saveTimer.stop();
save_internal();
}
}

bool ComponentList::saveIsScheduled() const
{
return d->dirty;
Expand Down Expand Up @@ -253,7 +258,7 @@ QString ComponentList::patchFilePathForUid(const QString& uid) const
return patchesPattern().arg(uid);
}

void ComponentList::save()
void ComponentList::save_internal()
{
qDebug() << "Component list save performed now for" << d->m_instance->name();
auto filename = componentsFilePath();
Expand Down Expand Up @@ -321,10 +326,7 @@ void ComponentList::reload(Net::Mode netmode)
}

// flush any scheduled saves to not lose state
if(saveIsScheduled())
{
save();
}
saveNow();

// FIXME: differentiate when a reapply is required by propagating state from components
invalidateLaunchProfile();
Expand Down
6 changes: 5 additions & 1 deletion api/logic/minecraft/ComponentList.h
Expand Up @@ -104,6 +104,10 @@ class MULTIMC_LOGIC_EXPORT ComponentList : public QAbstractListModel
bool setComponentVersion(const QString &uid, const QString &version, bool important = false);

QString patchFilePathForUid(const QString &uid) const;

/// if there is a save scheduled, do it now.
void saveNow();

public:
/// get the profile component by id
ComponentPtr getComponent(const QString &id);
Expand All @@ -127,7 +131,7 @@ class MULTIMC_LOGIC_EXPORT ComponentList : public QAbstractListModel
QString patchesPattern() const;

private slots:
void save();
void save_internal();
void updateSucceeded();
void updateFailed(const QString & error);
void componentDataChanged();
Expand Down
5 changes: 5 additions & 0 deletions api/logic/minecraft/MinecraftInstance.cpp
Expand Up @@ -115,6 +115,11 @@ void MinecraftInstance::init()
{
}

void MinecraftInstance::saveNow()
{
m_components->saveNow();
}

QString MinecraftInstance::typeName() const
{
return "Minecraft";
Expand Down
1 change: 1 addition & 0 deletions api/logic/minecraft/MinecraftInstance.h
Expand Up @@ -18,6 +18,7 @@ class MULTIMC_LOGIC_EXPORT MinecraftInstance: public BaseInstance
MinecraftInstance(SettingsObjectPtr globalSettings, SettingsObjectPtr settings, const QString &rootDir);
virtual ~MinecraftInstance() {};
virtual void init() override;
virtual void saveNow();

// FIXME: remove
QString typeName() const override;
Expand Down
3 changes: 2 additions & 1 deletion api/logic/minecraft/legacy/LegacyInstance.h
Expand Up @@ -34,7 +34,8 @@ class MULTIMC_LOGIC_EXPORT LegacyInstance : public BaseInstance

explicit LegacyInstance(SettingsObjectPtr globalSettings, SettingsObjectPtr settings, const QString &rootDir);

virtual void init() override {};
virtual void init() override {}
virtual void saveNow() override {}

/// Path to the instance's minecraft.jar
QString runnableJar() const;
Expand Down
3 changes: 2 additions & 1 deletion application/MultiMC.cpp
Expand Up @@ -644,7 +644,8 @@ MultiMC::MultiMC(int &argc, char **argv) : QApplication(argc, argv)
connect(this, &MultiMC::aboutToQuit, [this](){
if(m_instances)
{
// m_instances->saveGroupList();
// save any remaining instance state
m_instances->saveNow();
}
if(logFile)
{
Expand Down

0 comments on commit 95e6f37

Please sign in to comment.