glue: Add manager to keep track of application registry
Manages mapping between title IDs and application launch and control properties.
This commit is contained in:
		| @@ -276,6 +276,8 @@ add_library(core STATIC | |||||||
|     hle/service/friend/friend.h |     hle/service/friend/friend.h | ||||||
|     hle/service/friend/interface.cpp |     hle/service/friend/interface.cpp | ||||||
|     hle/service/friend/interface.h |     hle/service/friend/interface.h | ||||||
|  |     hle/service/glue/manager.cpp | ||||||
|  |     hle/service/glue/manager.h | ||||||
|     hle/service/grc/grc.cpp |     hle/service/grc/grc.cpp | ||||||
|     hle/service/grc/grc.h |     hle/service/grc/grc.h | ||||||
|     hle/service/hid/hid.cpp |     hle/service/hid/hid.cpp | ||||||
|   | |||||||
							
								
								
									
										73
									
								
								src/core/hle/service/glue/manager.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								src/core/hle/service/glue/manager.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -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
									
								
								src/core/hle/service/glue/manager.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/core/hle/service/glue/manager.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||||
		Reference in New Issue
	
	Block a user