diff --git a/nx/include/switch/applets/error.h b/nx/include/switch/applets/error.h index f350b3ff..5e8421ca 100644 --- a/nx/include/switch/applets/error.h +++ b/nx/include/switch/applets/error.h @@ -7,6 +7,7 @@ #pragma once #include "../types.h" #include "../services/applet.h" +#include "../services/set.h" typedef struct { u8 unk_x0[0x200]; @@ -29,6 +30,15 @@ typedef struct { Result res; } ErrorCommonArg; +typedef struct { + ErrorCommonHeader hdr; + SetRegion regionCode; +} ErrorEulaArg; + +typedef struct { + u8 data[0x20000]; +} ErrorEulaData; + /// SystemErrorArg typedef struct { ErrorCommonHeader hdr; @@ -57,6 +67,19 @@ typedef struct { ErrorContext ctx; } ErrorApplicationConfig; +/** + * @brief Launches the applet for displaying the EULA. + * @param RegionCode \ref SetRegion + */ +Result errorEulaShow(SetRegion RegionCode); + +/** + * @brief Launches the applet for displaying the system-update EULA. + * @param RegionCode \ref SetRegion + * @param eula EULA data. Address must be 0x1000-byte aligned. + */ +Result errorSystemUpdateEulaShow(SetRegion RegionCode, ErrorEulaData* eula); + /** * @brief Creates an ErrorSystemConfig struct. * @param c ErrorSystemConfig struct. diff --git a/nx/source/applets/error.c b/nx/source/applets/error.c index 576b4cf8..2abb6a5b 100644 --- a/nx/source/applets/error.c +++ b/nx/source/applets/error.c @@ -76,6 +76,45 @@ static Result _errorShowContext(const void* indata, size_t insize, ErrorContext* return _errorShow(indata, insize, ctx_ptr, ctx_size); } +// Eula + +Result errorEulaShow(SetRegion RegionCode) { + ErrorEulaArg arg; + + memset(&arg, 0, sizeof(arg)); + arg.hdr.type = 3; + arg.hdr.unk_x1 = 1; + arg.regionCode = RegionCode; + + return _errorShow(&arg, sizeof(arg), NULL, 0); +} + +Result errorSystemUpdateEulaShow(SetRegion RegionCode, ErrorEulaData* eula) { + Result rc=0; + AppletHolder holder; + AppletStorage storage={0}; + ErrorEulaArg arg; + + memset(&arg, 0, sizeof(arg)); + arg.hdr.type = 8; + arg.hdr.unk_x1 = 1; + arg.regionCode = RegionCode; + + rc = _errorAppletCreate(&holder, &arg, sizeof(arg), NULL, 0); + + if (R_SUCCEEDED(rc)) { + if (R_SUCCEEDED(rc)) rc = appletCreateTransferMemoryStorage(&storage, eula, sizeof(*eula), false); + if (R_SUCCEEDED(rc)) rc = appletHolderPushInData(&holder, &storage); + } + + if (R_SUCCEEDED(rc)) rc = _errorRun(&holder); + + appletHolderClose(&holder); + appletStorageCloseTmem(&storage); + + return rc; +} + // System Result errorSystemCreate(ErrorSystemConfig* c, const char* dialog_message, const char* fullscreen_message) {