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:
parent
db2e5e5fa6
commit
5f8d2a2044
|
@ -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
|
||||||
|
|
|
@ -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
|
Reference in New Issue