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