diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/crypto/key_manager.h | 9 | ||||
| -rw-r--r-- | src/core/file_sys/bis_factory.cpp | 2 | ||||
| -rw-r--r-- | src/core/file_sys/card_image.h | 2 | ||||
| -rw-r--r-- | src/core/file_sys/content_archive.h | 2 | ||||
| -rw-r--r-- | src/core/file_sys/registered_cache.h | 2 | ||||
| -rw-r--r-- | src/core/file_sys/submission_package.cpp | 2 | ||||
| -rw-r--r-- | src/core/file_sys/submission_package.h | 2 | ||||
| -rw-r--r-- | src/core/file_sys/xts_archive.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/acc/acc.cpp | 9 | ||||
| -rw-r--r-- | src/core/hle/service/acc/acc.h | 1 | ||||
| -rw-r--r-- | src/core/hle/service/acc/acc_su.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/service/acc/acc_u0.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/service/acc/acc_u1.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/service/am/am.cpp | 14 | ||||
| -rw-r--r-- | src/core/hle/service/es/es.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/service/set/set.cpp | 72 | ||||
| -rw-r--r-- | src/core/hle/service/set/set.h | 2 | 
17 files changed, 113 insertions, 18 deletions
| diff --git a/src/core/crypto/key_manager.h b/src/core/crypto/key_manager.h index bf3434e1c..9269a73f2 100644 --- a/src/core/crypto/key_manager.h +++ b/src/core/crypto/key_manager.h @@ -223,13 +223,16 @@ bool operator<(const KeyIndex<KeyType>& lhs, const KeyIndex<KeyType>& rhs) {  class KeyManager {  public: -    static KeyManager& instance() { +    static KeyManager& Instance() {          static KeyManager instance;          return instance;      } -    KeyManager(KeyManager const&) = delete; -    void operator=(KeyManager const&) = delete; +    KeyManager(const KeyManager&) = delete; +    KeyManager& operator=(const KeyManager&) = delete; + +    KeyManager(KeyManager&&) = delete; +    KeyManager& operator=(KeyManager&&) = delete;      bool HasKey(S128KeyType id, u64 field1 = 0, u64 field2 = 0) const;      bool HasKey(S256KeyType id, u64 field1 = 0, u64 field2 = 0) const; diff --git a/src/core/file_sys/bis_factory.cpp b/src/core/file_sys/bis_factory.cpp index 464ca6503..8935a62c3 100644 --- a/src/core/file_sys/bis_factory.cpp +++ b/src/core/file_sys/bis_factory.cpp @@ -79,7 +79,7 @@ VirtualDir BISFactory::OpenPartition(BisPartitionId id) const {  }  VirtualFile BISFactory::OpenPartitionStorage(BisPartitionId id) const { -    Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::instance(); +    auto& keys = Core::Crypto::KeyManager::Instance();      Core::Crypto::PartitionDataManager pdm{          Core::System::GetInstance().GetFilesystem()->OpenDirectory(              FileUtil::GetUserPath(FileUtil::UserPath::SysDataDir), Mode::Read)}; diff --git a/src/core/file_sys/card_image.h b/src/core/file_sys/card_image.h index a09d504ae..e1b136426 100644 --- a/src/core/file_sys/card_image.h +++ b/src/core/file_sys/card_image.h @@ -140,6 +140,6 @@ private:      u64 update_normal_partition_end; -    Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::instance(); +    Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::Instance();  };  } // namespace FileSys diff --git a/src/core/file_sys/content_archive.h b/src/core/file_sys/content_archive.h index e6c887b32..d25cbcf91 100644 --- a/src/core/file_sys/content_archive.h +++ b/src/core/file_sys/content_archive.h @@ -158,7 +158,7 @@ private:      bool encrypted = false;      bool is_update = false; -    Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::instance(); +    Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::Instance();  };  } // namespace FileSys diff --git a/src/core/file_sys/registered_cache.h b/src/core/file_sys/registered_cache.h index 4b2fb08cb..f339cd17b 100644 --- a/src/core/file_sys/registered_cache.h +++ b/src/core/file_sys/registered_cache.h @@ -88,7 +88,7 @@ public:  protected:      // A single instance of KeyManager to be used by GetEntry() -    Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::instance(); +    Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::Instance();  };  class PlaceholderCache { diff --git a/src/core/file_sys/submission_package.cpp b/src/core/file_sys/submission_package.cpp index c35a0d10b..175a8266a 100644 --- a/src/core/file_sys/submission_package.cpp +++ b/src/core/file_sys/submission_package.cpp @@ -21,7 +21,7 @@  namespace FileSys {  namespace {  void SetTicketKeys(const std::vector<VirtualFile>& files) { -    Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::instance(); +    auto& keys = Core::Crypto::KeyManager::Instance();      for (const auto& ticket_file : files) {          if (ticket_file == nullptr) { diff --git a/src/core/file_sys/submission_package.h b/src/core/file_sys/submission_package.h index bd577f6e5..cf89de6a9 100644 --- a/src/core/file_sys/submission_package.h +++ b/src/core/file_sys/submission_package.h @@ -73,7 +73,7 @@ private:      std::map<u64, std::map<std::pair<TitleType, ContentRecordType>, std::shared_ptr<NCA>>> ncas;      std::vector<VirtualFile> ticket_files; -    Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::instance(); +    Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::Instance();      VirtualFile romfs;      VirtualDir exefs; diff --git a/src/core/file_sys/xts_archive.h b/src/core/file_sys/xts_archive.h index 95da907bc..563531bb6 100644 --- a/src/core/file_sys/xts_archive.h +++ b/src/core/file_sys/xts_archive.h @@ -62,6 +62,6 @@ private:      VirtualFile dec_file; -    Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::instance(); +    Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::Instance();  };  } // namespace FileSys diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index 94d8c1fc6..8ac856ec3 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp @@ -776,6 +776,15 @@ void Module::Interface::ListQualifiedUsers(Kernel::HLERequestContext& ctx) {      rb.Push(RESULT_SUCCESS);  } +void Module::Interface::ListOpenContextStoredUsers(Kernel::HLERequestContext& ctx) { +    LOG_WARNING(Service_ACC, "(STUBBED) called"); + +    // TODO(ogniK): Handle open contexts +    ctx.WriteBuffer(profile_manager->GetOpenUsers()); +    IPC::ResponseBuilder rb{ctx, 2}; +    rb.Push(RESULT_SUCCESS); +} +  void Module::Interface::TrySelectUserWithoutInteraction(Kernel::HLERequestContext& ctx) {      LOG_DEBUG(Service_ACC, "called");      // A u8 is passed into this function which we can safely ignore. It's to determine if we have diff --git a/src/core/hle/service/acc/acc.h b/src/core/hle/service/acc/acc.h index 74ca39d6e..d4c6395c6 100644 --- a/src/core/hle/service/acc/acc.h +++ b/src/core/hle/service/acc/acc.h @@ -34,6 +34,7 @@ public:          void IsUserAccountSwitchLocked(Kernel::HLERequestContext& ctx);          void GetProfileEditor(Kernel::HLERequestContext& ctx);          void ListQualifiedUsers(Kernel::HLERequestContext& ctx); +        void ListOpenContextStoredUsers(Kernel::HLERequestContext& ctx);      private:          ResultCode InitializeApplicationInfoBase(); diff --git a/src/core/hle/service/acc/acc_su.cpp b/src/core/hle/service/acc/acc_su.cpp index 85620bde3..d2bb8c2c8 100644 --- a/src/core/hle/service/acc/acc_su.cpp +++ b/src/core/hle/service/acc/acc_su.cpp @@ -20,7 +20,7 @@ ACC_SU::ACC_SU(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p          {6, nullptr, "GetProfileDigest"}, // 3.0.0+          {50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},          {51, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, -        {60, nullptr, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0 +        {60, &ACC_SU::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0          {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+          {100, nullptr, "GetUserRegistrationNotifier"},          {101, nullptr, "GetUserStateChangeNotifier"}, diff --git a/src/core/hle/service/acc/acc_u0.cpp b/src/core/hle/service/acc/acc_u0.cpp index 49f6e20f1..cb44e06b7 100644 --- a/src/core/hle/service/acc/acc_u0.cpp +++ b/src/core/hle/service/acc/acc_u0.cpp @@ -20,7 +20,7 @@ ACC_U0::ACC_U0(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p          {6, nullptr, "GetProfileDigest"}, // 3.0.0+          {50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},          {51, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, -        {60, nullptr, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0 +        {60, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0          {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+          {100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"},          {101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"}, @@ -30,7 +30,7 @@ ACC_U0::ACC_U0(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p          {111, nullptr, "ClearSaveDataThumbnail"},          {120, nullptr, "CreateGuestLoginRequest"},          {130, nullptr, "LoadOpenContext"}, // 5.0.0+ -        {131, nullptr, "ListOpenContextStoredUsers"}, // 6.0.0+ +        {131, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 6.0.0+          {140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted"}, // 6.0.0+          {141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers"}, // 6.0.0+          {150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked"}, // 6.0.0+ diff --git a/src/core/hle/service/acc/acc_u1.cpp b/src/core/hle/service/acc/acc_u1.cpp index f47004f84..a4aa5316a 100644 --- a/src/core/hle/service/acc/acc_u1.cpp +++ b/src/core/hle/service/acc/acc_u1.cpp @@ -20,7 +20,7 @@ ACC_U1::ACC_U1(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p          {6, nullptr, "GetProfileDigest"}, // 3.0.0+          {50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},          {51, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, -        {60, nullptr, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0 +        {60, &ACC_U1::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0          {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+          {100, nullptr, "GetUserRegistrationNotifier"},          {101, nullptr, "GetUserStateChangeNotifier"}, diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 20f366635..1bb544dd8 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -841,7 +841,7 @@ public:              {110, nullptr, "NeedsToExitProcess"},              {120, nullptr, "GetLibraryAppletInfo"},              {150, nullptr, "RequestForAppletToGetForeground"}, -            {160, nullptr, "GetIndirectLayerConsumerHandle"}, +            {160, &ILibraryAppletAccessor::GetIndirectLayerConsumerHandle, "GetIndirectLayerConsumerHandle"},          };          // clang-format on @@ -960,6 +960,18 @@ private:          rb.PushCopyObjects(applet->GetBroker().GetInteractiveDataEvent());      } +    void GetIndirectLayerConsumerHandle(Kernel::HLERequestContext& ctx) { +        LOG_WARNING(Service_AM, "(STUBBED) called"); + +        // We require a non-zero handle to be valid. Using 0xdeadbeef allows us to trace if this is +        // actually used anywhere +        constexpr u64 handle = 0xdeadbeef; + +        IPC::ResponseBuilder rb{ctx, 4}; +        rb.Push(RESULT_SUCCESS); +        rb.Push(handle); +    } +      std::shared_ptr<Applets::Applet> applet;  }; diff --git a/src/core/hle/service/es/es.cpp b/src/core/hle/service/es/es.cpp index da6b74a22..a41c73c48 100644 --- a/src/core/hle/service/es/es.cpp +++ b/src/core/hle/service/es/es.cpp @@ -302,7 +302,7 @@ private:          rb.Push<u64>(write_size);      } -    Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::instance(); +    Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::Instance();  };  void InstallInterfaces(SM::ServiceManager& service_manager) { diff --git a/src/core/hle/service/set/set.cpp b/src/core/hle/service/set/set.cpp index f3b4b286c..e5cfd2101 100644 --- a/src/core/hle/service/set/set.cpp +++ b/src/core/hle/service/set/set.cpp @@ -3,6 +3,7 @@  // Refer to the license.txt file included.  #include <algorithm> +#include <array>  #include <chrono>  #include "common/logging/log.h"  #include "core/hle/ipc_helpers.h" @@ -31,6 +32,44 @@ constexpr std::array<LanguageCode, 17> available_language_codes = {{      LanguageCode::ZH_HANT,  }}; +enum class KeyboardLayout : u64 { +    Japanese = 0, +    EnglishUs = 1, +    EnglishUsInternational = 2, +    EnglishUk = 3, +    French = 4, +    FrenchCa = 5, +    Spanish = 6, +    SpanishLatin = 7, +    German = 8, +    Italian = 9, +    Portuguese = 10, +    Russian = 11, +    Korean = 12, +    ChineseSimplified = 13, +    ChineseTraditional = 14, +}; + +constexpr std::array<std::pair<LanguageCode, KeyboardLayout>, 17> language_to_layout{{ +    {LanguageCode::JA, KeyboardLayout::Japanese}, +    {LanguageCode::EN_US, KeyboardLayout::EnglishUs}, +    {LanguageCode::FR, KeyboardLayout::French}, +    {LanguageCode::DE, KeyboardLayout::German}, +    {LanguageCode::IT, KeyboardLayout::Italian}, +    {LanguageCode::ES, KeyboardLayout::Spanish}, +    {LanguageCode::ZH_CN, KeyboardLayout::ChineseSimplified}, +    {LanguageCode::KO, KeyboardLayout::Korean}, +    {LanguageCode::NL, KeyboardLayout::EnglishUsInternational}, +    {LanguageCode::PT, KeyboardLayout::Portuguese}, +    {LanguageCode::RU, KeyboardLayout::Russian}, +    {LanguageCode::ZH_TW, KeyboardLayout::ChineseTraditional}, +    {LanguageCode::EN_GB, KeyboardLayout::EnglishUk}, +    {LanguageCode::FR_CA, KeyboardLayout::FrenchCa}, +    {LanguageCode::ES_419, KeyboardLayout::SpanishLatin}, +    {LanguageCode::ZH_HANS, KeyboardLayout::ChineseSimplified}, +    {LanguageCode::ZH_HANT, KeyboardLayout::ChineseTraditional}, +}}; +  constexpr std::size_t pre4_0_0_max_entries = 15;  constexpr std::size_t post4_0_0_max_entries = 17; @@ -50,6 +89,25 @@ void GetAvailableLanguageCodesImpl(Kernel::HLERequestContext& ctx, std::size_t m      ctx.WriteBuffer(available_language_codes.data(), copy_size);      PushResponseLanguageCode(ctx, copy_amount);  } + +void GetKeyCodeMapImpl(Kernel::HLERequestContext& ctx) { +    const auto language_code = available_language_codes[Settings::values.language_index]; +    const auto key_code = +        std::find_if(language_to_layout.cbegin(), language_to_layout.cend(), +                     [=](const auto& element) { return element.first == language_code; }); +    KeyboardLayout layout = KeyboardLayout::EnglishUs; +    if (key_code == language_to_layout.cend()) { +        LOG_ERROR(Service_SET, +                  "Could not find keyboard layout for language index {}, defaulting to English us", +                  Settings::values.language_index); +    } else { +        layout = key_code->second; +    } + +    IPC::ResponseBuilder rb{ctx, 2}; +    rb.Push(RESULT_SUCCESS); +    ctx.WriteBuffer(&layout, sizeof(KeyboardLayout)); +}  } // Anonymous namespace  LanguageCode GetLanguageCodeFromIndex(std::size_t index) { @@ -120,6 +178,16 @@ void SET::GetRegionCode(Kernel::HLERequestContext& ctx) {      rb.Push(Settings::values.region_index);  } +void SET::GetKeyCodeMap(Kernel::HLERequestContext& ctx) { +    LOG_DEBUG(Service_SET, "Called {}", ctx.Description()); +    GetKeyCodeMapImpl(ctx); +} + +void SET::GetKeyCodeMap2(Kernel::HLERequestContext& ctx) { +    LOG_DEBUG(Service_SET, "Called {}", ctx.Description()); +    GetKeyCodeMapImpl(ctx); +} +  SET::SET() : ServiceFramework("set") {      // clang-format off      static const FunctionInfo functions[] = { @@ -130,9 +198,9 @@ SET::SET() : ServiceFramework("set") {          {4, &SET::GetRegionCode, "GetRegionCode"},          {5, &SET::GetAvailableLanguageCodes2, "GetAvailableLanguageCodes2"},          {6, &SET::GetAvailableLanguageCodeCount2, "GetAvailableLanguageCodeCount2"}, -        {7, nullptr, "GetKeyCodeMap"}, +        {7, &SET::GetKeyCodeMap, "GetKeyCodeMap"},          {8, &SET::GetQuestFlag, "GetQuestFlag"}, -        {9, nullptr, "GetKeyCodeMap2"}, +        {9, &SET::GetKeyCodeMap2, "GetKeyCodeMap2"},          {10, nullptr, "GetFirmwareVersionForDebug"},      };      // clang-format on diff --git a/src/core/hle/service/set/set.h b/src/core/hle/service/set/set.h index 6084b345d..8ac9c169d 100644 --- a/src/core/hle/service/set/set.h +++ b/src/core/hle/service/set/set.h @@ -44,6 +44,8 @@ private:      void GetAvailableLanguageCodeCount2(Kernel::HLERequestContext& ctx);      void GetQuestFlag(Kernel::HLERequestContext& ctx);      void GetRegionCode(Kernel::HLERequestContext& ctx); +    void GetKeyCodeMap(Kernel::HLERequestContext& ctx); +    void GetKeyCodeMap2(Kernel::HLERequestContext& ctx);  };  } // namespace Service::Set | 
