From 7603ba5da03ec0f84eee110b6d8de7570b86d195 Mon Sep 17 00:00:00 2001 From: Fuzzy2319 Date: Fri, 17 Jul 2026 21:25:29 +0200 Subject: [PATCH 01/14] add:err headers --- include/nn/err.h | 57 ++++++++++++++++------------ include/nn/err/ApplicationErrorArg.h | 32 ++++++++++++++++ include/nn/err/ErrorCode.h | 19 ++++++++++ include/nn/err/ErrorResultVariant.h | 34 +++++++++++++++++ include/nn/err/ResultBacktrace.h | 13 +++++++ include/nn/err/SystemErrorArg.h | 38 +++++++++++++++++++ include/nn/err/detail.h | 50 ++++++++++++++++++++++++ include/nn/err/detail/MessageKind.h | 8 ++++ include/nn/settings.h | 4 ++ 9 files changed, 230 insertions(+), 25 deletions(-) create mode 100644 include/nn/err/ApplicationErrorArg.h create mode 100644 include/nn/err/ErrorCode.h create mode 100644 include/nn/err/ErrorResultVariant.h create mode 100644 include/nn/err/ResultBacktrace.h create mode 100644 include/nn/err/SystemErrorArg.h create mode 100644 include/nn/err/detail.h create mode 100644 include/nn/err/detail/MessageKind.h diff --git a/include/nn/err.h b/include/nn/err.h index 1635bb02..90be1351 100644 --- a/include/nn/err.h +++ b/include/nn/err.h @@ -1,31 +1,38 @@ #pragma once +#include +#include +#include +#include +#include #include +#include +#include -namespace nn { -namespace err { -enum ErrorCodeCategoryType : u32 { - unk1, - unk2, -}; +namespace nn::err { +// TODO +class ErrorMessageDatabaseVersion; +class EulaData; -class ApplicationErrorArg { -public: - ApplicationErrorArg(); - ApplicationErrorArg(u32 error_code, const char* dialog_message, const char* fullscreen_message, - const nn::settings::LanguageCode& languageCode); - void SetApplicationErrorCodeNumber(u32 error_code); - void SetDialogMessage(const char* message); - void SetFullScreenMessage(const char* message); - - u64 unk; - u32 error_code; - nn::settings::LanguageCode language_code; - char dialog_message[2048]; - char fullscreen_message[2048]; -}; - -u32 MakeErrorCode(ErrorCodeCategoryType err_category_type, u32 errorCodeNumber); +ErrorCode ConvertResultToErrorCode(const Result& result); +bool CreateErrorViewerStartupParamForRecordedError(void*, u64*, u64, const char*, const char*, + time::PosixTime); +void GetErrorCodeString(char* outErrorCodeStr, size_t errorCodeStrBufferSize, ErrorCode errorCode); +void* GetErrorMessageDatabaseVersion(ErrorMessageDatabaseVersion* outErrorMessageDatabaseVersion); +ErrorCode MakeErrorCode(u32, u32); void ShowApplicationError(const ApplicationErrorArg& arg); -} // namespace err -} // namespace nn +void ShowError(Result result); +void ShowError(ErrorCode errorCode); +void ShowError(const ErrorResultVariant& errorResultVariant); +void ShowError(Result result, ResultBacktrace& backtrace); +void ShowErrorRecord(Result result, time::PosixTime timestamp); +void ShowErrorRecord(ErrorCode errorCode, time::PosixTime timestamp); +void ShowErrorRecord(const void*, u64); +void ShowErrorWithoutJump(Result result); +void ShowErrorWithoutJump(ErrorCode errorCode); +void ShowEula(settings::system::RegionCode regionCode); +void ShowSystemError(const SystemErrorArg& arg); +void ShowSystemUpdateEula(settings::system::RegionCode regionCode, EulaData& data); +void ShowUnacceptableAddOnContentVersionError(); +void ShowUnacceptableApplicationVersionError(); +} // namespace nn::err diff --git a/include/nn/err/ApplicationErrorArg.h b/include/nn/err/ApplicationErrorArg.h new file mode 100644 index 00000000..bf81a513 --- /dev/null +++ b/include/nn/err/ApplicationErrorArg.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include + +namespace nn::err { +class ApplicationErrorArg { +public: + ApplicationErrorArg(); + ApplicationErrorArg(u32 errorCode, const char* dialogMessage, const char* fullscreenMessage, + const settings::LanguageCode& languageCode); + + u32 GetApplicationErrorCodeNumber() const; + const char* GetDialogMessage() const; + const char* GetFullScreenMessage() const; + const settings::LanguageCode& GetLanguageCode() const; + + void SetApplicationErrorCodeNumber(u32 errorCode); + void SetDialogMessage(const char* message); + void SetFullScreenMessage(const char* message); + void SetLanguageCode(const settings::LanguageCode& languageCode); + +private: + u8 _0 = 2; + u8 _1 = 1; + u8 padding[6]; + u32 mErrorCode = 0; + settings::LanguageCode mLanguageCode; + char mDialogMessage[2048]; + char mFullscreenMessage[2048]; +}; +} // namespace nn::err diff --git a/include/nn/err/ErrorCode.h b/include/nn/err/ErrorCode.h new file mode 100644 index 00000000..f73f3e75 --- /dev/null +++ b/include/nn/err/ErrorCode.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +namespace nn::err { +class ErrorCode { +public: + static ErrorCode GetInvalidErrorCode(); + + ErrorCode() {} + ErrorCode(s32 param_1, s32 param_2) : _0(param_1), _4(param_2) {} + + bool IsValid() const; + +private: + s32 _0 = 0; + s32 _4 = 0; +}; +} // namespace nn::err diff --git a/include/nn/err/ErrorResultVariant.h b/include/nn/err/ErrorResultVariant.h new file mode 100644 index 00000000..6deb15ca --- /dev/null +++ b/include/nn/err/ErrorResultVariant.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include + +namespace nn::err { +class ErrorResultVariant { +public: + enum class State : u32 { + Undefined, + Result, + ErrorCode, + }; + + ErrorResultVariant(); + ErrorResultVariant(const Result& result); + ErrorResultVariant(const ErrorCode& errorCode); + + State GetState() const; + + operator ErrorCode() const; + operator Result() const; + + void operator=(const Result& result); + void operator=(const ErrorCode& errorCode); + +private: + State mState = State::Undefined; + union { + Result mResult; + ErrorCode mErrorCode; + } mValue; +}; +} // namespace nn::err diff --git a/include/nn/err/ResultBacktrace.h b/include/nn/err/ResultBacktrace.h new file mode 100644 index 00000000..f5028cf5 --- /dev/null +++ b/include/nn/err/ResultBacktrace.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +namespace nn::err { +class ResultBacktrace { +public: + static void Make(ResultBacktrace* outBackTrace, const Result*, s32); + +private: + // TODO +}; +} // namespace nn::err diff --git a/include/nn/err/SystemErrorArg.h b/include/nn/err/SystemErrorArg.h new file mode 100644 index 00000000..f1a1d599 --- /dev/null +++ b/include/nn/err/SystemErrorArg.h @@ -0,0 +1,38 @@ +#pragma once + +#include +#include +#include + +namespace nn::err { +class SystemErrorArg { +public: + SystemErrorArg(); + SystemErrorArg(ErrorCode errorCode, const char* dialogueMessage, const char* fullScreenMessage, + const settings::LanguageCode& languageCode); + + void SetErrorCode(ErrorCode errorCode); + void SetDialogMessage(const char* dialogueMessage); + void SetFullScreenMessage(const char* fullScreenMessage); + void SetLanguageCode(const settings::LanguageCode& languageCode); + ErrorCode GetErrorCode() const; + const char* GetDialogMessage() const; + const char* GetFullScreenMessage() const; + settings::LanguageCode GetLanguageCode() const; + void GetStartupParam() const; + +private: + s8 _0 = 1; + s8 _1 = 0; + s8 _2 = 0; + s8 _3 = 0; + s8 _4 = 0; + s8 _5 = 0; + s8 _6 = 0; + s8 _7 = 0; + ErrorCode mErrorCode; + settings::LanguageCode mLanguageCode; + char mDialogMessage[2048]; + char mFullScreenMessage[2048]; +}; +} // namespace nn::err diff --git a/include/nn/err/detail.h b/include/nn/err/detail.h new file mode 100644 index 00000000..2e65cacb --- /dev/null +++ b/include/nn/err/detail.h @@ -0,0 +1,50 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace nn::ns { +// TODO +class ApplicationErrorCodeCategory; +} // namespace nn::ns + +namespace nn::err { +class ErrorMessageDatabaseVersion; +} // namespace nn::err + +namespace nn::err::detail { +bool CategoryExists(u32); +bool DefaultErrorMessageDataExists(u32); +bool ErrorMessageDataExists(ErrorCode errorCode); +bool IsApplicationErrorCodeString(const char* errorCodeString); +void MakeApplicationErrorCodeString(char* outErrorCodeString, size_t errorCodeStringBufferSize, + const ns::ApplicationErrorCodeCategory&, u32); +void MakeErrorCodeString(char* outErrorCodeString, size_t errorCodeStringBufferSize, + ErrorCode errorCode); +void MakeErrorInfoCommonFilePath(char* outErrorInfoCommonFilePath, + size_t errorInfoCommonFilePathBufferSize, ErrorCode errorCode); +void MakeErrorInfoDirectoryPath(char* outErrorInfoDirectoryPath, + size_t errorInfoDirectoryPathBufferSize, ErrorCode errorCode); +void MakeErrorInfoMessageFilePath(char* outErrorInfoMessageFilePath, + size_t errorInfoMessageFilePathBufferSize, ErrorCode errorCode, + settings::LanguageCode languageCode, MessageKind messageKind); +void MakeErrorInfoModuleDirectoryPath(char* outErrorInfoModuleDirectoryPath, + size_t errorInfoModuleDirectoryPathBufferSize, u32); +void ParseApplicationErrorCodeString( + ns::ApplicationErrorCodeCategory* outApplicationErrorCodeCategory, u32*, + const char* errorCodeString); +void ParseApplicationErrorCodeString(ErrorCode* outErrorCode, const char* errorCodeString); +void* ReadMessageFile(char16* outMessage, s32* outMessageLength, size_t messageBufferSize, + ErrorCode errorCode, settings::LanguageCode languageCode, + MessageKind messageKind); +void* ReadMessageFile(char16* outMessage, size_t messageBufferSize, const char* errorCodeString, + const settings::LanguageCode& languageCode); +void ReadVersion(ErrorMessageDatabaseVersion* outMessageDatabaseVersion); +bool TryParseApplicationErrorCodeString( + ns::ApplicationErrorCodeCategory* outApplicationErrorCodeCategory, u32*, + const char* errorCodeString); +bool TryParseApplicationErrorCodeString(ErrorCode* outErrorCode, const char* errorCodeString); +} // namespace nn::err::detail diff --git a/include/nn/err/detail/MessageKind.h b/include/nn/err/detail/MessageKind.h new file mode 100644 index 00000000..410b7c1f --- /dev/null +++ b/include/nn/err/detail/MessageKind.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +namespace nn::err::detail { +// What does Flv stand for? +enum class MessageKind : u8 { DialogueMessage, DialogueButton, FlvMessage, FlvButton }; +} // namespace nn::err::detail diff --git a/include/nn/settings.h b/include/nn/settings.h index cb322e84..88114150 100644 --- a/include/nn/settings.h +++ b/include/nn/settings.h @@ -52,6 +52,10 @@ struct FirmwareVersion { } }; +struct RegionCode { + s32 code; +}; + Result GetFirmwareVersion(FirmwareVersion*); } // namespace system From 14b4f6902b1699765d5b58e961c403eb522114d9 Mon Sep 17 00:00:00 2001 From: Fuzzy2319 Date: Sun, 19 Jul 2026 01:29:42 +0200 Subject: [PATCH 02/14] add:partial err implementation --- include/nn/diag.h | 7 +- include/nn/err.h | 2 +- include/nn/err/ErrorCode.h | 9 +- include/nn/err/detail.h | 32 +- include/nn/util.h | 8 +- include/vapours/results/results_common.hpp | 332 +++++++++++---------- src/NintendoSDK/err/detail.cpp | 187 ++++++++++++ 7 files changed, 403 insertions(+), 174 deletions(-) create mode 100644 src/NintendoSDK/err/detail.cpp diff --git a/include/nn/diag.h b/include/nn/diag.h index edcce651..880016df 100644 --- a/include/nn/diag.h +++ b/include/nn/diag.h @@ -23,9 +23,12 @@ namespace detail { // LOG void LogImpl(nn::diag::LogMetaData const&, char const*, ...); void AbortImpl(char const*, char const*, char const*, s32); -void AbortImpl(char const*, char const*, char const*, int, Result); +void AbortImpl(char const*, char const*, char const*, s32, Result); -void OnAssertionFailure(nn::diag::AssertionType, char const*, char const*, char const*, int); +[[gnu::format(printf, 6, 7)]] [[noreturn]] +void AbortImpl(char const*, char const*, char const*, s32, Result, const char*, ...); + +void OnAssertionFailure(nn::diag::AssertionType, char const*, char const*, char const*, s32); } // namespace detail // MODULE / SYMBOL diff --git a/include/nn/err.h b/include/nn/err.h index 90be1351..cfb05701 100644 --- a/include/nn/err.h +++ b/include/nn/err.h @@ -19,7 +19,7 @@ bool CreateErrorViewerStartupParamForRecordedError(void*, u64*, u64, const char* time::PosixTime); void GetErrorCodeString(char* outErrorCodeStr, size_t errorCodeStrBufferSize, ErrorCode errorCode); void* GetErrorMessageDatabaseVersion(ErrorMessageDatabaseVersion* outErrorMessageDatabaseVersion); -ErrorCode MakeErrorCode(u32, u32); +ErrorCode MakeErrorCode(u32 category, u32 number); void ShowApplicationError(const ApplicationErrorArg& arg); void ShowError(Result result); void ShowError(ErrorCode errorCode); diff --git a/include/nn/err/ErrorCode.h b/include/nn/err/ErrorCode.h index f73f3e75..49a5603d 100644 --- a/include/nn/err/ErrorCode.h +++ b/include/nn/err/ErrorCode.h @@ -8,12 +8,15 @@ class ErrorCode { static ErrorCode GetInvalidErrorCode(); ErrorCode() {} - ErrorCode(s32 param_1, s32 param_2) : _0(param_1), _4(param_2) {} + ErrorCode(u32 category, u32 number) : mCategory(category), mNumber(number) {} bool IsValid() const; + u32 GetCategory() const { return mCategory; } + u32 GetNumber() const { return mNumber; } + private: - s32 _0 = 0; - s32 _4 = 0; + u32 mCategory = 0; + u32 mNumber = 0; }; } // namespace nn::err diff --git a/include/nn/err/detail.h b/include/nn/err/detail.h index 2e65cacb..7e471c1f 100644 --- a/include/nn/err/detail.h +++ b/include/nn/err/detail.h @@ -8,7 +8,13 @@ namespace nn::ns { // TODO -class ApplicationErrorCodeCategory; +class ApplicationErrorCodeCategory { +public: + const char* GetCategory() const { return mCategory; } + +private: + char mCategory[8]; +}; } // namespace nn::ns namespace nn::err { @@ -16,12 +22,13 @@ class ErrorMessageDatabaseVersion; } // namespace nn::err namespace nn::err::detail { -bool CategoryExists(u32); -bool DefaultErrorMessageDataExists(u32); +bool CategoryExists(u32 category); +bool DefaultErrorMessageDataExists(u32 category); bool ErrorMessageDataExists(ErrorCode errorCode); bool IsApplicationErrorCodeString(const char* errorCodeString); -void MakeApplicationErrorCodeString(char* outErrorCodeString, size_t errorCodeStringBufferSize, - const ns::ApplicationErrorCodeCategory&, u32); +void MakeApplicationErrorCodeString( + char* outErrorCodeString, size_t errorCodeStringBufferSize, + const ns::ApplicationErrorCodeCategory& applicationErrorCodeCategory, u32 errorCodeNumber); void MakeErrorCodeString(char* outErrorCodeString, size_t errorCodeStringBufferSize, ErrorCode errorCode); void MakeErrorInfoCommonFilePath(char* outErrorInfoCommonFilePath, @@ -32,11 +39,12 @@ void MakeErrorInfoMessageFilePath(char* outErrorInfoMessageFilePath, size_t errorInfoMessageFilePathBufferSize, ErrorCode errorCode, settings::LanguageCode languageCode, MessageKind messageKind); void MakeErrorInfoModuleDirectoryPath(char* outErrorInfoModuleDirectoryPath, - size_t errorInfoModuleDirectoryPathBufferSize, u32); + size_t errorInfoModuleDirectoryPathBufferSize, + u32 errorCodeCategory); void ParseApplicationErrorCodeString( - ns::ApplicationErrorCodeCategory* outApplicationErrorCodeCategory, u32*, - const char* errorCodeString); -void ParseApplicationErrorCodeString(ErrorCode* outErrorCode, const char* errorCodeString); + ns::ApplicationErrorCodeCategory* outApplicationErrorCodeCategory, + u32* outErrorCodeCategoryNumber, const char* errorCodeString); +void ParseErrorCodeString(ErrorCode* outErrorCode, const char* errorCodeString); void* ReadMessageFile(char16* outMessage, s32* outMessageLength, size_t messageBufferSize, ErrorCode errorCode, settings::LanguageCode languageCode, MessageKind messageKind); @@ -44,7 +52,7 @@ void* ReadMessageFile(char16* outMessage, size_t messageBufferSize, const char* const settings::LanguageCode& languageCode); void ReadVersion(ErrorMessageDatabaseVersion* outMessageDatabaseVersion); bool TryParseApplicationErrorCodeString( - ns::ApplicationErrorCodeCategory* outApplicationErrorCodeCategory, u32*, - const char* errorCodeString); -bool TryParseApplicationErrorCodeString(ErrorCode* outErrorCode, const char* errorCodeString); + ns::ApplicationErrorCodeCategory* outApplicationErrorCodeCategory, + u32* outErrorCodeCategoryNumber, const char* errorCodeString); +bool TryParseErrorCodeString(ErrorCode* outErrorCode, const char* errorCodeString); } // namespace nn::err::detail diff --git a/include/nn/util.h b/include/nn/util.h index 3e2bc5f8..6db8a2e5 100644 --- a/include/nn/util.h +++ b/include/nn/util.h @@ -18,8 +18,12 @@ CharacterEncodingResult ConvertCharacterUtf8ToUtf32(u32* dest, char const* src); CharacterEncodingResult ConvertStringUtf16NativeToUtf8(char*, s32, u16 const*, s32); CharacterEncodingResult ConvertStringUtf8ToUtf16Native(u16*, s32, char const*, s32); -s32 SNPrintf(char* s, ulong n, const char* format, ...); -s32 VSNPrintf(char* s, ulong n, const char* format, va_list arg); +[[gnu::format(printf, 3, 4)]] +s32 SNPrintf(char* s, size_t n, const char* format, ...); +s32 VSNPrintf(char* s, size_t n, const char* format, va_list arg); +[[gnu::format(printf, 3, 4)]] +s32 TSNPrintf(char* s, size_t n, const char* format, ...); +s32 TVSNPrintf(char* s, size_t n, const char* format, va_list arg); void ReferSymbol(const void*); } // namespace util diff --git a/include/vapours/results/results_common.hpp b/include/vapours/results/results_common.hpp index e124af0c..9649366c 100644 --- a/include/vapours/results/results_common.hpp +++ b/include/vapours/results/results_common.hpp @@ -17,198 +17,222 @@ * see /include/vapours/LICENSE */ #pragma once -#include #include +#include #include namespace nn { - namespace result::detail { - - class ResultTraits { - public: - using BaseType = std::uint32_t; - static const BaseType SuccessValue = BaseType(); - static const int ModuleBits = 9; - static const int DescriptionBits = 13; - static const int ReservedBits = 10; - static_assert(ModuleBits + DescriptionBits + ReservedBits == sizeof(BaseType) * CHAR_BIT, "ModuleBits + DescriptionBits + ReservedBits == sizeof(BaseType) * CHAR_BIT"); - private: - static BaseType GetBitsValue(BaseType v, int ofs, int num) noexcept { - return (v >> ofs) & ~(~BaseType() << num); - } - public: - template - struct MakeInnerValueStatic : public std::integral_constant { - static_assert(M < (1 << ModuleBits), "Invalid Module"); - static_assert(D < (1 << DescriptionBits), "Invalid Description"); - }; - - static BaseType MakeInnerValue(int m, int d) noexcept { - return (static_cast(m) << 0) | (static_cast(d) << ModuleBits); - } - - static BaseType GetModuleFromValue(BaseType value) noexcept { - return GetBitsValue(value, 0, ModuleBits); - } - - static BaseType GetDescriptionFromValue(BaseType value) noexcept { - return GetBitsValue(value, ModuleBits, DescriptionBits); - } - }; - - /* Use CRTP for Results. */ - template - class ResultBase { - public: - using BaseType = typename ResultTraits::BaseType; - static const BaseType SuccessValue = ResultTraits::SuccessValue; - - int GetModule() const noexcept { - return static_cast(ResultTraits::GetModuleFromValue(static_cast(*this).GetInnerValueForDebug())); - } - - int GetDescription() const noexcept { - return static_cast(ResultTraits::GetDescriptionFromValue(static_cast(*this).GetInnerValueForDebug())); - } - }; - - class ResultInternalAccessor; +namespace result::detail { + +class ResultTraits { +public: + using BaseType = std::uint32_t; + static const BaseType SuccessValue = BaseType(); + static const int ModuleBits = 9; + static const int DescriptionBits = 13; + static const int ReservedBits = 10; + static_assert(ModuleBits + DescriptionBits + ReservedBits == sizeof(BaseType) * CHAR_BIT, + "ModuleBits + DescriptionBits + ReservedBits == sizeof(BaseType) * CHAR_BIT"); + +private: + static BaseType GetBitsValue(BaseType v, int ofs, int num) noexcept { + return (v >> ofs) & ~(~BaseType() << num); + } + +public: + template + struct MakeInnerValueStatic : public std::integral_constant { + static_assert(M < (1 << ModuleBits), "Invalid Module"); + static_assert(D < (1 << DescriptionBits), "Invalid Description"); + }; + + static BaseType MakeInnerValue(int m, int d) noexcept { + return (static_cast(m) << 0) | (static_cast(d) << ModuleBits); + } + + static BaseType GetModuleFromValue(BaseType value) noexcept { + return GetBitsValue(value, 0, ModuleBits); + } + static BaseType GetDescriptionFromValue(BaseType value) noexcept { + return GetBitsValue(value, ModuleBits, DescriptionBits); + } +}; + +/* Use CRTP for Results. */ +template +class ResultBase { +public: + using BaseType = typename ResultTraits::BaseType; + static const BaseType SuccessValue = ResultTraits::SuccessValue; + + int GetModule() const noexcept { + return static_cast(ResultTraits::GetModuleFromValue( + static_cast(*this).GetInnerValueForDebug())); } - class ResultSuccess; + int GetDescription() const noexcept { + return static_cast(ResultTraits::GetDescriptionFromValue( + static_cast(*this).GetInnerValueForDebug())); + } +}; - class Result : public result::detail::ResultBase { - friend class result::detail::ResultInternalAccessor; - private: - using Base = typename result::detail::ResultBase; - private: - BaseType m_value; - private: - explicit Result(BaseType v) noexcept : m_value(v) { /* ... */ } - public: - Result() noexcept { /* ... */ } +class ResultInternalAccessor; - BaseType GetInnerValueForDebug() const noexcept { return m_value; } +} // namespace result::detail - bool IsSuccess() const noexcept { return m_value == SuccessValue; } - bool IsFailure() const noexcept { return !IsSuccess(); } +class ResultSuccess; - operator ResultSuccess() const noexcept; - static bool CanAccept(Result result) noexcept; +class Result : public result::detail::ResultBase { + friend class result::detail::ResultInternalAccessor; - int GetModule() const noexcept { return Base::GetModule(); } - int GetDescription() const noexcept { return Base::GetDescription(); } - }; - static_assert(sizeof(Result) == sizeof(result::detail::ResultTraits::BaseType), "sizeof(Result) == sizeof(detail::ResultTraits::BaseType)"); - static_assert(std::is_trivially_destructible::value, "std::is_trivially_destructible::value"); +private: + using Base = typename result::detail::ResultBase; - inline bool Result::CanAccept(Result result) noexcept { - (void)(result); - return true; - } +private: + BaseType m_value; - namespace result::detail { +private: + explicit Result(BaseType v) noexcept : m_value(v) { /* ... */ } - class ResultInternalAccessor { - public: - static Result ConstructResult(ResultTraits::BaseType v) noexcept { return Result(v); } - }; +public: + Result() noexcept { /* ... */ } - inline Result ConstructResult(ResultTraits::BaseType v) noexcept { return ResultInternalAccessor::ConstructResult(v); } + BaseType GetInnerValueForDebug() const noexcept { return m_value; } - } + bool IsSuccess() const noexcept { return m_value == SuccessValue; } + bool IsFailure() const noexcept { return !IsSuccess(); } - class ResultSuccess : public result::detail::ResultBase { - public: - using Base = typename result::detail::ResultBase; - public: - operator Result() const noexcept { return result::detail::ConstructResult(SuccessValue); } + bool operator==(Result other) const noexcept { return m_value == other.m_value; } + bool operator!=(Result other) const noexcept { return !operator==(other); } + operator ResultSuccess() const noexcept; + static bool CanAccept(Result result) noexcept; - BaseType GetInnerValueForDebug() const noexcept { return SuccessValue; } + int GetModule() const noexcept { return Base::GetModule(); } + int GetDescription() const noexcept { return Base::GetDescription(); } +}; +static_assert(sizeof(Result) == sizeof(result::detail::ResultTraits::BaseType), + "sizeof(Result) == sizeof(detail::ResultTraits::BaseType)"); +static_assert(std::is_trivially_destructible::value, + "std::is_trivially_destructible::value"); - bool IsSuccess() const noexcept { return true; } +inline bool Result::CanAccept(Result result) noexcept { + (void)(result); + return true; +} - static bool CanAccept(Result result) noexcept { return result.IsSuccess(); } +namespace result::detail { - int GetModule() const noexcept { return Base::GetModule(); } - int GetDescription() const noexcept { return Base::GetDescription(); } - }; +class ResultInternalAccessor { +public: + static Result ConstructResult(ResultTraits::BaseType v) noexcept { return Result(v); } +}; - namespace result::detail { +inline Result ConstructResult(ResultTraits::BaseType v) noexcept { + return ResultInternalAccessor::ConstructResult(v); +} + +} // namespace result::detail + +class ResultSuccess : public result::detail::ResultBase { +public: + using Base = typename result::detail::ResultBase; + +public: + operator Result() const noexcept { return result::detail::ConstructResult(SuccessValue); } + + BaseType GetInnerValueForDebug() const noexcept { return SuccessValue; } + + bool IsSuccess() const noexcept { return true; } + + static bool CanAccept(Result result) noexcept { return result.IsSuccess(); } + + int GetModule() const noexcept { return Base::GetModule(); } + int GetDescription() const noexcept { return Base::GetDescription(); } +}; - __attribute__((noreturn)) void OnUnhandledResult(Result result) noexcept; +namespace result::detail { +__attribute__((noreturn)) void OnUnhandledResult(Result result) noexcept; + +} + +inline Result::operator ResultSuccess() const noexcept { + if (!ResultSuccess::CanAccept(*this)) { + result::detail::OnUnhandledResult(*this); } + return ResultSuccess(); +} - inline Result::operator ResultSuccess() const noexcept { - if (!ResultSuccess::CanAccept(*this)) { - result::detail::OnUnhandledResult(*this); - } - return ResultSuccess(); +namespace result::detail { + +template +class ErrorResultBase : public ResultBase> { +private: + using Base = ResultBase>; + +public: + static constexpr int Module = Module_; + static constexpr int Description = Description_; + static constexpr typename Base::BaseType InnerValue = + ResultTraits::MakeInnerValueStatic::value; + static_assert(InnerValue != Base::SuccessValue, "InnerValue != Base::SuccessValue"); + +public: + operator Result() const noexcept { return ConstructResult(InnerValue); } + operator ResultSuccess() const noexcept { OnUnhandledResult(*this); } + + bool IsSuccess() const noexcept { return false; } + + typename Base::BaseType GetInnerValueForDebug() const noexcept { return InnerValue; } +}; + +template +class ErrorRange { +public: + static const int Module = Module_; + static const int DescriptionStart = DescStart; + static const int DescriptionEnd = DescEnd; + static_assert(DescriptionStart < DescriptionEnd, "DescriptionStart < DescriptionEnd"); + +public: + static bool Includes(Result result) noexcept { + return result.GetModule() == Module && DescriptionStart <= result.GetDescription() && + result.GetDescription() < DescriptionEnd; } - namespace result::detail { - - template - class ErrorResultBase : public ResultBase> { - private: - using Base = ResultBase>; - public: - static constexpr int Module = Module_; - static constexpr int Description = Description_; - static constexpr typename Base::BaseType InnerValue = ResultTraits::MakeInnerValueStatic::value; - static_assert(InnerValue != Base::SuccessValue, "InnerValue != Base::SuccessValue"); - public: - operator Result() const noexcept { return ConstructResult(InnerValue); } - operator ResultSuccess() const noexcept { OnUnhandledResult(*this); } - - bool IsSuccess() const noexcept { return false; } - - typename Base::BaseType GetInnerValueForDebug() const noexcept { return InnerValue; } - }; - - template - class ErrorRange { - public: - static const int Module = Module_; - static const int DescriptionStart = DescStart; - static const int DescriptionEnd = DescEnd; - static_assert(DescriptionStart < DescriptionEnd, "DescriptionStart < DescriptionEnd"); - public: - static bool Includes(Result result) noexcept { - return result.GetModule() == Module && DescriptionStart <= result.GetDescription() && result.GetDescription() < DescriptionEnd; - } - - friend bool operator <=(Result result, ErrorRange) noexcept { - return Includes(result); - } - }; + friend bool operator<=(Result result, ErrorRange) noexcept { return Includes(result); } +}; - } +} // namespace result::detail -} +} // namespace nn /* Macros for defining new results. */ -#define R_DEFINE_NAMESPACE_RESULT_MODULE(value) namespace detail::result { using ResultModuleId = std::integral_constant; } +#define R_DEFINE_NAMESPACE_RESULT_MODULE(value) \ + namespace detail::result { \ + using ResultModuleId = std::integral_constant; \ + } #define R_CURRENT_NAMESPACE_RESULT_MODULE detail::result::ResultModuleId::value #define R_NAMESPACE_MODULE_ID(nmspc) nmspc::R_CURRENT_NAMESPACE_RESULT_MODULE -#define R_DEFINE_ERROR_RESULT_IMPL(name, desc_start, desc_end) \ - class Result##name : \ - public ::nn::result::detail::ErrorResultBase, \ - public ::nn::result::detail::ErrorRange \ - {} - -#define R_DEFINE_ABSTRACT_ERROR_RESULT_IMPL(name, desc_start, desc_end) \ - class Result##name : \ - public ::nn::result::detail::ErrorRange \ - {} +#define R_DEFINE_ERROR_RESULT_IMPL(name, desc_start, desc_end) \ + class Result##name \ + : public ::nn::result::detail::ErrorResultBase, \ + public ::nn::result::detail::ErrorRange {} +#define R_DEFINE_ABSTRACT_ERROR_RESULT_IMPL(name, desc_start, desc_end) \ + class Result##name \ + : public ::nn::result::detail::ErrorRange {} -#define R_DEFINE_ERROR_RESULT(name, desc) R_DEFINE_ERROR_RESULT_IMPL(name, desc, desc) +#define R_DEFINE_ERROR_RESULT(name, desc) R_DEFINE_ERROR_RESULT_IMPL(name, desc, desc) #define R_DEFINE_ERROR_RANGE(name, start, end) R_DEFINE_ERROR_RESULT_IMPL(name, start, end) -#define R_DEFINE_ABSTRACT_ERROR_RESULT(name, desc) R_DEFINE_ABSTRACT_ERROR_RESULT_IMPL(name, desc, desc) -#define R_DEFINE_ABSTRACT_ERROR_RANGE(name, start, end) R_DEFINE_ABSTRACT_ERROR_RESULT_IMPL(name, start, end) +#define R_DEFINE_ABSTRACT_ERROR_RESULT(name, desc) \ + R_DEFINE_ABSTRACT_ERROR_RESULT_IMPL(name, desc, desc) +#define R_DEFINE_ABSTRACT_ERROR_RANGE(name, start, end) \ + R_DEFINE_ABSTRACT_ERROR_RESULT_IMPL(name, start, end) diff --git a/src/NintendoSDK/err/detail.cpp b/src/NintendoSDK/err/detail.cpp new file mode 100644 index 00000000..878d5319 --- /dev/null +++ b/src/NintendoSDK/err/detail.cpp @@ -0,0 +1,187 @@ +#include + +#include +#include +#include + +namespace nn::err::detail { +static const char* sMessageKindStrs[] = {"DlgMsg", "DlgBtn", "FlvMsg", "FlvBtn"}; + +void MakeErrorCodeString(char* outErrorCodeString, size_t errorCodeStringBufferSize, + ErrorCode errorCode) { + util::TSNPrintf(outErrorCodeString, errorCodeStringBufferSize, "%04d-%04d", + errorCode.GetCategory(), errorCode.GetNumber()); +} + +void MakeApplicationErrorCodeString( + char* outErrorCodeString, size_t errorCodeStringBufferSize, + const ns::ApplicationErrorCodeCategory& applicationErrorCodeCategory, u32 errorCodeNumber) { + util::TSNPrintf(outErrorCodeString, errorCodeStringBufferSize, "2-%s-%04d", + applicationErrorCodeCategory.GetCategory(), errorCodeNumber); +} + +// void ParseErrorCodeString(ErrorCode* outErrorCode, const char* errorCodeString) {} + +// void ParseApplicationErrorCodeString( +// ns::ApplicationErrorCodeCategory* outApplicationErrorCodeCategory, +// u32* outErrorCodeCategoryNumber, const char* errorCodeString) {} + +bool IsApplicationErrorCodeString(const char* errorCodeString) { + char c1 = errorCodeString[0]; + char c2; + if (c1 == '2') { + c1 = errorCodeString[1]; + c2 = '-'; + } else { + c2 = '2'; + } + + return c1 == c2; +} + +// bool TryParseErrorCodeString(ErrorCode* outErrorCode, const char* errorCodeString) {} + +// bool TryParseApplicationErrorCodeString( +// ns::ApplicationErrorCodeCategory* outApplicationErrorCodeCategory, +// u32* outErrorCodeCategoryNumber, const char* errorCodeString) {} + +void MakeErrorInfoModuleDirectoryPath(char* outErrorInfoModuleDirectoryPath, + size_t errorInfoModuleDirectoryPathBufferSize, + u32 errorCodeCategory) { + util::TSNPrintf(outErrorInfoModuleDirectoryPath, errorInfoModuleDirectoryPathBufferSize, + "%s:/%04d", "err", errorCodeCategory); +} + +void MakeErrorInfoDirectoryPath(char* outErrorInfoDirectoryPath, + size_t errorInfoDirectoryPathBufferSize, ErrorCode errorCode) { + util::TSNPrintf(outErrorInfoDirectoryPath, errorInfoDirectoryPathBufferSize, "%s:/%04d/%04d", + "err", errorCode.GetCategory(), errorCode.GetNumber()); +} + +void MakeErrorInfoCommonFilePath(char* outErrorInfoCommonFilePath, + size_t errorInfoCommonFilePathBufferSize, ErrorCode errorCode) { + util::TSNPrintf(outErrorInfoCommonFilePath, errorInfoCommonFilePathBufferSize, + "%s:/%04d/%04d/common", "err", errorCode.GetCategory(), errorCode.GetNumber()); +} + +void MakeErrorInfoMessageFilePath(char* outErrorInfoMessageFilePath, + size_t errorInfoMessageFilePathBufferSize, ErrorCode errorCode, + settings::LanguageCode languageCode, MessageKind messageKind) { + u8 kind = static_cast(messageKind); + if (kind >= 4) { + nn::detail::UnexpectedDefaultImpl("", "", 0); + } + + util::TSNPrintf(outErrorInfoMessageFilePath, errorInfoMessageFilePathBufferSize, + "%s:/%04d/%04d/%s_%s", "err", errorCode.GetCategory(), errorCode.GetNumber(), + languageCode.code, sMessageKindStrs[kind]); +} + +bool ErrorMessageDataExists(ErrorCode errorCode) { + char errorInfoDirectoryPath[32]; + MakeErrorInfoDirectoryPath(errorInfoDirectoryPath, sizeof(errorInfoDirectoryPath), errorCode); + + fs::DirectoryHandle handle; + Result result = + fs::OpenDirectory(&handle, errorInfoDirectoryPath, fs::OpenDirectoryMode_Directory); + + if (result.IsSuccess()) { + fs::CloseDirectory(handle); + + return true; + } + + if (result != fs::ResultPathNotFound()) { + diag::detail::AbortImpl("", "", "", 0, result, + "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", + "result", result.GetModule(), result.GetDescription(), + result.GetInnerValueForDebug()); + } + + return false; +} + +bool CategoryExists(u32 category) { + char errorInfoModuleDirectoryPath[32]; + MakeErrorInfoModuleDirectoryPath(errorInfoModuleDirectoryPath, + sizeof(errorInfoModuleDirectoryPath), category); + + fs::DirectoryHandle handle; + Result result = + fs::OpenDirectory(&handle, errorInfoModuleDirectoryPath, fs::OpenDirectoryMode_Directory); + + if (result.IsSuccess()) { + fs::CloseDirectory(handle); + + return true; + } + + if (result != fs::ResultPathNotFound()) { + diag::detail::AbortImpl("", "", "", 0, result, + "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", + "result", result.GetModule(), result.GetDescription(), + result.GetInnerValueForDebug()); + } + + return false; +} + +bool DefaultErrorMessageDataExists(u32 category) { + char errorInfoDirectoryPath[32]; + MakeErrorInfoDirectoryPath(errorInfoDirectoryPath, sizeof(errorInfoDirectoryPath), + {category, 9999}); + + fs::DirectoryHandle handle; + Result result = + fs::OpenDirectory(&handle, errorInfoDirectoryPath, fs::OpenDirectoryMode_Directory); + + if (result.IsSuccess()) { + fs::CloseDirectory(handle); + + return true; + } + + if (result != fs::ResultPathNotFound()) { + diag::detail::AbortImpl("", "", "", 0, result, + "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", + "result", result.GetModule(), result.GetDescription(), + result.GetInnerValueForDebug()); + } + + return false; +} + +void* ReadMessageFile(char16* outMessage, s32* outMessageLength, size_t messageBufferSize, + ErrorCode errorCode, settings::LanguageCode languageCode, + MessageKind messageKind) { + char errorInfoMessageFilePath[32]; + MakeErrorInfoMessageFilePath(errorInfoMessageFilePath, sizeof(errorInfoMessageFilePath), + errorCode, languageCode, messageKind); + + fs::FileHandle fileHandle; + Result result = + fs::OpenFile(&fileHandle, errorInfoMessageFilePath, fs::OpenDirectoryMode_Directory); + + if (result.IsSuccess()) { + u64 fileSize; + result = fs::GetFileSize(&fileSize, fileHandle); + } + + if (result != fs::ResultPathNotFound()) { + diag::detail::AbortImpl("", "", "", 0, result, + "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", + "result", result.GetModule(), result.GetDescription(), + result.GetInnerValueForDebug()); + } + + *outMessageLength = 0; + *outMessage = u'\0'; + + return nullptr; +} + +void ReadVersion(ErrorMessageDatabaseVersion* outMessageDatabaseVersion) {} + +void* ReadMessageFile(char16* outMessage, size_t messageBufferSize, const char* errorCodeString, + const settings::LanguageCode& languageCode) {} +} // namespace nn::err::detail From 1e2e59fb2f8778fedc9a398abc599c1c989eb6c1 Mon Sep 17 00:00:00 2001 From: Fuzzy2319 Date: Sun, 19 Jul 2026 11:41:31 +0200 Subject: [PATCH 03/14] add:partial err implementation --- include/nn/err.h | 2 +- include/nn/err/ErrorMessageDatabaseVersion.h | 13 +++ include/nn/err/detail.h | 8 +- include/nn/fs/fs_mount.h | 5 + src/NintendoSDK/err/detail.cpp | 117 +++++++++++++++++-- 5 files changed, 133 insertions(+), 12 deletions(-) create mode 100644 include/nn/err/ErrorMessageDatabaseVersion.h diff --git a/include/nn/err.h b/include/nn/err.h index cfb05701..d9196ede 100644 --- a/include/nn/err.h +++ b/include/nn/err.h @@ -10,8 +10,8 @@ #include namespace nn::err { -// TODO class ErrorMessageDatabaseVersion; +// TODO class EulaData; ErrorCode ConvertResultToErrorCode(const Result& result); diff --git a/include/nn/err/ErrorMessageDatabaseVersion.h b/include/nn/err/ErrorMessageDatabaseVersion.h new file mode 100644 index 00000000..3ad7cce3 --- /dev/null +++ b/include/nn/err/ErrorMessageDatabaseVersion.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +namespace nn::err { +class ErrorMessageDatabaseVersion { +public: +private: + s32 mVersion; +}; + +static_assert(sizeof(ErrorMessageDatabaseVersion) == 4); +} // namespace nn::err diff --git a/include/nn/err/detail.h b/include/nn/err/detail.h index 7e471c1f..6df8150b 100644 --- a/include/nn/err/detail.h +++ b/include/nn/err/detail.h @@ -45,12 +45,12 @@ void ParseApplicationErrorCodeString( ns::ApplicationErrorCodeCategory* outApplicationErrorCodeCategory, u32* outErrorCodeCategoryNumber, const char* errorCodeString); void ParseErrorCodeString(ErrorCode* outErrorCode, const char* errorCodeString); -void* ReadMessageFile(char16* outMessage, s32* outMessageLength, size_t messageBufferSize, +void* ReadMessageFile(char16* outBuffer, s32* outMessageLength, size_t messageBufferSize, ErrorCode errorCode, settings::LanguageCode languageCode, MessageKind messageKind); -void* ReadMessageFile(char16* outMessage, size_t messageBufferSize, const char* errorCodeString, - const settings::LanguageCode& languageCode); -void ReadVersion(ErrorMessageDatabaseVersion* outMessageDatabaseVersion); +void ReadMessageFile(char16* outMessage, size_t messageBufferSize, const char* errorCodeString, + const settings::LanguageCode& languageCode); +void ReadVersion(ErrorMessageDatabaseVersion* outVersion); bool TryParseApplicationErrorCodeString( ns::ApplicationErrorCodeCategory* outApplicationErrorCodeCategory, u32* outErrorCodeCategoryNumber, const char* errorCodeString); diff --git a/include/nn/fs/fs_mount.h b/include/nn/fs/fs_mount.h index 405c6595..70530d2a 100644 --- a/include/nn/fs/fs_mount.h +++ b/include/nn/fs/fs_mount.h @@ -2,6 +2,10 @@ #include +namespace nn::ncm { +enum class SystemDataId { Err = 0x801 }; +} // namespace nn::ncm + namespace nn::fs { /* @@ -11,6 +15,7 @@ namespace nn::fs { bool MountSdCardForDebug(const char* mount); Result MountSdCard(const char* mountPoint); +Result MountSystemData(const char* mountPoint, ncm::SystemDataId id); bool IsSdCardInserted(); Result FormatSdCard(); Result FormatSdCardDryRun(); diff --git a/src/NintendoSDK/err/detail.cpp b/src/NintendoSDK/err/detail.cpp index 878d5319..52ceec8f 100644 --- a/src/NintendoSDK/err/detail.cpp +++ b/src/NintendoSDK/err/detail.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include @@ -151,7 +152,7 @@ bool DefaultErrorMessageDataExists(u32 category) { return false; } -void* ReadMessageFile(char16* outMessage, s32* outMessageLength, size_t messageBufferSize, +void* ReadMessageFile(char16* outBuffer, s32* outMessageLength, size_t messageBufferSize, ErrorCode errorCode, settings::LanguageCode languageCode, MessageKind messageKind) { char errorInfoMessageFilePath[32]; @@ -159,12 +160,42 @@ void* ReadMessageFile(char16* outMessage, s32* outMessageLength, size_t messageB errorCode, languageCode, messageKind); fs::FileHandle fileHandle; - Result result = - fs::OpenFile(&fileHandle, errorInfoMessageFilePath, fs::OpenDirectoryMode_Directory); + Result result = fs::OpenFile(&fileHandle, errorInfoMessageFilePath, fs::OpenMode_Read); if (result.IsSuccess()) { u64 fileSize; result = fs::GetFileSize(&fileSize, fileHandle); + + if (result.IsFailure()) { + diag::detail::AbortImpl( + "", "", "", 0, result, + "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", + "fs::GetFileSize(&fileSize, fileHandle)", result.GetModule(), + result.GetDescription(), result.GetInnerValueForDebug()); + } + + if (fileSize != 0) { + *outMessageLength = fileSize; + + if (messageBufferSize <= fileSize) { + diag::detail::AbortImpl("", "", "", 0); + } + + result = fs::ReadFile(fileHandle, 0, outBuffer, static_cast(fileSize)); + + if (result.IsFailure()) { + diag::detail::AbortImpl( + "", "", "", 0, result, + "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", + "fs::ReadFile(fileHandle, 0, outBuffer, static_cast(fileSize))", + result.GetModule(), result.GetDescription(), result.GetInnerValueForDebug()); + } + + outBuffer[*outMessageLength] = u'\0'; + fs::CloseFile(fileHandle); + + return nullptr; + } } if (result != fs::ResultPathNotFound()) { @@ -175,13 +206,85 @@ void* ReadMessageFile(char16* outMessage, s32* outMessageLength, size_t messageB } *outMessageLength = 0; - *outMessage = u'\0'; + *outBuffer = u'\0'; return nullptr; } -void ReadVersion(ErrorMessageDatabaseVersion* outMessageDatabaseVersion) {} +void ReadVersion(ErrorMessageDatabaseVersion* outVersion) { + Result result = fs::MountSystemData("err", ncm::SystemDataId::Err); + + if (result.IsFailure()) { + return; + } + + char infoFilePath[32]; + util::TSNPrintf(infoFilePath, sizeof(infoFilePath), "%s:/DatabaseInfo", "err"); + + fs::FileHandle fileHandle; + result = fs::OpenFile(&fileHandle, infoFilePath, fs::OpenMode_Read); + + if (result.IsFailure()) { + diag::detail::AbortImpl( + "", "", "", 0, result, + "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", + "nn::fs::OpenFile(&fileHandle, infoFilePath, nn::fs::OpenMode_Read)", + result.GetModule(), result.GetDescription(), result.GetInnerValueForDebug()); + } + + result = fs::ReadFile(fileHandle, 0, outVersion, sizeof(ErrorMessageDatabaseVersion)); + + if (result.IsFailure()) { + diag::detail::AbortImpl( + "", "", "", 0, result, + "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", + "fs::ReadFile(fileHandle, 0, outVersion, sizeof(ErrorMessageDatabaseVersion))", + result.GetModule(), result.GetDescription(), result.GetInnerValueForDebug()); + } + + fs::CloseFile(fileHandle); + fs::Unmount("err"); +} + +void ReadMessageFile(char16* outMessage, size_t messageBufferSize, const char* errorCodeString, + const settings::LanguageCode& languageCode) { + Result result = fs::MountSystemData("err", ncm::SystemDataId::Err); + + if (result.IsFailure()) { + *outMessage = u'\0'; + + return; + } + + char messageFilePath[32]; + util::TSNPrintf(messageFilePath, sizeof(messageFilePath), "%s:/Messages/%s_%s", "err", + languageCode.code, errorCodeString); + + fs::FileHandle fileHandle; + result = fs::OpenFile(&fileHandle, messageFilePath, fs::OpenMode_Read); -void* ReadMessageFile(char16* outMessage, size_t messageBufferSize, const char* errorCodeString, - const settings::LanguageCode& languageCode) {} + if (result.IsFailure()) { + diag::detail::AbortImpl( + "", "", "", 0, result, + "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x"); + } + + result = fs::ReadFile(fileHandle, 0, outMessage, messageBufferSize); + + if (result.IsFailure()) { + diag::detail::AbortImpl( + "", "", "", 0, result, + "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x"); + } + + u32 uh; //???? + u32 fileRead = messageBufferSize - 1; + if (fileRead >= uh) + fileRead = uh; + + outMessage[fileRead] = u'\0'; + + fs::CloseFile(fileHandle); + fs::Unmount("err"); +} } // namespace nn::err::detail From 1c2bc87c29b94463534490dcc7f879f27e7baa0b Mon Sep 17 00:00:00 2001 From: Fuzzy2319 Date: Sun, 19 Jul 2026 13:08:09 +0200 Subject: [PATCH 04/14] fix:abort message --- src/NintendoSDK/err/detail.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NintendoSDK/err/detail.cpp b/src/NintendoSDK/err/detail.cpp index 52ceec8f..44ccb297 100644 --- a/src/NintendoSDK/err/detail.cpp +++ b/src/NintendoSDK/err/detail.cpp @@ -238,7 +238,7 @@ void ReadVersion(ErrorMessageDatabaseVersion* outVersion) { diag::detail::AbortImpl( "", "", "", 0, result, "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", - "fs::ReadFile(fileHandle, 0, outVersion, sizeof(ErrorMessageDatabaseVersion))", + "nn::fs::ReadFile(fileHandle, 0, outVersion, sizeof(ErrorMessageDatabaseVersion))", result.GetModule(), result.GetDescription(), result.GetInnerValueForDebug()); } From b1ee2bbf69174372f07814cd236adf8b3bf96a0f Mon Sep 17 00:00:00 2001 From: Fuzzy2319 Date: Sun, 19 Jul 2026 13:22:23 +0200 Subject: [PATCH 05/14] fix:ReadMessageFile implementation --- src/NintendoSDK/err/detail.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/NintendoSDK/err/detail.cpp b/src/NintendoSDK/err/detail.cpp index 44ccb297..3cdb204c 100644 --- a/src/NintendoSDK/err/detail.cpp +++ b/src/NintendoSDK/err/detail.cpp @@ -269,7 +269,8 @@ void ReadMessageFile(char16* outMessage, size_t messageBufferSize, const char* e "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x"); } - result = fs::ReadFile(fileHandle, 0, outMessage, messageBufferSize); + u64 bytesRead; + result = fs::ReadFile(&bytesRead, fileHandle, 0, outMessage, messageBufferSize); if (result.IsFailure()) { diag::detail::AbortImpl( @@ -277,10 +278,9 @@ void ReadMessageFile(char16* outMessage, size_t messageBufferSize, const char* e "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x"); } - u32 uh; //???? - u32 fileRead = messageBufferSize - 1; - if (fileRead >= uh) - fileRead = uh; + u64 fileRead = messageBufferSize - 1; + if (fileRead >= bytesRead) + fileRead = bytesRead; outMessage[fileRead] = u'\0'; From fc64abef582d937bdd57d5de402a726904a78ef0 Mon Sep 17 00:00:00 2001 From: Fuzzy2319 Date: Sun, 19 Jul 2026 15:20:02 +0200 Subject: [PATCH 06/14] add:partial err implementation --- include/nn/err.h | 7 ++++-- include/nn/err/detail.h | 2 +- src/NintendoSDK/err/err.cpp | 48 +++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 src/NintendoSDK/err/err.cpp diff --git a/include/nn/err.h b/include/nn/err.h index d9196ede..e0a8dd16 100644 --- a/include/nn/err.h +++ b/include/nn/err.h @@ -13,12 +13,15 @@ namespace nn::err { class ErrorMessageDatabaseVersion; // TODO class EulaData; +class ErrorViewerJumpDestination; ErrorCode ConvertResultToErrorCode(const Result& result); bool CreateErrorViewerStartupParamForRecordedError(void*, u64*, u64, const char*, const char*, time::PosixTime); -void GetErrorCodeString(char* outErrorCodeStr, size_t errorCodeStrBufferSize, ErrorCode errorCode); -void* GetErrorMessageDatabaseVersion(ErrorMessageDatabaseVersion* outErrorMessageDatabaseVersion); +void ExecuteJump(ErrorViewerJumpDestination destination); +void GetErrorCodeString(char* outErrorCodeString, size_t errorCodeStrBufferSize, + ErrorCode errorCode); +void* GetErrorMessageDatabaseVersion(ErrorMessageDatabaseVersion* outVersion); ErrorCode MakeErrorCode(u32 category, u32 number); void ShowApplicationError(const ApplicationErrorArg& arg); void ShowError(Result result); diff --git a/include/nn/err/detail.h b/include/nn/err/detail.h index 6df8150b..41c88972 100644 --- a/include/nn/err/detail.h +++ b/include/nn/err/detail.h @@ -7,7 +7,7 @@ #include namespace nn::ns { -// TODO +// TODO: move class ApplicationErrorCodeCategory { public: const char* GetCategory() const { return mCategory; } diff --git a/src/NintendoSDK/err/err.cpp b/src/NintendoSDK/err/err.cpp new file mode 100644 index 00000000..40a5c6b2 --- /dev/null +++ b/src/NintendoSDK/err/err.cpp @@ -0,0 +1,48 @@ +#include + +#include + +namespace nn::err { +ErrorCode MakeErrorCode(u32 category, u32 number) { + return {category, number}; +} + +// TODO: needs `la` stuff before I can implement these +// void ShowError(Result result) {} +// void ShowError(ErrorCode errorCode) {} +// void ShowError(const ErrorResultVariant& errorResultVariant) {} +// void ShowUnacceptableApplicationVersionError() {} +// void ShowUnacceptableAddOnContentVersionError() {} +// void ShowApplicationError(const ApplicationErrorArg& arg) {} +// void ShowError(Result result, ResultBacktrace& backtrace) {} +// void ShowSystemError(const SystemErrorArg& arg){} +// void ShowErrorWithoutJump(Result result){} +// void ShowErrorWithoutJump(ErrorCode errorCode){} +// void ShowEula(settings::system::RegionCode regionCode) {} +// void ShowSystemUpdateEula(settings::system::RegionCode regionCode, EulaData& data) {} +// void ShowErrorRecord(Result result, time::PosixTime timestamp) {} +// void ShowErrorRecord(ErrorCode errorCode, time::PosixTime timestamp) {} + +// bool CreateErrorViewerStartupParamForRecordedError(void*, u64*, u64, const char*, const char*, +// time::PosixTime) {} + +// void ShowErrorRecord(const void*, u64) {} + +ErrorCode ConvertResultToErrorCode(const Result& result) { + return {result.GetModule() + 2000u, (u32)result.GetDescription()}; +} + +void GetErrorCodeString(char* outErrorCodeString, size_t errorCodeStrBufferSize, + ErrorCode errorCode) { + detail::MakeErrorCodeString(outErrorCodeString, errorCodeStrBufferSize, errorCode); +} + +void* GetErrorMessageDatabaseVersion(ErrorMessageDatabaseVersion* outVersion) { + detail::ReadVersion(outVersion); + + return nullptr; +} + +// Seems to be stubbed in Release so I can't implement it +void ExecuteJump(ErrorViewerJumpDestination destination) {} +} // namespace nn::err From 96726c44ecadbb78c26cbf823386ee50106a8c54 Mon Sep 17 00:00:00 2001 From: Fuzzy2319 Date: Sun, 19 Jul 2026 16:02:38 +0200 Subject: [PATCH 07/14] add:partial err implementation --- include/nn/err/ApplicationErrorArg.h | 2 +- src/NintendoSDK/err/ApplicationErrorArg.cpp | 80 +++++++++++++++++++++ src/NintendoSDK/err/ErrorCode.cpp | 11 +++ src/NintendoSDK/err/ResultBacktrace.cpp | 5 ++ 4 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 src/NintendoSDK/err/ApplicationErrorArg.cpp create mode 100644 src/NintendoSDK/err/ErrorCode.cpp create mode 100644 src/NintendoSDK/err/ResultBacktrace.cpp diff --git a/include/nn/err/ApplicationErrorArg.h b/include/nn/err/ApplicationErrorArg.h index bf81a513..dfffb11a 100644 --- a/include/nn/err/ApplicationErrorArg.h +++ b/include/nn/err/ApplicationErrorArg.h @@ -13,7 +13,7 @@ class ApplicationErrorArg { u32 GetApplicationErrorCodeNumber() const; const char* GetDialogMessage() const; const char* GetFullScreenMessage() const; - const settings::LanguageCode& GetLanguageCode() const; + settings::LanguageCode GetLanguageCode() const; void SetApplicationErrorCodeNumber(u32 errorCode); void SetDialogMessage(const char* message); diff --git a/src/NintendoSDK/err/ApplicationErrorArg.cpp b/src/NintendoSDK/err/ApplicationErrorArg.cpp new file mode 100644 index 00000000..51e41090 --- /dev/null +++ b/src/NintendoSDK/err/ApplicationErrorArg.cpp @@ -0,0 +1,80 @@ +#include + +namespace nn::err { +ApplicationErrorArg::ApplicationErrorArg() { + mDialogMessage[0] = '\0'; + mFullscreenMessage[0] = '\0'; +} + +ApplicationErrorArg::ApplicationErrorArg(u32 errorCode, const char* dialogMessage, + const char* fullscreenMessage, + const settings::LanguageCode& languageCode) + : mErrorCode(errorCode), mLanguageCode(languageCode) { + s32 i = 0; + while (dialogMessage[i] != '\0' || i != 0x7fe) { + mDialogMessage[i] = dialogMessage[i]; + i++; + } + + mDialogMessage[i] = '\0'; + + i = 0; + while (fullscreenMessage[i] != '\0' || i != 0x7fe) { + mFullscreenMessage[i] = fullscreenMessage[i]; + i++; + } + + mFullscreenMessage[i] = '\0'; +} + +void ApplicationErrorArg::SetApplicationErrorCodeNumber(u32 errorCode) { + mErrorCode = errorCode; +} + +// strcpy??? +void ApplicationErrorArg::SetDialogMessage(const char* message) { + s32 i = 0; + while (message[i] != '\0' || i != 0x7fe) { + mDialogMessage[i] = message[i]; + i++; + } + + mDialogMessage[i] = '\0'; +} + +void ApplicationErrorArg::SetFullScreenMessage(const char* message) { + s32 i = 0; + while (message[i] != '\0' || i != 0x7fe) { + mFullscreenMessage[i] = message[i]; + i++; + } + + mFullscreenMessage[i] = '\0'; +} + +void ApplicationErrorArg::SetLanguageCode(const settings::LanguageCode& languageCode) { + s32 i = 0; + while (languageCode.code[i] != '\0' || i != 7) { + mLanguageCode.code[i] = languageCode.code[i]; + i++; + } + + mLanguageCode.code[i] = '\0'; +} + +u32 ApplicationErrorArg::GetApplicationErrorCodeNumber() const { + return mErrorCode; +} + +const char* ApplicationErrorArg::GetDialogMessage() const { + return mDialogMessage; +} + +const char* ApplicationErrorArg::GetFullScreenMessage() const { + return mFullscreenMessage; +} + +settings::LanguageCode ApplicationErrorArg::GetLanguageCode() const { + return mLanguageCode; +} +} // namespace nn::err diff --git a/src/NintendoSDK/err/ErrorCode.cpp b/src/NintendoSDK/err/ErrorCode.cpp new file mode 100644 index 00000000..dc886972 --- /dev/null +++ b/src/NintendoSDK/err/ErrorCode.cpp @@ -0,0 +1,11 @@ +#include + +namespace nn::err { +bool ErrorCode::IsValid() const { + return mCategory != 0; +} + +ErrorCode ErrorCode::GetInvalidErrorCode() { + return {}; +} +} // namespace nn::err diff --git a/src/NintendoSDK/err/ResultBacktrace.cpp b/src/NintendoSDK/err/ResultBacktrace.cpp new file mode 100644 index 00000000..7bf47012 --- /dev/null +++ b/src/NintendoSDK/err/ResultBacktrace.cpp @@ -0,0 +1,5 @@ +#include + +namespace nn::err { +// void ResultBacktrace::Make(ResultBacktrace* outBackTrace, const Result*, s32) {} +} // namespace nn::err From 7df1ffb5b691709234612fcb220bd04c608eec48 Mon Sep 17 00:00:00 2001 From: Fuzzy2319 Date: Sun, 19 Jul 2026 22:27:06 +0200 Subject: [PATCH 08/14] add:partial err implementation --- src/NintendoSDK/err/ErrorResultVariant.cpp | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/NintendoSDK/err/ErrorResultVariant.cpp diff --git a/src/NintendoSDK/err/ErrorResultVariant.cpp b/src/NintendoSDK/err/ErrorResultVariant.cpp new file mode 100644 index 00000000..ed7e8811 --- /dev/null +++ b/src/NintendoSDK/err/ErrorResultVariant.cpp @@ -0,0 +1,33 @@ +#include + +namespace nn::err { +ErrorResultVariant::ErrorResultVariant() {} + +ErrorResultVariant::ErrorResultVariant(const Result& result) + : mState(State::Result), mValue({.mResult = result}) {} + +ErrorResultVariant::ErrorResultVariant(const ErrorCode& errorCode) + : mState(State::ErrorCode), mValue({.mErrorCode = errorCode}) {} + +void ErrorResultVariant::operator=(const Result& result) { + mState = State::Result; + mValue.mResult = result; +} + +void ErrorResultVariant::operator=(const ErrorCode& errorCode) { + mState = State::ErrorCode; + mValue.mErrorCode = errorCode; +} + +ErrorResultVariant::operator Result() const { + return mValue.mResult; +} + +ErrorResultVariant::operator ErrorCode() const { + return mValue.mErrorCode; +} + +ErrorResultVariant::State ErrorResultVariant::GetState() const { + return mState; +} +} // namespace nn::err From 8abe4874199ab670cadf9546d7be626fc3ce3969 Mon Sep 17 00:00:00 2001 From: Fuzzy2319 Date: Tue, 28 Jul 2026 21:00:33 +0200 Subject: [PATCH 09/14] add:SystemErrorArg implementation --- include/nn/err/ApplicationErrorArg.h | 4 +- include/nn/err/SystemErrorArg.h | 6 +- src/NintendoSDK/err/ApplicationErrorArg.cpp | 16 ++-- src/NintendoSDK/err/SystemErrorArg.cpp | 81 +++++++++++++++++++++ 4 files changed, 94 insertions(+), 13 deletions(-) create mode 100644 src/NintendoSDK/err/SystemErrorArg.cpp diff --git a/include/nn/err/ApplicationErrorArg.h b/include/nn/err/ApplicationErrorArg.h index dfffb11a..570a3a51 100644 --- a/include/nn/err/ApplicationErrorArg.h +++ b/include/nn/err/ApplicationErrorArg.h @@ -7,7 +7,7 @@ namespace nn::err { class ApplicationErrorArg { public: ApplicationErrorArg(); - ApplicationErrorArg(u32 errorCode, const char* dialogMessage, const char* fullscreenMessage, + ApplicationErrorArg(u32 errorCode, const char* dialogMessage, const char* fullScreenMessage, const settings::LanguageCode& languageCode); u32 GetApplicationErrorCodeNumber() const; @@ -27,6 +27,6 @@ class ApplicationErrorArg { u32 mErrorCode = 0; settings::LanguageCode mLanguageCode; char mDialogMessage[2048]; - char mFullscreenMessage[2048]; + char mFullScreenMessage[2048]; }; } // namespace nn::err diff --git a/include/nn/err/SystemErrorArg.h b/include/nn/err/SystemErrorArg.h index f1a1d599..51fa154a 100644 --- a/include/nn/err/SystemErrorArg.h +++ b/include/nn/err/SystemErrorArg.h @@ -8,12 +8,12 @@ namespace nn::err { class SystemErrorArg { public: SystemErrorArg(); - SystemErrorArg(ErrorCode errorCode, const char* dialogueMessage, const char* fullScreenMessage, + SystemErrorArg(ErrorCode errorCode, const char* dialogMessage, const char* fullScreenMessage, const settings::LanguageCode& languageCode); void SetErrorCode(ErrorCode errorCode); - void SetDialogMessage(const char* dialogueMessage); - void SetFullScreenMessage(const char* fullScreenMessage); + void SetDialogMessage(const char* message); + void SetFullScreenMessage(const char* message); void SetLanguageCode(const settings::LanguageCode& languageCode); ErrorCode GetErrorCode() const; const char* GetDialogMessage() const; diff --git a/src/NintendoSDK/err/ApplicationErrorArg.cpp b/src/NintendoSDK/err/ApplicationErrorArg.cpp index 51e41090..edeeb3d4 100644 --- a/src/NintendoSDK/err/ApplicationErrorArg.cpp +++ b/src/NintendoSDK/err/ApplicationErrorArg.cpp @@ -3,11 +3,11 @@ namespace nn::err { ApplicationErrorArg::ApplicationErrorArg() { mDialogMessage[0] = '\0'; - mFullscreenMessage[0] = '\0'; + mFullScreenMessage[0] = '\0'; } ApplicationErrorArg::ApplicationErrorArg(u32 errorCode, const char* dialogMessage, - const char* fullscreenMessage, + const char* fullScreenMessage, const settings::LanguageCode& languageCode) : mErrorCode(errorCode), mLanguageCode(languageCode) { s32 i = 0; @@ -19,12 +19,12 @@ ApplicationErrorArg::ApplicationErrorArg(u32 errorCode, const char* dialogMessag mDialogMessage[i] = '\0'; i = 0; - while (fullscreenMessage[i] != '\0' || i != 0x7fe) { - mFullscreenMessage[i] = fullscreenMessage[i]; + while (fullScreenMessage[i] != '\0' || i != 0x7fe) { + mFullScreenMessage[i] = fullScreenMessage[i]; i++; } - mFullscreenMessage[i] = '\0'; + mFullScreenMessage[i] = '\0'; } void ApplicationErrorArg::SetApplicationErrorCodeNumber(u32 errorCode) { @@ -45,11 +45,11 @@ void ApplicationErrorArg::SetDialogMessage(const char* message) { void ApplicationErrorArg::SetFullScreenMessage(const char* message) { s32 i = 0; while (message[i] != '\0' || i != 0x7fe) { - mFullscreenMessage[i] = message[i]; + mFullScreenMessage[i] = message[i]; i++; } - mFullscreenMessage[i] = '\0'; + mFullScreenMessage[i] = '\0'; } void ApplicationErrorArg::SetLanguageCode(const settings::LanguageCode& languageCode) { @@ -71,7 +71,7 @@ const char* ApplicationErrorArg::GetDialogMessage() const { } const char* ApplicationErrorArg::GetFullScreenMessage() const { - return mFullscreenMessage; + return mFullScreenMessage; } settings::LanguageCode ApplicationErrorArg::GetLanguageCode() const { diff --git a/src/NintendoSDK/err/SystemErrorArg.cpp b/src/NintendoSDK/err/SystemErrorArg.cpp new file mode 100644 index 00000000..92b025da --- /dev/null +++ b/src/NintendoSDK/err/SystemErrorArg.cpp @@ -0,0 +1,81 @@ +#include + +namespace nn::err { +SystemErrorArg::SystemErrorArg() { + mDialogMessage[0] = '\0'; + mFullScreenMessage[0] = '\0'; +} + +SystemErrorArg::SystemErrorArg(ErrorCode errorCode, const char* dialogMessage, + const char* fullScreenMessage, + const settings::LanguageCode& languageCode) + : mErrorCode(errorCode), mLanguageCode(languageCode) { + s32 i = 0; + while (dialogMessage[i] != '\0' || i != 0x7fe) { + mDialogMessage[i] = dialogMessage[i]; + i++; + } + + mDialogMessage[i] = '\0'; + + i = 0; + while (fullScreenMessage[i] != '\0' || i != 0x7fe) { + mFullScreenMessage[i] = fullScreenMessage[i]; + i++; + } + + mFullScreenMessage[i] = '\0'; +} + +void SystemErrorArg::SetErrorCode(ErrorCode errorCode) { + mErrorCode = errorCode; +} + +void SystemErrorArg::SetDialogMessage(const char* message) { + s32 i = 0; + while (message[i] != '\0' || i != 0x7fe) { + mDialogMessage[i] = message[i]; + i++; + } + + mDialogMessage[i] = '\0'; +} + +void SystemErrorArg::SetFullScreenMessage(const char* message) { + s32 i = 0; + while (message[i] != '\0' || i != 0x7fe) { + mFullScreenMessage[i] = message[i]; + i++; + } + + mFullScreenMessage[i] = '\0'; +} + +void SystemErrorArg::SetLanguageCode(const settings::LanguageCode& languageCode) { + s32 i = 0; + while (languageCode.code[i] != '\0' || i != 7) { + mLanguageCode.code[i] = languageCode.code[i]; + i++; + } + + mLanguageCode.code[i] = '\0'; +} + +ErrorCode SystemErrorArg::GetErrorCode() const { + return mErrorCode; +} + +const char* SystemErrorArg::GetDialogMessage() const { + return mDialogMessage; +} + +const char* SystemErrorArg::GetFullScreenMessage() const { + return mFullScreenMessage; +} + +settings::LanguageCode SystemErrorArg::GetLanguageCode() const { + return mLanguageCode; +} + +void SystemErrorArg::GetStartupParam() const {} +} // namespace nn::err From 7dbf97cb00e5390bbe40fe0c1ff239b7139c8fdd Mon Sep 17 00:00:00 2001 From: Fuzzy2319 Date: Fri, 31 Jul 2026 00:43:52 +0200 Subject: [PATCH 10/14] fix:some implementation mistakes --- include/nn/diag.h | 3 +-- include/nn/err.h | 2 +- include/vapours/results/results_common.hpp | 29 ++++++++++++++++------ src/NintendoSDK/err/ErrorResultVariant.cpp | 2 +- src/NintendoSDK/err/detail.cpp | 28 ++++++++++----------- 5 files changed, 39 insertions(+), 25 deletions(-) diff --git a/include/nn/diag.h b/include/nn/diag.h index 880016df..6feab431 100644 --- a/include/nn/diag.h +++ b/include/nn/diag.h @@ -23,10 +23,9 @@ namespace detail { // LOG void LogImpl(nn::diag::LogMetaData const&, char const*, ...); void AbortImpl(char const*, char const*, char const*, s32); -void AbortImpl(char const*, char const*, char const*, s32, Result); [[gnu::format(printf, 6, 7)]] [[noreturn]] -void AbortImpl(char const*, char const*, char const*, s32, Result, const char*, ...); +void AbortImpl(char const*, char const*, char const*, s32, const Result*, const char*, ...); void OnAssertionFailure(nn::diag::AssertionType, char const*, char const*, char const*, s32); } // namespace detail diff --git a/include/nn/err.h b/include/nn/err.h index e0a8dd16..c5bc4741 100644 --- a/include/nn/err.h +++ b/include/nn/err.h @@ -13,7 +13,7 @@ namespace nn::err { class ErrorMessageDatabaseVersion; // TODO class EulaData; -class ErrorViewerJumpDestination; +class ErrorViewerJumpDestination {}; ErrorCode ConvertResultToErrorCode(const Result& result); bool CreateErrorViewerStartupParamForRecordedError(void*, u64*, u64, const char*, const char*, diff --git a/include/vapours/results/results_common.hpp b/include/vapours/results/results_common.hpp index 9649366c..dc9d7fe1 100644 --- a/include/vapours/results/results_common.hpp +++ b/include/vapours/results/results_common.hpp @@ -58,6 +58,10 @@ class ResultTraits { static BaseType GetDescriptionFromValue(BaseType value) noexcept { return GetBitsValue(value, ModuleBits, DescriptionBits); } + + static BaseType GetModuleAndDescriptionFromValue(BaseType value) noexcept { + return GetBitsValue(value, 0, ModuleBits + DescriptionBits); + } }; /* Use CRTP for Results. */ @@ -67,15 +71,20 @@ class ResultBase { using BaseType = typename ResultTraits::BaseType; static const BaseType SuccessValue = ResultTraits::SuccessValue; - int GetModule() const noexcept { + __attribute__((always_inline)) int GetModule() const noexcept { return static_cast(ResultTraits::GetModuleFromValue( static_cast(*this).GetInnerValueForDebug())); } - int GetDescription() const noexcept { + __attribute__((always_inline)) int GetDescription() const noexcept { return static_cast(ResultTraits::GetDescriptionFromValue( static_cast(*this).GetInnerValueForDebug())); } + + __attribute__((always_inline)) int GetValue() const noexcept { + return static_cast(ResultTraits::GetModuleAndDescriptionFromValue( + static_cast(*this).GetInnerValueForDebug())); + } }; class ResultInternalAccessor; @@ -104,13 +113,16 @@ class Result : public result::detail::ResultBase { bool IsSuccess() const noexcept { return m_value == SuccessValue; } bool IsFailure() const noexcept { return !IsSuccess(); } - bool operator==(Result other) const noexcept { return m_value == other.m_value; } + bool operator==(Result other) const noexcept { return GetValue() == other.GetValue(); } bool operator!=(Result other) const noexcept { return !operator==(other); } operator ResultSuccess() const noexcept; static bool CanAccept(Result result) noexcept; - int GetModule() const noexcept { return Base::GetModule(); } - int GetDescription() const noexcept { return Base::GetDescription(); } + __attribute__((always_inline)) int GetModule() const noexcept { return Base::GetModule(); } + __attribute__((always_inline)) int GetDescription() const noexcept { + return Base::GetDescription(); + } + __attribute__((always_inline)) int GetValue() const noexcept { return Base::GetValue(); } }; static_assert(sizeof(Result) == sizeof(result::detail::ResultTraits::BaseType), "sizeof(Result) == sizeof(detail::ResultTraits::BaseType)"); @@ -148,8 +160,11 @@ class ResultSuccess : public result::detail::ResultBase { static bool CanAccept(Result result) noexcept { return result.IsSuccess(); } - int GetModule() const noexcept { return Base::GetModule(); } - int GetDescription() const noexcept { return Base::GetDescription(); } + __attribute__((always_inline)) int GetModule() const noexcept { return Base::GetModule(); } + __attribute__((always_inline)) int GetDescription() const noexcept { + return Base::GetDescription(); + } + __attribute__((always_inline)) int GetValue() const noexcept { return Base::GetValue(); } }; namespace result::detail { diff --git a/src/NintendoSDK/err/ErrorResultVariant.cpp b/src/NintendoSDK/err/ErrorResultVariant.cpp index ed7e8811..6df25585 100644 --- a/src/NintendoSDK/err/ErrorResultVariant.cpp +++ b/src/NintendoSDK/err/ErrorResultVariant.cpp @@ -1,7 +1,7 @@ #include namespace nn::err { -ErrorResultVariant::ErrorResultVariant() {} +ErrorResultVariant::ErrorResultVariant() : mValue({}) {} ErrorResultVariant::ErrorResultVariant(const Result& result) : mState(State::Result), mValue({.mResult = result}) {} diff --git a/src/NintendoSDK/err/detail.cpp b/src/NintendoSDK/err/detail.cpp index 3cdb204c..4a0cb1fb 100644 --- a/src/NintendoSDK/err/detail.cpp +++ b/src/NintendoSDK/err/detail.cpp @@ -68,14 +68,14 @@ void MakeErrorInfoCommonFilePath(char* outErrorInfoCommonFilePath, void MakeErrorInfoMessageFilePath(char* outErrorInfoMessageFilePath, size_t errorInfoMessageFilePathBufferSize, ErrorCode errorCode, settings::LanguageCode languageCode, MessageKind messageKind) { - u8 kind = static_cast(messageKind); - if (kind >= 4) { + if (messageKind > MessageKind::FlvButton) { nn::detail::UnexpectedDefaultImpl("", "", 0); } + const char* messageKindStr = sMessageKindStrs[static_cast(messageKind)]; util::TSNPrintf(outErrorInfoMessageFilePath, errorInfoMessageFilePathBufferSize, "%s:/%04d/%04d/%s_%s", "err", errorCode.GetCategory(), errorCode.GetNumber(), - languageCode.code, sMessageKindStrs[kind]); + languageCode.code, messageKindStr); } bool ErrorMessageDataExists(ErrorCode errorCode) { @@ -93,7 +93,7 @@ bool ErrorMessageDataExists(ErrorCode errorCode) { } if (result != fs::ResultPathNotFound()) { - diag::detail::AbortImpl("", "", "", 0, result, + diag::detail::AbortImpl("", "", "", 0, &result, "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", "result", result.GetModule(), result.GetDescription(), result.GetInnerValueForDebug()); @@ -118,7 +118,7 @@ bool CategoryExists(u32 category) { } if (result != fs::ResultPathNotFound()) { - diag::detail::AbortImpl("", "", "", 0, result, + diag::detail::AbortImpl("", "", "", 0, &result, "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", "result", result.GetModule(), result.GetDescription(), result.GetInnerValueForDebug()); @@ -143,7 +143,7 @@ bool DefaultErrorMessageDataExists(u32 category) { } if (result != fs::ResultPathNotFound()) { - diag::detail::AbortImpl("", "", "", 0, result, + diag::detail::AbortImpl("", "", "", 0, &result, "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", "result", result.GetModule(), result.GetDescription(), result.GetInnerValueForDebug()); @@ -163,12 +163,12 @@ void* ReadMessageFile(char16* outBuffer, s32* outMessageLength, size_t messageBu Result result = fs::OpenFile(&fileHandle, errorInfoMessageFilePath, fs::OpenMode_Read); if (result.IsSuccess()) { - u64 fileSize; + s64 fileSize; result = fs::GetFileSize(&fileSize, fileHandle); if (result.IsFailure()) { diag::detail::AbortImpl( - "", "", "", 0, result, + "", "", "", 0, &result, "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", "fs::GetFileSize(&fileSize, fileHandle)", result.GetModule(), result.GetDescription(), result.GetInnerValueForDebug()); @@ -185,7 +185,7 @@ void* ReadMessageFile(char16* outBuffer, s32* outMessageLength, size_t messageBu if (result.IsFailure()) { diag::detail::AbortImpl( - "", "", "", 0, result, + "", "", "", 0, &result, "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", "fs::ReadFile(fileHandle, 0, outBuffer, static_cast(fileSize))", result.GetModule(), result.GetDescription(), result.GetInnerValueForDebug()); @@ -199,7 +199,7 @@ void* ReadMessageFile(char16* outBuffer, s32* outMessageLength, size_t messageBu } if (result != fs::ResultPathNotFound()) { - diag::detail::AbortImpl("", "", "", 0, result, + diag::detail::AbortImpl("", "", "", 0, &result, "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", "result", result.GetModule(), result.GetDescription(), result.GetInnerValueForDebug()); @@ -226,7 +226,7 @@ void ReadVersion(ErrorMessageDatabaseVersion* outVersion) { if (result.IsFailure()) { diag::detail::AbortImpl( - "", "", "", 0, result, + "", "", "", 0, &result, "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", "nn::fs::OpenFile(&fileHandle, infoFilePath, nn::fs::OpenMode_Read)", result.GetModule(), result.GetDescription(), result.GetInnerValueForDebug()); @@ -236,7 +236,7 @@ void ReadVersion(ErrorMessageDatabaseVersion* outVersion) { if (result.IsFailure()) { diag::detail::AbortImpl( - "", "", "", 0, result, + "", "", "", 0, &result, "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", "nn::fs::ReadFile(fileHandle, 0, outVersion, sizeof(ErrorMessageDatabaseVersion))", result.GetModule(), result.GetDescription(), result.GetInnerValueForDebug()); @@ -265,7 +265,7 @@ void ReadMessageFile(char16* outMessage, size_t messageBufferSize, const char* e if (result.IsFailure()) { diag::detail::AbortImpl( - "", "", "", 0, result, + "", "", "", 0, &result, "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x"); } @@ -274,7 +274,7 @@ void ReadMessageFile(char16* outMessage, size_t messageBufferSize, const char* e if (result.IsFailure()) { diag::detail::AbortImpl( - "", "", "", 0, result, + "", "", "", 0, &result, "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x"); } From 3d0d601394cbdb53516f0f4df74c94f5fecfbfeb Mon Sep 17 00:00:00 2001 From: Fuzzy2319 Date: Fri, 31 Jul 2026 15:45:26 +0200 Subject: [PATCH 11/14] fix:warning && fix:abort && fix:variable names --- include/nn/err/detail.h | 2 +- src/NintendoSDK/err/detail.cpp | 36 +++++++++++++++++++--------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/include/nn/err/detail.h b/include/nn/err/detail.h index 41c88972..bc825c4c 100644 --- a/include/nn/err/detail.h +++ b/include/nn/err/detail.h @@ -48,7 +48,7 @@ void ParseErrorCodeString(ErrorCode* outErrorCode, const char* errorCodeString); void* ReadMessageFile(char16* outBuffer, s32* outMessageLength, size_t messageBufferSize, ErrorCode errorCode, settings::LanguageCode languageCode, MessageKind messageKind); -void ReadMessageFile(char16* outMessage, size_t messageBufferSize, const char* errorCodeString, +void ReadMessageFile(char16* outBuffer, size_t bufferSize, const char* errorCodeString, const settings::LanguageCode& languageCode); void ReadVersion(ErrorMessageDatabaseVersion* outVersion); bool TryParseApplicationErrorCodeString( diff --git a/src/NintendoSDK/err/detail.cpp b/src/NintendoSDK/err/detail.cpp index 4a0cb1fb..95d1fb14 100644 --- a/src/NintendoSDK/err/detail.cpp +++ b/src/NintendoSDK/err/detail.cpp @@ -177,7 +177,7 @@ void* ReadMessageFile(char16* outBuffer, s32* outMessageLength, size_t messageBu if (fileSize != 0) { *outMessageLength = fileSize; - if (messageBufferSize <= fileSize) { + if (messageBufferSize <= static_cast(fileSize)) { diag::detail::AbortImpl("", "", "", 0); } @@ -246,43 +246,47 @@ void ReadVersion(ErrorMessageDatabaseVersion* outVersion) { fs::Unmount("err"); } -void ReadMessageFile(char16* outMessage, size_t messageBufferSize, const char* errorCodeString, +void ReadMessageFile(char16* outBuffer, size_t bufferSize, const char* errorCodeString, const settings::LanguageCode& languageCode) { Result result = fs::MountSystemData("err", ncm::SystemDataId::Err); if (result.IsFailure()) { - *outMessage = u'\0'; + *outBuffer = u'\0'; return; } - char messageFilePath[32]; - util::TSNPrintf(messageFilePath, sizeof(messageFilePath), "%s:/Messages/%s_%s", "err", - languageCode.code, errorCodeString); + char filePath[32]; + util::TSNPrintf(filePath, sizeof(filePath), "%s:/Messages/%s_%s", "err", languageCode.code, + errorCodeString); fs::FileHandle fileHandle; - result = fs::OpenFile(&fileHandle, messageFilePath, fs::OpenMode_Read); + result = fs::OpenFile(&fileHandle, filePath, fs::OpenMode_Read); if (result.IsFailure()) { - diag::detail::AbortImpl( - "", "", "", 0, &result, - "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x"); + diag::detail::AbortImpl("", "", "", 0, &result, + "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", + "nn::fs::OpenFile(&fileHandle, filePath, nn::fs::OpenMode_Read)", + result.GetModule(), result.GetDescription(), + result.GetInnerValueForDebug()); } u64 bytesRead; - result = fs::ReadFile(&bytesRead, fileHandle, 0, outMessage, messageBufferSize); + result = fs::ReadFile(&bytesRead, fileHandle, 0, outBuffer, bufferSize); if (result.IsFailure()) { - diag::detail::AbortImpl( - "", "", "", 0, &result, - "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x"); + diag::detail::AbortImpl("", "", "", 0, &result, + "Failed: %s\n Module: %d\n Description: %d\n InnerValue: 0x%08x", + "nn::fs::ReadFile(&readSize, fileHandle, 0, outBuffer, bufferSize)", + result.GetModule(), result.GetDescription(), + result.GetInnerValueForDebug()); } - u64 fileRead = messageBufferSize - 1; + u64 fileRead = bufferSize - 1; if (fileRead >= bytesRead) fileRead = bytesRead; - outMessage[fileRead] = u'\0'; + outBuffer[fileRead] = u'\0'; fs::CloseFile(fileHandle); fs::Unmount("err"); From 38ad7f3bbeb19eadd686006e7c62c1f41c10beab Mon Sep 17 00:00:00 2001 From: Fuzzy2319 Date: Tue, 4 Aug 2026 15:42:30 +0200 Subject: [PATCH 12/14] fix:lint --- include/nn/diag.h | 4 ++-- include/nn/util.h | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/include/nn/diag.h b/include/nn/diag.h index 6feab431..f93217fc 100644 --- a/include/nn/diag.h +++ b/include/nn/diag.h @@ -24,8 +24,8 @@ namespace detail { void LogImpl(nn::diag::LogMetaData const&, char const*, ...); void AbortImpl(char const*, char const*, char const*, s32); -[[gnu::format(printf, 6, 7)]] [[noreturn]] -void AbortImpl(char const*, char const*, char const*, s32, const Result*, const char*, ...); +[[gnu::format(printf, 6, 7)]] [[noreturn]] void AbortImpl(char const*, char const*, char const*, + s32, const Result*, const char*, ...); void OnAssertionFailure(nn::diag::AssertionType, char const*, char const*, char const*, s32); } // namespace detail diff --git a/include/nn/util.h b/include/nn/util.h index 6db8a2e5..928ec770 100644 --- a/include/nn/util.h +++ b/include/nn/util.h @@ -18,11 +18,9 @@ CharacterEncodingResult ConvertCharacterUtf8ToUtf32(u32* dest, char const* src); CharacterEncodingResult ConvertStringUtf16NativeToUtf8(char*, s32, u16 const*, s32); CharacterEncodingResult ConvertStringUtf8ToUtf16Native(u16*, s32, char const*, s32); -[[gnu::format(printf, 3, 4)]] -s32 SNPrintf(char* s, size_t n, const char* format, ...); +[[gnu::format(printf, 3, 4)]] s32 SNPrintf(char* s, size_t n, const char* format, ...); s32 VSNPrintf(char* s, size_t n, const char* format, va_list arg); -[[gnu::format(printf, 3, 4)]] -s32 TSNPrintf(char* s, size_t n, const char* format, ...); +[[gnu::format(printf, 3, 4)]] s32 TSNPrintf(char* s, size_t n, const char* format, ...); s32 TVSNPrintf(char* s, size_t n, const char* format, va_list arg); void ReferSymbol(const void*); From 80df18f331575f00de108bab42034cc3df5604ee Mon Sep 17 00:00:00 2001 From: Fuzzy2319 Date: Fri, 7 Aug 2026 22:44:12 +0200 Subject: [PATCH 13/14] update:ApplicationErrorArg && add:build_sdk function --- CMakeLists.txt | 570 ++++++++++---------- src/NintendoSDK/err/ApplicationErrorArg.cpp | 27 +- 2 files changed, 300 insertions(+), 297 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 77d547e4..0ae2ea9e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,277 +11,277 @@ set_property(CACHE NVN_API PROPERTY STRINGS "C" "CPP") set(NN_SOURCES "") if(NN_GFX_TARGET) - # gfx_NvnHelper.cpp includes the C impl - if(NVN_API STREQUAL "C") - unset(NVN_API CACHE) - endif() + # gfx_NvnHelper.cpp includes the C impl + if(NVN_API STREQUAL "C") + unset(NVN_API CACHE) + endif() - set(NN_GFX_SOURCES - include/nn/gfx/detail/gfx_DataContainer.h - include/nn/gfx/detail/gfx_Fwd.h - include/nn/gfx/detail/gfx_Misc.h - include/nn/gfx/detail/gfx_RequiredMemory.h - include/nn/gfx/detail/gfx_ResShaderImpl.h - include/nn/gfx/detail/gfx_RootSignature-api.common.h - include/nn/gfx/util/gfx_PrimitiveShape.h + set(NN_GFX_SOURCES + include/nn/gfx/detail/gfx_DataContainer.h + include/nn/gfx/detail/gfx_Fwd.h + include/nn/gfx/detail/gfx_Misc.h + include/nn/gfx/detail/gfx_RequiredMemory.h + include/nn/gfx/detail/gfx_ResShaderImpl.h + include/nn/gfx/detail/gfx_RootSignature-api.common.h + include/nn/gfx/util/gfx_PrimitiveShape.h - include/nn/gfx/gfx_Buffer.h - include/nn/gfx/gfx_BufferInfo.h - include/nn/gfx/gfx_BufferInfoData.h - include/nn/gfx/gfx_CommandBuffer.h - include/nn/gfx/gfx_CommandBufferInfo.h - include/nn/gfx/gfx_CommandBufferInfoData.h - include/nn/gfx/gfx_Common.h - include/nn/gfx/gfx_DescriptorPool.h - include/nn/gfx/gfx_DescriptorPoolInfo.h - include/nn/gfx/gfx_DescriptorPoolInfoData.h - include/nn/gfx/gfx_DescriptorSlot.h - include/nn/gfx/gfx_Device.h - include/nn/gfx/gfx_DeviceInfo.h - include/nn/gfx/gfx_DeviceInfoData.h - include/nn/gfx/gfx_Enum.h - include/nn/gfx/gfx_GpuAddress.h - include/nn/gfx/gfx_MemoryPool.h - include/nn/gfx/gfx_MemoryPoolInfo.h - include/nn/gfx/gfx_MemoryPoolInfoData.h - include/nn/gfx/gfx_Queue.h - include/nn/gfx/gfx_QueueInfo.h - include/nn/gfx/gfx_QueueInfoData.h - include/nn/gfx/gfx_ResShader.h - include/nn/gfx/gfx_ResShaderData.h - include/nn/gfx/gfx_ResTexture.h - include/nn/gfx/gfx_ResTextureData.h - include/nn/gfx/gfx_ResUserData.h - include/nn/gfx/gfx_ResUserDataData.h - include/nn/gfx/gfx_RootSignatureData-api.common.h - include/nn/gfx/gfx_RootSignatureInfo.h - include/nn/gfx/gfx_RootSignatureInfoData.h - include/nn/gfx/gfx_Sampler.h - include/nn/gfx/gfx_SamplerInfo.h - include/nn/gfx/gfx_SamplerInfoData.h - include/nn/gfx/gfx_Shader.h - include/nn/gfx/gfx_ShaderInfo.h - include/nn/gfx/gfx_ShaderInfoData.h - include/nn/gfx/gfx_State.h - include/nn/gfx/gfx_StateInfo.h - include/nn/gfx/gfx_StateInfoData.h - include/nn/gfx/gfx_SwapChain.h - include/nn/gfx/gfx_SwapChainInfo.h - include/nn/gfx/gfx_SwapChainInfoData.h - include/nn/gfx/gfx_Sync.h - include/nn/gfx/gfx_SyncInfo.h - include/nn/gfx/gfx_SyncInfoData.h - include/nn/gfx/gfx_Texture.h - include/nn/gfx/gfx_TextureInfo.h - include/nn/gfx/gfx_TextureInfoData.h - include/nn/gfx/gfx_Types.h - include/nn/gfx/gfx_VariationBase.h - - src/NintendoSDK/gfx/detail/gfx_CommonHelper.cpp - src/NintendoSDK/gfx/detail/gfx_CommonHelper.h - src/NintendoSDK/gfx/util/gfx_PrimitiveShape.cpp + include/nn/gfx/gfx_Buffer.h + include/nn/gfx/gfx_BufferInfo.h + include/nn/gfx/gfx_BufferInfoData.h + include/nn/gfx/gfx_CommandBuffer.h + include/nn/gfx/gfx_CommandBufferInfo.h + include/nn/gfx/gfx_CommandBufferInfoData.h + include/nn/gfx/gfx_Common.h + include/nn/gfx/gfx_DescriptorPool.h + include/nn/gfx/gfx_DescriptorPoolInfo.h + include/nn/gfx/gfx_DescriptorPoolInfoData.h + include/nn/gfx/gfx_DescriptorSlot.h + include/nn/gfx/gfx_Device.h + include/nn/gfx/gfx_DeviceInfo.h + include/nn/gfx/gfx_DeviceInfoData.h + include/nn/gfx/gfx_Enum.h + include/nn/gfx/gfx_GpuAddress.h + include/nn/gfx/gfx_MemoryPool.h + include/nn/gfx/gfx_MemoryPoolInfo.h + include/nn/gfx/gfx_MemoryPoolInfoData.h + include/nn/gfx/gfx_Queue.h + include/nn/gfx/gfx_QueueInfo.h + include/nn/gfx/gfx_QueueInfoData.h + include/nn/gfx/gfx_ResShader.h + include/nn/gfx/gfx_ResShaderData.h + include/nn/gfx/gfx_ResTexture.h + include/nn/gfx/gfx_ResTextureData.h + include/nn/gfx/gfx_ResUserData.h + include/nn/gfx/gfx_ResUserDataData.h + include/nn/gfx/gfx_RootSignatureData-api.common.h + include/nn/gfx/gfx_RootSignatureInfo.h + include/nn/gfx/gfx_RootSignatureInfoData.h + include/nn/gfx/gfx_Sampler.h + include/nn/gfx/gfx_SamplerInfo.h + include/nn/gfx/gfx_SamplerInfoData.h + include/nn/gfx/gfx_Shader.h + include/nn/gfx/gfx_ShaderInfo.h + include/nn/gfx/gfx_ShaderInfoData.h + include/nn/gfx/gfx_State.h + include/nn/gfx/gfx_StateInfo.h + include/nn/gfx/gfx_StateInfoData.h + include/nn/gfx/gfx_SwapChain.h + include/nn/gfx/gfx_SwapChainInfo.h + include/nn/gfx/gfx_SwapChainInfoData.h + include/nn/gfx/gfx_Sync.h + include/nn/gfx/gfx_SyncInfo.h + include/nn/gfx/gfx_SyncInfoData.h + include/nn/gfx/gfx_Texture.h + include/nn/gfx/gfx_TextureInfo.h + include/nn/gfx/gfx_TextureInfoData.h + include/nn/gfx/gfx_Types.h + include/nn/gfx/gfx_VariationBase.h - src/NintendoSDK/gfx/gfx_BufferInfo.cpp - src/NintendoSDK/gfx/gfx_CommandBufferInfo.cpp - src/NintendoSDK/gfx/gfx_DescriptorPoolInfo.cpp - src/NintendoSDK/gfx/gfx_DeviceInfo.cpp - src/NintendoSDK/gfx/gfx_MemoryPoolInfo.cpp - src/NintendoSDK/gfx/gfx_QueueInfo.cpp - src/NintendoSDK/gfx/gfx_ResShader.cpp - src/NintendoSDK/gfx/gfx_ResTexture.cpp - src/NintendoSDK/gfx/gfx_SamplerInfo.cpp - src/NintendoSDK/gfx/gfx_ShaderInfo.cpp - src/NintendoSDK/gfx/gfx_StateInfo.cpp - src/NintendoSDK/gfx/gfx_SwapChainInfo.cpp - src/NintendoSDK/gfx/gfx_SyncInfo.cpp - src/NintendoSDK/gfx/gfx_TextureInfo.cpp - ) + src/NintendoSDK/gfx/detail/gfx_CommonHelper.cpp + src/NintendoSDK/gfx/detail/gfx_CommonHelper.h + src/NintendoSDK/gfx/util/gfx_PrimitiveShape.cpp - if(NN_GFX_TARGET STREQUAL "NVN") - list(APPEND NN_GFX_SOURCES - include/nn/gfx/detail/gfx_Buffer-api.nvn.8.h - include/nn/gfx/detail/gfx_CommandBuffer-api.nvn.8.h - include/nn/gfx/detail/gfx_Common-api.nvn.h - include/nn/gfx/detail/gfx_DescriptorPool-api.nvn.8.h - include/nn/gfx/detail/gfx_Device-api.nvn.8.h - include/nn/gfx/detail/gfx_MemoryPool-api.nvn.8.h - include/nn/gfx/detail/gfx_Pipeline-api.nvn.8.h - include/nn/gfx/detail/gfx_Queue-api.nvn.8.h - include/nn/gfx/detail/gfx_RootSignature-api.nvn.8.h - include/nn/gfx/detail/gfx_Sampler-api.nvn.8.h - include/nn/gfx/detail/gfx_Shader-api.nvn.8.h - include/nn/gfx/detail/gfx_State-api.nvn.8.h - include/nn/gfx/detail/gfx_SwapChain-api.nvn.8.h - include/nn/gfx/detail/gfx_Sync-api.nvn.8.h - include/nn/gfx/detail/gfx_Texture-api.nvn.8.h + src/NintendoSDK/gfx/gfx_BufferInfo.cpp + src/NintendoSDK/gfx/gfx_CommandBufferInfo.cpp + src/NintendoSDK/gfx/gfx_DescriptorPoolInfo.cpp + src/NintendoSDK/gfx/gfx_DeviceInfo.cpp + src/NintendoSDK/gfx/gfx_MemoryPoolInfo.cpp + src/NintendoSDK/gfx/gfx_QueueInfo.cpp + src/NintendoSDK/gfx/gfx_ResShader.cpp + src/NintendoSDK/gfx/gfx_ResTexture.cpp + src/NintendoSDK/gfx/gfx_SamplerInfo.cpp + src/NintendoSDK/gfx/gfx_ShaderInfo.cpp + src/NintendoSDK/gfx/gfx_StateInfo.cpp + src/NintendoSDK/gfx/gfx_SwapChainInfo.cpp + src/NintendoSDK/gfx/gfx_SyncInfo.cpp + src/NintendoSDK/gfx/gfx_TextureInfo.cpp + ) - include/nn/gfx/gfx_BufferData-api.nvn.8.h - include/nn/gfx/gfx_CommandBufferData-api.nvn.8.h - include/nn/gfx/gfx_DescriptorPoolData-api.nvn.8.h - include/nn/gfx/gfx_DeviceData-api.nvn.8.h - include/nn/gfx/gfx_Interoperation-api.nvn.8.h - include/nn/gfx/gfx_MemoryPoolData-api.nvn.8.h - include/nn/gfx/gfx_PipelineData-api.nvn.8.h - include/nn/gfx/gfx_QueueData-api.nvn.8.h - include/nn/gfx/gfx_ResShaderData-api.nvn.h - include/nn/gfx/gfx_SamplerData-api.nvn.8.h - include/nn/gfx/gfx_ShaderData-api.nvn.8.h - include/nn/gfx/gfx_StateData-api.nvn.8.h - include/nn/gfx/gfx_SwapChainData-api.nvn.8.h - include/nn/gfx/gfx_SyncData-api.nvn.8.h - include/nn/gfx/gfx_TextureData-api.nvn.8.h + if(NN_GFX_TARGET STREQUAL "NVN") + list(APPEND NN_GFX_SOURCES + include/nn/gfx/detail/gfx_Buffer-api.nvn.8.h + include/nn/gfx/detail/gfx_CommandBuffer-api.nvn.8.h + include/nn/gfx/detail/gfx_Common-api.nvn.h + include/nn/gfx/detail/gfx_DescriptorPool-api.nvn.8.h + include/nn/gfx/detail/gfx_Device-api.nvn.8.h + include/nn/gfx/detail/gfx_MemoryPool-api.nvn.8.h + include/nn/gfx/detail/gfx_Pipeline-api.nvn.8.h + include/nn/gfx/detail/gfx_Queue-api.nvn.8.h + include/nn/gfx/detail/gfx_RootSignature-api.nvn.8.h + include/nn/gfx/detail/gfx_Sampler-api.nvn.8.h + include/nn/gfx/detail/gfx_Shader-api.nvn.8.h + include/nn/gfx/detail/gfx_State-api.nvn.8.h + include/nn/gfx/detail/gfx_SwapChain-api.nvn.8.h + include/nn/gfx/detail/gfx_Sync-api.nvn.8.h + include/nn/gfx/detail/gfx_Texture-api.nvn.8.h - src/NintendoSDK/gfx/detail/gfx_Buffer-api.nvn.8.cpp - src/NintendoSDK/gfx/detail/gfx_CommandBuffer-api.nvn.8.cpp - src/NintendoSDK/gfx/detail/gfx_DescriptorPool-api.nvn.8.cpp - src/NintendoSDK/gfx/detail/gfx_Device-api.nvn.8-os.horizon.cpp - src/NintendoSDK/gfx/detail/gfx_GlslcFunction.cpp - src/NintendoSDK/gfx/detail/gfx_MemoryPool-api.nvn.8.cpp - src/NintendoSDK/gfx/detail/gfx_NvnHelper-os.horizon.cpp - src/NintendoSDK/gfx/detail/gfx_NvnHelper.cpp - src/NintendoSDK/gfx/detail/gfx_NvnHelper.h - src/NintendoSDK/gfx/detail/gfx_ResShader-api.nvn.8.cpp - src/NintendoSDK/gfx/detail/gfx_Sampler-api.nvn.8.cpp - src/NintendoSDK/gfx/detail/gfx_Shader-api.nvn.8.cpp - src/NintendoSDK/gfx/detail/gfx_State-api.nvn.8.cpp - src/NintendoSDK/gfx/detail/gfx_Texture-api.nvn.8.cpp + include/nn/gfx/gfx_BufferData-api.nvn.8.h + include/nn/gfx/gfx_CommandBufferData-api.nvn.8.h + include/nn/gfx/gfx_DescriptorPoolData-api.nvn.8.h + include/nn/gfx/gfx_DeviceData-api.nvn.8.h + include/nn/gfx/gfx_Interoperation-api.nvn.8.h + include/nn/gfx/gfx_MemoryPoolData-api.nvn.8.h + include/nn/gfx/gfx_PipelineData-api.nvn.8.h + include/nn/gfx/gfx_QueueData-api.nvn.8.h + include/nn/gfx/gfx_ResShaderData-api.nvn.h + include/nn/gfx/gfx_SamplerData-api.nvn.8.h + include/nn/gfx/gfx_ShaderData-api.nvn.8.h + include/nn/gfx/gfx_StateData-api.nvn.8.h + include/nn/gfx/gfx_SwapChainData-api.nvn.8.h + include/nn/gfx/gfx_SyncData-api.nvn.8.h + include/nn/gfx/gfx_TextureData-api.nvn.8.h - src/NintendoSDK/gfx/util/gfx_ObjectDebugLabel-api.nvn.8.cpp - src/NintendoSDK/gfx/gfx_Interoperation-api.nvn.cpp - ) - endif() + src/NintendoSDK/gfx/detail/gfx_Buffer-api.nvn.8.cpp + src/NintendoSDK/gfx/detail/gfx_CommandBuffer-api.nvn.8.cpp + src/NintendoSDK/gfx/detail/gfx_DescriptorPool-api.nvn.8.cpp + src/NintendoSDK/gfx/detail/gfx_Device-api.nvn.8-os.horizon.cpp + src/NintendoSDK/gfx/detail/gfx_GlslcFunction.cpp + src/NintendoSDK/gfx/detail/gfx_MemoryPool-api.nvn.8.cpp + src/NintendoSDK/gfx/detail/gfx_NvnHelper-os.horizon.cpp + src/NintendoSDK/gfx/detail/gfx_NvnHelper.cpp + src/NintendoSDK/gfx/detail/gfx_NvnHelper.h + src/NintendoSDK/gfx/detail/gfx_ResShader-api.nvn.8.cpp + src/NintendoSDK/gfx/detail/gfx_Sampler-api.nvn.8.cpp + src/NintendoSDK/gfx/detail/gfx_Shader-api.nvn.8.cpp + src/NintendoSDK/gfx/detail/gfx_State-api.nvn.8.cpp + src/NintendoSDK/gfx/detail/gfx_Texture-api.nvn.8.cpp - list(APPEND NN_SOURCES ${NN_GFX_SOURCES}) + src/NintendoSDK/gfx/util/gfx_ObjectDebugLabel-api.nvn.8.cpp + src/NintendoSDK/gfx/gfx_Interoperation-api.nvn.cpp + ) + endif() + + list(APPEND NN_SOURCES ${NN_GFX_SOURCES}) endif() add_library(NintendoSDK OBJECT - ${NN_SOURCES} + ${NN_SOURCES} + + include/nn/types.h + include/nn/fs.h + include/nn/os.h + include/nn/nifm.h + include/nn/prepo.h + include/nn/vfx/Config.h + include/nn/vfx/System.h + include/nn/vfx/Heap.h + include/nn/socket.h + include/nn/aoc.h + include/nn/ro.h + include/nn/oe.h + include/nn/util.h + include/nn/image.h + include/nn/util/AccessorBase.h + include/nn/util/MathTypes.h + include/nn/util/util_Arithmetic.h + include/nn/util/util_BinTypes.h + include/nn/util/util_BitPack.h + include/nn/util/util_BytePtr.h + include/nn/util/util_IntrusiveList.h + include/nn/util/util_BitUtil.h + include/nn/util/util_ResDic.h + include/nn/util/util_StringView.h + include/nn/ui2d/detail/TexCoordArray.h + include/nn/ui2d/Layout.h + include/nn/ui2d/Material.h + include/nn/ui2d/Pane.h + include/nn/ui2d/Parts.h + include/nn/ui2d/Types.h + include/nn/ui2d/Util.h + include/nn/g3d/BindFuncTable.h + include/nn/g3d/ModelObj.h + include/nn/g3d/ResMaterialAnim.h + include/nn/g3d/ResShapeAnim.h + include/nn/g3d/ResLightAnim.h + include/nn/g3d/ResSkeletalAnim.h + include/nn/g3d/ResSceneAnim.h + include/nn/g3d/ResFile.h + include/nn/g3d/ResMaterial.h + include/nn/g3d/ResFogAnim.h + include/nn/g3d/ResModel.h + include/nn/g3d/ResSkeleton.h + include/nn/g3d/SkeletonObj.h + include/nn/g3d/World.h + include/nn/nn.h + include/nn/settings.h + include/nn/hid.h + include/nn/atk/detail/StreamSoundRuntime.h + include/nn/atk/detail/BasicSound.h + include/nn/atk/detail/WaveSoundRuntime.h + include/nn/atk/detail/SequenceSoundRuntime.h + include/nn/atk/detail/SoundArchiveManager.h + include/nn/atk/detail/AdvancedWaveSoundRuntime.h + include/nn/atk/AuxBus.h + include/nn/atk/SoundArchivePlayer.h + include/nn/atk/SoundPlayer.h + include/nn/atk/SoundDataManager.h + include/nn/nfp.h + include/nn/nfp/nfp.h + include/nn/nfp/nfp_types.h + include/nn/time.h + include/nn/diag.h + include/nn/init.h + include/nn/crypto.h + include/nn/ssl.h + include/nn/fs/fs_bcat.h + include/nn/fs/fs_directories.h + include/nn/fs/fs_files.h + include/nn/fs/fs_mount.h + include/nn/fs/fs_rom.h + include/nn/fs/fs_save.h + include/nn/fs/fs_types.h + include/nn/vi.h + include/nn/account.h + include/nn/audio.h + include/nn/friends.h + include/nn/mem.h - include/nn/types.h - include/nn/fs.h - include/nn/os.h - include/nn/nifm.h - include/nn/prepo.h - include/nn/vfx/Config.h - include/nn/vfx/System.h - include/nn/vfx/Heap.h - include/nn/socket.h - include/nn/aoc.h - include/nn/ro.h - include/nn/oe.h - include/nn/util.h - include/nn/image.h - include/nn/util/AccessorBase.h - include/nn/util/MathTypes.h - include/nn/util/util_Arithmetic.h - include/nn/util/util_BinTypes.h - include/nn/util/util_BitPack.h - include/nn/util/util_BytePtr.h - include/nn/util/util_IntrusiveList.h - include/nn/util/util_BitUtil.h - include/nn/util/util_ResDic.h - include/nn/util/util_StringView.h - include/nn/ui2d/detail/TexCoordArray.h - include/nn/ui2d/Layout.h - include/nn/ui2d/Material.h - include/nn/ui2d/Pane.h - include/nn/ui2d/Parts.h - include/nn/ui2d/Types.h - include/nn/ui2d/Util.h - include/nn/g3d/BindFuncTable.h - include/nn/g3d/ModelObj.h - include/nn/g3d/ResMaterialAnim.h - include/nn/g3d/ResShapeAnim.h - include/nn/g3d/ResLightAnim.h - include/nn/g3d/ResSkeletalAnim.h - include/nn/g3d/ResSceneAnim.h - include/nn/g3d/ResFile.h - include/nn/g3d/ResMaterial.h - include/nn/g3d/ResFogAnim.h - include/nn/g3d/ResModel.h - include/nn/g3d/ResSkeleton.h - include/nn/g3d/SkeletonObj.h - include/nn/g3d/World.h - include/nn/nn.h - include/nn/settings.h - include/nn/hid.h - include/nn/atk/detail/StreamSoundRuntime.h - include/nn/atk/detail/BasicSound.h - include/nn/atk/detail/WaveSoundRuntime.h - include/nn/atk/detail/SequenceSoundRuntime.h - include/nn/atk/detail/SoundArchiveManager.h - include/nn/atk/detail/AdvancedWaveSoundRuntime.h - include/nn/atk/AuxBus.h - include/nn/atk/SoundArchivePlayer.h - include/nn/atk/SoundPlayer.h - include/nn/atk/SoundDataManager.h - include/nn/nfp.h - include/nn/nfp/nfp.h - include/nn/nfp/nfp_types.h - include/nn/time.h - include/nn/diag.h - include/nn/init.h - include/nn/crypto.h - include/nn/ssl.h - include/nn/fs/fs_bcat.h - include/nn/fs/fs_directories.h - include/nn/fs/fs_files.h - include/nn/fs/fs_mount.h - include/nn/fs/fs_rom.h - include/nn/fs/fs_save.h - include/nn/fs/fs_types.h - include/nn/vi.h - include/nn/account.h - include/nn/audio.h - include/nn/friends.h - include/nn/mem.h + include/nvn/nvn_Cpp.h + include/nvn/nvn_CppFuncPtrBase.h + include/nvn/nvn_CppMethods.h + include/nvn/nvn_FuncPtrBase.h + include/nvn/nvn_FuncPtrInline.h + include/nvn/nvn.h - include/nvn/nvn_Cpp.h - include/nvn/nvn_CppFuncPtrBase.h - include/nvn/nvn_CppMethods.h - include/nvn/nvn_FuncPtrBase.h - include/nvn/nvn_FuncPtrInline.h - include/nvn/nvn.h - - include/vapours/results.hpp - include/vapours/results/sf_results.hpp - include/vapours/results/capsrv_results.hpp - include/vapours/results/pgl_results.hpp - include/vapours/results/lr_results.hpp - include/vapours/results/spl_results.hpp - include/vapours/results/pm_results.hpp - include/vapours/results/settings_results.hpp - include/vapours/results/debug_results.hpp - include/vapours/results/cal_results.hpp - include/vapours/results/i2c_results.hpp - include/vapours/results/results_common.hpp - include/vapours/results/time_results.hpp - include/vapours/results/vi_results.hpp - include/vapours/results/ns_results.hpp - include/vapours/results/fs_results.hpp - include/vapours/results/hipc_results.hpp - include/vapours/results/os_results.hpp - include/vapours/results/ro_results.hpp - include/vapours/results/loader_results.hpp - include/vapours/results/err_results.hpp - include/vapours/results/ncm_results.hpp - include/vapours/results/svc_results.hpp - include/vapours/results/nim_results.hpp - include/vapours/results/exosphere_results.hpp - include/vapours/results/creport_results.hpp - include/vapours/results/erpt_results.hpp - include/vapours/results/kvdb_results.hpp - include/vapours/results/dmnt_results.hpp - include/vapours/results/updater_results.hpp - include/vapours/results/fatal_results.hpp - include/vapours/results/sm_results.hpp - include/vapours/results/psc_results.hpp - include/vapours/results/nfp_results.hpp - include/nv.h + include/vapours/results.hpp + include/vapours/results/sf_results.hpp + include/vapours/results/capsrv_results.hpp + include/vapours/results/pgl_results.hpp + include/vapours/results/lr_results.hpp + include/vapours/results/spl_results.hpp + include/vapours/results/pm_results.hpp + include/vapours/results/settings_results.hpp + include/vapours/results/debug_results.hpp + include/vapours/results/cal_results.hpp + include/vapours/results/i2c_results.hpp + include/vapours/results/results_common.hpp + include/vapours/results/time_results.hpp + include/vapours/results/vi_results.hpp + include/vapours/results/ns_results.hpp + include/vapours/results/fs_results.hpp + include/vapours/results/hipc_results.hpp + include/vapours/results/os_results.hpp + include/vapours/results/ro_results.hpp + include/vapours/results/loader_results.hpp + include/vapours/results/err_results.hpp + include/vapours/results/ncm_results.hpp + include/vapours/results/svc_results.hpp + include/vapours/results/nim_results.hpp + include/vapours/results/exosphere_results.hpp + include/vapours/results/creport_results.hpp + include/vapours/results/erpt_results.hpp + include/vapours/results/kvdb_results.hpp + include/vapours/results/dmnt_results.hpp + include/vapours/results/updater_results.hpp + include/vapours/results/fatal_results.hpp + include/vapours/results/sm_results.hpp + include/vapours/results/psc_results.hpp + include/vapours/results/nfp_results.hpp + include/nv.h - src/NintendoSDK/nvn/nvn_CppFuncPtrImpl.h - src/NintendoSDK/nvn/nvn_FuncPtrImpl.h - src/NintendoSDK/nvn/nvn_Impl.cpp + src/NintendoSDK/nvn/nvn_CppFuncPtrImpl.h + src/NintendoSDK/nvn/nvn_FuncPtrImpl.h + src/NintendoSDK/nvn/nvn_Impl.cpp ) target_include_directories(NintendoSDK PUBLIC include/) @@ -291,31 +291,47 @@ target_compile_options(NintendoSDK PRIVATE -fno-exceptions) target_compile_options(NintendoSDK PRIVATE -Wall -Wextra) target_compile_options(NintendoSDK PRIVATE -Wno-invalid-offsetof) -if (NVN_API) - target_compile_definitions(NintendoSDK PRIVATE NVN_API_${NVN_API}) +if(NVN_API) + target_compile_definitions(NintendoSDK PRIVATE NVN_API_${NVN_API}) endif() -function(nn_ver ID) - set(VER ${${ID}}) - string(REPLACE "." ";" VER "${VER}") +function(nn_ver TARGET ID) + set(VER ${${ID}}) + string(REPLACE "." ";" VER "${VER}") - list(LENGTH VER SEGS) - if(SEGS LESS 3) - set(DEF_VER 1 0 0) - list(SUBLIST DEF_VER ${SEGS} -1 DEF_VER) - list(APPEND VER ${DEF_VER}) + list(LENGTH VER SEGS) + if(SEGS LESS 3) + set(DEF_VER 1 0 0) + list(SUBLIST DEF_VER ${SEGS} -1 DEF_VER) + list(APPEND VER ${DEF_VER}) - message(AUTHOR_WARNING "${ID} semver is not complete (%d.%d.%d): ${${ID}}") - endif() + message(AUTHOR_WARNING "${ID} semver is not complete (%d.%d.%d): ${${ID}}") + endif() - list(POP_FRONT VER MAJOR MINOR PATCH) - - foreach(VAR IN ITEMS MAJOR MINOR PATCH) - target_compile_definitions(NintendoSDK PRIVATE ${ID}_${VAR}=${${VAR}}) - endforeach() + list(POP_FRONT VER MAJOR MINOR PATCH) + + foreach(VAR IN ITEMS MAJOR MINOR PATCH) + target_compile_definitions(${TARGET} INTERFACE ${ID}_${VAR}=${${VAR}}) + endforeach() +endfunction() + +function(build_sdk) + add_executable(nnsdk + ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/src/NintendoSDK/err/ApplicationErrorArg.cpp + ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/src/NintendoSDK/err/detail.cpp + ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/src/NintendoSDK/err/err.cpp + ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/src/NintendoSDK/err/ErrorCode.cpp + ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/src/NintendoSDK/err/ErrorResultVariant.cpp + ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/src/NintendoSDK/err/ResultBacktrace.cpp + ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/src/NintendoSDK/err/SystemErrorArg.cpp + ) + target_include_directories(nnsdk PRIVATE ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/include/) + nn_ver(nnsdk NN_WARE) + nn_ver(nnsdk NN_SDK) + target_compile_definitions(nnsdk PRIVATE NN_SDK_TYPE="${NN_SDK_TYPE}") endfunction() -nn_ver(NN_WARE) -nn_ver(NN_SDK) -target_compile_definitions(NintendoSDK PRIVATE NN_SDK_TYPE="${NN_SDK_TYPE}") +nn_ver(NintendoSDK NN_WARE) +nn_ver(NintendoSDK NN_SDK) +target_compile_definitions(NintendoSDK INTERFACE NN_SDK_TYPE="${NN_SDK_TYPE}") diff --git a/src/NintendoSDK/err/ApplicationErrorArg.cpp b/src/NintendoSDK/err/ApplicationErrorArg.cpp index edeeb3d4..7f6b7422 100644 --- a/src/NintendoSDK/err/ApplicationErrorArg.cpp +++ b/src/NintendoSDK/err/ApplicationErrorArg.cpp @@ -9,32 +9,19 @@ ApplicationErrorArg::ApplicationErrorArg() { ApplicationErrorArg::ApplicationErrorArg(u32 errorCode, const char* dialogMessage, const char* fullScreenMessage, const settings::LanguageCode& languageCode) - : mErrorCode(errorCode), mLanguageCode(languageCode) { - s32 i = 0; - while (dialogMessage[i] != '\0' || i != 0x7fe) { - mDialogMessage[i] = dialogMessage[i]; - i++; - } - - mDialogMessage[i] = '\0'; - - i = 0; - while (fullScreenMessage[i] != '\0' || i != 0x7fe) { - mFullScreenMessage[i] = fullScreenMessage[i]; - i++; - } - - mFullScreenMessage[i] = '\0'; + : mErrorCode(errorCode) { + SetDialogMessage(dialogMessage); + SetFullScreenMessage(fullScreenMessage); + SetLanguageCode(languageCode); } void ApplicationErrorArg::SetApplicationErrorCodeNumber(u32 errorCode) { mErrorCode = errorCode; } -// strcpy??? void ApplicationErrorArg::SetDialogMessage(const char* message) { s32 i = 0; - while (message[i] != '\0' || i != 0x7fe) { + while (message[i] != '\0' && i < 0x7fe) { mDialogMessage[i] = message[i]; i++; } @@ -44,7 +31,7 @@ void ApplicationErrorArg::SetDialogMessage(const char* message) { void ApplicationErrorArg::SetFullScreenMessage(const char* message) { s32 i = 0; - while (message[i] != '\0' || i != 0x7fe) { + while (message[i] != '\0' && i < 0x7fe) { mFullScreenMessage[i] = message[i]; i++; } @@ -54,7 +41,7 @@ void ApplicationErrorArg::SetFullScreenMessage(const char* message) { void ApplicationErrorArg::SetLanguageCode(const settings::LanguageCode& languageCode) { s32 i = 0; - while (languageCode.code[i] != '\0' || i != 7) { + while (languageCode.code[i] && i < 7) { mLanguageCode.code[i] = languageCode.code[i]; i++; } From a7acadaf7055709ab3bb7adef1bb3bc091067971 Mon Sep 17 00:00:00 2001 From: Fuzzy2319 Date: Sat, 8 Aug 2026 11:47:39 +0200 Subject: [PATCH 14/14] fix:result return type --- include/vapours/results/results_common.hpp | 24 +++++++++++----------- src/NintendoSDK/err/err.cpp | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/include/vapours/results/results_common.hpp b/include/vapours/results/results_common.hpp index dc9d7fe1..3ab642d0 100644 --- a/include/vapours/results/results_common.hpp +++ b/include/vapours/results/results_common.hpp @@ -71,19 +71,19 @@ class ResultBase { using BaseType = typename ResultTraits::BaseType; static const BaseType SuccessValue = ResultTraits::SuccessValue; - __attribute__((always_inline)) int GetModule() const noexcept { - return static_cast(ResultTraits::GetModuleFromValue( - static_cast(*this).GetInnerValueForDebug())); + __attribute__((always_inline)) BaseType GetModule() const noexcept { + return ResultTraits::GetModuleFromValue( + static_cast(*this).GetInnerValueForDebug()); } - __attribute__((always_inline)) int GetDescription() const noexcept { - return static_cast(ResultTraits::GetDescriptionFromValue( - static_cast(*this).GetInnerValueForDebug())); + __attribute__((always_inline)) BaseType GetDescription() const noexcept { + return ResultTraits::GetDescriptionFromValue( + static_cast(*this).GetInnerValueForDebug()); } - __attribute__((always_inline)) int GetValue() const noexcept { - return static_cast(ResultTraits::GetModuleAndDescriptionFromValue( - static_cast(*this).GetInnerValueForDebug())); + __attribute__((always_inline)) BaseType GetValue() const noexcept { + return ResultTraits::GetModuleAndDescriptionFromValue( + static_cast(*this).GetInnerValueForDebug()); } }; @@ -118,11 +118,11 @@ class Result : public result::detail::ResultBase { operator ResultSuccess() const noexcept; static bool CanAccept(Result result) noexcept; - __attribute__((always_inline)) int GetModule() const noexcept { return Base::GetModule(); } - __attribute__((always_inline)) int GetDescription() const noexcept { + __attribute__((always_inline)) BaseType GetModule() const noexcept { return Base::GetModule(); } + __attribute__((always_inline)) BaseType GetDescription() const noexcept { return Base::GetDescription(); } - __attribute__((always_inline)) int GetValue() const noexcept { return Base::GetValue(); } + __attribute__((always_inline)) BaseType GetValue() const noexcept { return Base::GetValue(); } }; static_assert(sizeof(Result) == sizeof(result::detail::ResultTraits::BaseType), "sizeof(Result) == sizeof(detail::ResultTraits::BaseType)"); diff --git a/src/NintendoSDK/err/err.cpp b/src/NintendoSDK/err/err.cpp index 40a5c6b2..93918002 100644 --- a/src/NintendoSDK/err/err.cpp +++ b/src/NintendoSDK/err/err.cpp @@ -29,7 +29,7 @@ ErrorCode MakeErrorCode(u32 category, u32 number) { // void ShowErrorRecord(const void*, u64) {} ErrorCode ConvertResultToErrorCode(const Result& result) { - return {result.GetModule() + 2000u, (u32)result.GetDescription()}; + return {result.GetModule() + 2000, result.GetDescription()}; } void GetErrorCodeString(char* outErrorCodeString, size_t errorCodeStrBufferSize,