Implement post 4.0.0 language list features in ISettingsServer

This commit is contained in:
Billy Laws 2020-07-09 20:34:57 +01:00 committed by ◱ PixelyIon
parent d1c1fa214c
commit 4cd7502df2
2 changed files with 46 additions and 15 deletions

View File

@ -6,10 +6,12 @@
namespace skyline::service::settings { namespace skyline::service::settings {
ISettingsServer::ISettingsServer(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::settings_ISettingsServer, "settings:ISettingsServer", { ISettingsServer::ISettingsServer(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::settings_ISettingsServer, "settings:ISettingsServer", {
{0x1, SFUNC(ISettingsServer::GetAvailableLanguageCodes)} {0x1, SFUNC(ISettingsServer::GetAvailableLanguageCodes)},
{0x2, SFUNC(ISettingsServer::MakeLanguageCode)},
{0x5, SFUNC(ISettingsServer::GetAvailableLanguageCodes2)}
}) {} }) {}
constexpr std::array<u64, 15> LanguageCodeList = { constexpr std::array<u64, constant::NewLanguageCodeListSize> LanguageCodeList = {
util::MakeMagic<u64>("ja"), util::MakeMagic<u64>("ja"),
util::MakeMagic<u64>("en-US"), util::MakeMagic<u64>("en-US"),
util::MakeMagic<u64>("fr"), util::MakeMagic<u64>("fr"),
@ -24,12 +26,24 @@ namespace skyline::service::settings {
util::MakeMagic<u64>("zh-TW"), util::MakeMagic<u64>("zh-TW"),
util::MakeMagic<u64>("en-GB"), util::MakeMagic<u64>("en-GB"),
util::MakeMagic<u64>("fr-CA"), util::MakeMagic<u64>("fr-CA"),
util::MakeMagic<u64>("es-419") util::MakeMagic<u64>("es-419"),
util::MakeMagic<u64>("zh-Hans"),
util::MakeMagic<u64>("zh-Hant"),
}; };
void ISettingsServer::GetAvailableLanguageCodes(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { void ISettingsServer::GetAvailableLanguageCodes(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
state.process->WriteMemory(LanguageCodeList.data(), request.outputBuf.at(0).address, LanguageCodeList.size() * sizeof(u64)); state.process->WriteMemory(LanguageCodeList.data(), request.outputBuf.at(0).address, constant::OldLanguageCodeListSize * sizeof(u64));
response.Push<i32>(LanguageCodeList.size()); response.Push<i32>(constant::OldLanguageCodeListSize);
}
void ISettingsServer::MakeLanguageCode(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
response.Push<u64>(LanguageCodeList.at(request.Pop<i32>()));
}
void ISettingsServer::GetAvailableLanguageCodes2(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
state.process->WriteMemory(LanguageCodeList.data(), request.outputBuf.at(0).address, constant::NewLanguageCodeListSize * sizeof(u64));
response.Push<i32>(constant::NewLanguageCodeListSize);
} }
} }

View File

@ -6,17 +6,34 @@
#include <services/base_service.h> #include <services/base_service.h>
#include <services/serviceman.h> #include <services/serviceman.h>
namespace skyline::service::settings { namespace skyline::service {
/** namespace constant {
* @brief ISettingsServer or 'set' provides access to user settings (https://switchbrew.org/wiki/Settings_services#set) constexpr size_t OldLanguageCodeListSize = 15; //!< The size of the pre 4.0.0 language code list
*/ constexpr size_t NewLanguageCodeListSize = 17; //!< The size of the post 4.0.0 language code list
class ISettingsServer : public BaseService { }
public:
ISettingsServer(const DeviceState &state, ServiceManager &manager);
namespace settings {
/** /**
* @brief This reads the available language codes that an application can use * @brief ISettingsServer or 'set' provides access to user settings (https://switchbrew.org/wiki/Settings_services#set)
*/ */
void GetAvailableLanguageCodes(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); class ISettingsServer : public BaseService {
}; public:
ISettingsServer(const DeviceState &state, ServiceManager &manager);
/**
* @brief This reads the available language codes that an application can use (pre 4.0.0)
*/
void GetAvailableLanguageCodes(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
/**
* @brief This converts a language code list index to it's corresponding language code
*/
void MakeLanguageCode(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
/**
* @brief This reads the available language codes that an application can use (post 4.0.0)
*/
void GetAvailableLanguageCodes2(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
};
}
} }