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/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
									
								
								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