use platform file functions for savestates and NAND importing file check
should fix character encoding issues on Windows
This commit is contained in:
parent
c0ada2f445
commit
12563fb636
|
@ -552,7 +552,7 @@ bool EmuInstance::savestateExists(int slot)
|
||||||
|
|
||||||
bool EmuInstance::loadState(const std::string& filename)
|
bool EmuInstance::loadState(const std::string& filename)
|
||||||
{
|
{
|
||||||
FILE* file = fopen(filename.c_str(), "rb");
|
Platform::FileHandle* file = Platform::OpenFile(filename, Platform::FileMode::Read);
|
||||||
if (file == nullptr)
|
if (file == nullptr)
|
||||||
{ // If we couldn't open the state file...
|
{ // If we couldn't open the state file...
|
||||||
Platform::Log(Platform::LogLevel::Error, "Failed to open state file \"%s\"\n", filename.c_str());
|
Platform::Log(Platform::LogLevel::Error, "Failed to open state file \"%s\"\n", filename.c_str());
|
||||||
|
@ -563,38 +563,31 @@ bool EmuInstance::loadState(const std::string& filename)
|
||||||
if (backup->Error)
|
if (backup->Error)
|
||||||
{ // If we couldn't allocate memory for the backup...
|
{ // If we couldn't allocate memory for the backup...
|
||||||
Platform::Log(Platform::LogLevel::Error, "Failed to allocate memory for state backup\n");
|
Platform::Log(Platform::LogLevel::Error, "Failed to allocate memory for state backup\n");
|
||||||
fclose(file);
|
Platform::CloseFile(file);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!nds->DoSavestate(backup.get()) || backup->Error)
|
if (!nds->DoSavestate(backup.get()) || backup->Error)
|
||||||
{ // Back up the emulator's state. If that failed...
|
{ // Back up the emulator's state. If that failed...
|
||||||
Platform::Log(Platform::LogLevel::Error, "Failed to back up state, aborting load (from \"%s\")\n", filename.c_str());
|
Platform::Log(Platform::LogLevel::Error, "Failed to back up state, aborting load (from \"%s\")\n", filename.c_str());
|
||||||
fclose(file);
|
Platform::CloseFile(file);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// We'll store the backup once we're sure that the state was loaded.
|
// We'll store the backup once we're sure that the state was loaded.
|
||||||
// Now that we know the file and backup are both good, let's load the new state.
|
// Now that we know the file and backup are both good, let's load the new state.
|
||||||
|
|
||||||
// Get the size of the file that we opened
|
// Get the size of the file that we opened
|
||||||
if (fseek(file, 0, SEEK_END) != 0)
|
size_t size = Platform::FileLength(file);
|
||||||
{
|
|
||||||
Platform::Log(Platform::LogLevel::Error, "Failed to seek to end of state file \"%s\"\n", filename.c_str());
|
|
||||||
fclose(file);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
size_t size = ftell(file);
|
|
||||||
rewind(file); // reset the filebuf's position
|
|
||||||
|
|
||||||
// Allocate exactly as much memory as we need for the savestate
|
// Allocate exactly as much memory as we need for the savestate
|
||||||
std::vector<u8> buffer(size);
|
std::vector<u8> buffer(size);
|
||||||
if (fread(buffer.data(), size, 1, file) == 0)
|
if (Platform::FileRead(buffer.data(), size, 1, file) == 0)
|
||||||
{ // Read the state file into the buffer. If that failed...
|
{ // Read the state file into the buffer. If that failed...
|
||||||
Platform::Log(Platform::LogLevel::Error, "Failed to read %u-byte state file \"%s\"\n", size, filename.c_str());
|
Platform::Log(Platform::LogLevel::Error, "Failed to read %u-byte state file \"%s\"\n", size, filename.c_str());
|
||||||
fclose(file);
|
Platform::CloseFile(file);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
fclose(file); // done with the file now
|
Platform::CloseFile(file); // done with the file now
|
||||||
|
|
||||||
// Get ready to load the state from the buffer into the emulator
|
// Get ready to load the state from the buffer into the emulator
|
||||||
std::unique_ptr<Savestate> state = std::make_unique<Savestate>(buffer.data(), size, false);
|
std::unique_ptr<Savestate> state = std::make_unique<Savestate>(buffer.data(), size, false);
|
||||||
|
@ -626,7 +619,7 @@ bool EmuInstance::loadState(const std::string& filename)
|
||||||
|
|
||||||
bool EmuInstance::saveState(const std::string& filename)
|
bool EmuInstance::saveState(const std::string& filename)
|
||||||
{
|
{
|
||||||
FILE* file = fopen(filename.c_str(), "wb");
|
Platform::FileHandle* file = Platform::OpenFile(filename, Platform::FileMode::Write);
|
||||||
|
|
||||||
if (file == nullptr)
|
if (file == nullptr)
|
||||||
{ // If the file couldn't be opened...
|
{ // If the file couldn't be opened...
|
||||||
|
@ -636,7 +629,7 @@ bool EmuInstance::saveState(const std::string& filename)
|
||||||
Savestate state;
|
Savestate state;
|
||||||
if (state.Error)
|
if (state.Error)
|
||||||
{ // If there was an error creating the state (and allocating its memory)...
|
{ // If there was an error creating the state (and allocating its memory)...
|
||||||
fclose(file);
|
Platform::CloseFile(file);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -645,22 +638,22 @@ bool EmuInstance::saveState(const std::string& filename)
|
||||||
|
|
||||||
if (state.Error)
|
if (state.Error)
|
||||||
{
|
{
|
||||||
fclose(file);
|
Platform::CloseFile(file);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fwrite(state.Buffer(), state.Length(), 1, file) == 0)
|
if (Platform::FileWrite(state.Buffer(), state.Length(), 1, file) == 0)
|
||||||
{ // Write the Savestate buffer to the file. If that fails...
|
{ // Write the Savestate buffer to the file. If that fails...
|
||||||
Platform::Log(Platform::Error,
|
Platform::Log(Platform::Error,
|
||||||
"Failed to write %d-byte savestate to %s\n",
|
"Failed to write %d-byte savestate to %s\n",
|
||||||
state.Length(),
|
state.Length(),
|
||||||
filename.c_str()
|
filename.c_str()
|
||||||
);
|
);
|
||||||
fclose(file);
|
Platform::CloseFile(file);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(file);
|
Platform::CloseFile(file);
|
||||||
|
|
||||||
if (globalCfg.GetBool("Savestate.RelocSRAM") && ndsSave)
|
if (globalCfg.GetBool("Savestate.RelocSRAM") && ndsSave)
|
||||||
{
|
{
|
||||||
|
|
|
@ -303,7 +303,7 @@ void TitleManagerDialog::onImportTitleData()
|
||||||
|
|
||||||
if (file.isEmpty()) return;
|
if (file.isEmpty()) return;
|
||||||
|
|
||||||
FILE* f = fopen(file.toStdString().c_str(), "rb");
|
Platform::FileHandle* f = Platform::OpenFile(file.toStdString(), Platform::Read);
|
||||||
if (!f)
|
if (!f)
|
||||||
{
|
{
|
||||||
QMessageBox::critical(this,
|
QMessageBox::critical(this,
|
||||||
|
@ -312,9 +312,8 @@ void TitleManagerDialog::onImportTitleData()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fseek(f, 0, SEEK_END);
|
u64 len = Platform::FileLength(f);
|
||||||
u64 len = ftell(f);
|
Platform::CloseFile(f);
|
||||||
fclose(f);
|
|
||||||
|
|
||||||
if (len != wantedsize)
|
if (len != wantedsize)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue