APT service serialization
This commit is contained in:
parent
3e752002c4
commit
5265c79056
25 changed files with 247 additions and 17 deletions
2
TODO
2
TODO
|
@ -64,7 +64,7 @@
|
||||||
✔ AC @started(19-12-23 12:48) @done(19-12-24 22:38) @lasted(1d9h50m3s)
|
✔ AC @started(19-12-23 12:48) @done(19-12-24 22:38) @lasted(1d9h50m3s)
|
||||||
✔ ACT @done(19-12-24 23:17)
|
✔ ACT @done(19-12-24 23:17)
|
||||||
✔ AM @started(19-12-24 23:17) @done(19-12-24 23:53) @lasted(36m8s)
|
✔ AM @started(19-12-24 23:17) @done(19-12-24 23:53) @lasted(36m8s)
|
||||||
☐ APT
|
✔ APT @done(19-12-25 21:41)
|
||||||
☐ BOSS
|
☐ BOSS
|
||||||
☐ CAM
|
☐ CAM
|
||||||
☐ CECD
|
☐ CECD
|
||||||
|
|
91
src/common/serialization/optional.h
Normal file
91
src/common/serialization/optional.h
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
|
||||||
|
#include <boost/archive/detail/basic_iarchive.hpp>
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
#include <boost/move/utility_core.hpp>
|
||||||
|
|
||||||
|
#include <boost/serialization/item_version_type.hpp>
|
||||||
|
#include <boost/serialization/split_free.hpp>
|
||||||
|
#include <boost/serialization/level.hpp>
|
||||||
|
#include <boost/serialization/nvp.hpp>
|
||||||
|
#include <boost/serialization/version.hpp>
|
||||||
|
#include <boost/type_traits/is_pointer.hpp>
|
||||||
|
#include <boost/serialization/detail/stack_constructor.hpp>
|
||||||
|
#include <boost/serialization/detail/is_default_constructible.hpp>
|
||||||
|
#include <boost/serialization/force_include.hpp>
|
||||||
|
|
||||||
|
// function specializations must be defined in the appropriate
|
||||||
|
// namespace - boost::serialization
|
||||||
|
namespace boost {
|
||||||
|
namespace serialization {
|
||||||
|
|
||||||
|
template<class Archive, class T>
|
||||||
|
void save(
|
||||||
|
Archive & ar,
|
||||||
|
const std::optional< T > & t,
|
||||||
|
const unsigned int /*version*/
|
||||||
|
){
|
||||||
|
// It is an inherent limitation to the serialization of optional.hpp
|
||||||
|
// that the underlying type must be either a pointer or must have a
|
||||||
|
// default constructor. It's possible that this could change sometime
|
||||||
|
// in the future, but for now, one will have to work around it. This can
|
||||||
|
// be done by serialization the optional<T> as optional<T *>
|
||||||
|
#if ! defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
|
||||||
|
BOOST_STATIC_ASSERT(
|
||||||
|
boost::serialization::detail::is_default_constructible<T>::value
|
||||||
|
|| boost::is_pointer<T>::value
|
||||||
|
);
|
||||||
|
#endif
|
||||||
|
const bool tflag = t.has_value();
|
||||||
|
ar << boost::serialization::make_nvp("initialized", tflag);
|
||||||
|
if (tflag){
|
||||||
|
ar << boost::serialization::make_nvp("value", *t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class Archive, class T>
|
||||||
|
void load(
|
||||||
|
Archive & ar,
|
||||||
|
std::optional< T > & t,
|
||||||
|
const unsigned int version
|
||||||
|
){
|
||||||
|
bool tflag;
|
||||||
|
ar >> boost::serialization::make_nvp("initialized", tflag);
|
||||||
|
if(! tflag){
|
||||||
|
t.reset();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(0 == version){
|
||||||
|
boost::serialization::item_version_type item_version(0);
|
||||||
|
boost::archive::library_version_type library_version(
|
||||||
|
ar.get_library_version()
|
||||||
|
);
|
||||||
|
if(boost::archive::library_version_type(3) < library_version){
|
||||||
|
ar >> BOOST_SERIALIZATION_NVP(item_version);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(! t.has_value())
|
||||||
|
t = T();
|
||||||
|
ar >> boost::serialization::make_nvp("value", *t);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class Archive, class T>
|
||||||
|
void serialize(
|
||||||
|
Archive & ar,
|
||||||
|
std::optional< T > & t,
|
||||||
|
const unsigned int version
|
||||||
|
){
|
||||||
|
boost::serialization::split_free(ar, t, version);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
struct version<std::optional<T> > {
|
||||||
|
BOOST_STATIC_CONSTANT(int, value = 1);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // serialization
|
||||||
|
} // boost
|
|
@ -3,4 +3,9 @@ namespace Core {
|
||||||
template <class T>
|
template <class T>
|
||||||
T& Global();
|
T& Global();
|
||||||
|
|
||||||
|
// Declare explicit specialisation to prevent im
|
||||||
|
class System;
|
||||||
|
template <>
|
||||||
|
System& Global();
|
||||||
|
|
||||||
} // namespace Core
|
} // namespace Core
|
||||||
|
|
|
@ -8,10 +8,11 @@
|
||||||
#include "core/hle/kernel/memory.h"
|
#include "core/hle/kernel/memory.h"
|
||||||
#include "core/hle/kernel/shared_memory.h"
|
#include "core/hle/kernel/shared_memory.h"
|
||||||
#include "core/memory.h"
|
#include "core/memory.h"
|
||||||
|
#include "core/global.h"
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
SharedMemory::SharedMemory(KernelSystem& kernel) : Object(kernel), kernel(kernel) {}
|
SharedMemory::SharedMemory() : Object(Core::Global<KernelSystem>()), kernel(Core::Global<KernelSystem>()) {}
|
||||||
SharedMemory::~SharedMemory() {
|
SharedMemory::~SharedMemory() {
|
||||||
for (const auto& interval : holding_memory) {
|
for (const auto& interval : holding_memory) {
|
||||||
kernel.GetMemoryRegion(MemoryRegion::SYSTEM)
|
kernel.GetMemoryRegion(MemoryRegion::SYSTEM)
|
||||||
|
@ -27,7 +28,7 @@ SharedMemory::~SharedMemory() {
|
||||||
ResultVal<std::shared_ptr<SharedMemory>> KernelSystem::CreateSharedMemory(
|
ResultVal<std::shared_ptr<SharedMemory>> KernelSystem::CreateSharedMemory(
|
||||||
Process* owner_process, u32 size, MemoryPermission permissions,
|
Process* owner_process, u32 size, MemoryPermission permissions,
|
||||||
MemoryPermission other_permissions, VAddr address, MemoryRegion region, std::string name) {
|
MemoryPermission other_permissions, VAddr address, MemoryRegion region, std::string name) {
|
||||||
auto shared_memory{std::make_shared<SharedMemory>(*this)};
|
auto shared_memory{std::make_shared<SharedMemory>()};
|
||||||
|
|
||||||
shared_memory->owner_process = owner_process;
|
shared_memory->owner_process = owner_process;
|
||||||
shared_memory->name = std::move(name);
|
shared_memory->name = std::move(name);
|
||||||
|
@ -72,7 +73,7 @@ ResultVal<std::shared_ptr<SharedMemory>> KernelSystem::CreateSharedMemory(
|
||||||
std::shared_ptr<SharedMemory> KernelSystem::CreateSharedMemoryForApplet(
|
std::shared_ptr<SharedMemory> KernelSystem::CreateSharedMemoryForApplet(
|
||||||
u32 offset, u32 size, MemoryPermission permissions, MemoryPermission other_permissions,
|
u32 offset, u32 size, MemoryPermission permissions, MemoryPermission other_permissions,
|
||||||
std::string name) {
|
std::string name) {
|
||||||
auto shared_memory{std::make_shared<SharedMemory>(*this)};
|
auto shared_memory{std::make_shared<SharedMemory>()};
|
||||||
|
|
||||||
// Allocate memory in heap
|
// Allocate memory in heap
|
||||||
MemoryRegionInfo* memory_region = GetMemoryRegion(MemoryRegion::SYSTEM);
|
MemoryRegionInfo* memory_region = GetMemoryRegion(MemoryRegion::SYSTEM);
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace Kernel {
|
||||||
|
|
||||||
class SharedMemory final : public Object {
|
class SharedMemory final : public Object {
|
||||||
public:
|
public:
|
||||||
explicit SharedMemory(KernelSystem& kernel);
|
explicit SharedMemory();
|
||||||
~SharedMemory() override;
|
~SharedMemory() override;
|
||||||
|
|
||||||
std::string GetTypeName() const override {
|
std::string GetTypeName() const override {
|
||||||
|
|
|
@ -14,7 +14,7 @@ public:
|
||||||
explicit AC_I(std::shared_ptr<Module> ac);
|
explicit AC_I(std::shared_ptr<Module> ac);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SERVICE_SERIALIZATION(AC_I, ac)
|
SERVICE_SERIALIZATION(AC_I, ac, Module)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::AC
|
} // namespace Service::AC
|
||||||
|
|
|
@ -14,7 +14,7 @@ public:
|
||||||
explicit AC_U(std::shared_ptr<Module> ac);
|
explicit AC_U(std::shared_ptr<Module> ac);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SERVICE_SERIALIZATION(AC_U, ac)
|
SERVICE_SERIALIZATION(AC_U, ac, Module)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::AC
|
} // namespace Service::AC
|
||||||
|
|
|
@ -12,7 +12,7 @@ class ACT_A final : public Module::Interface {
|
||||||
public:
|
public:
|
||||||
explicit ACT_A(std::shared_ptr<Module> act);
|
explicit ACT_A(std::shared_ptr<Module> act);
|
||||||
private:
|
private:
|
||||||
SERVICE_SERIALIZATION(ACT_A, act)
|
SERVICE_SERIALIZATION(ACT_A, act, Module)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::ACT
|
} // namespace Service::ACT
|
||||||
|
|
|
@ -12,7 +12,7 @@ class ACT_U final : public Module::Interface {
|
||||||
public:
|
public:
|
||||||
explicit ACT_U(std::shared_ptr<Module> act);
|
explicit ACT_U(std::shared_ptr<Module> act);
|
||||||
private:
|
private:
|
||||||
SERVICE_SERIALIZATION(ACT_U, act)
|
SERVICE_SERIALIZATION(ACT_U, act, Module)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::ACT
|
} // namespace Service::ACT
|
||||||
|
|
|
@ -12,7 +12,7 @@ class AM_APP final : public Module::Interface {
|
||||||
public:
|
public:
|
||||||
explicit AM_APP(std::shared_ptr<Module> am);
|
explicit AM_APP(std::shared_ptr<Module> am);
|
||||||
private:
|
private:
|
||||||
SERVICE_SERIALIZATION(AM_APP, am)
|
SERVICE_SERIALIZATION(AM_APP, am, Module)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::AM
|
} // namespace Service::AM
|
||||||
|
|
|
@ -12,7 +12,7 @@ class AM_NET final : public Module::Interface {
|
||||||
public:
|
public:
|
||||||
explicit AM_NET(std::shared_ptr<Module> am);
|
explicit AM_NET(std::shared_ptr<Module> am);
|
||||||
private:
|
private:
|
||||||
SERVICE_SERIALIZATION(AM_NET, am)
|
SERVICE_SERIALIZATION(AM_NET, am, Module)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::AM
|
} // namespace Service::AM
|
||||||
|
|
|
@ -12,7 +12,7 @@ class AM_SYS final : public Module::Interface {
|
||||||
public:
|
public:
|
||||||
explicit AM_SYS(std::shared_ptr<Module> am);
|
explicit AM_SYS(std::shared_ptr<Module> am);
|
||||||
private:
|
private:
|
||||||
SERVICE_SERIALIZATION(AM_SYS, am)
|
SERVICE_SERIALIZATION(AM_SYS, am, Module)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::AM
|
} // namespace Service::AM
|
||||||
|
|
|
@ -12,7 +12,7 @@ class AM_U final : public Module::Interface {
|
||||||
public:
|
public:
|
||||||
explicit AM_U(std::shared_ptr<Module> am);
|
explicit AM_U(std::shared_ptr<Module> am);
|
||||||
private:
|
private:
|
||||||
SERVICE_SERIALIZATION(AM_U, am)
|
SERVICE_SERIALIZATION(AM_U, am, Module)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::AM
|
} // namespace Service::AM
|
||||||
|
|
|
@ -8,9 +8,12 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <boost/serialization/array.hpp>
|
||||||
|
#include "common/serialization/optional.h"
|
||||||
#include "core/hle/kernel/event.h"
|
#include "core/hle/kernel/event.h"
|
||||||
#include "core/hle/result.h"
|
#include "core/hle/result.h"
|
||||||
#include "core/hle/service/fs/archive.h"
|
#include "core/hle/service/fs/archive.h"
|
||||||
|
#include "core/global.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
class System;
|
class System;
|
||||||
|
@ -84,6 +87,18 @@ struct MessageParameter {
|
||||||
SignalType signal = SignalType::None;
|
SignalType signal = SignalType::None;
|
||||||
std::shared_ptr<Kernel::Object> object = nullptr;
|
std::shared_ptr<Kernel::Object> object = nullptr;
|
||||||
std::vector<u8> buffer;
|
std::vector<u8> buffer;
|
||||||
|
|
||||||
|
private:
|
||||||
|
template <class Archive>
|
||||||
|
void serialize(Archive& ar, const unsigned int)
|
||||||
|
{
|
||||||
|
ar & sender_id;
|
||||||
|
ar & destination_id;
|
||||||
|
ar & signal;
|
||||||
|
ar & object;
|
||||||
|
ar & buffer;
|
||||||
|
}
|
||||||
|
friend class boost::serialization::access;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Holds information about the parameters used in StartLibraryApplet
|
/// Holds information about the parameters used in StartLibraryApplet
|
||||||
|
@ -161,6 +176,17 @@ public:
|
||||||
|
|
||||||
u64 current_title_id;
|
u64 current_title_id;
|
||||||
FS::MediaType current_media_type;
|
FS::MediaType current_media_type;
|
||||||
|
|
||||||
|
private:
|
||||||
|
template <class Archive>
|
||||||
|
void serialize(Archive& ar, const unsigned int)
|
||||||
|
{
|
||||||
|
ar & next_title_id;
|
||||||
|
ar & next_media_type;
|
||||||
|
ar & current_title_id;
|
||||||
|
ar & current_media_type;
|
||||||
|
}
|
||||||
|
friend class boost::serialization::access;
|
||||||
};
|
};
|
||||||
|
|
||||||
ApplicationJumpParameters GetApplicationJumpParameters() const {
|
ApplicationJumpParameters GetApplicationJumpParameters() const {
|
||||||
|
@ -199,6 +225,21 @@ private:
|
||||||
title_id = 0;
|
title_id = 0;
|
||||||
attributes.raw = 0;
|
attributes.raw = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
template <class Archive>
|
||||||
|
void serialize(Archive& ar, const unsigned int)
|
||||||
|
{
|
||||||
|
ar & applet_id;
|
||||||
|
ar & slot;
|
||||||
|
ar & title_id;
|
||||||
|
ar & registered;
|
||||||
|
ar & loaded;
|
||||||
|
ar & attributes.raw;
|
||||||
|
ar & notification_event;
|
||||||
|
ar & parameter_event;
|
||||||
|
}
|
||||||
|
friend class boost::serialization::access;
|
||||||
};
|
};
|
||||||
|
|
||||||
ApplicationJumpParameters app_jump_parameters{};
|
ApplicationJumpParameters app_jump_parameters{};
|
||||||
|
@ -216,6 +257,25 @@ private:
|
||||||
SignalType library_applet_closing_command;
|
SignalType library_applet_closing_command;
|
||||||
|
|
||||||
Core::System& system;
|
Core::System& system;
|
||||||
|
|
||||||
|
private:
|
||||||
|
template <class Archive>
|
||||||
|
void serialize(Archive& ar, const unsigned int)
|
||||||
|
{
|
||||||
|
ar & next_parameter;
|
||||||
|
ar & app_jump_parameters;
|
||||||
|
ar & applet_slots;
|
||||||
|
ar & library_applet_closing_command;
|
||||||
|
}
|
||||||
|
friend class boost::serialization::access;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::APT
|
} // namespace Service::APT
|
||||||
|
|
||||||
|
namespace boost::serialization {
|
||||||
|
template <class Archive>
|
||||||
|
inline void load_construct_data(Archive& ar, Service::APT::AppletManager* t, const unsigned int)
|
||||||
|
{
|
||||||
|
::new(t)Service::APT::AppletManager(Core::Global<Core::System>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "common/common_paths.h"
|
#include "common/common_paths.h"
|
||||||
#include "common/file_util.h"
|
#include "common/file_util.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
|
#include "common/archives.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/file_sys/archive_ncch.h"
|
#include "core/file_sys/archive_ncch.h"
|
||||||
#include "core/file_sys/file_backend.h"
|
#include "core/file_sys/file_backend.h"
|
||||||
|
@ -26,8 +27,35 @@
|
||||||
#include "core/hw/aes/ccm.h"
|
#include "core/hw/aes/ccm.h"
|
||||||
#include "core/hw/aes/key.h"
|
#include "core/hw/aes/key.h"
|
||||||
|
|
||||||
|
namespace boost::serialization {
|
||||||
|
template <class Archive>
|
||||||
|
void load_construct_data(Archive& ar, Service::APT::Module* t, const unsigned int)
|
||||||
|
{
|
||||||
|
::new(t)Service::APT::Module(Core::Global<Core::System>());
|
||||||
|
}
|
||||||
|
|
||||||
|
template
|
||||||
|
void load_construct_data<iarchive>(iarchive& ar, Service::APT::Module* t, const unsigned int);
|
||||||
|
}
|
||||||
|
|
||||||
namespace Service::APT {
|
namespace Service::APT {
|
||||||
|
|
||||||
|
template <class Archive>
|
||||||
|
void Module::serialize(Archive& ar, const unsigned int)
|
||||||
|
{
|
||||||
|
ar & shared_font_mem;
|
||||||
|
ar & shared_font_loaded;
|
||||||
|
ar & shared_font_relocated;
|
||||||
|
ar & lock;
|
||||||
|
ar & cpu_percent;
|
||||||
|
ar & unknown_ns_state_field;
|
||||||
|
ar & screen_capture_buffer;
|
||||||
|
ar & screen_capture_post_permission;
|
||||||
|
ar & applet_manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
SERIALIZE_IMPL(Module)
|
||||||
|
|
||||||
Module::NSInterface::NSInterface(std::shared_ptr<Module> apt, const char* name, u32 max_session)
|
Module::NSInterface::NSInterface(std::shared_ptr<Module> apt, const char* name, u32 max_session)
|
||||||
: ServiceFramework(name, max_session), apt(std::move(apt)) {}
|
: ServiceFramework(name, max_session), apt(std::move(apt)) {}
|
||||||
|
|
||||||
|
|
|
@ -6,11 +6,15 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <boost/serialization/shared_ptr.hpp>
|
||||||
|
#include <boost/serialization/vector.hpp>
|
||||||
|
#include "common/archives.h"
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "common/swap.h"
|
#include "common/swap.h"
|
||||||
#include "core/hle/kernel/kernel.h"
|
#include "core/hle/kernel/kernel.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
#include "core/global.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
class System;
|
class System;
|
||||||
|
@ -65,7 +69,7 @@ public:
|
||||||
NSInterface(std::shared_ptr<Module> apt, const char* name, u32 max_session);
|
NSInterface(std::shared_ptr<Module> apt, const char* name, u32 max_session);
|
||||||
~NSInterface();
|
~NSInterface();
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
std::shared_ptr<Module> apt;
|
std::shared_ptr<Module> apt;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -601,7 +605,7 @@ public:
|
||||||
*/
|
*/
|
||||||
void CheckNew3DS(Kernel::HLERequestContext& ctx);
|
void CheckNew3DS(Kernel::HLERequestContext& ctx);
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
bool application_reset_prepared{};
|
bool application_reset_prepared{};
|
||||||
std::shared_ptr<Module> apt;
|
std::shared_ptr<Module> apt;
|
||||||
};
|
};
|
||||||
|
@ -630,8 +634,17 @@ private:
|
||||||
ScreencapPostPermission::CleanThePermission; // TODO(JamePeng): verify the initial value
|
ScreencapPostPermission::CleanThePermission; // TODO(JamePeng): verify the initial value
|
||||||
|
|
||||||
std::shared_ptr<AppletManager> applet_manager;
|
std::shared_ptr<AppletManager> applet_manager;
|
||||||
|
|
||||||
|
template <class Archive>
|
||||||
|
void serialize(Archive& ar, const unsigned int);
|
||||||
|
friend class boost::serialization::access;
|
||||||
};
|
};
|
||||||
|
|
||||||
void InstallInterfaces(Core::System& system);
|
void InstallInterfaces(Core::System& system);
|
||||||
|
|
||||||
} // namespace Service::APT
|
} // namespace Service::APT
|
||||||
|
|
||||||
|
namespace boost::serialization {
|
||||||
|
template <class Archive>
|
||||||
|
void load_construct_data(Archive& ar, Service::APT::Module* t, const unsigned int);
|
||||||
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "core/hle/service/apt/apt_a.h"
|
#include "core/hle/service/apt/apt_a.h"
|
||||||
|
#include "common/archives.h"
|
||||||
|
|
||||||
namespace Service::APT {
|
namespace Service::APT {
|
||||||
|
|
||||||
|
@ -105,3 +106,5 @@ APT_A::APT_A(std::shared_ptr<Module> apt)
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Service::APT
|
} // namespace Service::APT
|
||||||
|
|
||||||
|
SERIALIZE_EXPORT_IMPL(Service::APT::APT_A)
|
||||||
|
|
|
@ -11,6 +11,11 @@ namespace Service::APT {
|
||||||
class APT_A final : public Module::APTInterface {
|
class APT_A final : public Module::APTInterface {
|
||||||
public:
|
public:
|
||||||
explicit APT_A(std::shared_ptr<Module> apt);
|
explicit APT_A(std::shared_ptr<Module> apt);
|
||||||
|
private:
|
||||||
|
SERVICE_SERIALIZATION(APT_A, apt, Module)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::APT
|
} // namespace Service::APT
|
||||||
|
|
||||||
|
BOOST_CLASS_EXPORT_KEY(Service::APT::APT_A)
|
||||||
|
BOOST_SERIALIZATION_CONSTRUCT(Service::APT::APT_A)
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "core/hle/service/apt/apt_s.h"
|
#include "core/hle/service/apt/apt_s.h"
|
||||||
|
#include "common/archives.h"
|
||||||
|
|
||||||
namespace Service::APT {
|
namespace Service::APT {
|
||||||
|
|
||||||
|
@ -105,3 +106,5 @@ APT_S::APT_S(std::shared_ptr<Module> apt)
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Service::APT
|
} // namespace Service::APT
|
||||||
|
|
||||||
|
SERIALIZE_EXPORT_IMPL(Service::APT::APT_S)
|
||||||
|
|
|
@ -18,6 +18,11 @@ namespace Service::APT {
|
||||||
class APT_S final : public Module::APTInterface {
|
class APT_S final : public Module::APTInterface {
|
||||||
public:
|
public:
|
||||||
explicit APT_S(std::shared_ptr<Module> apt);
|
explicit APT_S(std::shared_ptr<Module> apt);
|
||||||
|
private:
|
||||||
|
SERVICE_SERIALIZATION(APT_S, apt, Module)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::APT
|
} // namespace Service::APT
|
||||||
|
|
||||||
|
BOOST_CLASS_EXPORT_KEY(Service::APT::APT_S)
|
||||||
|
BOOST_SERIALIZATION_CONSTRUCT(Service::APT::APT_S)
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "core/hle/service/apt/apt_u.h"
|
#include "core/hle/service/apt/apt_u.h"
|
||||||
|
#include "common/archives.h"
|
||||||
|
|
||||||
namespace Service::APT {
|
namespace Service::APT {
|
||||||
|
|
||||||
|
@ -102,3 +103,5 @@ APT_U::APT_U(std::shared_ptr<Module> apt)
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Service::APT
|
} // namespace Service::APT
|
||||||
|
|
||||||
|
SERIALIZE_EXPORT_IMPL(Service::APT::APT_U)
|
||||||
|
|
|
@ -18,6 +18,11 @@ namespace Service::APT {
|
||||||
class APT_U final : public Module::APTInterface {
|
class APT_U final : public Module::APTInterface {
|
||||||
public:
|
public:
|
||||||
explicit APT_U(std::shared_ptr<Module> apt);
|
explicit APT_U(std::shared_ptr<Module> apt);
|
||||||
|
private:
|
||||||
|
SERVICE_SERIALIZATION(APT_U, apt, Module)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::APT
|
} // namespace Service::APT
|
||||||
|
|
||||||
|
BOOST_CLASS_EXPORT_KEY(Service::APT::APT_U)
|
||||||
|
BOOST_SERIALIZATION_CONSTRUCT(Service::APT::APT_U)
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "core/hle/service/apt/ns_s.h"
|
#include "core/hle/service/apt/ns_s.h"
|
||||||
|
#include "common/archives.h"
|
||||||
|
|
||||||
namespace Service::NS {
|
namespace Service::NS {
|
||||||
|
|
||||||
|
@ -29,3 +30,5 @@ NS_S::NS_S(std::shared_ptr<Service::APT::Module> apt)
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Service::NS
|
} // namespace Service::NS
|
||||||
|
|
||||||
|
SERIALIZE_EXPORT_IMPL(Service::NS::NS_S)
|
||||||
|
|
|
@ -14,6 +14,11 @@ namespace Service::NS {
|
||||||
class NS_S final : public Service::APT::Module::NSInterface {
|
class NS_S final : public Service::APT::Module::NSInterface {
|
||||||
public:
|
public:
|
||||||
explicit NS_S(std::shared_ptr<Service::APT::Module> apt);
|
explicit NS_S(std::shared_ptr<Service::APT::Module> apt);
|
||||||
|
private:
|
||||||
|
SERVICE_SERIALIZATION(NS_S, apt, Service::APT::Module)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::NS
|
} // namespace Service::NS
|
||||||
|
|
||||||
|
BOOST_CLASS_EXPORT_KEY(Service::NS::NS_S)
|
||||||
|
BOOST_SERIALIZATION_CONSTRUCT(Service::NS::NS_S)
|
||||||
|
|
|
@ -199,7 +199,7 @@ extern const std::array<ServiceModuleInfo, 40> service_module_map;
|
||||||
|
|
||||||
} // namespace Service
|
} // namespace Service
|
||||||
|
|
||||||
#define SERVICE_SERIALIZATION(T, MFIELD) \
|
#define SERVICE_SERIALIZATION(T, MFIELD, TMODULE) \
|
||||||
template <class Archive> \
|
template <class Archive> \
|
||||||
void save_construct(Archive& ar, const unsigned int file_version) const \
|
void save_construct(Archive& ar, const unsigned int file_version) const \
|
||||||
{ \
|
{ \
|
||||||
|
@ -209,7 +209,7 @@ extern const std::array<ServiceModuleInfo, 40> service_module_map;
|
||||||
template <class Archive> \
|
template <class Archive> \
|
||||||
static void load_construct(Archive& ar, T* t, const unsigned int file_version) \
|
static void load_construct(Archive& ar, T* t, const unsigned int file_version) \
|
||||||
{ \
|
{ \
|
||||||
std::shared_ptr<Module> MFIELD; \
|
std::shared_ptr<TMODULE> MFIELD; \
|
||||||
ar >> MFIELD; \
|
ar >> MFIELD; \
|
||||||
::new(t)T(MFIELD); \
|
::new(t)T(MFIELD); \
|
||||||
} \
|
} \
|
||||||
|
|
Loading…
Reference in a new issue