mirror of https://github.com/mgba-emu/mgba.git
Qt: Add load/saveState VFile functions, flags parameter to explicit state functions
This commit is contained in:
parent
4d3f9389e9
commit
d70be08dd1
|
@ -509,8 +509,12 @@ void CoreController::loadState(int slot) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void CoreController::loadState(const QString& path) {
|
void CoreController::loadState(const QString& path, int flags) {
|
||||||
m_statePath = path;
|
m_statePath = path;
|
||||||
|
int savedFlags = m_loadStateFlags;
|
||||||
|
if (flags != -1) {
|
||||||
|
m_loadStateFlags = flags;
|
||||||
|
}
|
||||||
mCoreThreadRunFunction(&m_threadContext, [](mCoreThread* context) {
|
mCoreThreadRunFunction(&m_threadContext, [](mCoreThread* context) {
|
||||||
CoreController* controller = static_cast<CoreController*>(context->userData);
|
CoreController* controller = static_cast<CoreController*>(context->userData);
|
||||||
VFile* vf = VFileDevice::open(controller->m_statePath, O_RDONLY);
|
VFile* vf = VFileDevice::open(controller->m_statePath, O_RDONLY);
|
||||||
|
@ -527,6 +531,35 @@ void CoreController::loadState(const QString& path) {
|
||||||
}
|
}
|
||||||
vf->close(vf);
|
vf->close(vf);
|
||||||
});
|
});
|
||||||
|
m_loadStateFlags = savedFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CoreController::loadState(QIODevice* iodev, int flags) {
|
||||||
|
m_stateVf = VFileDevice::wrap(iodev, QIODevice::ReadOnly);
|
||||||
|
if (!m_stateVf) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int savedFlags = m_loadStateFlags;
|
||||||
|
if (flags != -1) {
|
||||||
|
m_loadStateFlags = flags;
|
||||||
|
}
|
||||||
|
mCoreThreadRunFunction(&m_threadContext, [](mCoreThread* context) {
|
||||||
|
CoreController* controller = static_cast<CoreController*>(context->userData);
|
||||||
|
VFile* vf = controller->m_stateVf;
|
||||||
|
if (!vf) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!controller->m_backupLoadState.isOpen()) {
|
||||||
|
controller->m_backupLoadState = VFileDevice::openMemory();
|
||||||
|
}
|
||||||
|
mCoreSaveStateNamed(context->core, controller->m_backupLoadState, controller->m_saveStateFlags);
|
||||||
|
if (mCoreLoadStateNamed(context->core, vf, controller->m_loadStateFlags)) {
|
||||||
|
emit controller->frameAvailable();
|
||||||
|
emit controller->stateLoaded();
|
||||||
|
}
|
||||||
|
vf->close(vf);
|
||||||
|
});
|
||||||
|
m_loadStateFlags = savedFlags;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CoreController::saveState(int slot) {
|
void CoreController::saveState(int slot) {
|
||||||
|
@ -545,8 +578,12 @@ void CoreController::saveState(int slot) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void CoreController::saveState(const QString& path) {
|
void CoreController::saveState(const QString& path, int flags) {
|
||||||
m_statePath = path;
|
m_statePath = path;
|
||||||
|
int savedFlags = m_saveStateFlags;
|
||||||
|
if (flags != -1) {
|
||||||
|
m_saveStateFlags = flags;
|
||||||
|
}
|
||||||
mCoreThreadRunFunction(&m_threadContext, [](mCoreThread* context) {
|
mCoreThreadRunFunction(&m_threadContext, [](mCoreThread* context) {
|
||||||
CoreController* controller = static_cast<CoreController*>(context->userData);
|
CoreController* controller = static_cast<CoreController*>(context->userData);
|
||||||
VFile* vf = VFileDevice::open(controller->m_statePath, O_RDONLY);
|
VFile* vf = VFileDevice::open(controller->m_statePath, O_RDONLY);
|
||||||
|
@ -562,6 +599,28 @@ void CoreController::saveState(const QString& path) {
|
||||||
mCoreSaveStateNamed(context->core, vf, controller->m_saveStateFlags);
|
mCoreSaveStateNamed(context->core, vf, controller->m_saveStateFlags);
|
||||||
vf->close(vf);
|
vf->close(vf);
|
||||||
});
|
});
|
||||||
|
m_saveStateFlags = savedFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CoreController::saveState(QIODevice* iodev, int flags) {
|
||||||
|
m_stateVf = VFileDevice::wrap(iodev, QIODevice::WriteOnly | QIODevice::Truncate);
|
||||||
|
if (!m_stateVf) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int savedFlags = m_saveStateFlags;
|
||||||
|
if (flags != -1) {
|
||||||
|
m_saveStateFlags = flags;
|
||||||
|
}
|
||||||
|
mCoreThreadRunFunction(&m_threadContext, [](mCoreThread* context) {
|
||||||
|
CoreController* controller = static_cast<CoreController*>(context->userData);
|
||||||
|
VFile* vf = controller->m_stateVf;
|
||||||
|
if (!vf) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mCoreSaveStateNamed(context->core, vf, controller->m_saveStateFlags);
|
||||||
|
vf->close(vf);
|
||||||
|
});
|
||||||
|
m_saveStateFlags = savedFlags;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CoreController::loadBackupState() {
|
void CoreController::loadBackupState() {
|
||||||
|
|
|
@ -120,9 +120,11 @@ public slots:
|
||||||
void forceFastForward(bool);
|
void forceFastForward(bool);
|
||||||
|
|
||||||
void loadState(int slot = 0);
|
void loadState(int slot = 0);
|
||||||
void loadState(const QString& path);
|
void loadState(const QString& path, int flags = -1);
|
||||||
|
void loadState(QIODevice* iodev, int flags = -1);
|
||||||
void saveState(int slot = 0);
|
void saveState(int slot = 0);
|
||||||
void saveState(const QString& path);
|
void saveState(const QString& path, int flags = -1);
|
||||||
|
void saveState(QIODevice* iodev, int flags = -1);
|
||||||
void loadBackupState();
|
void loadBackupState();
|
||||||
void saveBackupState();
|
void saveBackupState();
|
||||||
|
|
||||||
|
@ -225,6 +227,7 @@ private:
|
||||||
QByteArray m_backupSaveState{nullptr};
|
QByteArray m_backupSaveState{nullptr};
|
||||||
int m_stateSlot = 1;
|
int m_stateSlot = 1;
|
||||||
QString m_statePath;
|
QString m_statePath;
|
||||||
|
VFile* m_stateVf;
|
||||||
int m_loadStateFlags;
|
int m_loadStateFlags;
|
||||||
int m_saveStateFlags;
|
int m_saveStateFlags;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue