Addressed Bunnei's review comments, and made some other tweaks:

- Deleted GetStatus() because it wasn't used anywhere outside of Core::System.
 - Fixed design flaw where the message bar status could be set despite the game being stopped.
This commit is contained in:
TheKoopaKingdom 2017-06-02 17:03:38 -04:00
parent ff04320c97
commit f008b22e3b
7 changed files with 32 additions and 29 deletions

View File

@ -663,10 +663,11 @@ void GMainWindow::OnCoreError(Core::System::ResultStatus result, std::string det
switch (result) { switch (result) {
case Core::System::ResultStatus::ErrorSystemFiles: { case Core::System::ResultStatus::ErrorSystemFiles: {
QString message = "Citra was unable to locate a 3DS system archive"; QString message = "Citra was unable to locate a 3DS system archive";
if (details != std::string()) if (!details.empty()) {
message.append(tr(": %1. ").arg(details.c_str())); message.append(tr(": %1. ").arg(details.c_str()));
else } else {
message.append(". "); message.append(". ");
}
message.append(common_message); message.append(common_message);
answer = QMessageBox::question(this, tr("System Archive Not Found"), message, answer = QMessageBox::question(this, tr("System Archive Not Found"), message,
@ -698,11 +699,15 @@ void GMainWindow::OnCoreError(Core::System::ResultStatus result, std::string det
} }
if (answer == QMessageBox::Yes) { if (answer == QMessageBox::Yes) {
if (emu_thread != nullptr) if (emu_thread) {
ShutdownGame(); ShutdownGame();
}
} else { } else {
message_label->setText(status_message); // Only show the message if the game is still running.
message_label->setVisible(true); if (emu_thread) {
message_label->setText(status_message);
message_label->setVisible(true);
}
} }
} }

View File

@ -26,7 +26,7 @@ namespace Core {
/*static*/ System System::s_instance; /*static*/ System System::s_instance;
System::ResultStatus System::RunLoop(int tight_loop) { System::ResultStatus System::RunLoop(int tight_loop) {
this->status = ResultStatus::Success; status = ResultStatus::Success;
if (!cpu_core) { if (!cpu_core) {
return ResultStatus::ErrorNotInitialized; return ResultStatus::ErrorNotInitialized;
} }
@ -60,7 +60,7 @@ System::ResultStatus System::RunLoop(int tight_loop) {
HW::Update(); HW::Update();
Reschedule(); Reschedule();
return GetStatus(); return status;
} }
System::ResultStatus System::SingleStep() { System::ResultStatus System::SingleStep() {
@ -99,8 +99,8 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file
return init_result; return init_result;
} }
Loader::ResultStatus load_result = app_loader->Load(); const Loader::ResultStatus load_result{app_loader->Load()};
if (load_result != Loader::ResultStatus::Success) { if (Loader::ResultStatus::Success != load_result) {
LOG_CRITICAL(Core, "Failed to load ROM (Error %i)!", load_result); LOG_CRITICAL(Core, "Failed to load ROM (Error %i)!", load_result);
System::Shutdown(); System::Shutdown();
@ -113,9 +113,8 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file
return ResultStatus::ErrorLoader; return ResultStatus::ErrorLoader;
} }
} }
// this->status will be used for errors while actually running the game
status = ResultStatus::Success; status = ResultStatus::Success;
return ResultStatus::Success; return status;
} }
void System::PrepareReschedule() { void System::PrepareReschedule() {

View File

@ -108,16 +108,14 @@ public:
PerfStats perf_stats; PerfStats perf_stats;
FrameLimiter frame_limiter; FrameLimiter frame_limiter;
ResultStatus GetStatus() { void SetStatus(ResultStatus new_status, const char* details = nullptr) {
return status;
}
void SetStatus(ResultStatus new_status, std::string details = std::string()) {
status = new_status; status = new_status;
status_details = details; if (details) {
status_details = details;
}
} }
std::string GetStatusDetails() { const std::string& GetStatusDetails() const {
return status_details; return status_details;
} }
@ -147,8 +145,8 @@ private:
static System s_instance; static System s_instance;
ResultStatus status; ResultStatus status = ResultStatus::Success;
std::string status_details; std::string status_details = "";
}; };
inline ARM_Interface& CPU() { inline ARM_Interface& CPU() {

View File

@ -42,13 +42,13 @@ ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_NCCH::Open(const Path&
if (!file->IsOpen()) { if (!file->IsOpen()) {
// High Title ID of the archive: The category (https://3dbrew.org/wiki/Title_list). // High Title ID of the archive: The category (https://3dbrew.org/wiki/Title_list).
const u32 shared_data_archive = 0x0004009B; constexpr u32 shared_data_archive = 0x0004009B;
const u32 system_data_archive = 0x000400DB; constexpr u32 system_data_archive = 0x000400DB;
// Low Title IDs. // Low Title IDs.
const u32 mii_data = 0x00010202; constexpr u32 mii_data = 0x00010202;
const u32 region_manifest = 0x00010402; constexpr u32 region_manifest = 0x00010402;
const u32 ng_word_list = 0x00010302; constexpr u32 ng_word_list = 0x00010302;
LOG_DEBUG(Service_FS, "Full Path: %s. Category: 0x%X. Path: 0x%X.", path.DebugStr().c_str(), LOG_DEBUG(Service_FS, "Full Path: %s. Category: 0x%X. Path: 0x%X.", path.DebugStr().c_str(),
high, low); high, low);
@ -60,7 +60,7 @@ ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_NCCH::Open(const Path&
"Mii data"); "Mii data");
} else if (low == region_manifest) { } else if (low == region_manifest) {
LOG_ERROR(Service_FS, LOG_ERROR(Service_FS,
"Failed to get a handle for shared data archive: region manifes"); "Failed to get a handle for shared data archive: region manifest.");
Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSystemFiles, Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSystemFiles,
"Region manifest"); "Region manifest");
} }

View File

@ -257,8 +257,9 @@ ResultVal<ArchiveHandle> OpenArchive(ArchiveIdCode id_code, FileSys::Path& archi
LOG_TRACE(Service_FS, "Opening archive with id code 0x%08X", id_code); LOG_TRACE(Service_FS, "Opening archive with id code 0x%08X", id_code);
auto itr = id_code_map.find(id_code); auto itr = id_code_map.find(id_code);
if (itr == id_code_map.end()) if (itr == id_code_map.end()) {
return FileSys::ERROR_NOT_FOUND; return FileSys::ERROR_NOT_FOUND;
}
CASCADE_RESULT(std::unique_ptr<ArchiveBackend> res, itr->second->Open(archive_path)); CASCADE_RESULT(std::unique_ptr<ArchiveBackend> res, itr->second->Open(archive_path));

View File

@ -101,7 +101,7 @@ public:
* Loads the system mode that this application needs. * Loads the system mode that this application needs.
* This function defaults to 2 (96MB allocated to the application) if it can't read the * This function defaults to 2 (96MB allocated to the application) if it can't read the
* information. * information.
* @returns a pair of Optional with the kernel system mode and ResultStatus. * @returns A pair with the optional system mode, and and the status.
*/ */
virtual std::pair<boost::optional<u32>, ResultStatus> LoadKernelSystemMode() { virtual std::pair<boost::optional<u32>, ResultStatus> LoadKernelSystemMode() {
// 96MB allocated to the application. // 96MB allocated to the application.

View File

@ -179,7 +179,7 @@ public:
/** /**
* Loads the Exheader and returns the system mode for this application. * Loads the Exheader and returns the system mode for this application.
* @returns a pair of Optional with the kernel system mode and ResultStatus * @returns A pair with the optional system mode, and and the status.
*/ */
std::pair<boost::optional<u32>, ResultStatus> LoadKernelSystemMode() override; std::pair<boost::optional<u32>, ResultStatus> LoadKernelSystemMode() override;