diff --git a/src/common/error.cpp b/src/common/error.cpp index e6da2f3f4..3dc04801b 100644 --- a/src/common/error.cpp +++ b/src/common/error.cpp @@ -56,28 +56,32 @@ void Error::SetErrno(int err) void Error::SetErrno(std::string_view prefix, int err) { m_type = Type::Errno; + m_description = TranslateErrnoError(prefix, err); +} +std::string Error::TranslateErrnoError(std::string_view prefix, int err) +{ #ifdef _MSC_VER char buf[128]; if (strerror_s(buf, sizeof(buf), err) == 0) - m_description = fmt::format("{}errno {}: {}", prefix, err, buf); + return fmt::format("{}errno {}: {}", prefix, err, buf); else - m_description = fmt::format("{}errno {}: ", prefix, err); + return fmt::format("{}errno {}: ", prefix, err); #elif defined(__GLIBC__) && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 32)) const char* desc = strerrordesc_np(err); const char* name = strerrorname_np(err); if (desc && name) - m_description = fmt::format("{}errno {} ({}): {}", prefix, err, name, desc); + return fmt::format("{}errno {} ({}): {}", prefix, err, name, desc); else if (desc) - m_description = fmt::format("{}errno {}: {}", prefix, err, desc); + return fmt::format("{}errno {}: {}", prefix, err, desc); else - m_description = fmt::format("{}errno {}: ", prefix, err); + return fmt::format("{}errno {}: ", prefix, err); #else const char* buf = std::strerror(err); if (buf) - m_description = fmt::format("{}errno {}: {}", prefix, err, buf); + return fmt::format("{}errno {}: {}", prefix, err, buf); else - m_description = fmt::format("{}errno {}: ", prefix, err); + return fmt::format("{}errno {}: ", prefix, err); #endif } @@ -127,7 +131,11 @@ void Error::SetWin32(unsigned long err) void Error::SetWin32(std::string_view prefix, unsigned long err) { m_type = Type::Win32; + m_description = TranslateWin32Error({}, err); +} +std::string Error::TranslateWin32Error(std::string_view prefix, unsigned long err) +{ WCHAR buf[128]; DWORD r = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, err, ENGLISH_LANG_ID, buf, static_cast(std::size(buf)), nullptr); @@ -136,12 +144,12 @@ void Error::SetWin32(std::string_view prefix, unsigned long err) if (r > 0) { - m_description = - fmt::format("{}Win32 Error {}: {}", prefix, err, StringUtil::WideStringToUTF8String(std::wstring_view(buf, r))); + return fmt::format("{}Win32 Error {}: {}", prefix, err, + StringUtil::WideStringToUTF8String(std::wstring_view(buf, r))); } else { - m_description = fmt::format("{}Win32 Error {}: ", prefix, err); + return fmt::format("{}Win32 Error {}: ", prefix, err); } } @@ -165,7 +173,11 @@ void Error::SetHResult(long err) void Error::SetHResult(std::string_view prefix, long err) { m_type = Type::HResult; + m_description = TranslateHResultError(prefix, err); +} +std::string Error::TranslateHResultError(std::string_view prefix, long err) +{ WCHAR buf[128]; DWORD r = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, err, ENGLISH_LANG_ID, buf, static_cast(std::size(buf)), nullptr); @@ -174,12 +186,12 @@ void Error::SetHResult(std::string_view prefix, long err) if (r > 0) { - m_description = fmt::format("{}HRESULT {:08X}: {}", prefix, static_cast(err), - StringUtil::WideStringToUTF8String(std::wstring_view(buf, r))); + return fmt::format("{}HRESULT {:08X}: {}", prefix, static_cast(err), + StringUtil::WideStringToUTF8String(std::wstring_view(buf, r))); } else { - m_description = fmt::format("{}HRESULT {:08X}: ", prefix, err); + return fmt::format("{}HRESULT {:08X}: ", prefix, err); } } diff --git a/src/common/error.h b/src/common/error.h index b36d8a60e..f14d66e90 100644 --- a/src/common/error.h +++ b/src/common/error.h @@ -132,6 +132,13 @@ public: errptr->AddSuffixFmtArgs(fmt.get(), fmt::make_format_args(args...)); } + // Helpers for obtaining error strings without creating an Error object. + static std::string TranslateErrnoError(std::string_view prefix, int err); +#ifdef _WIN32 + static std::string TranslateWin32Error(std::string_view prefix, unsigned long err); + static std::string TranslateHResultError(std::string_view prefix, long err); +#endif + Error& operator=(const Error& e); Error& operator=(Error&& e); bool operator==(const Error& e) const;