Просмотр исходного кода

glue: Add manager to keep track of application registry
Manages mapping between title IDs and application launch and control properties.

Zach Hilman 7 лет назад
Родитель
Сommit
5f8d2a2044
3 измененных файлов с 121 добавлено и 0 удалено
  1. 2 0
      src/core/CMakeLists.txt
  2. 73 0
      src/core/hle/service/glue/manager.cpp
  3. 46 0
      src/core/hle/service/glue/manager.h

+ 2 - 0
src/core/CMakeLists.txt

@@ -276,6 +276,8 @@ add_library(core STATIC
     hle/service/friend/friend.h
     hle/service/friend/interface.cpp
     hle/service/friend/interface.h
+    hle/service/glue/manager.cpp
+    hle/service/glue/manager.h
     hle/service/grc/grc.cpp
     hle/service/grc/grc.h
     hle/service/hid/hid.cpp

+ 73 - 0
src/core/hle/service/glue/manager.cpp

@@ -0,0 +1,73 @@
+// Copyright 2019 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/service/glue/errors.h"
+#include "core/hle/service/glue/manager.h"
+
+namespace Service::Glue {
+
+ARPManager::ARPManager() = default;
+
+ARPManager::~ARPManager() = default;
+
+ResultVal<ApplicationLaunchProperty> ARPManager::GetLaunchProperty(u64 title_id) const {
+    if (title_id == 0) {
+        return ERR_TITLE_ID_ZERO;
+    }
+
+    const auto iter = entries.find(title_id);
+    if (iter == entries.end()) {
+        return ERR_NONEXISTENT;
+    }
+
+    return MakeResult<ApplicationLaunchProperty>(iter->second.launch);
+}
+
+ResultVal<std::vector<u8>> ARPManager::GetControlProperty(u64 title_id) const {
+    if (title_id == 0) {
+        return ERR_TITLE_ID_ZERO;
+    }
+
+    const auto iter = entries.find(title_id);
+    if (iter == entries.end()) {
+        return ERR_NONEXISTENT;
+    }
+
+    return MakeResult<std::vector<u8>>(iter->second.control);
+}
+
+ResultCode ARPManager::Register(u64 title_id, ApplicationLaunchProperty launch,
+                                std::vector<u8> control) {
+    if (title_id == 0) {
+        return ERR_TITLE_ID_ZERO;
+    }
+
+    const auto iter = entries.find(title_id);
+    if (iter != entries.end()) {
+        return ERR_ALREADY_ISSUED;
+    }
+
+    entries.insert_or_assign(title_id, MapEntry{launch, std::move(control)});
+    return RESULT_SUCCESS;
+}
+
+ResultCode ARPManager::Unregister(u64 title_id) {
+    if (title_id == 0) {
+        return ERR_TITLE_ID_ZERO;
+    }
+
+    const auto iter = entries.find(title_id);
+    if (iter == entries.end()) {
+        return ERR_NONEXISTENT;
+    }
+
+    entries.erase(iter);
+    return RESULT_SUCCESS;
+}
+
+void ARPManager::ResetAll() {
+    entries.clear();
+}
+
+} // namespace Service::Glue

+ 46 - 0
src/core/hle/service/glue/manager.h

@@ -0,0 +1,46 @@
+// Copyright 2019 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include "core/file_sys/control_metadata.h"
+#include "core/file_sys/romfs_factory.h"
+#include "core/hle/result.h"
+
+namespace Service::Glue {
+
+struct ApplicationLaunchProperty {
+    u64 title_id;
+    u32 version;
+    FileSys::StorageId base_game_storage_id;
+    FileSys::StorageId update_storage_id;
+    INSERT_PADDING_BYTES(0x2);
+};
+static_assert(sizeof(ApplicationLaunchProperty) == 0x10,
+              "ApplicationLaunchProperty has incorrect size.");
+
+class ARPManager {
+public:
+    ARPManager();
+    ~ARPManager();
+
+    ResultVal<ApplicationLaunchProperty> GetLaunchProperty(u64 title_id) const;
+    ResultVal<std::vector<u8>> GetControlProperty(u64 title_id) const;
+
+    ResultCode Register(u64 title_id, ApplicationLaunchProperty launch, std::vector<u8> control);
+
+    ResultCode Unregister(u64 title_id);
+
+    void ResetAll();
+
+private:
+    struct MapEntry {
+        ApplicationLaunchProperty launch;
+        std::vector<u8> control;
+    };
+
+    std::map<u64, MapEntry> entries;
+};
+
+} // namespace Service::Glue