From 8731b7582be3692b6eeee714b4705354d951c7fd Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 21 Mar 2023 10:33:00 +0100 Subject: [PATCH] impr: Display a more detailed errors when opening a raw disk provider failed (#970) PR title is self explaining I may modify other providers implementations to display a detailed error message later I'm not sure how to deal with other locales because the format changed. Before, I had to add and comment the key in all locale files, now I'm not so sure. --- lib/libimhex/include/hex/providers/provider.hpp | 5 +++++ plugins/builtin/romfs/lang/base.json | 3 +++ plugins/builtin/romfs/lang/en_US.json | 3 +++ plugins/builtin/source/content/providers/disk_provider.cpp | 6 ++++++ .../source/content/views/view_provider_settings.cpp | 7 ++++++- 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/libimhex/include/hex/providers/provider.hpp b/lib/libimhex/include/hex/providers/provider.hpp index a418a93ef..521a44033 100644 --- a/lib/libimhex/include/hex/providers/provider.hpp +++ b/lib/libimhex/include/hex/providers/provider.hpp @@ -103,6 +103,9 @@ namespace hex::prv { void skipLoadInterface() { this->m_skipLoadInterface = true; } [[nodiscard]] bool shouldSkipLoadInterface() const { return this->m_skipLoadInterface; } + void setErrorMessage(const std::string &errorMessage) { this->m_errorMessage = errorMessage; } + [[nodiscard]] const std::string& getErrorMessage() const { return this->m_errorMessage; } + protected: u32 m_currPage = 0; u64 m_baseAddress = 0; @@ -116,6 +119,8 @@ namespace hex::prv { bool m_dirty = false; bool m_skipLoadInterface = false; + std::string m_errorMessage; + private: static u32 s_idCounter; }; diff --git a/plugins/builtin/romfs/lang/base.json b/plugins/builtin/romfs/lang/base.json index 9434c034b..1a2364987 100644 --- a/plugins/builtin/romfs/lang/base.json +++ b/plugins/builtin/romfs/lang/base.json @@ -335,6 +335,8 @@ "hex.builtin.provider.disk.reload", "hex.builtin.provider.disk.sector_size", "hex.builtin.provider.disk.selected_disk", + "hex.builtin.provider.disk.error.read_ro", + "hex.builtin.provider.disk.error.read_rw", "hex.builtin.provider.file", "hex.builtin.provider.file.access", "hex.builtin.provider.file.creation", @@ -742,6 +744,7 @@ "hex.builtin.view.pattern_editor.sections", "hex.builtin.view.pattern_editor.settings", "hex.builtin.view.provider_settings.load_error", + "hex.builtin.view.provider_settings.load_error_details", "hex.builtin.view.provider_settings.load_popup", "hex.builtin.view.provider_settings.name", "hex.builtin.view.settings.name", diff --git a/plugins/builtin/romfs/lang/en_US.json b/plugins/builtin/romfs/lang/en_US.json index ee7d21cb5..bd77da227 100644 --- a/plugins/builtin/romfs/lang/en_US.json +++ b/plugins/builtin/romfs/lang/en_US.json @@ -375,6 +375,8 @@ "hex.builtin.provider.disk.reload": "Reload", "hex.builtin.provider.disk.sector_size": "Sector Size", "hex.builtin.provider.disk.selected_disk": "Disk", + "hex.builtin.provider.disk.error.read_ro": "Failed to open disk {} in read/write: {}", + "hex.builtin.provider.disk.error.read_rw": "Failed to open disk {} in read/write: {}", "hex.builtin.provider.file": "File Provider", "hex.builtin.provider.file.access": "Last access time", "hex.builtin.provider.file.creation": "Creation time", @@ -791,6 +793,7 @@ "hex.builtin.view.pattern_editor.sections": "Sections", "hex.builtin.view.pattern_editor.settings": "Settings", "hex.builtin.view.provider_settings.load_error": "An error occurred while trying to open this provider!", + "hex.builtin.view.provider_settings.load_error_details": "An error occurred while trying to open this provider!\nDetails: {}", "hex.builtin.view.provider_settings.load_popup": "Open Provider", "hex.builtin.view.provider_settings.name": "Provider Settings", "hex.builtin.view.settings.name": "Settings", diff --git a/plugins/builtin/source/content/providers/disk_provider.cpp b/plugins/builtin/source/content/providers/disk_provider.cpp index 3bb5573c6..1d9230ced 100644 --- a/plugins/builtin/source/content/providers/disk_provider.cpp +++ b/plugins/builtin/source/content/providers/disk_provider.cpp @@ -1,3 +1,5 @@ +#include + #include "content/providers/disk_provider.hpp" #include @@ -123,11 +125,15 @@ namespace hex::plugin::builtin { this->m_diskHandle = ::open(path.c_str(), O_RDWR); if (this->m_diskHandle == -1) { + this->setErrorMessage(hex::format("hex.builtin.provider.disk.error.read_rw"_lang, path, ::strerror(errno))); + log::warn(this->getErrorMessage()); this->m_diskHandle = ::open(path.c_str(), O_RDONLY); this->m_writable = false; } if (this->m_diskHandle == -1) { + this->setErrorMessage(hex::format("hex.builtin.provider.disk.error.read_ro"_lang, path, ::strerror(errno))); + log::warn(this->getErrorMessage()); this->m_readable = false; return false; } diff --git a/plugins/builtin/source/content/views/view_provider_settings.cpp b/plugins/builtin/source/content/views/view_provider_settings.cpp index 719489a70..2053aac6f 100644 --- a/plugins/builtin/source/content/views/view_provider_settings.cpp +++ b/plugins/builtin/source/content/views/view_provider_settings.cpp @@ -41,7 +41,12 @@ namespace hex::plugin::builtin { ImGui::CloseCurrentPopup(); } else { - View::showErrorPopup("hex.builtin.view.provider_settings.load_error"_lang); + auto errorMessage = provider->getErrorMessage(); + if (errorMessage.empty()) { + View::showErrorPopup("hex.builtin.view.provider_settings.load_error"_lang); + } else { + View::showErrorPopup(hex::format("hex.builtin.view.provider_settings.load_error_details"_lang, errorMessage)); + } TaskManager::doLater([=] { ImHexApi::Provider::remove(provider); }); } }