Browse Source
glue: Add manager to keep track of application registry
glue: Add manager to keep track of application registry
Manages mapping between title IDs and application launch and control properties.nce_cpp
3 changed files with 121 additions and 0 deletions
-
2src/core/CMakeLists.txt
-
73src/core/hle/service/glue/manager.cpp
-
46src/core/hle/service/glue/manager.h
@ -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
|
|||
@ -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 |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue