From a14cd3a70c8be703b535a6fd07426bb5f5006bbb Mon Sep 17 00:00:00 2001 From: yellows8 Date: Mon, 14 Oct 2019 14:31:22 -0400 Subject: [PATCH] set: Replaced SetSysFlag/setsysGetFlag/setsysSetFlag with dedicated funcs for each flag, which also handles checking sysver now when needed. Fixed cmd order. Improved docs. --- nx/include/switch/services/set.h | 273 ++++++++++++++++++++++++++----- nx/source/services/set.c | 246 ++++++++++++++++++++++++---- 2 files changed, 449 insertions(+), 70 deletions(-) diff --git a/nx/include/switch/services/set.h b/nx/include/switch/services/set.h index e5162561..8c352c67 100644 --- a/nx/include/switch/services/set.h +++ b/nx/include/switch/services/set.h @@ -53,27 +53,6 @@ typedef enum { SetRegion_TWN = 6, ///< Taiwan } SetRegion; -/// Command IDs for setsysGetFlag/setsysSetFlag. -typedef enum { - SetSysFlag_LockScreen = 7, - SetSysFlag_ConsoleInformationUpload = 25, - SetSysFlag_AutomaticApplicationDownload = 27, - SetSysFlag_Quest = 47, - SetSysFlag_Usb30Enable = 65, - SetSysFlag_NfcEnable = 69, - SetSysFlag_WirelessLanEnable = 73, - SetSysFlag_BluetoothEnable = 88, - SetSysFlag_AutoUpdateEnable = 95, ///< [2.0.0+] - SetSysFlag_BatteryPercentage = 99, ///< [2.0.0+] - SetSysFlag_ExternalRtcReset = 101, ///< [2.0.0+] - SetSysFlag_UsbFullKeyEnable = 103, ///< [3.0.0+] - SetSysFlag_BluetoothAfhEnable = 111, ///< [3.0.0+] - SetSysFlag_BluetoothBoostEnable = 113, ///< [3.0.0+] - SetSysFlag_InRepairProcessEnable = 115, ///< [3.0.0+] - SetSysFlag_HeadphoneVolumeUpdate = 117, ///< [3.0.0+] - SetSysFlag_RequiresRunRepairTimeReviser = 141, ///< [5.0.0+] -} SetSysFlag; - /// Structure returned by \ref setsysGetFirmwareVersion typedef struct { u8 major; @@ -90,8 +69,13 @@ typedef struct { char display_title[0x80]; } SetSysFirmwareVersion; +/// Initialize set. Result setInitialize(void); + +/// Exit set. void setExit(void); + +/// Gets the Service object for the actual set service session. Service* setGetServiceSession(void); /// Converts LanguageCode to \ref SetLanguage. @@ -119,16 +103,63 @@ Result setGetAvailableLanguageCodeCount(s32 *total); /// Gets the RegionCode. Result setGetRegionCode(SetRegion *out); +/// Initialize setsys. Result setsysInitialize(void); + +/// Exit setsys. void setsysExit(void); + +/// Gets the Service object for the actual setsys service session. Service* setsysGetServiceSession(void); +/** + * @brief Gets the system firmware version. + * @param[out] out Firmware version to populate. + */ +Result setsysGetFirmwareVersion(SetSysFirmwareVersion *out); + +/** + * @brief GetLockScreenFlag + * @param[out] out Output flag. + */ +Result setsysGetLockScreenFlag(bool *out); + +/** + * @brief SetLockScreenFlag + * @param[in] flag Input flag. + */ +Result setsysSetLockScreenFlag(bool flag); + /// Gets the current system theme. Result setsysGetColorSetId(ColorSetId *out); /// Sets the current system theme. Result setsysSetColorSetId(ColorSetId id); +/** + * @brief GetConsoleInformationUploadFlag + * @param[out] out Output flag. + */ +Result setsysGetConsoleInformationUploadFlag(bool *out); + +/** + * @brief SetConsoleInformationUploadFlag + * @param[in] flag Input flag. + */ +Result setsysSetConsoleInformationUploadFlag(bool flag); + +/** + * @brief GetAutomaticApplicationDownloadFlag + * @param[out] out Output flag. + */ +Result setsysGetAutomaticApplicationDownloadFlag(bool *out); + +/** + * @brief SetAutomaticApplicationDownloadFlag + * @param[in] flag Input flag. + */ +Result setsysSetAutomaticApplicationDownloadFlag(bool flag); + /** * @brief Gets the size of a settings item value. * @param name Name string. @@ -147,6 +178,30 @@ Result setsysGetSettingsItemValueSize(const char *name, const char *item_key, u6 */ Result setsysGetSettingsItemValue(const char *name, const char *item_key, void *value_out, size_t value_out_size, u64 *size_out); +/** + * @brief GetQuestFlag + * @param[out] out Output flag. + */ +Result setsysGetQuestFlag(bool *out); + +/** + * @brief SetQuestFlag + * @param[in] flag Input flag. + */ +Result setsysSetQuestFlag(bool flag); + +/** + * @brief GetUsb30EnableFlag + * @param[out] out Output flag. + */ +Result setsysGetUsb30EnableFlag(bool *out); + +/** + * @brief SetUsb30EnableFlag + * @param[in] flag Input flag. + */ +Result setsysSetUsb30EnableFlag(bool flag); + /** * @brief Gets the system's serial number. * @param serial Pointer to output the serial to. (The buffer size needs to be at least 0x19 bytes) @@ -154,24 +209,52 @@ Result setsysGetSettingsItemValue(const char *name, const char *item_key, void * Result setsysGetSerialNumber(char *serial); /** - * @brief Gets the status of the specified settings flag. - * @param flag The specified settings flag. - * @param out Output pointer for the status. + * @brief GetNfcEnableFlag + * @param[out] out Output flag. */ -Result setsysGetFlag(SetSysFlag flag, bool *out); +Result setsysGetNfcEnableFlag(bool *out); /** - * @brief Enables/disables the specified settings flag. - * @param flag The specified settings flag. - * @param enable To enable/disable the flag. + * @brief SetNfcEnableFlag + * @param[in] flag Input flag. */ -Result setsysSetFlag(SetSysFlag flag, bool enable); +Result setsysSetNfcEnableFlag(bool flag); /** - * @brief Gets the system firmware version. - * @param out Firmware version to populate. + * @brief GetWirelessLanEnableFlag + * @param[out] out Output flag. */ -Result setsysGetFirmwareVersion(SetSysFirmwareVersion *out); +Result setsysGetWirelessLanEnableFlag(bool *out); + +/** + * @brief SetWirelessLanEnableFlag + * @param[in] flag Input flag. + */ +Result setsysSetWirelessLanEnableFlag(bool flag); + +/** + * @brief Gets the system's nickname. + * @param nickname Pointer to output the nickname to. (The buffer size needs to be at least 0x80 bytes) + */ +Result setsysGetDeviceNickname(char* nickname); + +/** + * @brief Sets the system's nickname. + * @param nickname Pointer to read the nickname from. + */ +Result setsysSetDeviceNickname(const char* nickname); + +/** + * @brief GetBluetoothEnableFlag + * @param[out] out Output flag. + */ +Result setsysGetBluetoothEnableFlag(bool *out); + +/** + * @brief SetBluetoothEnableFlag + * @param[in] flag Input flag. + */ +Result setsysSetBluetoothEnableFlag(bool flag); /** * @brief Gets an event that settings will signal on flag change. @@ -187,13 +270,127 @@ Result setsysBindFatalDirtyFlagEvent(Event *out_event); Result setsysGetFatalDirtyFlags(u64 *flags_0, u64 *flags_1); /** - * @brief Gets the system's nickname. - * @param nickname Pointer to output the nickname to. (The buffer size needs to be at least 0x80 bytes) + * @brief GetAutoUpdateEnableFlag + * @note Only available on [2.0.0+]. + * @param[out] out Output flag. */ -Result setsysGetDeviceNickname(char* nickname); +Result setsysGetAutoUpdateEnableFlag(bool *out); /** - * @brief Sets the system's nickname. - * @param nickname Pointer to read the nickname from. + * @brief SetAutoUpdateEnableFlag + * @note Only available on [2.0.0+]. + * @param[in] flag Input flag. */ -Result setsysSetDeviceNickname(const char* nickname); +Result setsysSetAutoUpdateEnableFlag(bool flag); + +/** + * @brief GetBatteryPercentageFlag + * @note Only available on [2.0.0+]. + * @param[out] out Output flag. + */ +Result setsysGetBatteryPercentageFlag(bool *out); + +/** + * @brief SetBatteryPercentageFlag + * @note Only available on [2.0.0+]. + * @param[in] flag Input flag. + */ +Result setsysSetBatteryPercentageFlag(bool flag); + +/** + * @brief GetExternalRtcResetFlag + * @note Only available on [2.0.0+]. + * @param[out] out Output flag. + */ +Result setsysGetExternalRtcResetFlag(bool *out); + +/** + * @brief SetExternalRtcResetFlag + * @note Only available on [2.0.0+]. + * @param[in] flag Input flag. + */ +Result setsysSetExternalRtcResetFlag(bool flag); + +/** + * @brief GetUsbFullKeyEnableFlag + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result setsysGetUsbFullKeyEnableFlag(bool *out); + +/** + * @brief SetUsbFullKeyEnableFlag + * @note Only available on [3.0.0+]. + * @param[in] flag Input flag. + */ +Result setsysSetUsbFullKeyEnableFlag(bool flag); + +/** + * @brief GetBluetoothAfhEnableFlag + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result setsysGetBluetoothAfhEnableFlag(bool *out); + +/** + * @brief SetBluetoothAfhEnableFlag + * @note Only available on [3.0.0+]. + * @param[in] flag Input flag. + */ +Result setsysSetBluetoothAfhEnableFlag(bool flag); + +/** + * @brief GetBluetoothBoostEnableFlag + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result setsysGetBluetoothBoostEnableFlag(bool *out); + +/** + * @brief SetBluetoothBoostEnableFlag + * @note Only available on [3.0.0+]. + * @param[in] flag Input flag. + */ +Result setsysSetBluetoothBoostEnableFlag(bool flag); + +/** + * @brief GetInRepairProcessEnableFlag + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result setsysGetInRepairProcessEnableFlag(bool *out); + +/** + * @brief SetInRepairProcessEnableFlag + * @note Only available on [3.0.0+]. + * @param[in] flag Input flag. + */ +Result setsysSetInRepairProcessEnableFlag(bool flag); + +/** + * @brief GetHeadphoneVolumeUpdateFlag + * @note Only available on [3.0.0+]. + * @param[out] out Output flag. + */ +Result setsysGetHeadphoneVolumeUpdateFlag(bool *out); + +/** + * @brief SetHeadphoneVolumeUpdateFlag + * @note Only available on [3.0.0+]. + * @param[in] flag Input flag. + */ +Result setsysSetHeadphoneVolumeUpdateFlag(bool flag); + +/** + * @brief GetRequiresRunRepairTimeReviser + * @note Only available on [5.0.0+]. + * @param[out] out Output flag. + */ +Result setsysGetRequiresRunRepairTimeReviser(bool *out); + +/** + * @brief SetRequiresRunRepairTimeReviser + * @note Only available on [5.0.0+]. + * @param[in] flag Input flag. + */ +Result setsysSetRequiresRunRepairTimeReviser(bool flag); diff --git a/nx/source/services/set.c b/nx/source/services/set.c index 720d45b8..00dd0d10 100644 --- a/nx/source/services/set.c +++ b/nx/source/services/set.c @@ -186,6 +186,30 @@ Result setGetRegionCode(SetRegion *out) { return rc; } +static Result _setsysGetFirmwareVersionImpl(SetSysFirmwareVersion *out, u32 cmd_id) { + return serviceDispatch(&g_setsysSrv, cmd_id, + .buffer_attrs = { SfBufferAttr_FixedSize | SfBufferAttr_HipcPointer | SfBufferAttr_Out }, + .buffers = { { out, sizeof(*out) } }, + ); +} + +Result setsysGetFirmwareVersion(SetSysFirmwareVersion *out) { + /* GetFirmwareVersion2 does exactly what GetFirmwareVersion does, except it doesn't zero the revision field. */ + if (hosversionAtLeast(3,0,0)) { + return _setsysGetFirmwareVersionImpl(out, 4); + } else { + return _setsysGetFirmwareVersionImpl(out, 3); + } +} + +Result setsysGetLockScreenFlag(bool *out) { + return _setCmdNoInOutBool(&g_setsysSrv, out, 7); +} + +Result setsysSetLockScreenFlag(bool flag) { + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 8); +} + Result setsysGetColorSetId(ColorSetId *out) { u32 color_set=0; Result rc = _setCmdNoInOutU32(&g_setsysSrv, &color_set, 23); @@ -197,6 +221,22 @@ Result setsysSetColorSetId(ColorSetId id) { return _setCmdInU32NoOut(&g_setsysSrv, id, 24); } +Result setsysGetConsoleInformationUploadFlag(bool *out) { + return _setCmdNoInOutBool(&g_setsysSrv, out, 25); +} + +Result setsysSetConsoleInformationUploadFlag(bool flag) { + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 26); +} + +Result setsysGetAutomaticApplicationDownloadFlag(bool *out) { + return _setCmdNoInOutBool(&g_setsysSrv, out, 27); +} + +Result setsysSetAutomaticApplicationDownloadFlag(bool flag) { + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 28); +} + Result setsysGetSettingsItemValueSize(const char *name, const char *item_key, u64 *size_out) { char send_name[SET_MAX_NAME_SIZE]; char send_item_key[SET_MAX_NAME_SIZE]; @@ -241,6 +281,22 @@ Result setsysGetSettingsItemValue(const char *name, const char *item_key, void * ); } +Result setsysGetQuestFlag(bool *out) { + return _setCmdNoInOutBool(&g_setsysSrv, out, 47); +} + +Result setsysSetQuestFlag(bool flag) { + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 48); +} + +Result setsysGetUsb30EnableFlag(bool *out) { + return _setCmdNoInOutBool(&g_setsysSrv, out, 65); +} + +Result setsysSetUsb30EnableFlag(bool flag) { + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 66); +} + Result setsysGetSerialNumber(char *serial) { char out[0x18]={0}; @@ -252,44 +308,20 @@ Result setsysGetSerialNumber(char *serial) { return rc; } -Result setsysGetFlag(SetSysFlag flag, bool *out) { - return _setCmdNoInOutBool(&g_setsysSrv, out, flag); +Result setsysGetNfcEnableFlag(bool *out) { + return _setCmdNoInOutBool(&g_setsysSrv, out, 69); } -Result setsysSetFlag(SetSysFlag flag, bool enable) { - return _setCmdInBoolNoOut(&g_setsysSrv, enable, flag + 1); +Result setsysSetNfcEnableFlag(bool flag) { + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 70); } -static Result _setsysGetFirmwareVersionImpl(SetSysFirmwareVersion *out, u32 cmd_id) { - return serviceDispatch(&g_setsysSrv, cmd_id, - .buffer_attrs = { SfBufferAttr_FixedSize | SfBufferAttr_HipcPointer | SfBufferAttr_Out }, - .buffers = { { out, sizeof(*out) } }, - ); +Result setsysGetWirelessLanEnableFlag(bool *out) { + return _setCmdNoInOutBool(&g_setsysSrv, out, 73); } -Result setsysGetFirmwareVersion(SetSysFirmwareVersion *out) { - /* GetFirmwareVersion2 does exactly what GetFirmwareVersion does, except it doesn't zero the revision field. */ - if (hosversionAtLeast(3,0,0)) { - return _setsysGetFirmwareVersionImpl(out, 4); - } else { - return _setsysGetFirmwareVersionImpl(out, 3); - } -} - -Result setsysBindFatalDirtyFlagEvent(Event *out_event) { - return _setCmdGetEvent(&g_setsysSrv, out_event, false, 93); -} - -Result setsysGetFatalDirtyFlags(u64 *flags_0, u64 *flags_1) { - struct { - u64 flags_0; - u64 flags_1; - } out; - - Result rc = serviceDispatchOut(&g_setsysSrv, 94, out); - if (R_SUCCEEDED(rc) && flags_0) *flags_0 = out.flags_0; - if (R_SUCCEEDED(rc) && flags_1) *flags_1 = out.flags_1; - return rc; +Result setsysSetWirelessLanEnableFlag(bool flag) { + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 74); } Result setsysGetDeviceNickname(char* nickname) { @@ -308,3 +340,153 @@ Result setsysSetDeviceNickname(const char* nickname) { .buffers = { { send_nickname, SET_MAX_NICKNAME_SIZE } }, ); } + +Result setsysGetBluetoothEnableFlag(bool *out) { + return _setCmdNoInOutBool(&g_setsysSrv, out, 88); +} + +Result setsysSetBluetoothEnableFlag(bool flag) { + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 89); +} + +Result setsysBindFatalDirtyFlagEvent(Event *out_event) { + return _setCmdGetEvent(&g_setsysSrv, out_event, false, 93); +} + +Result setsysGetFatalDirtyFlags(u64 *flags_0, u64 *flags_1) { + struct { + u64 flags_0; + u64 flags_1; + } out; + + Result rc = serviceDispatchOut(&g_setsysSrv, 94, out); + if (R_SUCCEEDED(rc) && flags_0) *flags_0 = out.flags_0; + if (R_SUCCEEDED(rc) && flags_1) *flags_1 = out.flags_1; + return rc; +} + +Result setsysGetAutoUpdateEnableFlag(bool *out) { + if (hosversionBefore(2,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdNoInOutBool(&g_setsysSrv, out, 95); +} + +Result setsysSetAutoUpdateEnableFlag(bool flag) { + if (hosversionBefore(2,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 96); +} + +Result setsysGetBatteryPercentageFlag(bool *out) { + if (hosversionBefore(2,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdNoInOutBool(&g_setsysSrv, out, 99); +} + +Result setsysSetBatteryPercentageFlag(bool flag) { + if (hosversionBefore(2,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 100); +} + +Result setsysGetExternalRtcResetFlag(bool *out) { + if (hosversionBefore(2,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdNoInOutBool(&g_setsysSrv, out, 101); +} + +Result setsysSetExternalRtcResetFlag(bool flag) { + if (hosversionBefore(2,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 102); +} + +Result setsysGetUsbFullKeyEnableFlag(bool *out) { + if (hosversionBefore(3,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdNoInOutBool(&g_setsysSrv, out, 103); +} + +Result setsysSetUsbFullKeyEnableFlag(bool flag) { + if (hosversionBefore(3,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 104); +} + +Result setsysGetBluetoothAfhEnableFlag(bool *out) { + if (hosversionBefore(3,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdNoInOutBool(&g_setsysSrv, out, 111); +} + +Result setsysSetBluetoothAfhEnableFlag(bool flag) { + if (hosversionBefore(3,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 112); +} + +Result setsysGetBluetoothBoostEnableFlag(bool *out) { + if (hosversionBefore(3,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdNoInOutBool(&g_setsysSrv, out, 113); +} + +Result setsysSetBluetoothBoostEnableFlag(bool flag) { + if (hosversionBefore(3,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 114); +} + +Result setsysGetInRepairProcessEnableFlag(bool *out) { + if (hosversionBefore(3,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdNoInOutBool(&g_setsysSrv, out, 115); +} + +Result setsysSetInRepairProcessEnableFlag(bool flag) { + if (hosversionBefore(3,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 116); +} + +Result setsysGetHeadphoneVolumeUpdateFlag(bool *out) { + if (hosversionBefore(3,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdNoInOutBool(&g_setsysSrv, out, 117); +} + +Result setsysSetHeadphoneVolumeUpdateFlag(bool flag) { + if (hosversionBefore(3,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 118); +} + +Result setsysGetRequiresRunRepairTimeReviser(bool *out) { + if (hosversionBefore(5,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdNoInOutBool(&g_setsysSrv, out, 141); +} + +Result setsysSetRequiresRunRepairTimeReviser(bool flag) { + if (hosversionBefore(5,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 142); +}