SaveState: Use Path instead of strings.

This commit is contained in:
Unknown W. Brackets 2021-05-14 23:00:22 -07:00
parent 8db4277e6c
commit b74ecd5fa0
7 changed files with 49 additions and 49 deletions

View file

@ -397,22 +397,22 @@ namespace SaveState
return title + " (" + filename + ")"; return title + " (" + filename + ")";
} }
std::string GetTitle(const std::string &filename) { std::string GetTitle(const Path &filename) {
std::string title; std::string title;
if (CChunkFileReader::GetFileTitle(Path(filename), &title) == CChunkFileReader::ERROR_NONE) { if (CChunkFileReader::GetFileTitle(filename, &title) == CChunkFileReader::ERROR_NONE) {
if (title.empty()) { if (title.empty()) {
return File::GetFilename(filename); return filename.GetFilename();
} }
return AppendSlotTitle(filename, title); return AppendSlotTitle(filename.GetFilename(), title);
} }
// The file can't be loaded - let's note that. // The file can't be loaded - let's note that.
auto sy = GetI18NCategory("System"); auto sy = GetI18NCategory("System");
return File::GetFilename(filename) + " " + sy->T("(broken)"); return filename.GetFilename() + " " + sy->T("(broken)");
} }
Path GenerateSaveSlotFilename(const std::string &gameFilename, int slot, const char *extension) Path GenerateSaveSlotFilename(const Path &gameFilename, int slot, const char *extension)
{ {
std::string discId = g_paramSFO.GetValueString("DISC_ID"); std::string discId = g_paramSFO.GetValueString("DISC_ID");
std::string discVer = g_paramSFO.GetValueString("DISC_VERSION"); std::string discVer = g_paramSFO.GetValueString("DISC_VERSION");
@ -437,7 +437,7 @@ namespace SaveState
g_Config.iCurrentStateSlot = (g_Config.iCurrentStateSlot + 1) % NUM_SLOTS; g_Config.iCurrentStateSlot = (g_Config.iCurrentStateSlot + 1) % NUM_SLOTS;
} }
void LoadSlot(const std::string &gameFilename, int slot, Callback callback, void *cbUserData) void LoadSlot(const Path &gameFilename, int slot, Callback callback, void *cbUserData)
{ {
Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION); Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION);
if (!fn.empty()) { if (!fn.empty()) {
@ -471,7 +471,7 @@ namespace SaveState
} }
} }
void SaveSlot(const std::string &gameFilename, int slot, Callback callback, void *cbUserData) void SaveSlot(const Path &gameFilename, int slot, Callback callback, void *cbUserData)
{ {
Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION); Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION);
Path shot = GenerateSaveSlotFilename(gameFilename, slot, SCREENSHOT_EXTENSION); Path shot = GenerateSaveSlotFilename(gameFilename, slot, SCREENSHOT_EXTENSION);
@ -506,7 +506,7 @@ namespace SaveState
} }
} }
bool UndoSaveSlot(const std::string &gameFilename, int slot) { bool UndoSaveSlot(const Path &gameFilename, int slot) {
Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION); Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION);
Path shot = GenerateSaveSlotFilename(gameFilename, slot, SCREENSHOT_EXTENSION); Path shot = GenerateSaveSlotFilename(gameFilename, slot, SCREENSHOT_EXTENSION);
Path fnUndo = GenerateSaveSlotFilename(gameFilename, slot, UNDO_STATE_EXTENSION); Path fnUndo = GenerateSaveSlotFilename(gameFilename, slot, UNDO_STATE_EXTENSION);
@ -523,19 +523,19 @@ namespace SaveState
return false; return false;
} }
bool HasSaveInSlot(const std::string &gameFilename, int slot) bool HasSaveInSlot(const Path &gameFilename, int slot)
{ {
Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION); Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION);
return File::Exists(fn); return File::Exists(fn);
} }
bool HasUndoSaveInSlot(const std::string &gameFilename, int slot) bool HasUndoSaveInSlot(const Path &gameFilename, int slot)
{ {
Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION); Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION);
return File::Exists(fn.WithExtraExtension(".undo")); return File::Exists(fn.WithExtraExtension(".undo"));
} }
bool HasScreenshotInSlot(const std::string &gameFilename, int slot) bool HasScreenshotInSlot(const Path &gameFilename, int slot)
{ {
Path fn = GenerateSaveSlotFilename(gameFilename, slot, SCREENSHOT_EXTENSION); Path fn = GenerateSaveSlotFilename(gameFilename, slot, SCREENSHOT_EXTENSION);
return File::Exists(fn); return File::Exists(fn);
@ -578,7 +578,7 @@ namespace SaveState
return true; return true;
} }
int GetNewestSlot(const std::string &gameFilename) { int GetNewestSlot(const Path &gameFilename) {
int newestSlot = -1; int newestSlot = -1;
tm newestDate = {0}; tm newestDate = {0};
for (int i = 0; i < NUM_SLOTS; i++) { for (int i = 0; i < NUM_SLOTS; i++) {
@ -595,7 +595,7 @@ namespace SaveState
return newestSlot; return newestSlot;
} }
int GetOldestSlot(const std::string &gameFilename) { int GetOldestSlot(const Path &gameFilename) {
int oldestSlot = -1; int oldestSlot = -1;
tm oldestDate = {0}; tm oldestDate = {0};
for (int i = 0; i < NUM_SLOTS; i++) { for (int i = 0; i < NUM_SLOTS; i++) {
@ -612,7 +612,7 @@ namespace SaveState
return oldestSlot; return oldestSlot;
} }
std::string GetSlotDateAsString(const std::string &gameFilename, int slot) { std::string GetSlotDateAsString(const Path &gameFilename, int slot) {
Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION); Path fn = GenerateSaveSlotFilename(gameFilename, slot, STATE_EXTENSION);
if (File::Exists(fn)) { if (File::Exists(fn)) {
tm time; tm time;

View file

@ -42,24 +42,24 @@ namespace SaveState
// Cycle through the 5 savestate slots // Cycle through the 5 savestate slots
void NextSlot(); void NextSlot();
void SaveSlot(const std::string &gameFilename, int slot, Callback callback, void *cbUserData = 0); void SaveSlot(const Path &gameFilename, int slot, Callback callback, void *cbUserData = 0);
void LoadSlot(const std::string &gameFilename, int slot, Callback callback, void *cbUserData = 0); void LoadSlot(const Path &gameFilename, int slot, Callback callback, void *cbUserData = 0);
bool UndoSaveSlot(const std::string &gameFilename, int slot); bool UndoSaveSlot(const Path &gameFilename, int slot);
// Checks whether there's an existing save in the specified slot. // Checks whether there's an existing save in the specified slot.
bool HasSaveInSlot(const std::string &gameFilename, int slot); bool HasSaveInSlot(const Path &gameFilename, int slot);
bool HasUndoSaveInSlot(const std::string &gameFilename, int slot); bool HasUndoSaveInSlot(const Path &gameFilename, int slot);
bool HasScreenshotInSlot(const std::string &gameFilename, int slot); bool HasScreenshotInSlot(const Path &gameFilename, int slot);
int GetCurrentSlot(); int GetCurrentSlot();
// Returns -1 if there's no oldest/newest slot. // Returns -1 if there's no oldest/newest slot.
int GetNewestSlot(const std::string &gameFilename); int GetNewestSlot(const Path &gameFilename);
int GetOldestSlot(const std::string &gameFilename); int GetOldestSlot(const Path &gameFilename);
std::string GetSlotDateAsString(const std::string &gameFilename, int slot); std::string GetSlotDateAsString(const Path &gameFilename, int slot);
Path GenerateSaveSlotFilename(const std::string &gameFilename, int slot, const char *extension); Path GenerateSaveSlotFilename(const Path &gameFilename, int slot, const char *extension);
std::string GetTitle(const std::string &filename); std::string GetTitle(const Path &filename);
// Load the specified file into the current state (async.) // Load the specified file into the current state (async.)
// Warning: callback will be called on a different thread. // Warning: callback will be called on a different thread.

View file

@ -157,13 +157,13 @@ void SaveStateActionFinished(SaveState::Status status, const std::string &messag
void MainWindow::qlstateAct() void MainWindow::qlstateAct()
{ {
std::string gamePath = PSP_CoreParameter().fileToStart.ToString(); Path gamePath = PSP_CoreParameter().fileToStart;
SaveState::LoadSlot(gamePath, 0, SaveStateActionFinished, this); SaveState::LoadSlot(gamePath, 0, SaveStateActionFinished, this);
} }
void MainWindow::qsstateAct() void MainWindow::qsstateAct()
{ {
std::string gamePath = PSP_CoreParameter().fileToStart.ToString(); Path gamePath = PSP_CoreParameter().fileToStart;
SaveState::SaveSlot(gamePath, 0, SaveStateActionFinished, this); SaveState::SaveSlot(gamePath, 0, SaveStateActionFinished, this);
} }

View file

@ -629,10 +629,10 @@ void EmuScreen::onVKeyDown(int virtualKeyCode) {
} }
break; break;
case VIRTKEY_SAVE_STATE: case VIRTKEY_SAVE_STATE:
SaveState::SaveSlot(gamePath_.ToString(), g_Config.iCurrentStateSlot, &AfterSaveStateAction); SaveState::SaveSlot(gamePath_, g_Config.iCurrentStateSlot, &AfterSaveStateAction);
break; break;
case VIRTKEY_LOAD_STATE: case VIRTKEY_LOAD_STATE:
SaveState::LoadSlot(gamePath_.ToString(), g_Config.iCurrentStateSlot, &AfterSaveStateAction); SaveState::LoadSlot(gamePath_, g_Config.iCurrentStateSlot, &AfterSaveStateAction);
break; break;
case VIRTKEY_NEXT_SLOT: case VIRTKEY_NEXT_SLOT:
SaveState::NextSlot(); SaveState::NextSlot();
@ -1226,8 +1226,8 @@ void EmuScreen::update() {
saveStateSlot_ = currentSlot; saveStateSlot_ = currentSlot;
Path fn; Path fn;
if (SaveState::HasSaveInSlot(gamePath_.ToString(), currentSlot)) { if (SaveState::HasSaveInSlot(gamePath_, currentSlot)) {
fn = SaveState::GenerateSaveSlotFilename(gamePath_.ToString(), currentSlot, SaveState::SCREENSHOT_EXTENSION); fn = SaveState::GenerateSaveSlotFilename(gamePath_, currentSlot, SaveState::SCREENSHOT_EXTENSION);
} }
saveStatePreview_->SetFilename(fn); saveStatePreview_->SetFilename(fn);
@ -1672,18 +1672,18 @@ void EmuScreen::autoLoad() {
case (int)AutoLoadSaveState::OFF: // "AutoLoad Off" case (int)AutoLoadSaveState::OFF: // "AutoLoad Off"
return; return;
case (int)AutoLoadSaveState::OLDEST: // "Oldest Save" case (int)AutoLoadSaveState::OLDEST: // "Oldest Save"
autoSlot = SaveState::GetOldestSlot(gamePath_.ToString()); autoSlot = SaveState::GetOldestSlot(gamePath_);
break; break;
case (int)AutoLoadSaveState::NEWEST: // "Newest Save" case (int)AutoLoadSaveState::NEWEST: // "Newest Save"
autoSlot = SaveState::GetNewestSlot(gamePath_.ToString()); autoSlot = SaveState::GetNewestSlot(gamePath_);
break; break;
default: // try the specific save state slot specified default: // try the specific save state slot specified
autoSlot = (SaveState::HasSaveInSlot(gamePath_.ToString(), g_Config.iAutoLoadSaveState - 3)) ? (g_Config.iAutoLoadSaveState - 3) : -1; autoSlot = (SaveState::HasSaveInSlot(gamePath_, g_Config.iAutoLoadSaveState - 3)) ? (g_Config.iAutoLoadSaveState - 3) : -1;
break; break;
} }
if (g_Config.iAutoLoadSaveState && autoSlot != -1) { if (g_Config.iAutoLoadSaveState && autoSlot != -1) {
SaveState::LoadSlot(gamePath_.ToString(), autoSlot, &AfterSaveStateAction); SaveState::LoadSlot(gamePath_, autoSlot, &AfterSaveStateAction);
g_Config.iCurrentStateSlot = autoSlot; g_Config.iCurrentStateSlot = autoSlot;
} }
} }

View file

@ -486,7 +486,7 @@ handleELF:
case IdentifiedFileType::PPSSPP_SAVESTATE: case IdentifiedFileType::PPSSPP_SAVESTATE:
{ {
info_->SetTitle(SaveState::GetTitle(gamePath_.ToString())); info_->SetTitle(SaveState::GetTitle(gamePath_));
std::lock_guard<std::mutex> guard(info_->lock); std::lock_guard<std::mutex> guard(info_->lock);

View file

@ -206,7 +206,7 @@ public:
} }
std::string GetScreenshotTitle() const { std::string GetScreenshotTitle() const {
return SaveState::GetSlotDateAsString(gamePath_.ToString(), slot_); return SaveState::GetSlotDateAsString(gamePath_, slot_);
} }
UI::Event OnStateLoaded; UI::Event OnStateLoaded;
@ -229,7 +229,7 @@ private:
SaveSlotView::SaveSlotView(const Path &gameFilename, int slot, UI::LayoutParams *layoutParams) : UI::LinearLayout(UI::ORIENT_HORIZONTAL, layoutParams), slot_(slot), gamePath_(gameFilename) { SaveSlotView::SaveSlotView(const Path &gameFilename, int slot, UI::LayoutParams *layoutParams) : UI::LinearLayout(UI::ORIENT_HORIZONTAL, layoutParams), slot_(slot), gamePath_(gameFilename) {
using namespace UI; using namespace UI;
screenshotFilename_ = SaveState::GenerateSaveSlotFilename(gamePath_.ToString(), slot, SaveState::SCREENSHOT_EXTENSION); screenshotFilename_ = SaveState::GenerateSaveSlotFilename(gamePath_, slot, SaveState::SCREENSHOT_EXTENSION);
Add(new Spacer(5)); Add(new Spacer(5));
AsyncImageFileView *fv = Add(new AsyncImageFileView(screenshotFilename_, IS_DEFAULT, new UI::LayoutParams(82 * 2, 47 * 2))); AsyncImageFileView *fv = Add(new AsyncImageFileView(screenshotFilename_, IS_DEFAULT, new UI::LayoutParams(82 * 2, 47 * 2)));
@ -246,11 +246,11 @@ SaveSlotView::SaveSlotView(const Path &gameFilename, int slot, UI::LayoutParams
fv->OnClick.Handle(this, &SaveSlotView::OnScreenshotClick); fv->OnClick.Handle(this, &SaveSlotView::OnScreenshotClick);
if (SaveState::HasSaveInSlot(gamePath_.ToString(), slot)) { if (SaveState::HasSaveInSlot(gamePath_, slot)) {
loadStateButton_ = buttons->Add(new Button(pa->T("Load State"), new LinearLayoutParams(0.0, G_VCENTER))); loadStateButton_ = buttons->Add(new Button(pa->T("Load State"), new LinearLayoutParams(0.0, G_VCENTER)));
loadStateButton_->OnClick.Handle(this, &SaveSlotView::OnLoadState); loadStateButton_->OnClick.Handle(this, &SaveSlotView::OnLoadState);
std::string dateStr = SaveState::GetSlotDateAsString(gamePath_.ToString(), slot_); std::string dateStr = SaveState::GetSlotDateAsString(gamePath_, slot_);
std::vector<std::string> dateStrs; std::vector<std::string> dateStrs;
SplitString(dateStr, ' ', dateStrs); SplitString(dateStr, ' ', dateStrs);
if (!dateStrs.empty() && !dateStrs[0].empty()) { if (!dateStrs.empty() && !dateStrs[0].empty()) {
@ -281,7 +281,7 @@ static void AfterSaveStateAction(SaveState::Status status, const std::string &me
UI::EventReturn SaveSlotView::OnLoadState(UI::EventParams &e) { UI::EventReturn SaveSlotView::OnLoadState(UI::EventParams &e) {
g_Config.iCurrentStateSlot = slot_; g_Config.iCurrentStateSlot = slot_;
SaveState::LoadSlot(gamePath_.ToString(), slot_, &AfterSaveStateAction); SaveState::LoadSlot(gamePath_, slot_, &AfterSaveStateAction);
UI::EventParams e2{}; UI::EventParams e2{};
e2.v = this; e2.v = this;
OnStateLoaded.Trigger(e2); OnStateLoaded.Trigger(e2);
@ -290,7 +290,7 @@ UI::EventReturn SaveSlotView::OnLoadState(UI::EventParams &e) {
UI::EventReturn SaveSlotView::OnSaveState(UI::EventParams &e) { UI::EventReturn SaveSlotView::OnSaveState(UI::EventParams &e) {
g_Config.iCurrentStateSlot = slot_; g_Config.iCurrentStateSlot = slot_;
SaveState::SaveSlot(gamePath_.ToString(), slot_, &AfterSaveStateAction); SaveState::SaveSlot(gamePath_, slot_, &AfterSaveStateAction);
UI::EventParams e2{}; UI::EventParams e2{};
e2.v = this; e2.v = this;
OnStateSaved.Trigger(e2); OnStateSaved.Trigger(e2);
@ -408,7 +408,7 @@ void GamePauseScreen::dialogFinished(const Screen *dialog, DialogResult dr) {
ScreenshotViewScreen *s = (ScreenshotViewScreen *)dialog; ScreenshotViewScreen *s = (ScreenshotViewScreen *)dialog;
int slot = s->GetSlot(); int slot = s->GetSlot();
g_Config.iCurrentStateSlot = slot; g_Config.iCurrentStateSlot = slot;
SaveState::LoadSlot(gamePath_.ToString(), slot, &AfterSaveStateAction); SaveState::LoadSlot(gamePath_, slot, &AfterSaveStateAction);
finishNextFrame_ = true; finishNextFrame_ = true;
} else { } else {
@ -421,7 +421,7 @@ UI::EventReturn GamePauseScreen::OnScreenshotClicked(UI::EventParams &e) {
SaveSlotView *v = static_cast<SaveSlotView *>(e.v); SaveSlotView *v = static_cast<SaveSlotView *>(e.v);
int slot = v->GetSlot(); int slot = v->GetSlot();
g_Config.iCurrentStateSlot = v->GetSlot(); g_Config.iCurrentStateSlot = v->GetSlot();
if (SaveState::HasSaveInSlot(gamePath_.ToString(), slot)) { if (SaveState::HasSaveInSlot(gamePath_, slot)) {
Path fn = v->GetScreenshotFilename(); Path fn = v->GetScreenshotFilename();
std::string title = v->GetScreenshotTitle(); std::string title = v->GetScreenshotTitle();
auto pa = GetI18NCategory("Pause"); auto pa = GetI18NCategory("Pause");

View file

@ -681,7 +681,7 @@ namespace MainWindow {
case ID_FILE_QUICKLOADSTATE: case ID_FILE_QUICKLOADSTATE:
{ {
SetCursor(LoadCursor(0, IDC_WAIT)); SetCursor(LoadCursor(0, IDC_WAIT));
SaveState::LoadSlot(PSP_CoreParameter().fileToStart.ToString(), g_Config.iCurrentStateSlot, SaveStateActionFinished); SaveState::LoadSlot(PSP_CoreParameter().fileToStart, g_Config.iCurrentStateSlot, SaveStateActionFinished);
break; break;
} }
@ -690,14 +690,14 @@ namespace MainWindow {
if (KeyMap::g_controllerMap[VIRTKEY_LOAD_STATE].empty()) if (KeyMap::g_controllerMap[VIRTKEY_LOAD_STATE].empty())
{ {
SetCursor(LoadCursor(0, IDC_WAIT)); SetCursor(LoadCursor(0, IDC_WAIT));
SaveState::LoadSlot(PSP_CoreParameter().fileToStart.ToString(), g_Config.iCurrentStateSlot, SaveStateActionFinished); SaveState::LoadSlot(PSP_CoreParameter().fileToStart, g_Config.iCurrentStateSlot, SaveStateActionFinished);
} }
break; break;
} }
case ID_FILE_QUICKSAVESTATE: case ID_FILE_QUICKSAVESTATE:
{ {
SetCursor(LoadCursor(0, IDC_WAIT)); SetCursor(LoadCursor(0, IDC_WAIT));
SaveState::SaveSlot(PSP_CoreParameter().fileToStart.ToString(), g_Config.iCurrentStateSlot, SaveStateActionFinished); SaveState::SaveSlot(PSP_CoreParameter().fileToStart, g_Config.iCurrentStateSlot, SaveStateActionFinished);
break; break;
} }
@ -706,7 +706,7 @@ namespace MainWindow {
if (KeyMap::g_controllerMap[VIRTKEY_SAVE_STATE].empty()) if (KeyMap::g_controllerMap[VIRTKEY_SAVE_STATE].empty())
{ {
SetCursor(LoadCursor(0, IDC_WAIT)); SetCursor(LoadCursor(0, IDC_WAIT));
SaveState::SaveSlot(PSP_CoreParameter().fileToStart.ToString(), g_Config.iCurrentStateSlot, SaveStateActionFinished); SaveState::SaveSlot(PSP_CoreParameter().fileToStart, g_Config.iCurrentStateSlot, SaveStateActionFinished);
break; break;
} }
break; break;