diff --git a/src/libs/dialog.cpp b/src/libs/dialog.cpp index 2b8fb45..7f657b5 100644 --- a/src/libs/dialog.cpp +++ b/src/libs/dialog.cpp @@ -199,6 +199,114 @@ void KYTY_SYSV_ABI LoginDialogParamInitialize(void* param) { } // namespace LoginDialog +namespace SigninDialog { + +LIB_NAME("SigninDialog", "SigninDialog"); + +constexpr int SIGNIN_STATUS_NONE = 0; +constexpr int SIGNIN_STATUS_INITIALIZED = 1; +constexpr int SIGNIN_STATUS_RUNNING = 2; +constexpr int SIGNIN_STATUS_FINISHED = 3; +constexpr int SIGNIN_RESULT_USER_CANCELED = 1; + +constexpr int SIGNIN_ERROR_NOT_INITIALIZED = static_cast(0x81350001u); +constexpr int SIGNIN_ERROR_ALREADY_INITIALIZED = static_cast(0x81350002u); +constexpr int SIGNIN_ERROR_PARAM_INVALID = static_cast(0x81350003u); +constexpr int SIGNIN_ERROR_INVALID_STATE = static_cast(0x81350005u); + +struct SigninDialogResult { + int32_t result; + int32_t reserved[3]; +}; + +struct SigninDialogParam { + int32_t size; + int32_t user_id; + int32_t reserved[2]; +}; + +static_assert(sizeof(SigninDialogResult) == 16); +static_assert(sizeof(SigninDialogParam) == 16); + +static int g_signin_status = SIGNIN_STATUS_NONE; + +int KYTY_SYSV_ABI SigninDialogInitialize() { + PRINT_NAME(); + if (g_signin_status != SIGNIN_STATUS_NONE) { + return SIGNIN_ERROR_ALREADY_INITIALIZED; + } + g_signin_status = SIGNIN_STATUS_INITIALIZED; + return OK; +} + +int KYTY_SYSV_ABI SigninDialogTerminate() { + PRINT_NAME(); + if (g_signin_status == SIGNIN_STATUS_NONE) { + return SIGNIN_ERROR_NOT_INITIALIZED; + } + g_signin_status = SIGNIN_STATUS_NONE; + return OK; +} + +int KYTY_SYSV_ABI SigninDialogOpen(const void* param) { + PRINT_NAME(); + if (g_signin_status != SIGNIN_STATUS_INITIALIZED && g_signin_status != SIGNIN_STATUS_FINISHED) { + return SIGNIN_ERROR_INVALID_STATE; + } + if (param == nullptr || + static_cast(param)->size != sizeof(SigninDialogParam)) { + return SIGNIN_ERROR_PARAM_INVALID; + } + g_signin_status = SIGNIN_STATUS_RUNNING; + return OK; +} + +int KYTY_SYSV_ABI SigninDialogClose() { + PRINT_NAME(); + if (g_signin_status == SIGNIN_STATUS_NONE) { + return SIGNIN_ERROR_NOT_INITIALIZED; + } + if (g_signin_status != SIGNIN_STATUS_RUNNING && g_signin_status != SIGNIN_STATUS_FINISHED) { + return SIGNIN_ERROR_INVALID_STATE; + } + g_signin_status = SIGNIN_STATUS_FINISHED; + return OK; +} + +int KYTY_SYSV_ABI SigninDialogUpdateStatus() { + PRINT_NAME(); + if (g_signin_status == SIGNIN_STATUS_RUNNING) { + g_signin_status = SIGNIN_STATUS_FINISHED; + } + return g_signin_status; +} + +int KYTY_SYSV_ABI SigninDialogGetStatus() { + PRINT_NAME(); + return g_signin_status; +} + +int KYTY_SYSV_ABI SigninDialogGetResult(void* result) { + PRINT_NAME(); + if (g_signin_status == SIGNIN_STATUS_NONE) { + return SIGNIN_ERROR_NOT_INITIALIZED; + } + if (g_signin_status != SIGNIN_STATUS_FINISHED) { + return SIGNIN_ERROR_INVALID_STATE; + } + if (result == nullptr) { + return SIGNIN_ERROR_PARAM_INVALID; + } + auto* r = static_cast(result); + r->result = SIGNIN_RESULT_USER_CANCELED; + r->reserved[0] = 0; + r->reserved[1] = 0; + r->reserved[2] = 0; + return OK; +} + +} // namespace SigninDialog + namespace SaveDataDialog { LIB_NAME("SaveDataDialog", "SaveDataDialog"); diff --git a/src/libs/dialog.h b/src/libs/dialog.h index c1a8976..b187ae6 100644 --- a/src/libs/dialog.h +++ b/src/libs/dialog.h @@ -31,6 +31,18 @@ void KYTY_SYSV_ABI LoginDialogParamInitialize(void* param); } // namespace LoginDialog +namespace SigninDialog { + +int KYTY_SYSV_ABI SigninDialogInitialize(); +int KYTY_SYSV_ABI SigninDialogTerminate(); +int KYTY_SYSV_ABI SigninDialogOpen(const void* param); +int KYTY_SYSV_ABI SigninDialogClose(); +int KYTY_SYSV_ABI SigninDialogUpdateStatus(); +int KYTY_SYSV_ABI SigninDialogGetStatus(); +int KYTY_SYSV_ABI SigninDialogGetResult(void* result); + +} // namespace SigninDialog + namespace SaveDataDialog { int KYTY_SYSV_ABI SaveDataDialogInitialize(); diff --git a/src/libs/libDialog.cpp b/src/libs/libDialog.cpp index a27bd5a..32a1057 100644 --- a/src/libs/libDialog.cpp +++ b/src/libs/libDialog.cpp @@ -48,6 +48,24 @@ LIB_DEFINE(InitDialog_1_LoginDialog) { } // namespace LibLoginDialog +namespace LibSigninDialog { + +LIB_VERSION("SigninDialog", 1, "SigninDialog", 1, 1); + +namespace SigninDialog = Dialog::SigninDialog; + +LIB_DEFINE(InitDialog_1_SigninDialog) { + LIB_FUNC("mlYGfmqE3fQ", SigninDialog::SigninDialogInitialize); + LIB_FUNC("LXlmS6PvJdU", SigninDialog::SigninDialogTerminate); + LIB_FUNC("JlpJVoRWv7U", SigninDialog::SigninDialogOpen); + LIB_FUNC("M3OkENHcyiU", SigninDialog::SigninDialogClose); + LIB_FUNC("Bw31liTFT3A", SigninDialog::SigninDialogUpdateStatus); + LIB_FUNC("2m077aeC+PA", SigninDialog::SigninDialogGetStatus); + LIB_FUNC("nqG7rqnYw1U", SigninDialog::SigninDialogGetResult); +} + +} // namespace LibSigninDialog + namespace LibSaveDataDialog { LIB_VERSION("SaveDataDialog", 1, "SaveDataDialog", 1, 1); @@ -127,6 +145,7 @@ LIB_DEFINE(InitDialog_1) { LibCommonDialog::InitDialog_1_CommonDialog(s); LibImeDialog::InitDialog_1_ImeDialog(s); LibLoginDialog::InitDialog_1_LoginDialog(s); + LibSigninDialog::InitDialog_1_SigninDialog(s); LibSaveDataDialog::InitDialog_1_SaveDataDialog(s); LibSaveDataDialogNative::InitDialog_1_SaveDataDialogNative(s); LibMsgDialog::InitDialog_1_MsgDialog(s);