mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-22 20:31:14 +00:00
libstrat: convert to experimental new (super-accurate) sf allocation semantics
This commit is contained in:
parent
8314d015f3
commit
f06de12bea
149 changed files with 2852 additions and 1746 deletions
|
@ -18,6 +18,7 @@ include $(DEVKITPRO)/libnx/switch_rules
|
||||||
# options for code generation
|
# options for code generation
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
PRECOMPILED_HEADERS := $(CURRENT_DIRECTORY)/include/stratosphere.hpp
|
PRECOMPILED_HEADERS := $(CURRENT_DIRECTORY)/include/stratosphere.hpp
|
||||||
|
#PRECOMPILED_HEADERS :=
|
||||||
|
|
||||||
DEFINES := $(ATMOSPHERE_DEFINES) -DATMOSPHERE_IS_STRATOSPHERE -D_GNU_SOURCE
|
DEFINES := $(ATMOSPHERE_DEFINES) -DATMOSPHERE_IS_STRATOSPHERE -D_GNU_SOURCE
|
||||||
SETTINGS := $(ATMOSPHERE_SETTINGS) -O2
|
SETTINGS := $(ATMOSPHERE_SETTINGS) -O2
|
||||||
|
|
|
@ -17,16 +17,12 @@
|
||||||
#include <vapours.hpp>
|
#include <vapours.hpp>
|
||||||
#include <stratosphere/erpt/erpt_types.hpp>
|
#include <stratosphere/erpt/erpt_types.hpp>
|
||||||
|
|
||||||
namespace ams::erpt::sf {
|
#define AMS_ERPT_I_ATTACHMENT_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, Open, (const erpt::AttachmentId &attachment_id), (attachment_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, Read, (ams::sf::Out<u32> out_count, const ams::sf::OutBuffer &out_buffer), (out_count, out_buffer)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, SetFlags, (erpt::AttachmentFlagSet flags), (flags)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, GetFlags, (ams::sf::Out<erpt::AttachmentFlagSet> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, Close, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, GetSize, (ams::sf::Out<s64> out), (out))
|
||||||
|
|
||||||
#define AMS_ERPT_I_ATTACHMENT_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::erpt::sf, IAttachment, AMS_ERPT_I_ATTACHMENT_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, Open, (const AttachmentId &attachment_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, Read, (ams::sf::Out<u32> out_count, const ams::sf::OutBuffer &out_buffer)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, SetFlags, (AttachmentFlagSet flags)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, GetFlags, (ams::sf::Out<AttachmentFlagSet> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, Close, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, GetSize, (ams::sf::Out<s64> out))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IAttachment, AMS_ERPT_I_ATTACHMENT_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
|
@ -20,24 +20,20 @@
|
||||||
#include <stratosphere/erpt/erpt_multiple_category_context.hpp>
|
#include <stratosphere/erpt/erpt_multiple_category_context.hpp>
|
||||||
#include <stratosphere/time/time_steady_clock_time_point.hpp>
|
#include <stratosphere/time/time_steady_clock_time_point.hpp>
|
||||||
|
|
||||||
namespace ams::erpt::sf {
|
#define AMS_ERPT_I_CONTEXT_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, SubmitContext, (const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer), (ctx_buffer, str_buffer)) \
|
||||||
#define AMS_ERPT_I_CONTEXT_INTERFACE_INFO(C, H) \
|
AMS_SF_METHOD_INFO(C, H, 1, Result, CreateReportV0, (erpt::ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &meta_buffer), (report_type, ctx_buffer, str_buffer, meta_buffer)) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, SubmitContext, (const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer)) \
|
AMS_SF_METHOD_INFO(C, H, 2, Result, SetInitialLaunchSettingsCompletionTime, (const time::SteadyClockTimePoint &time_point), (time_point), hos::Version_3_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, CreateReportV0, (ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &meta_buffer)) \
|
AMS_SF_METHOD_INFO(C, H, 3, Result, ClearInitialLaunchSettingsCompletionTime, (), (), hos::Version_3_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, SetInitialLaunchSettingsCompletionTime, (const time::SteadyClockTimePoint &time_point), hos::Version_3_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 4, Result, UpdatePowerOnTime, (), (), hos::Version_3_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, ClearInitialLaunchSettingsCompletionTime, (), hos::Version_3_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 5, Result, UpdateAwakeTime, (), (), hos::Version_3_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, UpdatePowerOnTime, (), hos::Version_3_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 6, Result, SubmitMultipleCategoryContext, (const erpt::MultipleCategoryContextEntry &ctx_entry, const ams::sf::InBuffer &str_buffer), (ctx_entry, str_buffer), hos::Version_5_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, UpdateAwakeTime, (), hos::Version_3_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 7, Result, UpdateApplicationLaunchTime, (), (), hos::Version_6_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, SubmitMultipleCategoryContext, (const MultipleCategoryContextEntry &ctx_entry, const ams::sf::InBuffer &str_buffer), hos::Version_5_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 8, Result, ClearApplicationLaunchTime, (), (), hos::Version_6_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, UpdateApplicationLaunchTime, (), hos::Version_6_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 9, Result, SubmitAttachment, (ams::sf::Out<erpt::AttachmentId> out, const ams::sf::InBuffer &attachment_name, const ams::sf::InBuffer &attachment_data), (out, attachment_name, attachment_data), hos::Version_8_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 8, Result, ClearApplicationLaunchTime, (), hos::Version_6_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 10, Result, CreateReportWithAttachmentsDeprecated, (erpt::ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &attachment_ids_buffer), (report_type, ctx_buffer, str_buffer, attachment_ids_buffer), hos::Version_8_0_0, hos::Version_10_2_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, Result, SubmitAttachment, (ams::sf::Out<AttachmentId> out, const ams::sf::InBuffer &attachment_name, const ams::sf::InBuffer &attachment_data), hos::Version_8_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 10, Result, CreateReportWithAttachments, (erpt::ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &attachment_ids_buffer, Result result), (report_type, ctx_buffer, str_buffer, attachment_ids_buffer, result), hos::Version_11_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, CreateReportWithAttachmentsDeprecated, (ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &attachment_ids_buffer), hos::Version_8_0_0, hos::Version_10_2_0) \
|
AMS_SF_METHOD_INFO(C, H, 11, Result, CreateReport, (erpt::ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &meta_buffer, Result result), (report_type, ctx_buffer, str_buffer, meta_buffer, result), hos::Version_11_0_0)
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, CreateReportWithAttachments, (ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &attachment_ids_buffer, Result result), hos::Version_11_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 11, Result, CreateReport, (ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &meta_buffer, Result result), hos::Version_11_0_0)
|
|
||||||
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IContext, AMS_ERPT_I_CONTEXT_INTERFACE_INFO)
|
AMS_SF_DEFINE_INTERFACE(ams::erpt::sf, IContext, AMS_ERPT_I_CONTEXT_INTERFACE_INFO)
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -17,17 +17,13 @@
|
||||||
#include <vapours.hpp>
|
#include <vapours.hpp>
|
||||||
#include <stratosphere/erpt/erpt_types.hpp>
|
#include <stratosphere/erpt/erpt_types.hpp>
|
||||||
|
|
||||||
namespace ams::erpt::sf {
|
#define AMS_ERPT_I_MANAGER_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, GetReportList, (const ams::sf::OutBuffer &out_list, erpt::ReportType type_filter), (out_list, type_filter)) \
|
||||||
#define AMS_ERPT_I_MANAGER_INTERFACE_INFO(C, H) \
|
AMS_SF_METHOD_INFO(C, H, 1, Result, GetEvent, (ams::sf::OutCopyHandle out), (out)) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, GetReportList, (const ams::sf::OutBuffer &out_list, ReportType type_filter)) \
|
AMS_SF_METHOD_INFO(C, H, 2, Result, CleanupReports, (), (), hos::Version_4_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, GetEvent, (ams::sf::OutCopyHandle out)) \
|
AMS_SF_METHOD_INFO(C, H, 3, Result, DeleteReport, (const erpt::ReportId &report_id), (report_id), hos::Version_5_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, CleanupReports, (), hos::Version_4_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 4, Result, GetStorageUsageStatistics, (ams::sf::Out<erpt::StorageUsageStatistics> out), (out), hos::Version_5_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, DeleteReport, (const ReportId &report_id), hos::Version_5_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 5, Result, GetAttachmentList, (const ams::sf::OutBuffer &out_buf, const erpt::ReportId &report_id), (out_buf, report_id), hos::Version_8_0_0)
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, GetStorageUsageStatistics, (ams::sf::Out<StorageUsageStatistics> out), hos::Version_5_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, GetAttachmentList, (const ams::sf::OutBuffer &out_buf, const ReportId &report_id), hos::Version_8_0_0)
|
|
||||||
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IManager, AMS_ERPT_I_MANAGER_INTERFACE_INFO)
|
AMS_SF_DEFINE_INTERFACE(ams::erpt::sf, IManager, AMS_ERPT_I_MANAGER_INTERFACE_INFO)
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -17,17 +17,12 @@
|
||||||
#include <vapours.hpp>
|
#include <vapours.hpp>
|
||||||
#include <stratosphere/erpt/erpt_types.hpp>
|
#include <stratosphere/erpt/erpt_types.hpp>
|
||||||
|
|
||||||
namespace ams::erpt::sf {
|
#define AMS_ERPT_I_REPORT_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, Open, (const erpt::ReportId &report_id), (report_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, Read, (ams::sf::Out<u32> out_count, const ams::sf::OutBuffer &out_buffer), (out_count, out_buffer)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, SetFlags, (erpt::ReportFlagSet flags), (flags)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, GetFlags, (ams::sf::Out<erpt::ReportFlagSet> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, Close, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, GetSize, (ams::sf::Out<s64> out), (out))
|
||||||
|
|
||||||
#define AMS_ERPT_I_REPORT_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::erpt::sf, IReport, AMS_ERPT_I_REPORT_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, Open, (const ReportId &report_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, Read, (ams::sf::Out<u32> out_count, const ams::sf::OutBuffer &out_buffer)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, SetFlags, (ReportFlagSet flags)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, GetFlags, (ams::sf::Out<ReportFlagSet> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, Close, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, GetSize, (ams::sf::Out<s64> out))
|
|
||||||
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IReport, AMS_ERPT_I_REPORT_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -20,13 +20,9 @@
|
||||||
#include <stratosphere/erpt/sf/erpt_sf_i_manager.hpp>
|
#include <stratosphere/erpt/sf/erpt_sf_i_manager.hpp>
|
||||||
#include <stratosphere/erpt/sf/erpt_sf_i_attachment.hpp>
|
#include <stratosphere/erpt/sf/erpt_sf_i_attachment.hpp>
|
||||||
|
|
||||||
namespace ams::erpt::sf {
|
#define AMS_ERPT_I_SESSION_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, OpenReport, (ams::sf::Out<ams::sf::SharedPointer<erpt::sf::IReport>> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, OpenManager, (ams::sf::Out<ams::sf::SharedPointer<erpt::sf::IManager>> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, OpenAttachment, (ams::sf::Out<ams::sf::SharedPointer<erpt::sf::IAttachment>> out), (out), hos::Version_8_0_0)
|
||||||
|
|
||||||
#define AMS_ERPT_I_SESSION_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::erpt::sf, ISession, AMS_ERPT_I_SESSION_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, OpenReport, (ams::sf::Out<std::shared_ptr<erpt::sf::IReport>> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, OpenManager, (ams::sf::Out<std::shared_ptr<erpt::sf::IManager>> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, OpenAttachment, (ams::sf::Out<std::shared_ptr<erpt::sf::IAttachment>> out), hos::Version_8_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(ISession, AMS_ERPT_I_SESSION_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,11 +19,7 @@
|
||||||
#include <stratosphere/fatal/fatal_types.hpp>
|
#include <stratosphere/fatal/fatal_types.hpp>
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
namespace ams::fatal::impl {
|
#define AMS_FATAL_I_PRIVATE_SERVICE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, GetFatalEvent, (sf::OutCopyHandle out_h), (out_h))
|
||||||
|
|
||||||
#define AMS_FATAL_I_PRIVATE_SERVICE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::fatal::impl, IPrivateService, AMS_FATAL_I_PRIVATE_SERVICE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, GetFatalEvent, (sf::OutCopyHandle out_h))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IPrivateService, AMS_FATAL_I_PRIVATE_SERVICE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,13 +19,9 @@
|
||||||
#include <stratosphere/fatal/fatal_types.hpp>
|
#include <stratosphere/fatal/fatal_types.hpp>
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
namespace ams::fatal::impl {
|
#define AMS_FATAL_I_SERVICE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, ThrowFatal, (Result error, const sf::ClientProcessId &client_pid), (error, client_pid)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, ThrowFatalWithPolicy, (Result error, const sf::ClientProcessId &client_pid, FatalPolicy policy), (error, client_pid, policy)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, ThrowFatalWithCpuContext, (Result error, const sf::ClientProcessId &client_pid, FatalPolicy policy, const fatal::CpuContext &cpu_ctx), (error, client_pid, policy, cpu_ctx))
|
||||||
|
|
||||||
#define AMS_FATAL_I_SERVICE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::fatal::impl, IService, AMS_FATAL_I_SERVICE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, ThrowFatal, (Result error, const sf::ClientProcessId &client_pid)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, ThrowFatalWithPolicy, (Result error, const sf::ClientProcessId &client_pid, FatalPolicy policy)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, ThrowFatalWithCpuContext, (Result error, const sf::ClientProcessId &client_pid, FatalPolicy policy, const CpuContext &cpu_ctx))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IService, AMS_FATAL_I_SERVICE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -37,14 +37,14 @@ namespace ams::fssrv::impl {
|
||||||
|
|
||||||
class FileSystemInterfaceAdapter;
|
class FileSystemInterfaceAdapter;
|
||||||
|
|
||||||
class FileInterfaceAdapter final {
|
class FileInterfaceAdapter {
|
||||||
NON_COPYABLE(FileInterfaceAdapter);
|
NON_COPYABLE(FileInterfaceAdapter);
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<FileSystemInterfaceAdapter> parent_filesystem;
|
ams::sf::SharedPointer<FileSystemInterfaceAdapter> parent_filesystem;
|
||||||
std::unique_ptr<fs::fsa::IFile> base_file;
|
std::unique_ptr<fs::fsa::IFile> base_file;
|
||||||
std::unique_lock<fssystem::SemaphoreAdapter> open_count_semaphore;
|
std::unique_lock<fssystem::SemaphoreAdapter> open_count_semaphore;
|
||||||
public:
|
public:
|
||||||
FileInterfaceAdapter(std::unique_ptr<fs::fsa::IFile> &&file, std::shared_ptr<FileSystemInterfaceAdapter> &&parent, std::unique_lock<fssystem::SemaphoreAdapter> &&sema);
|
FileInterfaceAdapter(std::unique_ptr<fs::fsa::IFile> &&file, FileSystemInterfaceAdapter *parent, std::unique_lock<fssystem::SemaphoreAdapter> &&sema);
|
||||||
~FileInterfaceAdapter();
|
~FileInterfaceAdapter();
|
||||||
private:
|
private:
|
||||||
void InvalidateCache();
|
void InvalidateCache();
|
||||||
|
@ -59,14 +59,14 @@ namespace ams::fssrv::impl {
|
||||||
};
|
};
|
||||||
static_assert(fssrv::sf::IsIFile<FileInterfaceAdapter>);
|
static_assert(fssrv::sf::IsIFile<FileInterfaceAdapter>);
|
||||||
|
|
||||||
class DirectoryInterfaceAdapter final {
|
class DirectoryInterfaceAdapter {
|
||||||
NON_COPYABLE(DirectoryInterfaceAdapter);
|
NON_COPYABLE(DirectoryInterfaceAdapter);
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<FileSystemInterfaceAdapter> parent_filesystem;
|
ams::sf::SharedPointer<FileSystemInterfaceAdapter> parent_filesystem;
|
||||||
std::unique_ptr<fs::fsa::IDirectory> base_dir;
|
std::unique_ptr<fs::fsa::IDirectory> base_dir;
|
||||||
std::unique_lock<fssystem::SemaphoreAdapter> open_count_semaphore;
|
std::unique_lock<fssystem::SemaphoreAdapter> open_count_semaphore;
|
||||||
public:
|
public:
|
||||||
DirectoryInterfaceAdapter(std::unique_ptr<fs::fsa::IDirectory> &&dir, std::shared_ptr<FileSystemInterfaceAdapter> &&parent, std::unique_lock<fssystem::SemaphoreAdapter> &&sema);
|
DirectoryInterfaceAdapter(std::unique_ptr<fs::fsa::IDirectory> &&dir, FileSystemInterfaceAdapter *parent, std::unique_lock<fssystem::SemaphoreAdapter> &&sema);
|
||||||
~DirectoryInterfaceAdapter();
|
~DirectoryInterfaceAdapter();
|
||||||
public:
|
public:
|
||||||
/* Command API */
|
/* Command API */
|
||||||
|
@ -75,7 +75,7 @@ namespace ams::fssrv::impl {
|
||||||
};
|
};
|
||||||
static_assert(fssrv::sf::IsIDirectory<DirectoryInterfaceAdapter>);
|
static_assert(fssrv::sf::IsIDirectory<DirectoryInterfaceAdapter>);
|
||||||
|
|
||||||
class FileSystemInterfaceAdapter final : public std::enable_shared_from_this<FileSystemInterfaceAdapter> {
|
class FileSystemInterfaceAdapter : public ams::sf::ISharedObject {
|
||||||
NON_COPYABLE(FileSystemInterfaceAdapter);
|
NON_COPYABLE(FileSystemInterfaceAdapter);
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<fs::fsa::IFileSystem> base_fs;
|
std::shared_ptr<fs::fsa::IFileSystem> base_fs;
|
||||||
|
@ -103,8 +103,8 @@ namespace ams::fssrv::impl {
|
||||||
Result RenameFile(const fssrv::sf::Path &old_path, const fssrv::sf::Path &new_path);
|
Result RenameFile(const fssrv::sf::Path &old_path, const fssrv::sf::Path &new_path);
|
||||||
Result RenameDirectory(const fssrv::sf::Path &old_path, const fssrv::sf::Path &new_path);
|
Result RenameDirectory(const fssrv::sf::Path &old_path, const fssrv::sf::Path &new_path);
|
||||||
Result GetEntryType(ams::sf::Out<u32> out, const fssrv::sf::Path &path);
|
Result GetEntryType(ams::sf::Out<u32> out, const fssrv::sf::Path &path);
|
||||||
Result OpenFile(ams::sf::Out<std::shared_ptr<fssrv::sf::IFile>> out, const fssrv::sf::Path &path, u32 mode);
|
Result OpenFile(ams::sf::Out<ams::sf::SharedPointer<fssrv::sf::IFile>> out, const fssrv::sf::Path &path, u32 mode);
|
||||||
Result OpenDirectory(ams::sf::Out<std::shared_ptr<fssrv::sf::IDirectory>> out, const fssrv::sf::Path &path, u32 mode);
|
Result OpenDirectory(ams::sf::Out<ams::sf::SharedPointer<fssrv::sf::IDirectory>> out, const fssrv::sf::Path &path, u32 mode);
|
||||||
Result Commit();
|
Result Commit();
|
||||||
Result GetFreeSpaceSize(ams::sf::Out<s64> out, const fssrv::sf::Path &path);
|
Result GetFreeSpaceSize(ams::sf::Out<s64> out, const fssrv::sf::Path &path);
|
||||||
Result GetTotalSpaceSize(ams::sf::Out<s64> out, const fssrv::sf::Path &path);
|
Result GetTotalSpaceSize(ams::sf::Out<s64> out, const fssrv::sf::Path &path);
|
||||||
|
|
|
@ -18,12 +18,8 @@
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
#include <stratosphere/fs/fs_directory.hpp>
|
#include <stratosphere/fs/fs_directory.hpp>
|
||||||
|
|
||||||
namespace ams::fssrv::sf {
|
#define AMS_FSSRV_I_DIRECTORY_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, Read, (ams::sf::Out<s64> out, const ams::sf::OutBuffer &out_entries), (out, out_entries)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, GetEntryCount, (ams::sf::Out<s64> out), (out))
|
||||||
|
|
||||||
#define AMS_FSSRV_I_DIRECTORY_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::fssrv::sf, IDirectory, AMS_FSSRV_I_DIRECTORY_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, Read, (ams::sf::Out<s64> out, const ams::sf::OutBuffer &out_entries)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, GetEntryCount, (ams::sf::Out<s64> out))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IDirectory, AMS_FSSRV_I_DIRECTORY_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,16 +19,12 @@
|
||||||
#include <stratosphere/fs/fs_file.hpp>
|
#include <stratosphere/fs/fs_file.hpp>
|
||||||
#include <stratosphere/fs/fs_query_range.hpp>
|
#include <stratosphere/fs/fs_query_range.hpp>
|
||||||
|
|
||||||
namespace ams::fssrv::sf {
|
#define AMS_FSSRV_I_FILE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, Read, (ams::sf::Out<s64> out, s64 offset, const ams::sf::OutNonSecureBuffer &buffer, s64 size, ams::fs::ReadOption option), (out, offset, buffer, size, option)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, Write, (s64 offset, const ams::sf::InNonSecureBuffer &buffer, s64 size, ams::fs::WriteOption option), (offset, buffer, size, option)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, Flush, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, SetSize, (s64 size), (size)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, GetSize, (ams::sf::Out<s64> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, OperateRange, (ams::sf::Out<ams::fs::FileQueryRangeInfo> out, s32 op_id, s64 offset, s64 size), (out, op_id, offset, size), hos::Version_4_0_0)
|
||||||
|
|
||||||
#define AMS_FSSRV_I_FILE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::fssrv::sf, IFile, AMS_FSSRV_I_FILE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, Read, (ams::sf::Out<s64> out, s64 offset, const ams::sf::OutNonSecureBuffer &buffer, s64 size, ams::fs::ReadOption option)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, Write, (s64 offset, const ams::sf::InNonSecureBuffer &buffer, s64 size, ams::fs::WriteOption option)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, Flush, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, SetSize, (s64 size)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, GetSize, (ams::sf::Out<s64> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, OperateRange, (ams::sf::Out<ams::fs::FileQueryRangeInfo> out, s32 op_id, s64 offset, s64 size), hos::Version_4_0_0) \
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IFile, AMS_FSSRV_I_FILE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -22,26 +22,22 @@
|
||||||
#include <stratosphere/fssrv/sf/fssrv_sf_ifile.hpp>
|
#include <stratosphere/fssrv/sf/fssrv_sf_ifile.hpp>
|
||||||
#include <stratosphere/fssrv/sf/fssrv_sf_idirectory.hpp>
|
#include <stratosphere/fssrv/sf/fssrv_sf_idirectory.hpp>
|
||||||
|
|
||||||
namespace ams::fssrv::sf {
|
#define AMS_FSSRV_I_FILESYSTEM_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, CreateFile, (const ams::fssrv::sf::Path &path, s64 size, s32 option), (path, size, option)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, DeleteFile, (const ams::fssrv::sf::Path &path), (path)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, CreateDirectory, (const ams::fssrv::sf::Path &path), (path)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, DeleteDirectory, (const ams::fssrv::sf::Path &path), (path)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, DeleteDirectoryRecursively, (const ams::fssrv::sf::Path &path), (path)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, RenameFile, (const ams::fssrv::sf::Path &old_path, const ams::fssrv::sf::Path &new_path), (old_path, new_path)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 6, Result, RenameDirectory, (const ams::fssrv::sf::Path &old_path, const ams::fssrv::sf::Path &new_path), (old_path, new_path)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 7, Result, GetEntryType, (ams::sf::Out<u32> out, const ams::fssrv::sf::Path &path), (out, path)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 8, Result, OpenFile, (ams::sf::Out<ams::sf::SharedPointer<ams::fssrv::sf::IFile>> out, const ams::fssrv::sf::Path &path, u32 mode), (out, path, mode)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 9, Result, OpenDirectory, (ams::sf::Out<ams::sf::SharedPointer<ams::fssrv::sf::IDirectory>> out, const ams::fssrv::sf::Path &path, u32 mode), (out, path, mode)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 10, Result, Commit, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 11, Result, GetFreeSpaceSize, (ams::sf::Out<s64> out, const ams::fssrv::sf::Path &path), (out, path)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 12, Result, GetTotalSpaceSize, (ams::sf::Out<s64> out, const ams::fssrv::sf::Path &path), (out, path)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 13, Result, CleanDirectoryRecursively, (const ams::fssrv::sf::Path &path), (path), hos::Version_3_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 14, Result, GetFileTimeStampRaw, (ams::sf::Out<ams::fs::FileTimeStampRaw> out, const ams::fssrv::sf::Path &path), (out, path), hos::Version_3_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 15, Result, QueryEntry, (const ams::sf::OutBuffer &out_buf, const ams::sf::InBuffer &in_buf, s32 query_id, const ams::fssrv::sf::Path &path), (out_buf, in_buf, query_id, path), hos::Version_4_0_0)
|
||||||
|
|
||||||
#define AMS_FSSRV_I_FILESYSTEM_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::fssrv::sf, IFileSystem, AMS_FSSRV_I_FILESYSTEM_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, CreateFile, (const ams::fssrv::sf::Path &path, s64 size, s32 option)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, DeleteFile, (const ams::fssrv::sf::Path &path)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, CreateDirectory, (const ams::fssrv::sf::Path &path)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, DeleteDirectory, (const ams::fssrv::sf::Path &path)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, DeleteDirectoryRecursively, (const ams::fssrv::sf::Path &path)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, RenameFile, (const ams::fssrv::sf::Path &old_path, const ams::fssrv::sf::Path &new_path)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, RenameDirectory, (const ams::fssrv::sf::Path &old_path, const ams::fssrv::sf::Path &new_path)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, GetEntryType, (ams::sf::Out<u32> out, const ams::fssrv::sf::Path &path)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 8, Result, OpenFile, (ams::sf::Out<std::shared_ptr<ams::fssrv::sf::IFile>> out, const ams::fssrv::sf::Path &path, u32 mode)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, Result, OpenDirectory, (ams::sf::Out<std::shared_ptr<ams::fssrv::sf::IDirectory>> out, const ams::fssrv::sf::Path &path, u32 mode)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, Commit, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 11, Result, GetFreeSpaceSize, (ams::sf::Out<s64> out, const ams::fssrv::sf::Path &path)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 12, Result, GetTotalSpaceSize, (ams::sf::Out<s64> out, const ams::fssrv::sf::Path &path)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 13, Result, CleanDirectoryRecursively, (const ams::fssrv::sf::Path &path), hos::Version_3_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 14, Result, GetFileTimeStampRaw, (ams::sf::Out<ams::fs::FileTimeStampRaw> out, const ams::fssrv::sf::Path &path), hos::Version_3_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 15, Result, QueryEntry, (const ams::sf::OutBuffer &out_buf, const ams::sf::InBuffer &in_buf, s32 query_id, const ams::fssrv::sf::Path &path), hos::Version_4_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IFileSystem, AMS_FSSRV_I_FILESYSTEM_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,16 +19,12 @@
|
||||||
#include <stratosphere/fs/fs_file.hpp>
|
#include <stratosphere/fs/fs_file.hpp>
|
||||||
#include <stratosphere/fs/fs_query_range.hpp>
|
#include <stratosphere/fs/fs_query_range.hpp>
|
||||||
|
|
||||||
namespace ams::fssrv::sf {
|
#define AMS_FSSRV_I_STORAGE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, Read, (s64 offset, const ams::sf::OutNonSecureBuffer &buffer, s64 size), (offset, buffer, size)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, Write, (s64 offset, const ams::sf::InNonSecureBuffer &buffer, s64 size), (offset, buffer, size)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, Flush, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, SetSize, (s64 size), (size)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, GetSize, (ams::sf::Out<s64> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, OperateRange, (ams::sf::Out<ams::fs::StorageQueryRangeInfo> out, s32 op_id, s64 offset, s64 size), (out, op_id, offset, size), hos::Version_4_0_0)
|
||||||
|
|
||||||
#define AMS_FSSRV_I_STORAGE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::fssrv::sf, IStorage, AMS_FSSRV_I_STORAGE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, Read, (s64 offset, const ams::sf::OutNonSecureBuffer &buffer, s64 size)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, Write, (s64 offset, const ams::sf::InNonSecureBuffer &buffer, s64 size)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, Flush, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, SetSize, (s64 size)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, GetSize, (ams::sf::Out<s64> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, OperateRange, (ams::sf::Out<ams::fs::StorageQueryRangeInfo> out, s32 op_id, s64 offset, s64 size), hos::Version_4_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IStorage, AMS_FSSRV_I_STORAGE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -23,6 +23,6 @@ namespace ams::gpio {
|
||||||
void Initialize();
|
void Initialize();
|
||||||
void Finalize();
|
void Finalize();
|
||||||
|
|
||||||
void InitializeWith(std::shared_ptr<gpio::sf::IManager> &&sp);
|
void InitializeWith(ams::sf::SharedPointer<gpio::sf::IManager> sp);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,6 @@
|
||||||
|
|
||||||
namespace ams::gpio::server {
|
namespace ams::gpio::server {
|
||||||
|
|
||||||
std::shared_ptr<gpio::sf::IManager> GetServiceObject();
|
ams::sf::SharedPointer<gpio::sf::IManager> GetServiceObject();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,21 +21,17 @@
|
||||||
#include <stratosphere/gpio/gpio_select_pad_name.hpp>
|
#include <stratosphere/gpio/gpio_select_pad_name.hpp>
|
||||||
#include <stratosphere/gpio/sf/gpio_sf_i_pad_session.hpp>
|
#include <stratosphere/gpio/sf/gpio_sf_i_pad_session.hpp>
|
||||||
|
|
||||||
namespace ams::gpio::sf {
|
#define AMS_GPIO_I_MANAGER_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, OpenSessionForDev, (ams::sf::Out<ams::sf::SharedPointer<gpio::sf::IPadSession>> out, s32 pad_descriptor), (out, pad_descriptor) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, OpenSession, (ams::sf::Out<ams::sf::SharedPointer<gpio::sf::IPadSession>> out, gpio::GpioPadName pad_name), (out, pad_name) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, OpenSessionForTest, (ams::sf::Out<ams::sf::SharedPointer<gpio::sf::IPadSession>> out, gpio::GpioPadName pad_name), (out, pad_name) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, IsWakeEventActive, (ams::sf::Out<bool> out, gpio::GpioPadName pad_name), (out, pad_name), hos::Version_Min, hos::Version_6_2_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, GetWakeEventActiveFlagSet, (ams::sf::Out<gpio::WakeBitFlag> out), (out), hos::Version_Min, hos::Version_6_2_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, SetWakeEventActiveFlagSetForDebug, (gpio::GpioPadName pad_name, bool is_enabled), (pad_name, is_enabled), hos::Version_Min, hos::Version_6_2_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 6, Result, SetWakePinDebugMode, (s32 mode), (mode) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 7, Result, OpenSession2, (ams::sf::Out<ams::sf::SharedPointer<gpio::sf::IPadSession>> out, DeviceCode device_code, ddsf::AccessMode access_mode), (out, device_code, access_mode), hos::Version_5_0_0 ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 8, Result, IsWakeEventActive2, (ams::sf::Out<bool> out, DeviceCode device_code), (out, device_code), hos::Version_5_0_0 ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 9, Result, SetWakeEventActiveFlagSetForDebug2, (DeviceCode device_code, bool is_enabled), (device_code, is_enabled), hos::Version_5_0_0 ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 10, Result, SetRetryValues, (u32 arg0, u32 arg1), (arg0, arg1), hos::Version_6_0_0 )
|
||||||
|
|
||||||
#define AMS_GPIO_I_MANAGER_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::gpio::sf, IManager, AMS_GPIO_I_MANAGER_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, OpenSessionForDev, (ams::sf::Out<std::shared_ptr<gpio::sf::IPadSession>> out, s32 pad_descriptor) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, OpenSession, (ams::sf::Out<std::shared_ptr<gpio::sf::IPadSession>> out, gpio::GpioPadName pad_name) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, OpenSessionForTest, (ams::sf::Out<std::shared_ptr<gpio::sf::IPadSession>> out, gpio::GpioPadName pad_name) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, IsWakeEventActive, (ams::sf::Out<bool> out, gpio::GpioPadName pad_name), hos::Version_Min, hos::Version_6_2_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, GetWakeEventActiveFlagSet, (ams::sf::Out<gpio::WakeBitFlag> out), hos::Version_Min, hos::Version_6_2_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, SetWakeEventActiveFlagSetForDebug, (gpio::GpioPadName pad_name, bool is_enabled), hos::Version_Min, hos::Version_6_2_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, SetWakePinDebugMode, (s32 mode) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, OpenSession2, (ams::sf::Out<std::shared_ptr<gpio::sf::IPadSession>> out, DeviceCode device_code, ddsf::AccessMode access_mode), hos::Version_5_0_0 ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 8, Result, IsWakeEventActive2, (ams::sf::Out<bool> out, DeviceCode device_code), hos::Version_5_0_0 ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, Result, SetWakeEventActiveFlagSetForDebug2, (DeviceCode device_code, bool is_enabled), hos::Version_5_0_0 ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, SetRetryValues, (u32 arg0, u32 arg1), hos::Version_6_0_0 )
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IManager, AMS_GPIO_I_MANAGER_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -18,28 +18,24 @@
|
||||||
#include <vapours.hpp>
|
#include <vapours.hpp>
|
||||||
#include <stratosphere/gpio/gpio_types.hpp>
|
#include <stratosphere/gpio/gpio_types.hpp>
|
||||||
|
|
||||||
namespace ams::gpio::sf {
|
#define AMS_GPIO_I_PAD_SESSION_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, SetDirection, (gpio::Direction direction), (direction) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, GetDirection, (ams::sf::Out<gpio::Direction> out), (out) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, SetInterruptMode, (gpio::InterruptMode mode), (mode) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, GetInterruptMode, (ams::sf::Out<gpio::InterruptMode> out), (out) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, SetInterruptEnable, (bool enable), (enable) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, GetInterruptEnable, (ams::sf::Out<bool> out), (out) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 6, Result, GetInterruptStatus, (ams::sf::Out<gpio::InterruptStatus> out), (out) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 7, Result, ClearInterruptStatus, (), () ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 8, Result, SetValue, (gpio::GpioValue value), (value) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 9, Result, GetValue, (ams::sf::Out<gpio::GpioValue> out), (out) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 10, Result, BindInterrupt, (ams::sf::OutCopyHandle out), (out) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 11, Result, UnbindInterrupt, (), () ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 12, Result, SetDebounceEnabled, (bool enable), (enable) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 13, Result, GetDebounceEnabled, (ams::sf::Out<bool> out), (out) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 14, Result, SetDebounceTime, (s32 ms), (ms) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 15, Result, GetDebounceTime, (ams::sf::Out<s32> out), (out) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 16, Result, SetValueForSleepState, (gpio::GpioValue value), (value), hos::Version_4_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 16, Result, GetValueForSleepState, (ams::sf::Out<gpio::GpioValue> out), (out), hos::Version_6_0_0)
|
||||||
|
|
||||||
#define AMS_GPIO_I_PAD_SESSION_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::gpio::sf, IPadSession, AMS_GPIO_I_PAD_SESSION_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, SetDirection, (gpio::Direction direction) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, GetDirection, (ams::sf::Out<gpio::Direction> out) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, SetInterruptMode, (gpio::InterruptMode mode) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, GetInterruptMode, (ams::sf::Out<gpio::InterruptMode> out) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, SetInterruptEnable, (bool enable) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, GetInterruptEnable, (ams::sf::Out<bool> out) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, GetInterruptStatus, (ams::sf::Out<gpio::InterruptStatus> out) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, ClearInterruptStatus, () ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 8, Result, SetValue, (gpio::GpioValue value) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, Result, GetValue, (ams::sf::Out<gpio::GpioValue> out) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, BindInterrupt, (ams::sf::OutCopyHandle out) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 11, Result, UnbindInterrupt, () ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 12, Result, SetDebounceEnabled, (bool enable) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 13, Result, GetDebounceEnabled, (ams::sf::Out<bool> out) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 14, Result, SetDebounceTime, (s32 ms) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 15, Result, GetDebounceTime, (ams::sf::Out<s32> out) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 16, Result, SetValueForSleepState, (gpio::GpioValue value), hos::Version_4_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 16, Result, GetValueForSleepState, (ams::sf::Out<gpio::GpioValue> out), hos::Version_6_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IPadSession, AMS_GPIO_I_PAD_SESSION_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
namespace ams::i2c {
|
namespace ams::i2c {
|
||||||
|
|
||||||
void InitializeWith(std::shared_ptr<i2c::sf::IManager> &&sp, std::shared_ptr<i2c::sf::IManager> &&sp_pcv);
|
void InitializeWith(ams::sf::SharedPointer<i2c::sf::IManager> sp, ams::sf::SharedPointer<i2c::sf::IManager> sp_pcv);
|
||||||
void InitializeEmpty();
|
void InitializeEmpty();
|
||||||
|
|
||||||
void Finalize();
|
void Finalize();
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
namespace ams::i2c::server {
|
namespace ams::i2c::server {
|
||||||
|
|
||||||
std::shared_ptr<i2c::sf::IManager> GetServiceObject();
|
ams::sf::SharedPointer<i2c::sf::IManager> GetServiceObject();
|
||||||
std::shared_ptr<i2c::sf::IManager> GetServiceObjectPowerBus();
|
ams::sf::SharedPointer<i2c::sf::IManager> GetServiceObjectPowerBus();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,15 +20,11 @@
|
||||||
#include <stratosphere/i2c/i2c_select_device_name.hpp>
|
#include <stratosphere/i2c/i2c_select_device_name.hpp>
|
||||||
#include <stratosphere/i2c/sf/i2c_sf_i_session.hpp>
|
#include <stratosphere/i2c/sf/i2c_sf_i_session.hpp>
|
||||||
|
|
||||||
namespace ams::i2c::sf {
|
#define AMS_I2C_I_MANAGER_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, OpenSessionForDev, (ams::sf::Out<ams::sf::SharedPointer<i2c::sf::ISession>> out, s32 bus_idx, u16 slave_address, i2c::AddressingMode addressing_mode, i2c::SpeedMode speed_mode), (out, bus_idx, slave_address, addressing_mode, speed_mode) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, OpenSession, (ams::sf::Out<ams::sf::SharedPointer<i2c::sf::ISession>> out, i2c::I2cDevice device), (out, device) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, HasDevice, (ams::sf::Out<bool> out, i2c::I2cDevice device), (out, device), hos::Version_Min, hos::Version_5_1_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, HasDeviceForDev, (ams::sf::Out<bool> out, i2c::I2cDevice device), (out, device), hos::Version_Min, hos::Version_5_1_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, OpenSession2, (ams::sf::Out<ams::sf::SharedPointer<i2c::sf::ISession>> out, DeviceCode device_code), (out, device_code), hos::Version_6_0_0 )
|
||||||
|
|
||||||
#define AMS_I2C_I_MANAGER_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::i2c::sf, IManager, AMS_I2C_I_MANAGER_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, OpenSessionForDev, (ams::sf::Out<std::shared_ptr<i2c::sf::ISession>> out, s32 bus_idx, u16 slave_address, i2c::AddressingMode addressing_mode, i2c::SpeedMode speed_mode) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, OpenSession, (ams::sf::Out<std::shared_ptr<i2c::sf::ISession>> out, i2c::I2cDevice device) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, HasDevice, (ams::sf::Out<bool> out, i2c::I2cDevice device), hos::Version_Min, hos::Version_5_1_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, HasDeviceForDev, (ams::sf::Out<bool> out, i2c::I2cDevice device), hos::Version_Min, hos::Version_5_1_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, OpenSession2, (ams::sf::Out<std::shared_ptr<i2c::sf::ISession>> out, DeviceCode device_code), hos::Version_6_0_0 )
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IManager, AMS_I2C_I_MANAGER_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -18,17 +18,13 @@
|
||||||
#include <vapours.hpp>
|
#include <vapours.hpp>
|
||||||
#include <stratosphere/i2c/i2c_types.hpp>
|
#include <stratosphere/i2c/i2c_types.hpp>
|
||||||
|
|
||||||
namespace ams::i2c::sf {
|
#define AMS_I2C_I_SESSION_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, SendOld, (const ams::sf::InBuffer &in_data, i2c::TransactionOption option), (in_data, option), hos::Version_Min, hos::Version_5_1_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, ReceiveOld, (const ams::sf::OutBuffer &out_data, i2c::TransactionOption option), (out_data, option), hos::Version_Min, hos::Version_5_1_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, ExecuteCommandListOld, (const ams::sf::OutBuffer &rcv_buf, const ams::sf::InPointerArray<i2c::I2cCommand> &command_list), (rcv_buf, command_list), hos::Version_Min, hos::Version_5_1_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 10, Result, Send, (const ams::sf::InAutoSelectBuffer &in_data, i2c::TransactionOption option), (in_data, option) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 11, Result, Receive, (const ams::sf::OutAutoSelectBuffer &out_data, i2c::TransactionOption option), (out_data, option) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 12, Result, ExecuteCommandList, (const ams::sf::OutAutoSelectBuffer &rcv_buf, const ams::sf::InPointerArray<i2c::I2cCommand> &command_list), (rcv_buf, command_list) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 13, Result, SetRetryPolicy, (s32 max_retry_count, s32 retry_interval_us), (max_retry_count, retry_interval_us), hos::Version_6_0_0 )
|
||||||
|
|
||||||
#define AMS_I2C_I_SESSION_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::i2c::sf, ISession, AMS_I2C_I_SESSION_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, SendOld, (const ams::sf::InBuffer &in_data, i2c::TransactionOption option), hos::Version_Min, hos::Version_5_1_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, ReceiveOld, (const ams::sf::OutBuffer &out_data, i2c::TransactionOption option), hos::Version_Min, hos::Version_5_1_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, ExecuteCommandListOld, (const ams::sf::OutBuffer &rcv_buf, const ams::sf::InPointerArray<i2c::I2cCommand> &command_list), hos::Version_Min, hos::Version_5_1_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, Send, (const ams::sf::InAutoSelectBuffer &in_data, i2c::TransactionOption option) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 11, Result, Receive, (const ams::sf::OutAutoSelectBuffer &out_data, i2c::TransactionOption option) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 12, Result, ExecuteCommandList, (const ams::sf::OutAutoSelectBuffer &rcv_buf, const ams::sf::InPointerArray<i2c::I2cCommand> &command_list) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 13, Result, SetRetryPolicy, (s32 max_retry_count, s32 retry_interval_us), hos::Version_6_0_0 )
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(ISession, AMS_I2C_I_SESSION_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,15 +19,11 @@
|
||||||
#include <stratosphere/ldr/ldr_types.hpp>
|
#include <stratosphere/ldr/ldr_types.hpp>
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
namespace ams::ldr::impl {
|
#define AMS_LDR_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, SetProgramArgumentsDeprecated, (ncm::ProgramId program_id, const sf::InPointerBuffer &args, u32 args_size), (program_id, args, args_size), hos::Version_Min, hos::Version_10_2_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, SetProgramArguments, (ncm::ProgramId program_id, const sf::InPointerBuffer &args), (program_id, args), hos::Version_11_0_0 ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, FlushArguments, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, GetProcessModuleInfo, (sf::Out<u32> count, const sf::OutPointerArray<ldr::ModuleInfo> &out, os::ProcessId process_id), (count, out, process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65000, void, AtmosphereHasLaunchedProgram, (sf::Out<bool> out, ncm::ProgramId program_id), (out, program_id))
|
||||||
|
|
||||||
#define AMS_LDR_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::ldr::impl, IDebugMonitorInterface, AMS_LDR_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, SetProgramArgumentsDeprecated, (ncm::ProgramId program_id, const sf::InPointerBuffer &args, u32 args_size), hos::Version_Min, hos::Version_10_2_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, SetProgramArguments, (ncm::ProgramId program_id, const sf::InPointerBuffer &args), hos::Version_11_0_0 ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, FlushArguments, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, GetProcessModuleInfo, (sf::Out<u32> count, const sf::OutPointerArray<ModuleInfo> &out, os::ProcessId process_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65000, void, AtmosphereHasLaunchedProgram, (sf::Out<bool> out, ncm::ProgramId program_id))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IDebugMonitorInterface, AMS_LDR_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,18 +19,14 @@
|
||||||
#include <stratosphere/ldr/ldr_types.hpp>
|
#include <stratosphere/ldr/ldr_types.hpp>
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
namespace ams::ldr::impl {
|
#define AMS_LDR_I_PROCESS_MANAGER_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, CreateProcess, (sf::OutMoveHandle proc_h, ldr::PinId id, u32 flags, sf::CopyHandle reslimit_h), (proc_h, id, flags, reslimit_h)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, GetProgramInfo, (sf::Out<ldr::ProgramInfo> out_program_info, const ncm::ProgramLocation &loc), (out_program_info, loc)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, PinProgram, (sf::Out<ldr::PinId> out_id, const ncm::ProgramLocation &loc), (out_id, loc)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, UnpinProgram, (ldr::PinId id), (id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, SetEnabledProgramVerification, (bool enabled), (enabled), hos::Version_10_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65000, void, AtmosphereHasLaunchedProgram, (sf::Out<bool> out, ncm::ProgramId program_id), (out, program_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65001, Result, AtmosphereGetProgramInfo, (sf::Out<ldr::ProgramInfo> out_program_info, sf::Out<cfg::OverrideStatus> out_status, const ncm::ProgramLocation &loc), (out_program_info, out_status, loc)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65002, Result, AtmospherePinProgram, (sf::Out<ldr::PinId> out_id, const ncm::ProgramLocation &loc, const cfg::OverrideStatus &override_status), (out_id, loc, override_status))
|
||||||
|
|
||||||
#define AMS_LDR_I_PROCESS_MANAGER_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::ldr::impl, IProcessManagerInterface, AMS_LDR_I_PROCESS_MANAGER_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, CreateProcess, (sf::OutMoveHandle proc_h, PinId id, u32 flags, sf::CopyHandle reslimit_h)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, GetProgramInfo, (sf::Out<ProgramInfo> out_program_info, const ncm::ProgramLocation &loc)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, PinProgram, (sf::Out<PinId> out_id, const ncm::ProgramLocation &loc)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, UnpinProgram, (PinId id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, SetEnabledProgramVerification, (bool enabled), hos::Version_10_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65000, void, AtmosphereHasLaunchedProgram, (sf::Out<bool> out, ncm::ProgramId program_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65001, Result, AtmosphereGetProgramInfo, (sf::Out<ProgramInfo> out_program_info, sf::Out<cfg::OverrideStatus> out_status, const ncm::ProgramLocation &loc)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65002, Result, AtmospherePinProgram, (sf::Out<PinId> out_id, const ncm::ProgramLocation &loc, const cfg::OverrideStatus &override_status))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IProcessManagerInterface, AMS_LDR_I_PROCESS_MANAGER_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,15 +19,11 @@
|
||||||
#include <stratosphere/ldr/ldr_types.hpp>
|
#include <stratosphere/ldr/ldr_types.hpp>
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
namespace ams::ldr::impl {
|
#define AMS_LDR_I_SHELL_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, SetProgramArgumentsDeprecated, (ncm::ProgramId program_id, const sf::InPointerBuffer &args, u32 args_size), (program_id, args, args_size), hos::Version_Min, hos::Version_10_2_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, SetProgramArguments, (ncm::ProgramId program_id, const sf::InPointerBuffer &args), (program_id, args), hos::Version_11_0_0 ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, FlushArguments, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65000, Result, AtmosphereRegisterExternalCode, (sf::OutMoveHandle out, ncm::ProgramId program_id), (out, program_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65001, void, AtmosphereUnregisterExternalCode, (ncm::ProgramId program_id), (program_id))
|
||||||
|
|
||||||
#define AMS_LDR_I_SHELL_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::ldr::impl, IShellInterface, AMS_LDR_I_SHELL_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, SetProgramArgumentsDeprecated, (ncm::ProgramId program_id, const sf::InPointerBuffer &args, u32 args_size), hos::Version_Min, hos::Version_10_2_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, SetProgramArguments, (ncm::ProgramId program_id, const sf::InPointerBuffer &args), hos::Version_11_0_0 ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, FlushArguments, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65000, Result, AtmosphereRegisterExternalCode, (sf::OutMoveHandle out, ncm::ProgramId program_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65001, void, AtmosphereUnregisterExternalCode, (ncm::ProgramId program_id))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IShellInterface, AMS_LDR_I_SHELL_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -23,10 +23,10 @@ namespace ams::lr {
|
||||||
class AddOnContentLocationResolver {
|
class AddOnContentLocationResolver {
|
||||||
NON_COPYABLE(AddOnContentLocationResolver);
|
NON_COPYABLE(AddOnContentLocationResolver);
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<IAddOnContentLocationResolver> interface;
|
sf::SharedPointer<IAddOnContentLocationResolver> interface;
|
||||||
public:
|
public:
|
||||||
AddOnContentLocationResolver() { /* ... */ }
|
AddOnContentLocationResolver() { /* ... */ }
|
||||||
explicit AddOnContentLocationResolver(std::shared_ptr<IAddOnContentLocationResolver> intf) : interface(std::move(intf)) { /* ... */ }
|
explicit AddOnContentLocationResolver(sf::SharedPointer<IAddOnContentLocationResolver> intf) : interface(intf) { /* ... */ }
|
||||||
|
|
||||||
AddOnContentLocationResolver(AddOnContentLocationResolver &&rhs) {
|
AddOnContentLocationResolver(AddOnContentLocationResolver &&rhs) {
|
||||||
this->interface = std::move(rhs.interface);
|
this->interface = std::move(rhs.interface);
|
||||||
|
|
|
@ -17,16 +17,12 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <stratosphere/lr/lr_types.hpp>
|
#include <stratosphere/lr/lr_types.hpp>
|
||||||
|
|
||||||
namespace ams::lr {
|
#define AMS_LR_I_ADD_ON_CONTENT_LOCATION_RESOLVER_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, ResolveAddOnContentPath, (sf::Out<lr::Path> out, ncm::DataId id), (out, id), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, RegisterAddOnContentStorageDeprecated, (ncm::DataId id, ncm::StorageId storage_id), (id, storage_id), hos::Version_2_0_0, hos::Version_8_1_1) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, RegisterAddOnContentStorage, (ncm::DataId id, ncm::ApplicationId application_id, ncm::StorageId storage_id), (id, application_id, storage_id), hos::Version_9_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, UnregisterAllAddOnContentPath, (), (), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, RefreshApplicationAddOnContent, (const sf::InArray<ncm::ApplicationId> &ids), (ids), hos::Version_9_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, UnregisterApplicationAddOnContent, (ncm::ApplicationId id), (id), hos::Version_9_0_0)
|
||||||
|
|
||||||
#define AMS_LR_I_ADD_ON_CONTENT_LOCATION_RESOLVER_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::lr, IAddOnContentLocationResolver, AMS_LR_I_ADD_ON_CONTENT_LOCATION_RESOLVER_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, ResolveAddOnContentPath, (sf::Out<Path> out, ncm::DataId id), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, RegisterAddOnContentStorageDeprecated, (ncm::DataId id, ncm::StorageId storage_id), hos::Version_2_0_0, hos::Version_8_1_1) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, RegisterAddOnContentStorage, (ncm::DataId id, ncm::ApplicationId application_id, ncm::StorageId storage_id), hos::Version_9_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, UnregisterAllAddOnContentPath, (), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, RefreshApplicationAddOnContent, (const sf::InArray<ncm::ApplicationId> &ids), hos::Version_9_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, UnregisterApplicationAddOnContent, (ncm::ApplicationId id), hos::Version_9_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IAddOnContentLocationResolver, AMS_LR_I_ADD_ON_CONTENT_LOCATION_RESOLVER_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -17,37 +17,33 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <stratosphere/lr/lr_types.hpp>
|
#include <stratosphere/lr/lr_types.hpp>
|
||||||
|
|
||||||
namespace ams::lr {
|
#define AMS_LR_I_LOCATION_RESOLVER_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, ResolveProgramPath, (sf::Out<lr::Path> out, ncm::ProgramId id), (out, id)) \
|
||||||
#define AMS_LR_I_LOCATION_RESOLVER_INTERFACE_INFO(C, H) \
|
AMS_SF_METHOD_INFO(C, H, 1, Result, RedirectProgramPath, (const lr::Path &path, ncm::ProgramId id), (path, id)) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, ResolveProgramPath, (sf::Out<Path> out, ncm::ProgramId id)) \
|
AMS_SF_METHOD_INFO(C, H, 2, Result, ResolveApplicationControlPath, (sf::Out<lr::Path> out, ncm::ProgramId id), (out, id)) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, RedirectProgramPath, (const Path &path, ncm::ProgramId id)) \
|
AMS_SF_METHOD_INFO(C, H, 3, Result, ResolveApplicationHtmlDocumentPath, (sf::Out<lr::Path> out, ncm::ProgramId id), (out, id)) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, ResolveApplicationControlPath, (sf::Out<Path> out, ncm::ProgramId id)) \
|
AMS_SF_METHOD_INFO(C, H, 4, Result, ResolveDataPath, (sf::Out<lr::Path> out, ncm::DataId id), (out, id)) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, ResolveApplicationHtmlDocumentPath, (sf::Out<Path> out, ncm::ProgramId id)) \
|
AMS_SF_METHOD_INFO(C, H, 5, Result, RedirectApplicationControlPathDeprecated, (const lr::Path &path, ncm::ProgramId id), (path, id), hos::Version_1_0_0, hos::Version_8_1_1) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, ResolveDataPath, (sf::Out<Path> out, ncm::DataId id)) \
|
AMS_SF_METHOD_INFO(C, H, 5, Result, RedirectApplicationControlPath, (const lr::Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), (path, id, owner_id), hos::Version_9_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, RedirectApplicationControlPathDeprecated, (const Path &path, ncm::ProgramId id), hos::Version_1_0_0, hos::Version_8_1_1) \
|
AMS_SF_METHOD_INFO(C, H, 6, Result, RedirectApplicationHtmlDocumentPathDeprecated, (const lr::Path &path, ncm::ProgramId id), (path, id), hos::Version_1_0_0, hos::Version_8_1_1) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, RedirectApplicationControlPath, (const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), hos::Version_9_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 6, Result, RedirectApplicationHtmlDocumentPath, (const lr::Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), (path, id, owner_id), hos::Version_9_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, RedirectApplicationHtmlDocumentPathDeprecated, (const Path &path, ncm::ProgramId id), hos::Version_1_0_0, hos::Version_8_1_1) \
|
AMS_SF_METHOD_INFO(C, H, 7, Result, ResolveApplicationLegalInformationPath, (sf::Out<lr::Path> out, ncm::ProgramId id), (out, id)) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, RedirectApplicationHtmlDocumentPath, (const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), hos::Version_9_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 8, Result, RedirectApplicationLegalInformationPathDeprecated, (const lr::Path &path, ncm::ProgramId id), (path, id), hos::Version_1_0_0, hos::Version_8_1_1) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, ResolveApplicationLegalInformationPath, (sf::Out<Path> out, ncm::ProgramId id)) \
|
AMS_SF_METHOD_INFO(C, H, 8, Result, RedirectApplicationLegalInformationPath, (const lr::Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), (path, id, owner_id), hos::Version_9_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 8, Result, RedirectApplicationLegalInformationPathDeprecated, (const Path &path, ncm::ProgramId id), hos::Version_1_0_0, hos::Version_8_1_1) \
|
AMS_SF_METHOD_INFO(C, H, 9, Result, Refresh, (), ()) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 8, Result, RedirectApplicationLegalInformationPath, (const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), hos::Version_9_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 10, Result, RedirectApplicationProgramPathDeprecated, (const lr::Path &path, ncm::ProgramId id), (path, id), hos::Version_5_0_0, hos::Version_8_1_1) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, Result, Refresh, ()) \
|
AMS_SF_METHOD_INFO(C, H, 10, Result, RedirectApplicationProgramPath, (const lr::Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), (path, id, owner_id), hos::Version_9_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, RedirectApplicationProgramPathDeprecated, (const Path &path, ncm::ProgramId id), hos::Version_5_0_0, hos::Version_8_1_1) \
|
AMS_SF_METHOD_INFO(C, H, 11, Result, ClearApplicationRedirectionDeprecated, (), (), hos::Version_5_0_0, hos::Version_8_1_1) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, RedirectApplicationProgramPath, (const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), hos::Version_9_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 11, Result, ClearApplicationRedirection, (const sf::InArray<ncm::ProgramId> &excluding_ids), (excluding_ids), hos::Version_9_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 11, Result, ClearApplicationRedirectionDeprecated, (), hos::Version_5_0_0, hos::Version_8_1_1) \
|
AMS_SF_METHOD_INFO(C, H, 12, Result, EraseProgramRedirection, (ncm::ProgramId id), (id), hos::Version_5_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 11, Result, ClearApplicationRedirection, (const sf::InArray<ncm::ProgramId> &excluding_ids), hos::Version_9_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 13, Result, EraseApplicationControlRedirection, (ncm::ProgramId id), (id), hos::Version_5_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 12, Result, EraseProgramRedirection, (ncm::ProgramId id), hos::Version_5_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 14, Result, EraseApplicationHtmlDocumentRedirection, (ncm::ProgramId id), (id), hos::Version_5_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 13, Result, EraseApplicationControlRedirection, (ncm::ProgramId id), hos::Version_5_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 15, Result, EraseApplicationLegalInformationRedirection, (ncm::ProgramId id), (id), hos::Version_5_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 14, Result, EraseApplicationHtmlDocumentRedirection, (ncm::ProgramId id), hos::Version_5_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 16, Result, ResolveProgramPathForDebug, (sf::Out<lr::Path> out, ncm::ProgramId id), (out, id), hos::Version_7_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 15, Result, EraseApplicationLegalInformationRedirection, (ncm::ProgramId id), hos::Version_5_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 17, Result, RedirectProgramPathForDebug, (const lr::Path &path, ncm::ProgramId id), (path, id), hos::Version_7_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 16, Result, ResolveProgramPathForDebug, (sf::Out<Path> out, ncm::ProgramId id), hos::Version_7_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 18, Result, RedirectApplicationProgramPathForDebugDeprecated, (const lr::Path &path, ncm::ProgramId id), (path, id), hos::Version_7_0_0, hos::Version_8_1_1) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 17, Result, RedirectProgramPathForDebug, (const Path &path, ncm::ProgramId id), hos::Version_7_0_0) \
|
AMS_SF_METHOD_INFO(C, H, 18, Result, RedirectApplicationProgramPathForDebug, (const lr::Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), (path, id, owner_id), hos::Version_9_0_0) \
|
||||||
AMS_SF_METHOD_INFO(C, H, 18, Result, RedirectApplicationProgramPathForDebugDeprecated, (const Path &path, ncm::ProgramId id), hos::Version_7_0_0, hos::Version_8_1_1) \
|
AMS_SF_METHOD_INFO(C, H, 19, Result, EraseProgramRedirectionForDebug, (ncm::ProgramId id), (id), hos::Version_7_0_0)
|
||||||
AMS_SF_METHOD_INFO(C, H, 18, Result, RedirectApplicationProgramPathForDebug, (const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), hos::Version_9_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 19, Result, EraseProgramRedirectionForDebug, (ncm::ProgramId id), hos::Version_7_0_0)
|
|
||||||
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(ILocationResolver, AMS_LR_I_LOCATION_RESOLVER_INTERFACE_INFO)
|
AMS_SF_DEFINE_INTERFACE(ams::lr, ILocationResolver, AMS_LR_I_LOCATION_RESOLVER_INTERFACE_INFO)
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -20,14 +20,10 @@
|
||||||
#include <stratosphere/lr/lr_i_add_on_content_location_resolver.hpp>
|
#include <stratosphere/lr/lr_i_add_on_content_location_resolver.hpp>
|
||||||
#include <stratosphere/lr/lr_i_registered_location_resolver.hpp>
|
#include <stratosphere/lr/lr_i_registered_location_resolver.hpp>
|
||||||
|
|
||||||
namespace ams::lr {
|
#define AMS_LR_I_LOCATION_RESOLVER_MANAGER_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, OpenLocationResolver, (sf::Out<ams::sf::SharedPointer<lr::ILocationResolver>> out, ncm::StorageId storage_id), (out, storage_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, OpenRegisteredLocationResolver, (sf::Out<ams::sf::SharedPointer<lr::IRegisteredLocationResolver>> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, RefreshLocationResolver, (ncm::StorageId storage_id), (storage_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, OpenAddOnContentLocationResolver, (sf::Out<ams::sf::SharedPointer<lr::IAddOnContentLocationResolver>> out), (out), hos::Version_2_0_0)
|
||||||
|
|
||||||
#define AMS_LR_I_LOCATION_RESOLVER_MANAGER_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::lr, ILocationResolverManager, AMS_LR_I_LOCATION_RESOLVER_MANAGER_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, OpenLocationResolver, (sf::Out<std::shared_ptr<ILocationResolver>> out, ncm::StorageId storage_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, OpenRegisteredLocationResolver, (sf::Out<std::shared_ptr<IRegisteredLocationResolver>> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, RefreshLocationResolver, (ncm::StorageId storage_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, OpenAddOnContentLocationResolver, (sf::Out<std::shared_ptr<IAddOnContentLocationResolver>> out), hos::Version_2_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(ILocationResolverManager, AMS_LR_I_LOCATION_RESOLVER_MANAGER_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -17,24 +17,20 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <stratosphere/lr/lr_types.hpp>
|
#include <stratosphere/lr/lr_types.hpp>
|
||||||
|
|
||||||
namespace ams::lr {
|
#define AMS_LR_I_REGISTERED_LOCATION_RESOLVER_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, ResolveProgramPath, (sf::Out<lr::Path> out, ncm::ProgramId id), (out, id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, RegisterProgramPathDeprecated, (const lr::Path &path, ncm::ProgramId id), (path, id), hos::Version_1_0_0, hos::Version_8_1_1) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, RegisterProgramPath, (const lr::Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), (path, id, owner_id), hos::Version_9_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, UnregisterProgramPath, (ncm::ProgramId id), (id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, RedirectProgramPathDeprecated, (const lr::Path &path, ncm::ProgramId id), (path, id), hos::Version_1_0_0, hos::Version_8_1_1) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, RedirectProgramPath, (const lr::Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), (path, id, owner_id), hos::Version_9_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, ResolveHtmlDocumentPath, (sf::Out<lr::Path> out, ncm::ProgramId id), (out, id), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, RegisterHtmlDocumentPathDeprecated, (const lr::Path &path, ncm::ProgramId id), (path, id), hos::Version_2_0_0, hos::Version_8_1_1) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, RegisterHtmlDocumentPath, (const lr::Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), (path, id, owner_id), hos::Version_9_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 6, Result, UnregisterHtmlDocumentPath, (ncm::ProgramId id), (id), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 7, Result, RedirectHtmlDocumentPathDeprecated, (const lr::Path &path, ncm::ProgramId id), (path, id), hos::Version_2_0_0, hos::Version_8_1_1) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 7, Result, RedirectHtmlDocumentPath, (const lr::Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), (path, id, owner_id), hos::Version_9_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 8, Result, Refresh, (), (), hos::Version_7_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 9, Result, RefreshExcluding, (const sf::InArray<ncm::ProgramId> &ids), (ids), hos::Version_9_0_0)
|
||||||
|
|
||||||
#define AMS_LR_I_REGISTERED_LOCATION_RESOLVER_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::lr, IRegisteredLocationResolver, AMS_LR_I_REGISTERED_LOCATION_RESOLVER_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, ResolveProgramPath, (sf::Out<Path> out, ncm::ProgramId id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, RegisterProgramPathDeprecated, (const Path &path, ncm::ProgramId id), hos::Version_1_0_0, hos::Version_8_1_1) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, RegisterProgramPath, (const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), hos::Version_9_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, UnregisterProgramPath, (ncm::ProgramId id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, RedirectProgramPathDeprecated, (const Path &path, ncm::ProgramId id), hos::Version_1_0_0, hos::Version_8_1_1) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, RedirectProgramPath, (const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), hos::Version_9_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, ResolveHtmlDocumentPath, (sf::Out<Path> out, ncm::ProgramId id), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, RegisterHtmlDocumentPathDeprecated, (const Path &path, ncm::ProgramId id), hos::Version_2_0_0, hos::Version_8_1_1) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, RegisterHtmlDocumentPath, (const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), hos::Version_9_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, UnregisterHtmlDocumentPath, (ncm::ProgramId id), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, RedirectHtmlDocumentPathDeprecated, (const Path &path, ncm::ProgramId id), hos::Version_2_0_0, hos::Version_8_1_1) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, RedirectHtmlDocumentPath, (const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), hos::Version_9_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 8, Result, Refresh, (), hos::Version_7_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, Result, RefreshExcluding, (const sf::InArray<ncm::ProgramId> &ids), hos::Version_9_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IRegisteredLocationResolver, AMS_LR_I_REGISTERED_LOCATION_RESOLVER_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -23,21 +23,21 @@ namespace ams::lr {
|
||||||
class LocationResolver {
|
class LocationResolver {
|
||||||
NON_COPYABLE(LocationResolver);
|
NON_COPYABLE(LocationResolver);
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<ILocationResolver> interface;
|
sf::SharedPointer<ILocationResolver> interface;
|
||||||
public:
|
public:
|
||||||
LocationResolver() { /* ... */ }
|
LocationResolver() { /* ... */ }
|
||||||
explicit LocationResolver(std::shared_ptr<ILocationResolver> intf) : interface(std::move(intf)) { /* ... */ }
|
explicit LocationResolver(sf::SharedPointer<ILocationResolver> intf) : interface(intf) { /* ... */ }
|
||||||
|
|
||||||
LocationResolver(LocationResolver &&rhs) {
|
LocationResolver(LocationResolver &&rhs) {
|
||||||
this->interface = std::move(rhs.interface);
|
this->interface = std::move(rhs.interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
LocationResolver &operator=(LocationResolver &&rhs) {
|
LocationResolver &operator=(LocationResolver &&rhs) {
|
||||||
LocationResolver(std::move(rhs)).Swap(*this);
|
LocationResolver(std::move(rhs)).swap(*this);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Swap(LocationResolver &rhs) {
|
void swap(LocationResolver &rhs) {
|
||||||
std::swap(this->interface, rhs.interface);
|
std::swap(this->interface, rhs.interface);
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -21,20 +21,20 @@
|
||||||
|
|
||||||
namespace ams::lr {
|
namespace ams::lr {
|
||||||
|
|
||||||
class LocationResolverManagerImpl final {
|
class LocationResolverManagerImpl {
|
||||||
private:
|
private:
|
||||||
/* Resolver storage. */
|
/* Resolver storage. */
|
||||||
ncm::BoundedMap<ncm::StorageId, std::shared_ptr<ILocationResolver>, 5> location_resolvers;
|
ncm::BoundedMap<ncm::StorageId, sf::SharedPointer<ILocationResolver>, 5> location_resolvers;
|
||||||
std::shared_ptr<IRegisteredLocationResolver> registered_location_resolver = nullptr;
|
sf::SharedPointer<IRegisteredLocationResolver> registered_location_resolver = nullptr;
|
||||||
std::shared_ptr<IAddOnContentLocationResolver> add_on_content_location_resolver = nullptr;
|
sf::SharedPointer<IAddOnContentLocationResolver> add_on_content_location_resolver = nullptr;
|
||||||
|
|
||||||
os::Mutex mutex{false};
|
os::Mutex mutex{false};
|
||||||
public:
|
public:
|
||||||
/* Actual commands. */
|
/* Actual commands. */
|
||||||
Result OpenLocationResolver(sf::Out<std::shared_ptr<ILocationResolver>> out, ncm::StorageId storage_id);
|
Result OpenLocationResolver(sf::Out<sf::SharedPointer<ILocationResolver>> out, ncm::StorageId storage_id);
|
||||||
Result OpenRegisteredLocationResolver(sf::Out<std::shared_ptr<IRegisteredLocationResolver>> out);
|
Result OpenRegisteredLocationResolver(sf::Out<sf::SharedPointer<IRegisteredLocationResolver>> out);
|
||||||
Result RefreshLocationResolver(ncm::StorageId storage_id);
|
Result RefreshLocationResolver(ncm::StorageId storage_id);
|
||||||
Result OpenAddOnContentLocationResolver(sf::Out<std::shared_ptr<IAddOnContentLocationResolver>> out);
|
Result OpenAddOnContentLocationResolver(sf::Out<sf::SharedPointer<IAddOnContentLocationResolver>> out);
|
||||||
};
|
};
|
||||||
static_assert(IsILocationResolverManager<LocationResolverManagerImpl>);
|
static_assert(IsILocationResolverManager<LocationResolverManagerImpl>);
|
||||||
|
|
||||||
|
|
|
@ -23,10 +23,10 @@ namespace ams::lr {
|
||||||
class RegisteredLocationResolver {
|
class RegisteredLocationResolver {
|
||||||
NON_COPYABLE(RegisteredLocationResolver);
|
NON_COPYABLE(RegisteredLocationResolver);
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<IRegisteredLocationResolver> interface;
|
sf::SharedPointer<IRegisteredLocationResolver> interface;
|
||||||
public:
|
public:
|
||||||
RegisteredLocationResolver() { /* ... */ }
|
RegisteredLocationResolver() { /* ... */ }
|
||||||
explicit RegisteredLocationResolver(std::shared_ptr<IRegisteredLocationResolver> intf) : interface(std::move(intf)) { /* ... */ }
|
explicit RegisteredLocationResolver(sf::SharedPointer<IRegisteredLocationResolver> intf) : interface(intf) { /* ... */ }
|
||||||
|
|
||||||
RegisteredLocationResolver(RegisteredLocationResolver &&rhs) {
|
RegisteredLocationResolver(RegisteredLocationResolver &&rhs) {
|
||||||
this->interface = std::move(rhs.interface);
|
this->interface = std::move(rhs.interface);
|
||||||
|
|
|
@ -67,7 +67,7 @@ namespace ams::ncm {
|
||||||
};
|
};
|
||||||
static_assert(util::is_pod<SystemSaveDataInfo>::value);
|
static_assert(util::is_pod<SystemSaveDataInfo>::value);
|
||||||
|
|
||||||
class ContentManagerImpl final {
|
class ContentManagerImpl {
|
||||||
private:
|
private:
|
||||||
constexpr static size_t MaxContentStorageRoots = 8;
|
constexpr static size_t MaxContentStorageRoots = 8;
|
||||||
constexpr static size_t MaxContentMetaDatabaseRoots = 8;
|
constexpr static size_t MaxContentMetaDatabaseRoots = 8;
|
||||||
|
@ -80,7 +80,7 @@ namespace ams::ncm {
|
||||||
char path[128];
|
char path[128];
|
||||||
StorageId storage_id;
|
StorageId storage_id;
|
||||||
fs::ContentStorageId content_storage_id;
|
fs::ContentStorageId content_storage_id;
|
||||||
std::shared_ptr<IContentStorage> content_storage;
|
sf::SharedPointer<IContentStorage> content_storage;
|
||||||
|
|
||||||
ContentStorageRoot() { /* ... */ }
|
ContentStorageRoot() { /* ... */ }
|
||||||
};
|
};
|
||||||
|
@ -93,7 +93,7 @@ namespace ams::ncm {
|
||||||
char path[128];
|
char path[128];
|
||||||
StorageId storage_id;
|
StorageId storage_id;
|
||||||
SystemSaveDataInfo info;
|
SystemSaveDataInfo info;
|
||||||
std::shared_ptr<IContentMetaDatabase> content_meta_database;
|
sf::SharedPointer<IContentMetaDatabase> content_meta_database;
|
||||||
std::optional<kvdb::MemoryKeyValueStore<ContentMetaKey>> kvs;
|
std::optional<kvdb::MemoryKeyValueStore<ContentMetaKey>> kvs;
|
||||||
ContentMetaMemoryResource *memory_resource;
|
ContentMetaMemoryResource *memory_resource;
|
||||||
u32 max_content_metas;
|
u32 max_content_metas;
|
||||||
|
@ -135,8 +135,8 @@ namespace ams::ncm {
|
||||||
Result CreateContentMetaDatabase(StorageId storage_id);
|
Result CreateContentMetaDatabase(StorageId storage_id);
|
||||||
Result VerifyContentStorage(StorageId storage_id);
|
Result VerifyContentStorage(StorageId storage_id);
|
||||||
Result VerifyContentMetaDatabase(StorageId storage_id);
|
Result VerifyContentMetaDatabase(StorageId storage_id);
|
||||||
Result OpenContentStorage(sf::Out<std::shared_ptr<IContentStorage>> out, StorageId storage_id);
|
Result OpenContentStorage(sf::Out<sf::SharedPointer<IContentStorage>> out, StorageId storage_id);
|
||||||
Result OpenContentMetaDatabase(sf::Out<std::shared_ptr<IContentMetaDatabase>> out, StorageId storage_id);
|
Result OpenContentMetaDatabase(sf::Out<sf::SharedPointer<IContentMetaDatabase>> out, StorageId storage_id);
|
||||||
Result CloseContentStorageForcibly(StorageId storage_id);
|
Result CloseContentStorageForcibly(StorageId storage_id);
|
||||||
Result CloseContentMetaDatabaseForcibly(StorageId storage_id);
|
Result CloseContentMetaDatabaseForcibly(StorageId storage_id);
|
||||||
Result CleanupContentMetaDatabase(StorageId storage_id);
|
Result CleanupContentMetaDatabase(StorageId storage_id);
|
||||||
|
|
|
@ -26,21 +26,21 @@ namespace ams::ncm {
|
||||||
s32 total;
|
s32 total;
|
||||||
};
|
};
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<IContentMetaDatabase> interface;
|
sf::SharedPointer<IContentMetaDatabase> interface;
|
||||||
public:
|
public:
|
||||||
ContentMetaDatabase() { /* ... */ }
|
ContentMetaDatabase() { /* ... */ }
|
||||||
explicit ContentMetaDatabase(std::shared_ptr<IContentMetaDatabase> intf) : interface(std::move(intf)) { /* ... */ }
|
explicit ContentMetaDatabase(sf::SharedPointer<IContentMetaDatabase> intf) : interface(intf) { /* ... */ }
|
||||||
|
|
||||||
ContentMetaDatabase(ContentMetaDatabase &&rhs) {
|
ContentMetaDatabase(ContentMetaDatabase &&rhs) {
|
||||||
this->interface = std::move(rhs.interface);
|
this->interface = std::move(rhs.interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
ContentMetaDatabase &operator=(ContentMetaDatabase &&rhs) {
|
ContentMetaDatabase &operator=(ContentMetaDatabase &&rhs) {
|
||||||
ContentMetaDatabase(std::move(rhs)).Swap(*this);
|
ContentMetaDatabase(std::move(rhs)).swap(*this);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Swap(ContentMetaDatabase &rhs) {
|
void swap(ContentMetaDatabase &rhs) {
|
||||||
std::swap(this->interface, rhs.interface);
|
std::swap(this->interface, rhs.interface);
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -21,21 +21,21 @@ namespace ams::ncm {
|
||||||
class ContentStorage {
|
class ContentStorage {
|
||||||
NON_COPYABLE(ContentStorage);
|
NON_COPYABLE(ContentStorage);
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<IContentStorage> interface;
|
sf::SharedPointer<IContentStorage> interface;
|
||||||
public:
|
public:
|
||||||
ContentStorage() { /* ... */ }
|
ContentStorage() { /* ... */ }
|
||||||
explicit ContentStorage(std::shared_ptr<IContentStorage> intf) : interface(std::move(intf)) { /* ... */ }
|
explicit ContentStorage(sf::SharedPointer<IContentStorage> intf) : interface(intf) { /* ... */ }
|
||||||
|
|
||||||
ContentStorage(ContentStorage &&rhs) {
|
ContentStorage(ContentStorage &&rhs) {
|
||||||
this->interface = std::move(rhs.interface);
|
this->interface = std::move(rhs.interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
ContentStorage &operator=(ContentStorage &&rhs) {
|
ContentStorage &operator=(ContentStorage &&rhs) {
|
||||||
ContentStorage(std::move(rhs)).Swap(*this);
|
ContentStorage(std::move(rhs)).swap(*this);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Swap(ContentStorage &rhs) {
|
void swap(ContentStorage &rhs) {
|
||||||
std::swap(this->interface, rhs.interface);
|
std::swap(this->interface, rhs.interface);
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -18,25 +18,21 @@
|
||||||
#include <stratosphere/ncm/ncm_i_content_meta_database.hpp>
|
#include <stratosphere/ncm/ncm_i_content_meta_database.hpp>
|
||||||
#include <stratosphere/ncm/ncm_memory_report.hpp>
|
#include <stratosphere/ncm/ncm_memory_report.hpp>
|
||||||
|
|
||||||
namespace ams::ncm {
|
#define AMS_NCM_I_CONTENT_MANAGER_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, CreateContentStorage, (ncm::StorageId storage_id), (storage_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, CreateContentMetaDatabase, (ncm::StorageId storage_id), (storage_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, VerifyContentStorage, (ncm::StorageId storage_id), (storage_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, VerifyContentMetaDatabase, (ncm::StorageId storage_id), (storage_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, OpenContentStorage, (sf::Out<sf::SharedPointer<ncm::IContentStorage>> out, ncm::StorageId storage_id), (out, storage_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, OpenContentMetaDatabase, (sf::Out<sf::SharedPointer<ncm::IContentMetaDatabase>> out, ncm::StorageId storage_id), (out, storage_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 6, Result, CloseContentStorageForcibly, (ncm::StorageId storage_id), (storage_id), hos::Version_1_0_0, hos::Version_1_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 7, Result, CloseContentMetaDatabaseForcibly, (ncm::StorageId storage_id), (storage_id), hos::Version_1_0_0, hos::Version_1_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 8, Result, CleanupContentMetaDatabase, (ncm::StorageId storage_id), (storage_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 9, Result, ActivateContentStorage, (ncm::StorageId storage_id), (storage_id), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 10, Result, InactivateContentStorage, (ncm::StorageId storage_id), (storage_id), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 11, Result, ActivateContentMetaDatabase, (ncm::StorageId storage_id), (storage_id), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 12, Result, InactivateContentMetaDatabase, (ncm::StorageId storage_id), (storage_id), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 13, Result, InvalidateRightsIdCache, (), (), hos::Version_9_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 14, Result, GetMemoryReport, (sf::Out<ncm::MemoryReport> out), (out), hos::Version_10_0_0)
|
||||||
|
|
||||||
#define AMS_NCM_I_CONTENT_MANAGER_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::ncm, IContentManager, AMS_NCM_I_CONTENT_MANAGER_INTERFACE_INFO);
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, CreateContentStorage, (StorageId storage_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, CreateContentMetaDatabase, (StorageId storage_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, VerifyContentStorage, (StorageId storage_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, VerifyContentMetaDatabase, (StorageId storage_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, OpenContentStorage, (sf::Out<std::shared_ptr<IContentStorage>> out, StorageId storage_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, OpenContentMetaDatabase, (sf::Out<std::shared_ptr<IContentMetaDatabase>> out, StorageId storage_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, CloseContentStorageForcibly, (StorageId storage_id), hos::Version_1_0_0, hos::Version_1_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, CloseContentMetaDatabaseForcibly, (StorageId storage_id), hos::Version_1_0_0, hos::Version_1_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 8, Result, CleanupContentMetaDatabase, (StorageId storage_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, Result, ActivateContentStorage, (StorageId storage_id), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, InactivateContentStorage, (StorageId storage_id), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 11, Result, ActivateContentMetaDatabase, (StorageId storage_id), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 12, Result, InactivateContentMetaDatabase, (StorageId storage_id), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 13, Result, InvalidateRightsIdCache, (), hos::Version_9_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 14, Result, GetMemoryReport, (sf::Out<MemoryReport> out), hos::Version_10_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IContentManager, AMS_NCM_I_CONTENT_MANAGER_INTERFACE_INFO);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -17,33 +17,29 @@
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
#include <stratosphere/ncm/ncm_content_meta.hpp>
|
#include <stratosphere/ncm/ncm_content_meta.hpp>
|
||||||
|
|
||||||
namespace ams::ncm {
|
#define AMS_NCM_I_CONTENT_META_DATABASE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, Set, (const ncm::ContentMetaKey &key, const sf::InBuffer &value), (key, value)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, Get, (sf::Out<u64> out_size, const ncm::ContentMetaKey &key, const sf::OutBuffer &out_value), (out_size, key, out_value)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, Remove, (const ncm::ContentMetaKey &key), (key)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, GetContentIdByType, (sf::Out<ncm::ContentId> out_content_id, const ncm::ContentMetaKey &key, ncm::ContentType type), (out_content_id, key, type)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, ListContentInfo, (sf::Out<s32> out_entries_written, const sf::OutArray<ncm::ContentInfo> &out_info, const ncm::ContentMetaKey &key, s32 offset), (out_entries_written, out_info, key, offset)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, List, (sf::Out<s32> out_entries_total, sf::Out<s32> out_entries_written, const sf::OutArray<ncm::ContentMetaKey> &out_info, ncm::ContentMetaType meta_type, ncm::ApplicationId application_id, u64 min, u64 max, ncm::ContentInstallType install_type), (out_entries_total, out_entries_written, out_info, meta_type, application_id, min, max, install_type)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 6, Result, GetLatestContentMetaKey, (sf::Out<ncm::ContentMetaKey> out_key, u64 id), (out_key, id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 7, Result, ListApplication, (sf::Out<s32> out_entries_total, sf::Out<s32> out_entries_written, const sf::OutArray<ncm::ApplicationContentMetaKey> &out_keys, ncm::ContentMetaType meta_type), (out_entries_total, out_entries_written, out_keys, meta_type)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 8, Result, Has, (sf::Out<bool> out, const ncm::ContentMetaKey &key), (out, key)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 9, Result, HasAll, (sf::Out<bool> out, const sf::InArray<ncm::ContentMetaKey> &keys), (out, keys)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 10, Result, GetSize, (sf::Out<u64> out_size, const ncm::ContentMetaKey &key), (out_size, key)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 11, Result, GetRequiredSystemVersion, (sf::Out<u32> out_version, const ncm::ContentMetaKey &key), (out_version, key)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 12, Result, GetPatchId, (sf::Out<ncm::PatchId> out_patch_id, const ncm::ContentMetaKey &key), (out_patch_id, key)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 13, Result, DisableForcibly, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 14, Result, LookupOrphanContent, (const sf::OutArray<bool> &out_orphaned, const sf::InArray<ncm::ContentId> &content_ids), (out_orphaned, content_ids)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 15, Result, Commit, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 16, Result, HasContent, (sf::Out<bool> out, const ncm::ContentMetaKey &key, const ncm::ContentId &content_id), (out, key, content_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 17, Result, ListContentMetaInfo, (sf::Out<s32> out_entries_written, const sf::OutArray<ncm::ContentMetaInfo> &out_meta_info, const ncm::ContentMetaKey &key, s32 offset), (out_entries_written, out_meta_info, key, offset)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 18, Result, GetAttributes, (sf::Out<u8> out_attributes, const ncm::ContentMetaKey &key), (out_attributes, key)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 19, Result, GetRequiredApplicationVersion, (sf::Out<u32> out_version, const ncm::ContentMetaKey &key), (out_version, key), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 20, Result, GetContentIdByTypeAndIdOffset, (sf::Out<ncm::ContentId> out_content_id, const ncm::ContentMetaKey &key, ncm::ContentType type, u8 id_offset), (out_content_id, key, type, id_offset), hos::Version_5_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 21, Result, GetCount, (sf::Out<u32> out_count), (out_count), hos::Version_10_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 22, Result, GetOwnerApplicationId, (sf::Out<ncm::ApplicationId> out_id, const ncm::ContentMetaKey &key), (out_id, key), hos::Version_10_0_0)
|
||||||
|
|
||||||
#define AMS_NCM_I_CONTENT_META_DATABASE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::ncm, IContentMetaDatabase, AMS_NCM_I_CONTENT_META_DATABASE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, Set, (const ContentMetaKey &key, sf::InBuffer value)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, Get, (sf::Out<u64> out_size, const ContentMetaKey &key, sf::OutBuffer out_value)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, Remove, (const ContentMetaKey &key)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, GetContentIdByType, (sf::Out<ContentId> out_content_id, const ContentMetaKey &key, ContentType type)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, ListContentInfo, (sf::Out<s32> out_entries_written, const sf::OutArray<ContentInfo> &out_info, const ContentMetaKey &key, s32 offset)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, List, (sf::Out<s32> out_entries_total, sf::Out<s32> out_entries_written, const sf::OutArray<ContentMetaKey> &out_info, ContentMetaType meta_type, ApplicationId application_id, u64 min, u64 max, ContentInstallType install_type)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, GetLatestContentMetaKey, (sf::Out<ContentMetaKey> out_key, u64 id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, ListApplication, (sf::Out<s32> out_entries_total, sf::Out<s32> out_entries_written, const sf::OutArray<ApplicationContentMetaKey> &out_keys, ContentMetaType meta_type)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 8, Result, Has, (sf::Out<bool> out, const ContentMetaKey &key)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, Result, HasAll, (sf::Out<bool> out, const sf::InArray<ContentMetaKey> &keys)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, GetSize, (sf::Out<u64> out_size, const ContentMetaKey &key)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 11, Result, GetRequiredSystemVersion, (sf::Out<u32> out_version, const ContentMetaKey &key)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 12, Result, GetPatchId, (sf::Out<PatchId> out_patch_id, const ContentMetaKey &key)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 13, Result, DisableForcibly, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 14, Result, LookupOrphanContent, (const sf::OutArray<bool> &out_orphaned, const sf::InArray<ContentId> &content_ids)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 15, Result, Commit, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 16, Result, HasContent, (sf::Out<bool> out, const ContentMetaKey &key, const ContentId &content_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 17, Result, ListContentMetaInfo, (sf::Out<s32> out_entries_written, const sf::OutArray<ContentMetaInfo> &out_meta_info, const ContentMetaKey &key, s32 offset)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 18, Result, GetAttributes, (sf::Out<u8> out_attributes, const ContentMetaKey &key)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 19, Result, GetRequiredApplicationVersion, (sf::Out<u32> out_version, const ContentMetaKey &key), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 20, Result, GetContentIdByTypeAndIdOffset, (sf::Out<ContentId> out_content_id, const ContentMetaKey &key, ContentType type, u8 id_offset), hos::Version_5_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 21, Result, GetCount, (sf::Out<u32> out_count), hos::Version_10_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 22, Result, GetOwnerApplicationId, (sf::Out<ApplicationId> out_id, const ContentMetaKey &key), hos::Version_10_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IContentMetaDatabase, AMS_NCM_I_CONTENT_META_DATABASE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -20,40 +20,36 @@
|
||||||
#include <stratosphere/ncm/ncm_path.hpp>
|
#include <stratosphere/ncm/ncm_path.hpp>
|
||||||
#include <stratosphere/ncm/ncm_rights_id.hpp>
|
#include <stratosphere/ncm/ncm_rights_id.hpp>
|
||||||
|
|
||||||
namespace ams::ncm {
|
#define AMS_NCM_I_CONTENT_STORAGE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, GeneratePlaceHolderId, (sf::Out<ncm::PlaceHolderId> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, CreatePlaceHolder, (ncm::PlaceHolderId placeholder_id, ncm::ContentId content_id, s64 size), (placeholder_id, content_id, size)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, DeletePlaceHolder, (ncm::PlaceHolderId placeholder_id), (placeholder_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, HasPlaceHolder, (sf::Out<bool> out, ncm::PlaceHolderId placeholder_id), (out, placeholder_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, WritePlaceHolder, (ncm::PlaceHolderId placeholder_id, s64 offset, const sf::InBuffer &data), (placeholder_id, offset, data)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, Register, (ncm::PlaceHolderId placeholder_id, ncm::ContentId content_id), (placeholder_id, content_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 6, Result, Delete, (ncm::ContentId content_id), (content_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 7, Result, Has, (sf::Out<bool> out, ncm::ContentId content_id), (out, content_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 8, Result, GetPath, (sf::Out<ncm::Path> out, ncm::ContentId content_id), (out, content_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 9, Result, GetPlaceHolderPath, (sf::Out<ncm::Path> out, ncm::PlaceHolderId placeholder_id), (out, placeholder_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 10, Result, CleanupAllPlaceHolder, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 11, Result, ListPlaceHolder, (sf::Out<s32> out_count, const sf::OutArray<ncm::PlaceHolderId> &out_buf), (out_count, out_buf)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 12, Result, GetContentCount, (sf::Out<s32> out_count), (out_count)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 13, Result, ListContentId, (sf::Out<s32> out_count, const sf::OutArray<ncm::ContentId> &out_buf, s32 start_offset), (out_count, out_buf, start_offset)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 14, Result, GetSizeFromContentId, (sf::Out<s64> out_size, ncm::ContentId content_id), (out_size, content_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 15, Result, DisableForcibly, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 16, Result, RevertToPlaceHolder, (ncm::PlaceHolderId placeholder_id, ncm::ContentId old_content_id, ncm::ContentId new_content_id), (placeholder_id, old_content_id, new_content_id), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 17, Result, SetPlaceHolderSize, (ncm::PlaceHolderId placeholder_id, s64 size), (placeholder_id, size), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 18, Result, ReadContentIdFile, (const sf::OutBuffer &buf, ncm::ContentId content_id, s64 offset), (buf, content_id, offset), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 19, Result, GetRightsIdFromPlaceHolderIdDeprecated, (sf::Out<ams::fs::RightsId> out_rights_id, ncm::PlaceHolderId placeholder_id), (out_rights_id, placeholder_id), hos::Version_2_0_0, hos::Version_2_3_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 19, Result, GetRightsIdFromPlaceHolderId, (sf::Out<ncm::RightsId> out_rights_id, ncm::PlaceHolderId placeholder_id), (out_rights_id, placeholder_id), hos::Version_3_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 20, Result, GetRightsIdFromContentIdDeprecated, (sf::Out<ams::fs::RightsId> out_rights_id, ncm::ContentId content_id), (out_rights_id, content_id), hos::Version_2_0_0, hos::Version_2_3_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 20, Result, GetRightsIdFromContentId, (sf::Out<ncm::RightsId> out_rights_id, ncm::ContentId content_id), (out_rights_id, content_id), hos::Version_3_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 21, Result, WriteContentForDebug, (ncm::ContentId content_id, s64 offset, const sf::InBuffer &data), (content_id, offset, data), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 22, Result, GetFreeSpaceSize, (sf::Out<s64> out_size), (out_size), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 23, Result, GetTotalSpaceSize, (sf::Out<s64> out_size), (out_size), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 24, Result, FlushPlaceHolder, (), (), hos::Version_3_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 25, Result, GetSizeFromPlaceHolderId, (sf::Out<s64> out, ncm::PlaceHolderId placeholder_id), (out, placeholder_id), hos::Version_4_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 26, Result, RepairInvalidFileAttribute, (), (), hos::Version_4_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 27, Result, GetRightsIdFromPlaceHolderIdWithCache, (sf::Out<ncm::RightsId> out_rights_id, ncm::PlaceHolderId placeholder_id, ncm::ContentId cache_content_id), (out_rights_id, placeholder_id, cache_content_id), hos::Version_8_0_0)
|
||||||
|
|
||||||
#define AMS_NCM_I_CONTENT_STORAGE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::ncm, IContentStorage, AMS_NCM_I_CONTENT_STORAGE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, GeneratePlaceHolderId, (sf::Out<PlaceHolderId> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, CreatePlaceHolder, (PlaceHolderId placeholder_id, ContentId content_id, s64 size)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, DeletePlaceHolder, (PlaceHolderId placeholder_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, HasPlaceHolder, (sf::Out<bool> out, PlaceHolderId placeholder_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, WritePlaceHolder, (PlaceHolderId placeholder_id, s64 offset, sf::InBuffer data)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, Register, (PlaceHolderId placeholder_id, ContentId content_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, Delete, (ContentId content_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, Has, (sf::Out<bool> out, ContentId content_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 8, Result, GetPath, (sf::Out<Path> out, ContentId content_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, Result, GetPlaceHolderPath, (sf::Out<Path> out, PlaceHolderId placeholder_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, CleanupAllPlaceHolder, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 11, Result, ListPlaceHolder, (sf::Out<s32> out_count, const sf::OutArray<PlaceHolderId> &out_buf)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 12, Result, GetContentCount, (sf::Out<s32> out_count)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 13, Result, ListContentId, (sf::Out<s32> out_count, const sf::OutArray<ContentId> &out_buf, s32 start_offset)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 14, Result, GetSizeFromContentId, (sf::Out<s64> out_size, ContentId content_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 15, Result, DisableForcibly, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 16, Result, RevertToPlaceHolder, (PlaceHolderId placeholder_id, ContentId old_content_id, ContentId new_content_id), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 17, Result, SetPlaceHolderSize, (PlaceHolderId placeholder_id, s64 size), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 18, Result, ReadContentIdFile, (sf::OutBuffer buf, ContentId content_id, s64 offset), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 19, Result, GetRightsIdFromPlaceHolderIdDeprecated, (sf::Out<ams::fs::RightsId> out_rights_id, PlaceHolderId placeholder_id), hos::Version_2_0_0, hos::Version_2_3_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 19, Result, GetRightsIdFromPlaceHolderId, (sf::Out<ncm::RightsId> out_rights_id, PlaceHolderId placeholder_id), hos::Version_3_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 20, Result, GetRightsIdFromContentIdDeprecated, (sf::Out<ams::fs::RightsId> out_rights_id, ContentId content_id), hos::Version_2_0_0, hos::Version_2_3_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 20, Result, GetRightsIdFromContentId, (sf::Out<ncm::RightsId> out_rights_id, ContentId content_id), hos::Version_3_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 21, Result, WriteContentForDebug, (ContentId content_id, s64 offset, sf::InBuffer data), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 22, Result, GetFreeSpaceSize, (sf::Out<s64> out_size), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 23, Result, GetTotalSpaceSize, (sf::Out<s64> out_size), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 24, Result, FlushPlaceHolder, (), hos::Version_3_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 25, Result, GetSizeFromPlaceHolderId, (sf::Out<s64> out, PlaceHolderId placeholder_id), hos::Version_4_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 26, Result, RepairInvalidFileAttribute, (), hos::Version_4_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 27, Result, GetRightsIdFromPlaceHolderIdWithCache, (sf::Out<ncm::RightsId> out_rights_id, PlaceHolderId placeholder_id, ContentId cache_content_id), hos::Version_8_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IContentStorage, AMS_NCM_I_CONTENT_STORAGE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,13 +19,9 @@
|
||||||
#include <stratosphere/err/err_error_context.hpp>
|
#include <stratosphere/err/err_error_context.hpp>
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
namespace ams::ns::impl {
|
#define AMS_NS_I_ASYNC_RESULT_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, Get, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, Cancel, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, GetErrorContext, (::ams::sf::Out<::ams::err::ErrorContext> out), (out))
|
||||||
|
|
||||||
#define AMS_NS_I_ASYNC_RESULT_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::ns::impl, IAsyncResult, AMS_NS_I_ASYNC_RESULT_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, Get, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, Cancel, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, GetErrorContext, (::ams::sf::Out<::ams::err::ErrorContext> out))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IAsyncResult, AMS_NS_I_ASYNC_RESULT_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -25,10 +25,10 @@ namespace ams::pgl {
|
||||||
class EventObserver {
|
class EventObserver {
|
||||||
NON_COPYABLE(EventObserver);
|
NON_COPYABLE(EventObserver);
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<pgl::sf::IEventObserver> interface;
|
ams::sf::SharedPointer<pgl::sf::IEventObserver> interface;
|
||||||
public:
|
public:
|
||||||
EventObserver() { /* ... */ }
|
EventObserver() { /* ... */ }
|
||||||
explicit EventObserver(std::shared_ptr<pgl::sf::IEventObserver> intf) : interface(std::move(intf)) { /* ... */ }
|
explicit EventObserver(ams::sf::SharedPointer<pgl::sf::IEventObserver> intf) : interface(intf) { /* ... */ }
|
||||||
|
|
||||||
EventObserver(EventObserver &&rhs) {
|
EventObserver(EventObserver &&rhs) {
|
||||||
this->interface = std::move(rhs.interface);
|
this->interface = std::move(rhs.interface);
|
||||||
|
|
|
@ -20,12 +20,8 @@
|
||||||
#include <stratosphere/pm.hpp>
|
#include <stratosphere/pm.hpp>
|
||||||
#include <stratosphere/pgl/pgl_types.hpp>
|
#include <stratosphere/pgl/pgl_types.hpp>
|
||||||
|
|
||||||
namespace ams::pgl::sf {
|
#define AMS_PGL_I_EVENT_OBSERVER_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, GetProcessEventHandle, (ams::sf::OutCopyHandle out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, GetProcessEventInfo, (ams::sf::Out<pm::ProcessEventInfo> out), (out))
|
||||||
|
|
||||||
#define AMS_PGL_I_EVENT_OBSERVER_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::pgl::sf, IEventObserver, AMS_PGL_I_EVENT_OBSERVER_INTERFACE_INFO);
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, GetProcessEventHandle, (ams::sf::OutCopyHandle out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, GetProcessEventInfo, (ams::sf::Out<pm::ProcessEventInfo> out))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IEventObserver, AMS_PGL_I_EVENT_OBSERVER_INTERFACE_INFO);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -21,25 +21,19 @@
|
||||||
#include <stratosphere/pgl/pgl_types.hpp>
|
#include <stratosphere/pgl/pgl_types.hpp>
|
||||||
#include <stratosphere/pgl/sf/pgl_sf_i_event_observer.hpp>
|
#include <stratosphere/pgl/sf/pgl_sf_i_event_observer.hpp>
|
||||||
|
|
||||||
namespace ams::pgl::sf {
|
#define AMS_PGL_I_SHELL_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, LaunchProgram, (ams::sf::Out<os::ProcessId> out, const ncm::ProgramLocation &loc, u32 pm_flags, u8 pgl_flags), (out, loc, pm_flags, pgl_flags)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, TerminateProcess, (os::ProcessId process_id), (process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, LaunchProgramFromHost, (ams::sf::Out<os::ProcessId> out, const ams::sf::InBuffer &content_path, u32 pm_flags), (out, content_path, pm_flags)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, GetHostContentMetaInfo, (ams::sf::Out<pgl::ContentMetaInfo> out, const ams::sf::InBuffer &content_path), (out, content_path)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, GetApplicationProcessId, (ams::sf::Out<os::ProcessId> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 6, Result, BoostSystemMemoryResourceLimit, (u64 size), (size)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 7, Result, IsProcessTracked, (ams::sf::Out<bool> out, os::ProcessId process_id), (out, process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 8, Result, EnableApplicationCrashReport, (bool enabled), (enabled)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 9, Result, IsApplicationCrashReportEnabled, (ams::sf::Out<bool> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 10, Result, EnableApplicationAllThreadDumpOnCrash, (bool enabled), (enabled)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 12, Result, TriggerApplicationSnapShotDumper, (pgl::SnapShotDumpType dump_type, const ams::sf::InBuffer &arg), (dump_type, arg)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 20, Result, GetShellEventObserver, (ams::sf::Out<ams::sf::SharedPointer<pgl::sf::IEventObserver>> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 21, Result, Command21NotImplemented, (ams::sf::Out<u64> out, u32 in, const ams::sf::InBuffer &buf1, const ams::sf::InBuffer &buf2), (out, in, buf1, buf2), hos::Version_11_0_0)
|
||||||
|
|
||||||
#define AMS_PGL_I_SHELL_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::pgl::sf, IShellInterface, AMS_PGL_I_SHELL_INTERFACE_INTERFACE_INFO);
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, LaunchProgram, (ams::sf::Out<os::ProcessId> out, const ncm::ProgramLocation &loc, u32 pm_flags, u8 pgl_flags)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, TerminateProcess, (os::ProcessId process_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, LaunchProgramFromHost, (ams::sf::Out<os::ProcessId> out, const ams::sf::InBuffer &content_path, u32 pm_flags)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, GetHostContentMetaInfo, (ams::sf::Out<pgl::ContentMetaInfo> out, const ams::sf::InBuffer &content_path)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, GetApplicationProcessId, (ams::sf::Out<os::ProcessId> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, BoostSystemMemoryResourceLimit, (u64 size)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, IsProcessTracked, (ams::sf::Out<bool> out, os::ProcessId process_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 8, Result, EnableApplicationCrashReport, (bool enabled)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, Result, IsApplicationCrashReportEnabled, (ams::sf::Out<bool> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, EnableApplicationAllThreadDumpOnCrash, (bool enabled)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 12, Result, TriggerApplicationSnapShotDumper, (SnapShotDumpType dump_type, const ams::sf::InBuffer &arg)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 20, Result, GetShellEventObserver, (ams::sf::Out<std::shared_ptr<pgl::sf::IEventObserver>> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 21, Result, Command21NotImplemented, (ams::sf::Out<u64> out, u32 in, const ams::sf::InBuffer &buf1, const ams::sf::InBuffer &buf2), hos::Version_11_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IShellInterface, AMS_PGL_I_SHELL_INTERFACE_INTERFACE_INFO);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ namespace ams::pgl::srv {
|
||||||
Result EnableApplicationAllThreadDumpOnCrash(bool enabled);
|
Result EnableApplicationAllThreadDumpOnCrash(bool enabled);
|
||||||
Result TriggerApplicationSnapShotDumper(SnapShotDumpType dump_type, const ams::sf::InBuffer &arg);
|
Result TriggerApplicationSnapShotDumper(SnapShotDumpType dump_type, const ams::sf::InBuffer &arg);
|
||||||
|
|
||||||
Result GetShellEventObserver(ams::sf::Out<std::shared_ptr<pgl::sf::IEventObserver>> out);
|
Result GetShellEventObserver(ams::sf::Out<ams::sf::SharedPointer<pgl::sf::IEventObserver>> out);
|
||||||
Result Command21NotImplemented(ams::sf::Out<u64> out, u32 in, const ams::sf::InBuffer &buf1, const ams::sf::InBuffer &buf2);
|
Result Command21NotImplemented(ams::sf::Out<u64> out, u32 in, const ams::sf::InBuffer &buf1, const ams::sf::InBuffer &buf2);
|
||||||
};
|
};
|
||||||
static_assert(pgl::sf::IsIShellInterface<ShellInterface>);
|
static_assert(pgl::sf::IsIShellInterface<ShellInterface>);
|
||||||
|
|
|
@ -19,12 +19,8 @@
|
||||||
#include <stratosphere/pm/pm_types.hpp>
|
#include <stratosphere/pm/pm_types.hpp>
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
namespace ams::pm::impl {
|
#define AMS_PM_I_BOOT_MODE_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, void, GetBootMode, (sf::Out<u32> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, void, SetMaintenanceBoot, (), ())
|
||||||
|
|
||||||
#define AMS_PM_I_BOOT_MODE_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::pm::impl, IBootModeInterface, AMS_PM_I_BOOT_MODE_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, void, GetBootMode, (sf::Out<u32> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, void, SetMaintenanceBoot, ())
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IBootModeInterface, AMS_PM_I_BOOT_MODE_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,32 +19,28 @@
|
||||||
#include <stratosphere/pm/pm_types.hpp>
|
#include <stratosphere/pm/pm_types.hpp>
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
namespace ams::pm::impl {
|
#define AMS_PM_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, GetExceptionProcessIdList, (sf::Out<u32> out_count, const sf::OutArray<os::ProcessId> &out_process_ids), (out_count, out_process_ids)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, StartProcess, (os::ProcessId process_id), (process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, GetProcessId, (sf::Out<os::ProcessId> out, ncm::ProgramId program_id), (out, program_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, HookToCreateProcess, (sf::OutCopyHandle out_hook, ncm::ProgramId program_id), (out_hook, program_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, GetApplicationProcessId, (sf::Out<os::ProcessId> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, HookToCreateApplicationProcess, (sf::OutCopyHandle out_hook), (out_hook)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 6, Result, ClearHook, (u32 which), (which), hos::Version_6_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65000, Result, AtmosphereGetProcessInfo, (sf::OutCopyHandle out_process_handle, sf::Out<ncm::ProgramLocation> out_loc, sf::Out<cfg::OverrideStatus> out_status, os::ProcessId process_id), (out_process_handle, out_loc, out_status, process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65001, Result, AtmosphereGetCurrentLimitInfo, (sf::Out<s64> out_cur_val, sf::Out<s64> out_lim_val, u32 group, u32 resource), (out_cur_val, out_lim_val, group, resource))
|
||||||
|
|
||||||
#define AMS_PM_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::pm::impl, IDebugMonitorInterface, AMS_PM_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, GetExceptionProcessIdList, (sf::Out<u32> out_count, const sf::OutArray<os::ProcessId> &out_process_ids)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, StartProcess, (os::ProcessId process_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, GetProcessId, (sf::Out<os::ProcessId> out, ncm::ProgramId program_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, HookToCreateProcess, (sf::OutCopyHandle out_hook, ncm::ProgramId program_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, GetApplicationProcessId, (sf::Out<os::ProcessId> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, HookToCreateApplicationProcess, (sf::OutCopyHandle out_hook)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, ClearHook, (u32 which), hos::Version_6_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65000, Result, AtmosphereGetProcessInfo, (sf::OutCopyHandle out_process_handle, sf::Out<ncm::ProgramLocation> out_loc, sf::Out<cfg::OverrideStatus> out_status, os::ProcessId process_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65001, Result, AtmosphereGetCurrentLimitInfo, (sf::Out<s64> out_cur_val, sf::Out<s64> out_lim_val, u32 group, u32 resource))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IDebugMonitorInterface, AMS_PM_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO)
|
#define AMS_PM_I_DEPRECATED_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, GetModuleIdList, (sf::Out<u32> out_count, const sf::OutBuffer &out_buf, u64 unused), (out_count, out_buf, unused)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, GetExceptionProcessIdList, (sf::Out<u32> out_count, const sf::OutArray<os::ProcessId> &out_process_ids), (out_count, out_process_ids)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, StartProcess, (os::ProcessId process_id), (process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, GetProcessId, (sf::Out<os::ProcessId> out, ncm::ProgramId program_id), (out, program_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, HookToCreateProcess, (sf::OutCopyHandle out_hook, ncm::ProgramId program_id), (out_hook, program_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, GetApplicationProcessId, (sf::Out<os::ProcessId> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 6, Result, HookToCreateApplicationProcess, (sf::OutCopyHandle out_hook), (out_hook)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65000, Result, AtmosphereGetProcessInfo, (sf::OutCopyHandle out_process_handle, sf::Out<ncm::ProgramLocation> out_loc, sf::Out<cfg::OverrideStatus> out_status, os::ProcessId process_id), (out_process_handle, out_loc, out_status, process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65001, Result, AtmosphereGetCurrentLimitInfo, (sf::Out<s64> out_cur_val, sf::Out<s64> out_lim_val, u32 group, u32 resource), (out_cur_val, out_lim_val, group, resource))
|
||||||
|
|
||||||
#define AMS_PM_I_DEPRECATED_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::pm::impl, IDeprecatedDebugMonitorInterface, AMS_PM_I_DEPRECATED_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, GetModuleIdList, (sf::Out<u32> out_count, const sf::OutBuffer &out_buf, u64 unused)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, GetExceptionProcessIdList, (sf::Out<u32> out_count, const sf::OutArray<os::ProcessId> &out_process_ids)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, StartProcess, (os::ProcessId process_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, GetProcessId, (sf::Out<os::ProcessId> out, ncm::ProgramId program_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, HookToCreateProcess, (sf::OutCopyHandle out_hook, ncm::ProgramId program_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, GetApplicationProcessId, (sf::Out<os::ProcessId> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, HookToCreateApplicationProcess, (sf::OutCopyHandle out_hook)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65000, Result, AtmosphereGetProcessInfo, (sf::OutCopyHandle out_process_handle, sf::Out<ncm::ProgramLocation> out_loc, sf::Out<cfg::OverrideStatus> out_status, os::ProcessId process_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65001, Result, AtmosphereGetCurrentLimitInfo, (sf::Out<s64> out_cur_val, sf::Out<s64> out_lim_val, u32 group, u32 resource))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IDeprecatedDebugMonitorInterface, AMS_PM_I_DEPRECATED_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,14 +19,10 @@
|
||||||
#include <stratosphere/pm/pm_types.hpp>
|
#include <stratosphere/pm/pm_types.hpp>
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
namespace ams::pm::impl {
|
#define AMS_PM_I_INFORMATION_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, GetProgramId, (sf::Out<ncm::ProgramId> out, os::ProcessId process_id), (out, process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65000, Result, AtmosphereGetProcessId, (sf::Out<os::ProcessId> out, ncm::ProgramId program_id), (out, program_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65001, Result, AtmosphereHasLaunchedProgram, (sf::Out<bool> out, ncm::ProgramId program_id), (out, program_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65002, Result, AtmosphereGetProcessInfo, (sf::Out<ncm::ProgramLocation> out_loc, sf::Out<cfg::OverrideStatus> out_status, os::ProcessId process_id), (out_loc, out_status, process_id))
|
||||||
|
|
||||||
#define AMS_PM_I_INFORMATION_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::pm::impl, IInformationInterface, AMS_PM_I_INFORMATION_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, GetProgramId, (sf::Out<ncm::ProgramId> out, os::ProcessId process_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65000, Result, AtmosphereGetProcessId, (sf::Out<os::ProcessId> out, ncm::ProgramId program_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65001, Result, AtmosphereHasLaunchedProgram, (sf::Out<bool> out, ncm::ProgramId program_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65002, Result, AtmosphereGetProcessInfo, (sf::Out<ncm::ProgramLocation> out_loc, sf::Out<cfg::OverrideStatus> out_status, os::ProcessId process_id))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IInformationInterface, AMS_PM_I_INFORMATION_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,34 +19,30 @@
|
||||||
#include <stratosphere/pm/pm_types.hpp>
|
#include <stratosphere/pm/pm_types.hpp>
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
namespace ams::pm::impl {
|
#define AMS_PM_I_SHELL_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, LaunchProgram, (sf::Out<os::ProcessId> out_process_id, const ncm::ProgramLocation &loc, u32 flags), (out_process_id, loc, flags)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, TerminateProcess, (os::ProcessId process_id), (process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, TerminateProgram, (ncm::ProgramId program_id), (program_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, void, GetProcessEventHandle, (sf::OutCopyHandle out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, void, GetProcessEventInfo, (sf::Out<pm::ProcessEventInfo> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, void, NotifyBootFinished, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 6, Result, GetApplicationProcessIdForShell, (sf::Out<os::ProcessId> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 7, Result, BoostSystemMemoryResourceLimit, (u64 boost_size), (boost_size)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 8, Result, BoostApplicationThreadResourceLimit, (), (), hos::Version_7_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 9, void, GetBootFinishedEventHandle, (sf::OutCopyHandle out), (out), hos::Version_8_0_0)
|
||||||
|
|
||||||
#define AMS_PM_I_SHELL_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::pm::impl, IShellInterface, AMS_PM_I_SHELL_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, LaunchProgram, (sf::Out<os::ProcessId> out_process_id, const ncm::ProgramLocation &loc, u32 flags)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, TerminateProcess, (os::ProcessId process_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, TerminateProgram, (ncm::ProgramId program_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, void, GetProcessEventHandle, (sf::OutCopyHandle out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, void, GetProcessEventInfo, (sf::Out<ProcessEventInfo> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, void, NotifyBootFinished, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, GetApplicationProcessIdForShell, (sf::Out<os::ProcessId> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, BoostSystemMemoryResourceLimit, (u64 boost_size)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 8, Result, BoostApplicationThreadResourceLimit, (), hos::Version_7_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, void, GetBootFinishedEventHandle, (sf::OutCopyHandle out), hos::Version_8_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IShellInterface, AMS_PM_I_SHELL_INTERFACE_INTERFACE_INFO)
|
#define AMS_PM_I_DEPRECATED_SHELL_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, LaunchProgram, (sf::Out<os::ProcessId> out_process_id, const ncm::ProgramLocation &loc, u32 flags), (out_process_id, loc, flags)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, TerminateProcess, (os::ProcessId process_id), (process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, TerminateProgram, (ncm::ProgramId program_id), (program_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, void, GetProcessEventHandle, (sf::OutCopyHandle out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, void, GetProcessEventInfo, (sf::Out<pm::ProcessEventInfo> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, CleanupProcess, (os::ProcessId process_id), (process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 6, Result, ClearExceptionOccurred, (os::ProcessId process_id), (process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 7, void, NotifyBootFinished, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 8, Result, GetApplicationProcessIdForShell, (sf::Out<os::ProcessId> out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 9, Result, BoostSystemMemoryResourceLimit, (u64 boost_size), (boost_size), hos::Version_4_0_0)
|
||||||
|
|
||||||
#define AMS_PM_I_DEPRECATED_SHELL_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::pm::impl, IDeprecatedShellInterface, AMS_PM_I_DEPRECATED_SHELL_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, LaunchProgram, (sf::Out<os::ProcessId> out_process_id, const ncm::ProgramLocation &loc, u32 flags)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, TerminateProcess, (os::ProcessId process_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, TerminateProgram, (ncm::ProgramId program_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, void, GetProcessEventHandle, (sf::OutCopyHandle out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, void, GetProcessEventInfo, (sf::Out<ProcessEventInfo> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, CleanupProcess, (os::ProcessId process_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, ClearExceptionOccurred, (os::ProcessId process_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, void, NotifyBootFinished, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 8, Result, GetApplicationProcessIdForShell, (sf::Out<os::ProcessId> out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, Result, BoostSystemMemoryResourceLimit, (u64 boost_size), hos::Version_4_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IDeprecatedShellInterface, AMS_PM_I_DEPRECATED_SHELL_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ namespace ams::psc {
|
||||||
NON_COPYABLE(PmModule);
|
NON_COPYABLE(PmModule);
|
||||||
NON_MOVEABLE(PmModule);
|
NON_MOVEABLE(PmModule);
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<psc::sf::IPmModule> intf;
|
ams::sf::SharedPointer<psc::sf::IPmModule> intf;
|
||||||
os::SystemEvent system_event;
|
os::SystemEvent system_event;
|
||||||
bool initialized;
|
bool initialized;
|
||||||
PmModuleId module_id;
|
PmModuleId module_id;
|
||||||
|
|
|
@ -19,15 +19,11 @@
|
||||||
#include <stratosphere/psc/psc_types.hpp>
|
#include <stratosphere/psc/psc_types.hpp>
|
||||||
#include <stratosphere/psc/psc_pm_module_id.hpp>
|
#include <stratosphere/psc/psc_pm_module_id.hpp>
|
||||||
|
|
||||||
namespace ams::psc::sf {
|
#define AMS_PSC_I_PM_MODULE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, Initialize, (ams::sf::OutCopyHandle out, psc::PmModuleId module_id, const ams::sf::InBuffer &child_list), (out, module_id, child_list)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, GetRequest, (ams::sf::Out<psc::PmState> out_state, ams::sf::Out<psc::PmFlagSet> out_flags), (out_state, out_flags)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, Acknowledge, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, Finalize, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, AcknowledgeEx, (psc::PmState state), (state), hos::Version_5_1_0)
|
||||||
|
|
||||||
#define AMS_PSC_I_PM_MODULE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::psc::sf, IPmModule, AMS_PSC_I_PM_MODULE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, Initialize, (ams::sf::OutCopyHandle out, psc::PmModuleId module_id, const ams::sf::InBuffer &child_list)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, GetRequest, (ams::sf::Out<PmState> out_state, ams::sf::Out<PmFlagSet> out_flags)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, Acknowledge, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, Finalize, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, AcknowledgeEx, (PmState state), hos::Version_5_1_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IPmModule, AMS_PSC_I_PM_MODULE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -18,11 +18,7 @@
|
||||||
#include <vapours.hpp>
|
#include <vapours.hpp>
|
||||||
#include <stratosphere/psc/sf/psc_sf_i_pm_module.hpp>
|
#include <stratosphere/psc/sf/psc_sf_i_pm_module.hpp>
|
||||||
|
|
||||||
namespace ams::psc::sf {
|
#define AMS_PSC_I_PM_SERVICE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, Initialize, (ams::sf::Out<ams::sf::SharedPointer<psc::sf::IPmModule>> out), (out))
|
||||||
|
|
||||||
#define AMS_PSC_I_PM_SERVICE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::psc::sf, IPmService, AMS_PSC_I_PM_SERVICE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, Initialize, (ams::sf::Out<std::shared_ptr<psc::sf::IPmModule>> out))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IPmService, AMS_PSC_I_PM_SERVICE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
namespace ams::pwm {
|
namespace ams::pwm {
|
||||||
|
|
||||||
void InitializeWith(std::shared_ptr<pwm::sf::IManager> &&sp);
|
void InitializeWith(ams::sf::SharedPointer<pwm::sf::IManager> sp);
|
||||||
void Finalize();
|
void Finalize();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,6 @@
|
||||||
|
|
||||||
namespace ams::pwm::server {
|
namespace ams::pwm::server {
|
||||||
|
|
||||||
std::shared_ptr<pwm::sf::IManager> GetServiceObject();
|
ams::sf::SharedPointer<pwm::sf::IManager> GetServiceObject();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,18 +18,14 @@
|
||||||
#include <vapours.hpp>
|
#include <vapours.hpp>
|
||||||
#include <stratosphere/pwm/pwm_types.hpp>
|
#include <stratosphere/pwm/pwm_types.hpp>
|
||||||
|
|
||||||
namespace ams::pwm::sf {
|
#define AMS_PWM_I_CHANNEL_SESSION_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, SetPeriod, (TimeSpanType period), (period) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, GetPeriod, (ams::sf::Out<TimeSpanType> out), (out) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, SetDuty, (int duty), (duty) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, GetDuty, (ams::sf::Out<int> out), (out) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, SetEnabled, (bool enabled), (enabled) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, GetEnabled, (ams::sf::Out<bool> out), (out) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 6, Result, SetScale, (double scale), (scale), hos::Version_6_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 7, Result, GetScale, (ams::sf::Out<double> out), (out), hos::Version_6_0_0)
|
||||||
|
|
||||||
#define AMS_PWM_I_CHANNEL_SESSION_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::pwm::sf, IChannelSession, AMS_PWM_I_CHANNEL_SESSION_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, SetPeriod, (TimeSpanType period) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, GetPeriod, (ams::sf::Out<TimeSpanType> out) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, SetDuty, (int duty) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, GetDuty, (ams::sf::Out<int> out) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, SetEnabled, (bool enabled) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, GetEnabled, (ams::sf::Out<bool> out) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 6, Result, SetScale, (double scale), hos::Version_6_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, GetScale, (ams::sf::Out<double> out), hos::Version_6_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IChannelSession, AMS_PWM_I_CHANNEL_SESSION_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -20,13 +20,9 @@
|
||||||
#include <stratosphere/pwm/pwm_select_channel_name.hpp>
|
#include <stratosphere/pwm/pwm_select_channel_name.hpp>
|
||||||
#include <stratosphere/pwm/sf/pwm_sf_i_channel_session.hpp>
|
#include <stratosphere/pwm/sf/pwm_sf_i_channel_session.hpp>
|
||||||
|
|
||||||
namespace ams::pwm::sf {
|
#define AMS_PWM_I_MANAGER_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, OpenSessionForDev, (ams::sf::Out<ams::sf::SharedPointer<pwm::sf::IChannelSession>> out, int channel), (out, channel) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, OpenSession, (ams::sf::Out<ams::sf::SharedPointer<pwm::sf::IChannelSession>> out, pwm::ChannelName channel_name), (out, channel_name) ) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, OpenSession2, (ams::sf::Out<ams::sf::SharedPointer<pwm::sf::IChannelSession>> out, DeviceCode device_code), (out, device_code), hos::Version_6_0_0)
|
||||||
|
|
||||||
#define AMS_PWM_I_MANAGER_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::pwm::sf, IManager, AMS_PWM_I_MANAGER_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, OpenSessionForDev, (ams::sf::Out<std::shared_ptr<pwm::sf::IChannelSession>> out, int channel) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, OpenSession, (ams::sf::Out<std::shared_ptr<pwm::sf::IChannelSession>> out, pwm::ChannelName channel_name) ) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, OpenSession2, (ams::sf::Out<std::shared_ptr<pwm::sf::IChannelSession>> out, DeviceCode device_code), hos::Version_6_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IManager, AMS_PWM_I_MANAGER_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,11 +19,7 @@
|
||||||
#include <stratosphere/ro/ro_types.hpp>
|
#include <stratosphere/ro/ro_types.hpp>
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
namespace ams::ro::impl {
|
#define AMS_RO_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, GetProcessModuleInfo, (sf::Out<u32> out_count, const sf::OutArray<LoaderModuleInfo> &out_infos, os::ProcessId process_id), (out_count, out_infos, process_id))
|
||||||
|
|
||||||
#define AMS_RO_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::ro::impl, IDebugMonitorInterface, AMS_RO_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, GetProcessModuleInfo, (sf::Out<u32> out_count, const sf::OutArray<LoaderModuleInfo> &out_infos, os::ProcessId process_id))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IDebugMonitorInterface, AMS_RO_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,16 +19,12 @@
|
||||||
#include <stratosphere/ro/ro_types.hpp>
|
#include <stratosphere/ro/ro_types.hpp>
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
namespace ams::ro::impl {
|
#define AMS_RO_I_RO_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, MapManualLoadModuleMemory, (sf::Out<u64> out_load_address, const sf::ClientProcessId &client_pid, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size), (out_load_address, client_pid, nro_address, nro_size, bss_address, bss_size)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, UnmapManualLoadModuleMemory, (const sf::ClientProcessId &client_pid, u64 nro_address), (client_pid, nro_address)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, RegisterModuleInfo, (const sf::ClientProcessId &client_pid, u64 nrr_address, u64 nrr_size), (client_pid, nrr_address, nrr_size)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, UnregisterModuleInfo, (const sf::ClientProcessId &client_pid, u64 nrr_address), (client_pid, nrr_address)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, RegisterProcessHandle, (const sf::ClientProcessId &client_pid, sf::CopyHandle process_h), (client_pid, process_h)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 10, Result, RegisterProcessModuleInfo, (const sf::ClientProcessId &client_pid, u64 nrr_address, u64 nrr_size, sf::CopyHandle process_h), (client_pid, nrr_address, nrr_size, process_h), hos::Version_7_0_0)
|
||||||
|
|
||||||
#define AMS_RO_I_RO_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::ro::impl, IRoInterface, AMS_RO_I_RO_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, MapManualLoadModuleMemory, (sf::Out<u64> out_load_address, const sf::ClientProcessId &client_pid, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, UnmapManualLoadModuleMemory, (const sf::ClientProcessId &client_pid, u64 nro_address)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, RegisterModuleInfo, (const sf::ClientProcessId &client_pid, u64 nrr_address, u64 nrr_size)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, UnregisterModuleInfo, (const sf::ClientProcessId &client_pid, u64 nrr_address)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, RegisterProcessHandle, (const sf::ClientProcessId &client_pid, sf::CopyHandle process_h)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, RegisterProcessModuleInfo, (const sf::ClientProcessId &client_pid, u64 nrr_address, u64 nrr_size, sf::CopyHandle process_h), hos::Version_7_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IRoInterface, AMS_RO_I_RO_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -17,8 +17,13 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stratosphere/sf/sf_common.hpp>
|
#include <stratosphere/sf/sf_common.hpp>
|
||||||
|
#include <stratosphere/sf/sf_allocation_policies.hpp>
|
||||||
#include <stratosphere/sf/sf_lmem_utility.hpp>
|
#include <stratosphere/sf/sf_lmem_utility.hpp>
|
||||||
#include <stratosphere/sf/sf_mem_utility.hpp>
|
#include <stratosphere/sf/sf_mem_utility.hpp>
|
||||||
|
#include <stratosphere/sf/sf_exp_heap_allocator.hpp>
|
||||||
|
#include <stratosphere/sf/sf_standard_allocation_policy.hpp>
|
||||||
|
#include <stratosphere/sf/sf_std_allocation_policy.hpp>
|
||||||
|
#include <stratosphere/sf/sf_shared_object.hpp>
|
||||||
#include <stratosphere/sf/sf_service_object.hpp>
|
#include <stratosphere/sf/sf_service_object.hpp>
|
||||||
#include <stratosphere/sf/hipc/sf_hipc_server_session_manager.hpp>
|
#include <stratosphere/sf/hipc/sf_hipc_server_session_manager.hpp>
|
||||||
|
|
||||||
|
@ -28,7 +33,10 @@
|
||||||
#include <stratosphere/sf/sf_out.hpp>
|
#include <stratosphere/sf/sf_out.hpp>
|
||||||
#include <stratosphere/sf/sf_buffers.hpp>
|
#include <stratosphere/sf/sf_buffers.hpp>
|
||||||
#include <stratosphere/sf/impl/sf_impl_command_serialization.hpp>
|
#include <stratosphere/sf/impl/sf_impl_command_serialization.hpp>
|
||||||
#include <stratosphere/sf/impl/sf_impl_service_object_macros.hpp>
|
#include <stratosphere/sf/impl/sf_impl_autogen_interface_macros.hpp>
|
||||||
|
#include <stratosphere/sf/impl/sf_impl_autogen_impl_macros.hpp>
|
||||||
|
#include <stratosphere/sf/impl/sf_impl_template_base.hpp>
|
||||||
|
#include <stratosphere/sf/sf_object_factory.hpp>
|
||||||
|
|
||||||
#include <stratosphere/sf/hipc/sf_hipc_server_manager.hpp>
|
#include <stratosphere/sf/hipc/sf_hipc_server_manager.hpp>
|
||||||
|
|
||||||
|
|
|
@ -15,9 +15,10 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "../sf_common.hpp"
|
#include <stratosphere/sf/sf_common.hpp>
|
||||||
#include "sf_cmif_domain_api.hpp"
|
#include <stratosphere/sf/cmif/sf_cmif_domain_api.hpp>
|
||||||
#include "sf_cmif_domain_service_object.hpp"
|
#include <stratosphere/sf/cmif/sf_cmif_domain_service_object.hpp>
|
||||||
|
#include <stratosphere/sf/impl/sf_service_object_impl.hpp>
|
||||||
|
|
||||||
namespace ams::sf::cmif {
|
namespace ams::sf::cmif {
|
||||||
|
|
||||||
|
@ -39,7 +40,7 @@ namespace ams::sf::cmif {
|
||||||
explicit Entry() : owner(nullptr) { /* ... */ }
|
explicit Entry() : owner(nullptr) { /* ... */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
class Domain final : public DomainServiceObject {
|
class Domain final : public DomainServiceObject, private sf::impl::ServiceObjectImplBase2 {
|
||||||
NON_COPYABLE(Domain);
|
NON_COPYABLE(Domain);
|
||||||
NON_MOVEABLE(Domain);
|
NON_MOVEABLE(Domain);
|
||||||
private:
|
private:
|
||||||
|
@ -51,7 +52,17 @@ namespace ams::sf::cmif {
|
||||||
explicit Domain(ServerDomainManager *m) : manager(m) { /* ... */ }
|
explicit Domain(ServerDomainManager *m) : manager(m) { /* ... */ }
|
||||||
~Domain();
|
~Domain();
|
||||||
|
|
||||||
void DestroySelf();
|
void DisposeImpl();
|
||||||
|
|
||||||
|
virtual void AddReference() {
|
||||||
|
ServiceObjectImplBase2::AddReferenceImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void Release() {
|
||||||
|
if (ServiceObjectImplBase2::ReleaseImpl()) {
|
||||||
|
this->DisposeImpl();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
virtual ServerDomainBase *GetServerDomain() override final {
|
virtual ServerDomainBase *GetServerDomain() override final {
|
||||||
return static_cast<ServerDomainBase *>(this);
|
return static_cast<ServerDomainBase *>(this);
|
||||||
|
@ -120,7 +131,7 @@ namespace ams::sf::cmif {
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
static void DestroyDomainServiceObject(DomainServiceObject *obj) {
|
static void DestroyDomainServiceObject(DomainServiceObject *obj) {
|
||||||
static_cast<Domain *>(obj)->DestroySelf();
|
static_cast<Domain *>(obj)->DisposeImpl();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -84,18 +84,14 @@ namespace ams::sf::cmif {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<size_t N, class = std::make_index_sequence<N>>
|
template<size_t N>
|
||||||
class ServiceDispatchTableImpl;
|
class ServiceDispatchTableImpl : public ServiceDispatchTableBase {
|
||||||
|
public:
|
||||||
template<size_t N, size_t... Is>
|
static constexpr size_t NumEntries = N;
|
||||||
class ServiceDispatchTableImpl<N, std::index_sequence<Is...>> : public ServiceDispatchTableBase {
|
|
||||||
private:
|
|
||||||
template<size_t>
|
|
||||||
using EntryType = ServiceCommandMeta;
|
|
||||||
private:
|
private:
|
||||||
const std::array<ServiceCommandMeta, N> entries;
|
const std::array<ServiceCommandMeta, N> entries;
|
||||||
public:
|
public:
|
||||||
explicit constexpr ServiceDispatchTableImpl(EntryType<Is>... args) : entries { args... } { /* ... */ }
|
explicit constexpr ServiceDispatchTableImpl(const std::array<ServiceCommandMeta, N> &e) : entries{e} { /* ... */ }
|
||||||
|
|
||||||
Result ProcessMessage(ServiceDispatchContext &ctx, const cmif::PointerAndSize &in_raw_data) const {
|
Result ProcessMessage(ServiceDispatchContext &ctx, const cmif::PointerAndSize &in_raw_data) const {
|
||||||
return this->ProcessMessageImpl(ctx, in_raw_data, this->entries.data(), this->entries.size());
|
return this->ProcessMessageImpl(ctx, in_raw_data, this->entries.data(), this->entries.size());
|
||||||
|
@ -104,20 +100,20 @@ namespace ams::sf::cmif {
|
||||||
Result ProcessMessageForMitm(ServiceDispatchContext &ctx, const cmif::PointerAndSize &in_raw_data) const {
|
Result ProcessMessageForMitm(ServiceDispatchContext &ctx, const cmif::PointerAndSize &in_raw_data) const {
|
||||||
return this->ProcessMessageForMitmImpl(ctx, in_raw_data, this->entries.data(), this->entries.size());
|
return this->ProcessMessageForMitmImpl(ctx, in_raw_data, this->entries.data(), this->entries.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constexpr const std::array<ServiceCommandMeta, N> &GetEntries() const {
|
||||||
|
return this->entries;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ...Entries>
|
template<size_t N>
|
||||||
class ServiceDispatchTable : public impl::ServiceDispatchTableImpl<sizeof...(Entries)> {
|
class ServiceDispatchTable : public impl::ServiceDispatchTableImpl<N> {
|
||||||
public:
|
public:
|
||||||
explicit constexpr ServiceDispatchTable(Entries... entries) : impl::ServiceDispatchTableImpl<sizeof...(Entries)>(entries...) { /* ... */ }
|
explicit constexpr ServiceDispatchTable(const std::array<ServiceCommandMeta, N> &e) : impl::ServiceDispatchTableImpl<N>(e) { /* ... */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
#define AMS_SF_CMIF_IMPL_DEFINE_SERVICE_DISPATCH_TABLE \
|
|
||||||
template<typename ServiceImpl> \
|
|
||||||
static constexpr inline ::ams::sf::cmif::ServiceDispatchTable s_CmifServiceDispatchTable
|
|
||||||
|
|
||||||
struct ServiceDispatchMeta {
|
struct ServiceDispatchMeta {
|
||||||
const impl::ServiceDispatchTableBase *DispatchTable;
|
const impl::ServiceDispatchTableBase *DispatchTable;
|
||||||
Result (impl::ServiceDispatchTableBase::*ProcessHandler)(ServiceDispatchContext &, const cmif::PointerAndSize &) const;
|
Result (impl::ServiceDispatchTableBase::*ProcessHandler)(ServiceDispatchContext &, const cmif::PointerAndSize &) const;
|
||||||
|
@ -140,6 +136,16 @@ namespace ams::sf::cmif {
|
||||||
static constexpr inline ServiceDispatchMeta Meta{&DispatchTable, ProcessHandlerImpl};
|
static constexpr inline ServiceDispatchMeta Meta{&DispatchTable, ProcessHandlerImpl};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct ServiceDispatchTraits<sf::IServiceObject> {
|
||||||
|
static constexpr inline auto DispatchTable = ServiceDispatchTable<0>(std::array<ServiceCommandMeta, 0>{});
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct ServiceDispatchTraits<sf::IMitmServiceObject> {
|
||||||
|
static constexpr inline auto DispatchTable = ServiceDispatchTable<0>(std::array<ServiceCommandMeta, 0>{});
|
||||||
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr ALWAYS_INLINE const ServiceDispatchMeta *GetServiceDispatchMeta() {
|
constexpr ALWAYS_INLINE const ServiceDispatchMeta *GetServiceDispatchMeta() {
|
||||||
return &ServiceDispatchTraits<T>::Meta;
|
return &ServiceDispatchTraits<T>::Meta;
|
||||||
|
|
|
@ -22,7 +22,7 @@ namespace ams::sf::cmif {
|
||||||
|
|
||||||
class ServiceObjectHolder {
|
class ServiceObjectHolder {
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<sf::IServiceObject> srv;
|
SharedPointer<IServiceObject> srv;
|
||||||
const ServiceDispatchMeta *dispatch_meta;
|
const ServiceDispatchMeta *dispatch_meta;
|
||||||
private:
|
private:
|
||||||
/* Copy constructor. */
|
/* Copy constructor. */
|
||||||
|
@ -30,7 +30,7 @@ namespace ams::sf::cmif {
|
||||||
ServiceObjectHolder &operator=(const ServiceObjectHolder &o) = delete;
|
ServiceObjectHolder &operator=(const ServiceObjectHolder &o) = delete;
|
||||||
public:
|
public:
|
||||||
/* Default constructor, null all members. */
|
/* Default constructor, null all members. */
|
||||||
ServiceObjectHolder() : srv(nullptr), dispatch_meta(nullptr) { /* ... */ }
|
ServiceObjectHolder() : srv(nullptr, false), dispatch_meta(nullptr) { /* ... */ }
|
||||||
|
|
||||||
~ServiceObjectHolder() {
|
~ServiceObjectHolder() {
|
||||||
this->dispatch_meta = nullptr;
|
this->dispatch_meta = nullptr;
|
||||||
|
@ -38,9 +38,8 @@ namespace ams::sf::cmif {
|
||||||
|
|
||||||
/* Ensure correct type id at runtime through template constructor. */
|
/* Ensure correct type id at runtime through template constructor. */
|
||||||
template<typename ServiceImpl>
|
template<typename ServiceImpl>
|
||||||
constexpr explicit ServiceObjectHolder(std::shared_ptr<ServiceImpl> &&s) {
|
constexpr explicit ServiceObjectHolder(SharedPointer<ServiceImpl> &&s) : srv(std::move(s)), dispatch_meta(GetServiceDispatchMeta<ServiceImpl>()) {
|
||||||
this->srv = std::move(s);
|
/* ... */
|
||||||
this->dispatch_meta = GetServiceDispatchMeta<ServiceImpl>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move constructor, assignment operator. */
|
/* Move constructor, assignment operator. */
|
||||||
|
@ -50,13 +49,13 @@ namespace ams::sf::cmif {
|
||||||
|
|
||||||
ServiceObjectHolder &operator=(ServiceObjectHolder &&o) {
|
ServiceObjectHolder &operator=(ServiceObjectHolder &&o) {
|
||||||
ServiceObjectHolder tmp(std::move(o));
|
ServiceObjectHolder tmp(std::move(o));
|
||||||
tmp.Swap(*this);
|
tmp.swap(*this);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* State management. */
|
/* State management. */
|
||||||
void Swap(ServiceObjectHolder &o) {
|
void swap(ServiceObjectHolder &o) {
|
||||||
std::swap(this->srv, o.srv);
|
this->srv.swap(o.srv);
|
||||||
std::swap(this->dispatch_meta, o.dispatch_meta);
|
std::swap(this->dispatch_meta, o.dispatch_meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,21 +85,21 @@ namespace ams::sf::cmif {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ServiceImpl>
|
template<typename Interface>
|
||||||
constexpr inline bool IsServiceObjectValid() const {
|
constexpr inline bool IsServiceObjectValid() const {
|
||||||
return this->GetServiceId() == GetServiceDispatchMeta<ServiceImpl>()->GetServiceId();
|
return this->GetServiceId() == GetServiceDispatchMeta<Interface>()->GetServiceId();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ServiceImpl>
|
template<typename Interface>
|
||||||
inline std::shared_ptr<ServiceImpl> GetServiceObject() const {
|
inline Interface *GetServiceObject() const {
|
||||||
if (this->GetServiceId() == GetServiceDispatchMeta<ServiceImpl>()->GetServiceId()) {
|
if (this->GetServiceId() == GetServiceDispatchMeta<Interface>()->GetServiceId()) {
|
||||||
return std::static_pointer_cast<ServiceImpl>(this->srv);
|
return static_cast<Interface *>(this->srv.Get());
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline sf::IServiceObject *GetServiceObjectUnsafe() const {
|
inline sf::IServiceObject *GetServiceObjectUnsafe() const {
|
||||||
return this->srv.get();
|
return static_cast<sf::IServiceObject *>(this->srv.Get());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Processing. */
|
/* Processing. */
|
||||||
|
|
|
@ -46,75 +46,20 @@ namespace ams::sf::hipc {
|
||||||
protected:
|
protected:
|
||||||
using ServerDomainSessionManager::DomainEntryStorage;
|
using ServerDomainSessionManager::DomainEntryStorage;
|
||||||
using ServerDomainSessionManager::DomainStorage;
|
using ServerDomainSessionManager::DomainStorage;
|
||||||
private:
|
protected:
|
||||||
class ServerBase : public os::WaitableHolderType {
|
class Server : public os::WaitableHolderType {
|
||||||
friend class ServerManagerBase;
|
friend class ServerManagerBase;
|
||||||
template<size_t, typename, size_t>
|
template<size_t, typename, size_t>
|
||||||
friend class ServerManager;
|
friend class ServerManager;
|
||||||
NON_COPYABLE(ServerBase);
|
NON_COPYABLE(Server);
|
||||||
NON_MOVEABLE(ServerBase);
|
NON_MOVEABLE(Server);
|
||||||
protected:
|
protected:
|
||||||
cmif::ServiceObjectHolder static_object;
|
cmif::ServiceObjectHolder static_object;
|
||||||
::Handle port_handle;
|
::Handle port_handle;
|
||||||
sm::ServiceName service_name;
|
sm::ServiceName service_name;
|
||||||
|
int index;
|
||||||
bool service_managed;
|
bool service_managed;
|
||||||
public:
|
bool is_mitm_server;
|
||||||
ServerBase(Handle ph, sm::ServiceName sn, bool m, cmif::ServiceObjectHolder &&sh) :
|
|
||||||
static_object(std::move(sh)), port_handle(ph), service_name(sn), service_managed(m)
|
|
||||||
{
|
|
||||||
hipc::AttachWaitableHolderForAccept(this, ph);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~ServerBase() = 0;
|
|
||||||
virtual void CreateSessionObjectHolder(cmif::ServiceObjectHolder *out_obj, std::shared_ptr<::Service> *out_fsrv) const = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename Interface, auto MakeShared>
|
|
||||||
class Server : public ServerBase {
|
|
||||||
NON_COPYABLE(Server);
|
|
||||||
NON_MOVEABLE(Server);
|
|
||||||
private:
|
|
||||||
static constexpr bool IsMitmServer = sf::IsMitmServiceObject<Interface>;
|
|
||||||
public:
|
|
||||||
Server(Handle ph, sm::ServiceName sn, bool m, cmif::ServiceObjectHolder &&sh) : ServerBase(ph, sn, m, std::forward<cmif::ServiceObjectHolder>(sh)) {
|
|
||||||
/* ... */
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~Server() override {
|
|
||||||
if (this->service_managed) {
|
|
||||||
if constexpr (IsMitmServer) {
|
|
||||||
R_ABORT_UNLESS(sm::mitm::UninstallMitm(this->service_name));
|
|
||||||
} else {
|
|
||||||
R_ABORT_UNLESS(sm::UnregisterService(this->service_name));
|
|
||||||
}
|
|
||||||
R_ABORT_UNLESS(svc::CloseHandle(this->port_handle));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void CreateSessionObjectHolder(cmif::ServiceObjectHolder *out_obj, std::shared_ptr<::Service> *out_fsrv) const override final {
|
|
||||||
/* If we're serving a static object, use it. */
|
|
||||||
if (this->static_object) {
|
|
||||||
*out_obj = std::move(this->static_object.Clone());
|
|
||||||
*out_fsrv = nullptr;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Otherwise, we're either a mitm session or a non-mitm session. */
|
|
||||||
if constexpr (IsMitmServer) {
|
|
||||||
/* Custom deleter ensures that nothing goes awry. */
|
|
||||||
std::shared_ptr<::Service> forward_service = std::move(ServerSession::CreateForwardService());
|
|
||||||
|
|
||||||
/* Get mitm forward session. */
|
|
||||||
sm::MitmProcessInfo client_info;
|
|
||||||
R_ABORT_UNLESS(sm::mitm::AcknowledgeSession(forward_service.get(), &client_info, this->service_name));
|
|
||||||
|
|
||||||
*out_obj = std::move(cmif::ServiceObjectHolder(std::move(MakeShared(std::shared_ptr<::Service>(forward_service), client_info))));
|
|
||||||
*out_fsrv = std::move(forward_service);
|
|
||||||
} else {
|
|
||||||
*out_obj = std::move(cmif::ServiceObjectHolder(std::move(MakeShared())));
|
|
||||||
*out_fsrv = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
private:
|
private:
|
||||||
/* Management of waitables. */
|
/* Management of waitables. */
|
||||||
|
@ -139,33 +84,94 @@ namespace ams::sf::hipc {
|
||||||
Result ProcessForMitmServer(os::WaitableHolderType *holder);
|
Result ProcessForMitmServer(os::WaitableHolderType *holder);
|
||||||
Result ProcessForSession(os::WaitableHolderType *holder);
|
Result ProcessForSession(os::WaitableHolderType *holder);
|
||||||
|
|
||||||
template<typename Interface, auto MakeShared>
|
void RegisterServerImpl(Server *server, Handle port_handle, bool is_mitm_server) {
|
||||||
void RegisterServerImpl(Handle port_handle, sm::ServiceName service_name, bool managed, cmif::ServiceObjectHolder &&static_holder) {
|
server->port_handle = port_handle;
|
||||||
/* Allocate server memory. */
|
hipc::AttachWaitableHolderForAccept(server, port_handle);
|
||||||
auto *server = this->AllocateServer();
|
|
||||||
AMS_ABORT_UNLESS(server != nullptr);
|
|
||||||
new (server) Server<Interface, MakeShared>(port_handle, service_name, managed, std::forward<cmif::ServiceObjectHolder>(static_holder));
|
|
||||||
|
|
||||||
if constexpr (!sf::IsMitmServiceObject<Interface>) {
|
server->is_mitm_server = is_mitm_server;
|
||||||
/* Non-mitm server. */
|
if (is_mitm_server) {
|
||||||
os::SetWaitableHolderUserData(server, static_cast<uintptr_t>(UserDataTag::Server));
|
|
||||||
} else {
|
|
||||||
/* Mitm server. */
|
/* Mitm server. */
|
||||||
os::SetWaitableHolderUserData(server, static_cast<uintptr_t>(UserDataTag::MitmServer));
|
os::SetWaitableHolderUserData(server, static_cast<uintptr_t>(UserDataTag::MitmServer));
|
||||||
|
} else {
|
||||||
|
/* Non-mitm server. */
|
||||||
|
os::SetWaitableHolderUserData(server, static_cast<uintptr_t>(UserDataTag::Server));
|
||||||
}
|
}
|
||||||
|
|
||||||
os::LinkWaitableHolder(std::addressof(this->waitable_manager), server);
|
os::LinkWaitableHolder(std::addressof(this->waitable_manager), server);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Interface, typename ServiceImpl>
|
void RegisterServerImpl(int index, cmif::ServiceObjectHolder &&static_holder, Handle port_handle, bool is_mitm_server) {
|
||||||
static constexpr inline std::shared_ptr<Interface> MakeSharedMitm(std::shared_ptr<::Service> &&s, const sm::MitmProcessInfo &client_info) {
|
/* Allocate server memory. */
|
||||||
return sf::MakeShared<Interface, ServiceImpl>(std::forward<std::shared_ptr<::Service>>(s), client_info);
|
auto *server = this->AllocateServer();
|
||||||
|
AMS_ABORT_UNLESS(server != nullptr);
|
||||||
|
server->service_managed = false;
|
||||||
|
|
||||||
|
if (static_holder) {
|
||||||
|
server->static_object = std::move(static_holder);
|
||||||
|
} else {
|
||||||
|
server->index = index;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->RegisterServerImpl(server, port_handle, is_mitm_server);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result RegisterServerImpl(int index, cmif::ServiceObjectHolder &&static_holder, sm::ServiceName service_name, size_t max_sessions) {
|
||||||
|
/* Register service. */
|
||||||
|
Handle port_handle;
|
||||||
|
R_TRY(sm::RegisterService(&port_handle, service_name, max_sessions, false));
|
||||||
|
|
||||||
|
/* Allocate server memory. */
|
||||||
|
auto *server = this->AllocateServer();
|
||||||
|
AMS_ABORT_UNLESS(server != nullptr);
|
||||||
|
server->service_managed = true;
|
||||||
|
server->service_name = service_name;
|
||||||
|
|
||||||
|
if (static_holder) {
|
||||||
|
server->static_object = std::move(static_holder);
|
||||||
|
} else {
|
||||||
|
server->index = index;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->RegisterServerImpl(server, port_handle, false);
|
||||||
|
|
||||||
|
return ResultSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface>
|
||||||
|
Result RegisterMitmServerImpl(int index, cmif::ServiceObjectHolder &&static_holder, sm::ServiceName service_name) {
|
||||||
|
/* Install mitm service. */
|
||||||
|
Handle port_handle;
|
||||||
|
R_TRY(this->InstallMitmServerImpl(&port_handle, service_name, &Interface::ShouldMitm));
|
||||||
|
|
||||||
|
/* Allocate server memory. */
|
||||||
|
auto *server = this->AllocateServer();
|
||||||
|
AMS_ABORT_UNLESS(server != nullptr);
|
||||||
|
server->service_managed = true;
|
||||||
|
server->service_name = service_name;
|
||||||
|
|
||||||
|
if (static_holder) {
|
||||||
|
server->static_object = std::move(static_holder);
|
||||||
|
} else {
|
||||||
|
server->index = index;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->RegisterServerImpl(server, port_handle, true);
|
||||||
|
|
||||||
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result InstallMitmServerImpl(Handle *out_port_handle, sm::ServiceName service_name, MitmQueryFunction query_func);
|
Result InstallMitmServerImpl(Handle *out_port_handle, sm::ServiceName service_name, MitmQueryFunction query_func);
|
||||||
protected:
|
protected:
|
||||||
virtual ServerBase *AllocateServer() = 0;
|
virtual Server *AllocateServer() = 0;
|
||||||
virtual void DestroyServer(ServerBase *server) = 0;
|
virtual void DestroyServer(Server *server) = 0;
|
||||||
|
virtual Result OnNeedsToAccept(int port_index, Server *server) {
|
||||||
|
AMS_ABORT("OnNeedsToAccept must be overridden when using indexed ports");
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface>
|
||||||
|
Result AcceptImpl(Server *server, SharedPointer<Interface> p) {
|
||||||
|
return ServerSessionManager::AcceptSession(server->port_handle, std::move(p));
|
||||||
|
}
|
||||||
public:
|
public:
|
||||||
ServerManagerBase(DomainEntryStorage *entry_storage, size_t entry_count) :
|
ServerManagerBase(DomainEntryStorage *entry_storage, size_t entry_count) :
|
||||||
ServerDomainSessionManager(entry_storage, entry_count),
|
ServerDomainSessionManager(entry_storage, entry_count),
|
||||||
|
@ -181,40 +187,27 @@ namespace ams::sf::hipc {
|
||||||
os::InitializeWaitableManager(std::addressof(this->waitlist));
|
os::InitializeWaitableManager(std::addressof(this->waitlist));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Interface, typename ServiceImpl, auto MakeShared = sf::MakeShared<Interface, ServiceImpl>> requires (sf::IsServiceObject<Interface> && !sf::IsMitmServiceObject<Interface>)
|
template<typename Interface>
|
||||||
void RegisterServer(Handle port_handle, std::shared_ptr<Interface> static_object = nullptr) {
|
void RegisterObjectForServer(SharedPointer<Interface> static_object, Handle port_handle) {
|
||||||
/* Register server. */
|
this->RegisterServerImpl(0, cmif::ServiceObjectHolder(std::move(static_object)), port_handle, false);
|
||||||
cmif::ServiceObjectHolder static_holder;
|
|
||||||
if (static_object != nullptr) {
|
|
||||||
static_holder = cmif::ServiceObjectHolder(std::move(static_object));
|
|
||||||
}
|
|
||||||
this->RegisterServerImpl<Interface, MakeShared>(port_handle, sm::InvalidServiceName, false, std::move(static_holder));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Interface, typename ServiceImpl, auto MakeShared = sf::MakeShared<Interface, ServiceImpl>> requires (sf::IsServiceObject<Interface> && !sf::IsMitmServiceObject<Interface>)
|
template<typename Interface>
|
||||||
Result RegisterServer(sm::ServiceName service_name, size_t max_sessions, std::shared_ptr<Interface> static_object = nullptr) {
|
Result RegisterObjectForServer(SharedPointer<Interface> static_object, sm::ServiceName service_name, size_t max_sessions) {
|
||||||
/* Register service. */
|
return this->RegisterServerImpl(0, cmif::ServiceObjectHolder(std::move(static_object)), service_name, max_sessions);
|
||||||
Handle port_handle;
|
|
||||||
R_TRY(sm::RegisterService(&port_handle, service_name, max_sessions, false));
|
|
||||||
|
|
||||||
/* Register server. */
|
|
||||||
cmif::ServiceObjectHolder static_holder;
|
|
||||||
if (static_object != nullptr) {
|
|
||||||
static_holder = cmif::ServiceObjectHolder(std::move(static_object));
|
|
||||||
}
|
|
||||||
this->RegisterServerImpl<Interface, MakeShared>(port_handle, service_name, true, std::move(static_holder));
|
|
||||||
return ResultSuccess();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Interface, typename ServiceImpl, auto MakeShared = MakeSharedMitm<Interface, ServiceImpl>>
|
void RegisterServer(int port_index, Handle port_handle) {
|
||||||
requires (sf::IsMitmServiceObject<Interface> && sf::IsMitmServiceImpl<ServiceImpl>)
|
this->RegisterServerImpl(port_index, cmif::ServiceObjectHolder(), port_handle, false);
|
||||||
Result RegisterMitmServer(sm::ServiceName service_name) {
|
}
|
||||||
/* Install mitm service. */
|
|
||||||
Handle port_handle;
|
|
||||||
R_TRY(this->InstallMitmServerImpl(&port_handle, service_name, &ServiceImpl::ShouldMitm));
|
|
||||||
|
|
||||||
this->RegisterServerImpl<Interface, MakeShared>(port_handle, service_name, true, cmif::ServiceObjectHolder());
|
Result RegisterServer(int port_index, sm::ServiceName service_name, size_t max_sessions) {
|
||||||
return ResultSuccess();
|
return this->RegisterServerImpl(port_index, cmif::ServiceObjectHolder(), service_name, max_sessions);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface>
|
||||||
|
Result RegisterMitmServer(int port_index, sm::ServiceName service_name) {
|
||||||
|
return this->template RegisterMitmServerImpl<Interface>(port_index, cmif::ServiceObjectHolder(), service_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Processing. */
|
/* Processing. */
|
||||||
|
@ -251,7 +244,7 @@ namespace ams::sf::hipc {
|
||||||
private:
|
private:
|
||||||
/* Resource storage. */
|
/* Resource storage. */
|
||||||
os::Mutex resource_mutex;
|
os::Mutex resource_mutex;
|
||||||
TYPED_STORAGE(ServerBase) server_storages[MaxServers];
|
TYPED_STORAGE(Server) server_storages[MaxServers];
|
||||||
bool server_allocated[MaxServers];
|
bool server_allocated[MaxServers];
|
||||||
TYPED_STORAGE(ServerSession) session_storages[MaxSessions];
|
TYPED_STORAGE(ServerSession) session_storages[MaxSessions];
|
||||||
bool session_allocated[MaxSessions];
|
bool session_allocated[MaxSessions];
|
||||||
|
@ -265,7 +258,7 @@ namespace ams::sf::hipc {
|
||||||
bool domain_allocated[ManagerOptions::MaxDomains];
|
bool domain_allocated[ManagerOptions::MaxDomains];
|
||||||
DomainEntryStorage domain_entry_storages[ManagerOptions::MaxDomainObjects];
|
DomainEntryStorage domain_entry_storages[ManagerOptions::MaxDomainObjects];
|
||||||
private:
|
private:
|
||||||
constexpr inline size_t GetServerIndex(const ServerBase *server) const {
|
constexpr inline size_t GetServerIndex(const Server *server) const {
|
||||||
const size_t i = server - GetPointer(this->server_storages[0]);
|
const size_t i = server - GetPointer(this->server_storages[0]);
|
||||||
AMS_ABORT_UNLESS(i < MaxServers);
|
AMS_ABORT_UNLESS(i < MaxServers);
|
||||||
return i;
|
return i;
|
||||||
|
@ -299,7 +292,7 @@ namespace ams::sf::hipc {
|
||||||
this->session_allocated[index] = false;
|
this->session_allocated[index] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ServerBase *AllocateServer() override final {
|
virtual Server *AllocateServer() override final {
|
||||||
std::scoped_lock lk(this->resource_mutex);
|
std::scoped_lock lk(this->resource_mutex);
|
||||||
for (size_t i = 0; i < MaxServers; i++) {
|
for (size_t i = 0; i < MaxServers; i++) {
|
||||||
if (!this->server_allocated[i]) {
|
if (!this->server_allocated[i]) {
|
||||||
|
@ -310,11 +303,22 @@ namespace ams::sf::hipc {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void DestroyServer(ServerBase *server) override final {
|
virtual void DestroyServer(Server *server) override final {
|
||||||
std::scoped_lock lk(this->resource_mutex);
|
std::scoped_lock lk(this->resource_mutex);
|
||||||
const size_t index = this->GetServerIndex(server);
|
const size_t index = this->GetServerIndex(server);
|
||||||
AMS_ABORT_UNLESS(this->server_allocated[index]);
|
AMS_ABORT_UNLESS(this->server_allocated[index]);
|
||||||
server->~ServerBase();
|
{
|
||||||
|
os::UnlinkWaitableHolder(server);
|
||||||
|
os::FinalizeWaitableHolder(server);
|
||||||
|
if (server->service_managed) {
|
||||||
|
if (server->is_mitm_server) {
|
||||||
|
R_ABORT_UNLESS(sm::mitm::UninstallMitm(server->service_name));
|
||||||
|
} else {
|
||||||
|
R_ABORT_UNLESS(sm::UnregisterService(server->service_name));
|
||||||
|
}
|
||||||
|
R_ABORT_UNLESS(svc::CloseHandle(server->port_handle));
|
||||||
|
}
|
||||||
|
}
|
||||||
this->server_allocated[index] = false;
|
this->server_allocated[index] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,14 +34,14 @@ namespace ams::sf::hipc {
|
||||||
|
|
||||||
namespace impl {
|
namespace impl {
|
||||||
|
|
||||||
class HipcManager;
|
class HipcManagerImpl;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class ServerSession : public os::WaitableHolderType {
|
class ServerSession : public os::WaitableHolderType {
|
||||||
friend class ServerSessionManager;
|
friend class ServerSessionManager;
|
||||||
friend class ServerManagerBase;
|
friend class ServerManagerBase;
|
||||||
friend class impl::HipcManager;
|
friend class impl::HipcManagerImpl;
|
||||||
NON_COPYABLE(ServerSession);
|
NON_COPYABLE(ServerSession);
|
||||||
NON_MOVEABLE(ServerSession);
|
NON_MOVEABLE(ServerSession);
|
||||||
private:
|
private:
|
||||||
|
@ -92,16 +92,13 @@ namespace ams::sf::hipc {
|
||||||
/* Allocate session. */
|
/* Allocate session. */
|
||||||
ServerSession *session_memory = this->AllocateSession();
|
ServerSession *session_memory = this->AllocateSession();
|
||||||
R_UNLESS(session_memory != nullptr, sf::hipc::ResultOutOfSessionMemory());
|
R_UNLESS(session_memory != nullptr, sf::hipc::ResultOutOfSessionMemory());
|
||||||
|
|
||||||
/* Register session. */
|
/* Register session. */
|
||||||
bool succeeded = false;
|
auto register_guard = SCOPE_GUARD { this->DestroySession(session_memory); };
|
||||||
ON_SCOPE_EXIT {
|
|
||||||
if (!succeeded) {
|
|
||||||
this->DestroySession(session_memory);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
R_TRY(ctor(session_memory));
|
R_TRY(ctor(session_memory));
|
||||||
|
|
||||||
/* Save new session to output. */
|
/* Save new session to output. */
|
||||||
succeeded = true;
|
register_guard.Cancel();
|
||||||
*out = session_memory;
|
*out = session_memory;
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
@ -162,13 +159,13 @@ namespace ams::sf::hipc {
|
||||||
Result RegisterMitmSession(Handle session_handle, cmif::ServiceObjectHolder &&obj, std::shared_ptr<::Service> &&fsrv);
|
Result RegisterMitmSession(Handle session_handle, cmif::ServiceObjectHolder &&obj, std::shared_ptr<::Service> &&fsrv);
|
||||||
Result AcceptMitmSession(Handle mitm_port_handle, cmif::ServiceObjectHolder &&obj, std::shared_ptr<::Service> &&fsrv);
|
Result AcceptMitmSession(Handle mitm_port_handle, cmif::ServiceObjectHolder &&obj, std::shared_ptr<::Service> &&fsrv);
|
||||||
|
|
||||||
template<typename ServiceImpl>
|
template<typename Interface>
|
||||||
Result AcceptSession(Handle port_handle, std::shared_ptr<ServiceImpl> obj) {
|
Result AcceptSession(Handle port_handle, SharedPointer<Interface> obj) {
|
||||||
return this->AcceptSession(port_handle, cmif::ServiceObjectHolder(std::move(obj)));
|
return this->AcceptSession(port_handle, cmif::ServiceObjectHolder(std::move(obj)));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ServiceImpl>
|
template<typename Interface>
|
||||||
Result AcceptMitmSession(Handle mitm_port_handle, std::shared_ptr<ServiceImpl> obj, std::shared_ptr<::Service> &&fsrv) {
|
Result AcceptMitmSession(Handle mitm_port_handle, SharedPointer<Interface> obj, std::shared_ptr<::Service> &&fsrv) {
|
||||||
return this->AcceptMitmSession(mitm_port_handle, cmif::ServiceObjectHolder(std::move(obj)), std::forward<std::shared_ptr<::Service>>(fsrv));
|
return this->AcceptMitmSession(mitm_port_handle, cmif::ServiceObjectHolder(std::move(obj)), std::forward<std::shared_ptr<::Service>>(fsrv));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <vapours.hpp>
|
||||||
|
#include <stratosphere/sf/impl/sf_impl_autogen_interface_macros.hpp>
|
||||||
|
#include <stratosphere/sf/impl/sf_impl_template_base.hpp>
|
||||||
|
|
||||||
|
namespace ams::sf::impl {
|
||||||
|
|
||||||
|
#define AMS_SF_IMPL_DEFINE_IMPL_SYNC_METHOD(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, ARGNAMES, VERSION_MIN, VERSION_MAX) \
|
||||||
|
virtual RETURN AMS_SF_IMPL_SYNC_FUNCTION_NAME(NAME) ARGS override { \
|
||||||
|
return ImplGetter::GetImplPointer(static_cast<ImplHolder *>(this))->NAME ARGNAMES; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define AMS_SF_DEFINE_INTERFACE(NAMESPACE, INTERFACE, CMD_MACRO) \
|
||||||
|
namespace NAMESPACE { \
|
||||||
|
\
|
||||||
|
AMS_SF_DEFINE_INTERFACE_IMPL(::ams::sf::IServiceObject, INTERFACE, CMD_MACRO) \
|
||||||
|
\
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
namespace ams::sf::impl { \
|
||||||
|
\
|
||||||
|
template<typename Base, typename ImplHolder, typename ImplGetter, typename Root> \
|
||||||
|
class ImplTemplateBaseT<::NAMESPACE::INTERFACE, Base, ImplHolder, ImplGetter, Root> : public Base, public ImplHolder { \
|
||||||
|
public: \
|
||||||
|
template<typename... Args> \
|
||||||
|
constexpr explicit ImplTemplateBaseT(Args &&...args) : ImplHolder(std::forward<Args>(args)...) { /* ... */ } \
|
||||||
|
private: \
|
||||||
|
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_IMPL_SYNC_METHOD) \
|
||||||
|
}; \
|
||||||
|
\
|
||||||
|
}
|
||||||
|
|
||||||
|
#define AMS_SF_DEFINE_INTERFACE_WITH_BASE(NAMESPACE, INTERFACE, BASE, CMD_MACRO) \
|
||||||
|
namespace NAMESPACE { \
|
||||||
|
\
|
||||||
|
AMS_SF_DEFINE_INTERFACE_IMPL(BASE, INTERFACE, CMD_MACRO) \
|
||||||
|
\
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
namespace ams::sf::impl { \
|
||||||
|
\
|
||||||
|
template<typename Base, typename ImplHolder, typename ImplGetter, typename Root> \
|
||||||
|
class ImplTemplateBaseT<::NAMESPACE::INTERFACE, Base, ImplHolder, ImplGetter, Root> : public ImplTemplateBaseT<BASE, Base, ImplHolder, ImplGetter, Root> { \
|
||||||
|
private: \
|
||||||
|
using BaseImplTemplateBase = ImplTemplateBaseT<BASE, Base, ImplHolder, ImplGetter, Root>; \
|
||||||
|
public: \
|
||||||
|
template<typename... Args> \
|
||||||
|
constexpr explicit ImplTemplateBaseT(Args &&...args) : BaseImplTemplateBase(std::forward<Args>(args)...) { /* ... */ } \
|
||||||
|
private: \
|
||||||
|
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_IMPL_SYNC_METHOD) \
|
||||||
|
}; \
|
||||||
|
\
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,144 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <vapours.hpp>
|
||||||
|
|
||||||
|
namespace ams::sf::impl {
|
||||||
|
|
||||||
|
struct SyncFunctionTraits {
|
||||||
|
public:
|
||||||
|
template<typename R, typename C, typename... A>
|
||||||
|
static std::tuple<A...> GetArgsImpl(R(C::*)(A...));
|
||||||
|
};
|
||||||
|
|
||||||
|
template<auto F>
|
||||||
|
using SyncFunctionArgsType = decltype(SyncFunctionTraits::GetArgsImpl(F));
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct TypeTag{};
|
||||||
|
|
||||||
|
template<size_t First, size_t... Ix>
|
||||||
|
static constexpr inline size_t ParameterCount = sizeof...(Ix);
|
||||||
|
|
||||||
|
#define AMS_SF_IMPL_SYNC_FUNCTION_NAME(FUNCNAME) \
|
||||||
|
_ams_sf_sync_##FUNCNAME
|
||||||
|
|
||||||
|
#define AMS_SF_IMPL_DEFINE_INTERFACE_SYNC_METHOD(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, ARGNAMES, VERSION_MIN, VERSION_MAX) \
|
||||||
|
virtual RETURN AMS_SF_IMPL_SYNC_FUNCTION_NAME(NAME) ARGS = 0;
|
||||||
|
|
||||||
|
#define AMS_SF_IMPL_EXTRACT_INTERFACE_SYNC_METHOD_ARGUMENTS(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, ARGNAMES, VERSION_MIN, VERSION_MAX) \
|
||||||
|
using NAME##ArgumentsType = ::ams::sf::impl::SyncFunctionArgsType<&CLASSNAME::AMS_SF_IMPL_SYNC_FUNCTION_NAME(NAME)>;
|
||||||
|
|
||||||
|
#define AMS_SF_IMPL_DEFINE_INTERFACE_METHOD(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, ARGNAMES, VERSION_MIN, VERSION_MAX) \
|
||||||
|
ALWAYS_INLINE RETURN NAME ARGS { \
|
||||||
|
return this->AMS_SF_IMPL_SYNC_FUNCTION_NAME(NAME) ARGNAMES; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define AMS_SF_IMPL_DEFINE_INTERFACE_SERVICE_COMMAND_META_HOLDER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, ARGNAMES, VERSION_MIN, VERSION_MAX) \
|
||||||
|
template<typename Interface, typename A> struct NAME##ServiceCommandMetaHolder; \
|
||||||
|
\
|
||||||
|
template<typename Interface, typename ...Arguments> \
|
||||||
|
requires std::same_as<std::tuple<Arguments...>, NAME##ArgumentsType> \
|
||||||
|
struct NAME##ServiceCommandMetaHolder<Interface, std::tuple<Arguments...>> { \
|
||||||
|
static constexpr auto Value = ::ams::sf::impl::MakeServiceCommandMeta<VERSION_MIN, VERSION_MAX, CMD_ID, &Interface::AMS_SF_IMPL_SYNC_FUNCTION_NAME(NAME), RETURN, Interface, Arguments...>(); \
|
||||||
|
};
|
||||||
|
|
||||||
|
#define AMS_SF_IMPL_GET_NULL_FOR_PARAMETER_COUNT(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, ARGNAMES, VERSION_MIN, VERSION_MAX) \
|
||||||
|
, 0
|
||||||
|
|
||||||
|
#define AMS_SF_IMPL_DEFINE_CMIF_SERVICE_COMMAND_META_TABLE_ENTRY(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, ARGNAMES, VERSION_MIN, VERSION_MAX) \
|
||||||
|
NAME##ServiceCommandMetaHolder<Interface, NAME##ArgumentsType>::Value,
|
||||||
|
|
||||||
|
template<typename...>
|
||||||
|
struct Print;
|
||||||
|
|
||||||
|
#define AMS_SF_IMPL_DEFINE_INTERFACE(BASECLASS, CLASSNAME, CMD_MACRO) \
|
||||||
|
class CLASSNAME : public BASECLASS { \
|
||||||
|
private: \
|
||||||
|
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_INTERFACE_SYNC_METHOD) \
|
||||||
|
public: \
|
||||||
|
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_EXTRACT_INTERFACE_SYNC_METHOD_ARGUMENTS) \
|
||||||
|
public: \
|
||||||
|
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_INTERFACE_METHOD) \
|
||||||
|
private: \
|
||||||
|
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_INTERFACE_SERVICE_COMMAND_META_HOLDER) \
|
||||||
|
public: \
|
||||||
|
template<typename Interface> \
|
||||||
|
static constexpr inline ::ams::sf::cmif::ServiceDispatchTable s_CmifServiceDispatchTable { \
|
||||||
|
[] { \
|
||||||
|
constexpr size_t CurSize = ::ams::sf::impl::ParameterCount<0 CMD_MACRO(CLASSNAME, AMS_SF_IMPL_GET_NULL_FOR_PARAMETER_COUNT) >; \
|
||||||
|
std::array<::ams::sf::cmif::ServiceCommandMeta, CurSize> cur_entries { CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_CMIF_SERVICE_COMMAND_META_TABLE_ENTRY) }; \
|
||||||
|
\
|
||||||
|
constexpr const auto &BaseEntries = ::ams::sf::cmif::ServiceDispatchTraits<BASECLASS>::DispatchTable.GetEntries(); \
|
||||||
|
constexpr size_t BaseSize = BaseEntries.size(); \
|
||||||
|
\
|
||||||
|
std::array<::ams::sf::cmif::ServiceCommandMeta, BaseSize + CurSize> combined_entries{}; \
|
||||||
|
for (size_t i = 0; i < BaseSize; ++i) { \
|
||||||
|
combined_entries[i] = BaseEntries[i]; \
|
||||||
|
} \
|
||||||
|
for (size_t i = 0; i < CurSize; ++i) { \
|
||||||
|
combined_entries[BaseSize + i] = cur_entries[i]; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
return ::ams::sf::cmif::ServiceDispatchTable { combined_entries }; \
|
||||||
|
} () \
|
||||||
|
}; \
|
||||||
|
};
|
||||||
|
|
||||||
|
#define AMS_SF_IMPL_DEFINE_CONCEPT_HELPERS(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, ARGNAMES, VERSION_MIN, VERSION_MAX) \
|
||||||
|
template<typename T, typename... Args> \
|
||||||
|
concept Is##CLASSNAME##__##NAME##Impl = requires (T &t, Args &&... args) { \
|
||||||
|
{ t.NAME(std::forward<Args>(args)...) } -> std::same_as<RETURN>; \
|
||||||
|
}; \
|
||||||
|
\
|
||||||
|
template<typename T, typename A> \
|
||||||
|
struct Is##CLASSNAME##__##NAME##Holder : std::false_type{}; \
|
||||||
|
\
|
||||||
|
template<typename T, typename... Args> requires std::same_as<std::tuple<Args...>, CLASSNAME::NAME##ArgumentsType> \
|
||||||
|
struct Is##CLASSNAME##__##NAME##Holder<T, std::tuple<Args...>> : std::bool_constant<Is##CLASSNAME##__##NAME##Impl<T, Args...>>{}; \
|
||||||
|
\
|
||||||
|
template<typename T> \
|
||||||
|
static constexpr inline bool Is##CLASSNAME##__##NAME = Is##CLASSNAME##__##NAME##Holder<T, CLASSNAME::NAME##ArgumentsType>::value;
|
||||||
|
|
||||||
|
#define AMS_SF_IMPL_CHECK_CONCEPT_HELPER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, ARGNAMES, VERSION_MIN, VERSION_MAX) \
|
||||||
|
Is##CLASSNAME##__##NAME<T> &&
|
||||||
|
|
||||||
|
#define AMS_SF_IMPL_DEFINE_CONCEPT(CLASSNAME, CMD_MACRO) \
|
||||||
|
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_CONCEPT_HELPERS) \
|
||||||
|
\
|
||||||
|
template<typename T> \
|
||||||
|
concept Is##CLASSNAME = CMD_MACRO(CLASSNAME, AMS_SF_IMPL_CHECK_CONCEPT_HELPER) true;
|
||||||
|
|
||||||
|
#define AMS_SF_DEFINE_INTERFACE_IMPL(BASECLASS, CLASSNAME, CMD_MACRO) \
|
||||||
|
AMS_SF_IMPL_DEFINE_INTERFACE(::ams::sf::IServiceObject, CLASSNAME, CMD_MACRO) \
|
||||||
|
AMS_SF_IMPL_DEFINE_CONCEPT(CLASSNAME, CMD_MACRO) \
|
||||||
|
static_assert(Is##CLASSNAME<CLASSNAME>);
|
||||||
|
|
||||||
|
#define AMS_SF_METHOD_INFO_7(CLASSNAME, HANDLER, CMD_ID, RETURN, NAME, ARGS, ARGNAMES) \
|
||||||
|
HANDLER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, ARGNAMES, hos::Version_Min, hos::Version_Max)
|
||||||
|
|
||||||
|
#define AMS_SF_METHOD_INFO_8(CLASSNAME, HANDLER, CMD_ID, RETURN, NAME, ARGS, ARGNAMES, VERSION_MIN) \
|
||||||
|
HANDLER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, ARGNAMES, VERSION_MIN, hos::Version_Max)
|
||||||
|
|
||||||
|
#define AMS_SF_METHOD_INFO_9(CLASSNAME, HANDLER, CMD_ID, RETURN, NAME, ARGS, ARGNAMES, VERSION_MIN, VERSION_MAX) \
|
||||||
|
HANDLER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, ARGNAMES, VERSION_MIN, VERSION_MAX)
|
||||||
|
|
||||||
|
#define AMS_SF_METHOD_INFO_X(_, _0, _1, _2, _3, _4, _5, _6, _7, _8, FUNC, ...) FUNC
|
||||||
|
|
||||||
|
#define AMS_SF_METHOD_INFO(...) \
|
||||||
|
AMS_SF_METHOD_INFO_X(, ## __VA_ARGS__, AMS_SF_METHOD_INFO_9(__VA_ARGS__), AMS_SF_METHOD_INFO_8(__VA_ARGS__), AMS_SF_METHOD_INFO_7(__VA_ARGS__))
|
||||||
|
|
||||||
|
}
|
|
@ -68,34 +68,78 @@ namespace ams::sf {
|
||||||
|
|
||||||
struct OutObjectTag{};
|
struct OutObjectTag{};
|
||||||
|
|
||||||
|
template<size_t, size_t>
|
||||||
|
class InOutObjectHolder;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename ServiceImpl> requires std::derived_from<ServiceImpl, IServiceObject>
|
||||||
class IsOutForceEnabled<std::shared_ptr<T>> : public std::true_type{};
|
class Out<SharedPointer<ServiceImpl>> : public impl::OutObjectTag {
|
||||||
|
|
||||||
template<typename ServiceImpl>
|
|
||||||
class Out<std::shared_ptr<ServiceImpl>> : public impl::OutObjectTag {
|
|
||||||
static_assert(std::is_base_of<sf::IServiceObject, ServiceImpl>::value, "Out<std::shared_ptr<ServiceImpl>> requires ServiceObject base.");
|
|
||||||
|
|
||||||
template<typename>
|
template<typename>
|
||||||
friend class Out;
|
friend class Out;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
using ServiceImplType = ServiceImpl;
|
using Interface = ServiceImpl;
|
||||||
private:
|
private:
|
||||||
cmif::ServiceObjectHolder *srv;
|
impl::SharedPointerBase *m_out;
|
||||||
cmif::DomainObjectId *object_id;
|
cmif::DomainObjectId *m_object_id;
|
||||||
|
private:
|
||||||
|
Out(impl::SharedPointerBase *p, cmif::DomainObjectId *o = nullptr) : m_out(p), m_object_id(o) { /* ... */ }
|
||||||
public:
|
public:
|
||||||
Out(cmif::ServiceObjectHolder *s) : srv(s), object_id(nullptr) { /* ... */ }
|
Out(const Out &rhs) : m_out(rhs.m_out), m_object_id(rhs.m_object_id) { /* ... */ }
|
||||||
Out(cmif::ServiceObjectHolder *s, cmif::DomainObjectId *o) : srv(s), object_id(o) { /* ... */ }
|
|
||||||
|
|
||||||
void SetValue(std::shared_ptr<ServiceImpl> &&s, cmif::DomainObjectId new_object_id = cmif::InvalidDomainObjectId) {
|
Out(SharedPointer<ServiceImpl> *out, cmif::DomainObjectId *o = nullptr) : m_out(std::addressof(out->m_base)), m_object_id(o) { /* .... */ }
|
||||||
*this->srv = cmif::ServiceObjectHolder(std::move(s));
|
|
||||||
|
template<typename U> requires std::derived_from<U, ServiceImpl>
|
||||||
|
Out(Out<SharedPointer<U>> out) : m_out(out.m_out), m_object_id(out.m_object_id) { /* ... */ }
|
||||||
|
|
||||||
|
template<typename U> requires std::derived_from<U, ServiceImpl>
|
||||||
|
Out(SharedPointer<U> *out, cmif::DomainObjectId *o = nullptr) : m_out(std::addressof(out->m_base)), m_object_id(o) { /* .... */ }
|
||||||
|
|
||||||
|
void SetValue(SharedPointer<ServiceImpl> s, cmif::DomainObjectId new_object_id = cmif::InvalidDomainObjectId) {
|
||||||
|
*m_out = std::move(s.m_base);
|
||||||
if (new_object_id != cmif::InvalidDomainObjectId) {
|
if (new_object_id != cmif::InvalidDomainObjectId) {
|
||||||
AMS_ABORT_UNLESS(object_id != nullptr);
|
AMS_ABORT_UNLESS(m_object_id != nullptr);
|
||||||
*this->object_id = new_object_id;
|
*m_object_id = new_object_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename U> requires std::derived_from<U, ServiceImpl>
|
||||||
|
void SetValue(SharedPointer<U> s, cmif::DomainObjectId new_object_id = cmif::InvalidDomainObjectId) {
|
||||||
|
*m_out = std::move(s.m_base);
|
||||||
|
if (new_object_id != cmif::InvalidDomainObjectId) {
|
||||||
|
AMS_ABORT_UNLESS(m_object_id != nullptr);
|
||||||
|
*m_object_id = new_object_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DerefProxy {
|
||||||
|
template<typename>
|
||||||
|
friend class Out;
|
||||||
|
private:
|
||||||
|
Out &m_target;
|
||||||
|
private:
|
||||||
|
explicit DerefProxy(Out &t) : m_target(t) { /* ... */ }
|
||||||
|
public:
|
||||||
|
DerefProxy &operator=(SharedPointer<ServiceImpl> p) {
|
||||||
|
m_target.SetValue(std::move(p));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename U> requires std::derived_from<U, ServiceImpl>
|
||||||
|
DerefProxy &operator=(SharedPointer<U> p) {
|
||||||
|
m_target.SetValue(std::move(p));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
DerefProxy operator *() {
|
||||||
|
return DerefProxy(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename U>
|
||||||
|
Out<SharedPointer<U>> DownCast() {
|
||||||
|
return Out<SharedPointer<U>>(m_out, m_object_id);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -149,8 +193,8 @@ namespace ams::sf::impl {
|
||||||
struct IsInObject : public std::false_type{};
|
struct IsInObject : public std::false_type{};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct IsInObject<std::shared_ptr<T>> : public std::true_type {
|
struct IsInObject<sf::SharedPointer<T>> : public std::true_type {
|
||||||
static_assert(std::is_base_of<sf::IServiceObject, T>::value, "Invalid IsInObject<std::shared_ptr<T>>");
|
static_assert(std::is_base_of<sf::IServiceObject, T>::value, "Invalid IsInObject<sf::SharedPointer<T>>");
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
@ -628,6 +672,7 @@ namespace ams::sf::impl {
|
||||||
private:
|
private:
|
||||||
std::array<cmif::ServiceObjectHolder, NumInObjects> in_object_holders;
|
std::array<cmif::ServiceObjectHolder, NumInObjects> in_object_holders;
|
||||||
std::array<cmif::ServiceObjectHolder, NumOutObjects> out_object_holders;
|
std::array<cmif::ServiceObjectHolder, NumOutObjects> out_object_holders;
|
||||||
|
std::array<TYPED_STORAGE(SharedPointer<sf::IServiceObject>), NumOutObjects> out_shared_pointers;
|
||||||
std::array<cmif::DomainObjectId, NumOutObjects> out_object_ids;
|
std::array<cmif::DomainObjectId, NumOutObjects> out_object_ids;
|
||||||
public:
|
public:
|
||||||
constexpr InOutObjectHolder() : in_object_holders(), out_object_holders() {
|
constexpr InOutObjectHolder() : in_object_holders(), out_object_holders() {
|
||||||
|
@ -655,8 +700,8 @@ namespace ams::sf::impl {
|
||||||
static_assert(std::tuple_size<ServiceImplTuple>::value == NumInObjects);
|
static_assert(std::tuple_size<ServiceImplTuple>::value == NumInObjects);
|
||||||
#define _SF_IN_OUT_HOLDER_VALIDATE_IN_OBJECT(n) do { \
|
#define _SF_IN_OUT_HOLDER_VALIDATE_IN_OBJECT(n) do { \
|
||||||
if constexpr (NumInObjects > n) { \
|
if constexpr (NumInObjects > n) { \
|
||||||
using SharedPtrToServiceImplType = typename std::tuple_element<n, ServiceImplTuple>::type; \
|
using SharedPointerType = typename std::tuple_element<n, ServiceImplTuple>::type; \
|
||||||
using ServiceImplType = typename SharedPtrToServiceImplType::element_type; \
|
using ServiceImplType = typename SharedPointerType::Interface; \
|
||||||
R_UNLESS((this->in_object_holders[n].template IsServiceObjectValid<ServiceImplType>()), sf::cmif::ResultInvalidInObject()); \
|
R_UNLESS((this->in_object_holders[n].template IsServiceObjectValid<ServiceImplType>()), sf::cmif::ResultInvalidInObject()); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
@ -672,15 +717,21 @@ namespace ams::sf::impl {
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<size_t Index, typename ServiceImpl>
|
template<size_t Index, typename Interface>
|
||||||
std::shared_ptr<ServiceImpl> GetInObject() const {
|
SharedPointer<Interface> *GetOutObjectSharedPointer() {
|
||||||
/* We know from ValidateInObjects() that this will succeed always. */
|
static_assert(sizeof(SharedPointer<Interface>) == sizeof(SharedPointer<sf::IServiceObject>));
|
||||||
return this->in_object_holders[Index].template GetServiceObject<ServiceImpl>();
|
return static_cast<SharedPointer<Interface> *>(static_cast<void *>(&out_shared_pointers[Index]));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<size_t Index, typename ServiceImpl>
|
template<size_t Index, typename Interface>
|
||||||
Out<std::shared_ptr<ServiceImpl>> GetOutObject() {
|
Out<SharedPointer<Interface>> GetOutObject() {
|
||||||
return Out<std::shared_ptr<ServiceImpl>>(&this->out_object_holders[Index], &this->out_object_ids[Index]);
|
auto sp = new (GetOutObjectSharedPointer<Index, Interface>()) SharedPointer<Interface>;
|
||||||
|
return Out<SharedPointer<Interface>>(sp, &this->out_object_ids[Index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<size_t Index, typename Interface>
|
||||||
|
void SetOutObject() {
|
||||||
|
this->out_object_holders[Index] = cmif::ServiceObjectHolder(std::move(*GetOutObjectSharedPointer<Index, Interface>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr void SetOutObjects(const cmif::ServiceDispatchContext &ctx, const HipcRequest &response) {
|
constexpr void SetOutObjects(const cmif::ServiceDispatchContext &ctx, const HipcRequest &response) {
|
||||||
|
@ -985,10 +1036,10 @@ namespace ams::sf::impl {
|
||||||
}
|
}
|
||||||
} else if constexpr (Info.arg_type == ArgumentType::InObject) {
|
} else if constexpr (Info.arg_type == ArgumentType::InObject) {
|
||||||
/* New InObject. */
|
/* New InObject. */
|
||||||
return in_out_objects_holder.template GetInObject<Info.in_object_index, typename T::element_type>();
|
return in_out_objects_holder.template GetInObject<Info.in_object_index, typename T::Interface>();
|
||||||
} else if constexpr (Info.arg_type == ArgumentType::OutObject) {
|
} else if constexpr (Info.arg_type == ArgumentType::OutObject) {
|
||||||
/* New OutObject. */
|
/* New OutObject. */
|
||||||
return in_out_objects_holder.template GetOutObject<Info.out_object_index, typename T::ServiceImplType>();
|
return in_out_objects_holder.template GetOutObject<Info.out_object_index, typename T::Interface>();
|
||||||
} else if constexpr (Info.arg_type == ArgumentType::Buffer) {
|
} else if constexpr (Info.arg_type == ArgumentType::Buffer) {
|
||||||
/* Buffers were already processed earlier. */
|
/* Buffers were already processed earlier. */
|
||||||
if constexpr (sf::IsLargeData<T>) {
|
if constexpr (sf::IsLargeData<T>) {
|
||||||
|
@ -1124,6 +1175,21 @@ namespace ams::sf::impl {
|
||||||
out_handles_holder.CopyTo(response, runtime_metadata.GetOutObjectCount());
|
out_handles_holder.CopyTo(response, runtime_metadata.GetOutObjectCount());
|
||||||
|
|
||||||
/* Set output objects. */
|
/* Set output objects. */
|
||||||
|
#define _SF_IMPL_PROCESSOR_MARSHAL_OUT_OBJECT(n) do { \
|
||||||
|
if constexpr (n < CommandMeta::NumOutObjects) { \
|
||||||
|
in_out_objects_holder.template SetOutObject<n, typename std::tuple_element_t<n, typename CommandMeta::OutObjects>::Interface>(); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
_SF_IMPL_PROCESSOR_MARSHAL_OUT_OBJECT(0);
|
||||||
|
_SF_IMPL_PROCESSOR_MARSHAL_OUT_OBJECT(1);
|
||||||
|
_SF_IMPL_PROCESSOR_MARSHAL_OUT_OBJECT(2);
|
||||||
|
_SF_IMPL_PROCESSOR_MARSHAL_OUT_OBJECT(3);
|
||||||
|
_SF_IMPL_PROCESSOR_MARSHAL_OUT_OBJECT(4);
|
||||||
|
_SF_IMPL_PROCESSOR_MARSHAL_OUT_OBJECT(5);
|
||||||
|
_SF_IMPL_PROCESSOR_MARSHAL_OUT_OBJECT(6);
|
||||||
|
_SF_IMPL_PROCESSOR_MARSHAL_OUT_OBJECT(7);
|
||||||
|
_SF_IMPL_PROCESSOR_MARSHAL_OUT_OBJECT(8);
|
||||||
|
#undef _SF_IMPL_PROCESSOR_MARSHAL_OUT_OBJECT
|
||||||
in_out_objects_holder.SetOutObjects(ctx, response);
|
in_out_objects_holder.SetOutObjects(ctx, response);
|
||||||
|
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
|
|
|
@ -1,327 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2018-2020 Atmosphère-NX
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
#include <vapours.hpp>
|
|
||||||
|
|
||||||
namespace ams::sf::impl {
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
concept ServiceCommandResult = std::same_as<::ams::Result, T> || std::same_as<void, T>;
|
|
||||||
|
|
||||||
template<auto F, typename ...Arguments>
|
|
||||||
concept Invokable = requires (Arguments &&... args) {
|
|
||||||
{ F(std::forward<Arguments>(args)...) };
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FunctionTraits {
|
|
||||||
public:
|
|
||||||
template<typename R, typename... A>
|
|
||||||
static std::tuple<A...> GetArgsImpl(R(A...));
|
|
||||||
};
|
|
||||||
|
|
||||||
template<auto F>
|
|
||||||
using FunctionArgsType = decltype(FunctionTraits::GetArgsImpl(F));
|
|
||||||
|
|
||||||
template<typename Class, typename Return, typename ArgsTuple>
|
|
||||||
struct ClassFunctionPointerHelper;
|
|
||||||
|
|
||||||
template<typename Class, typename Return, typename... Arguments>
|
|
||||||
struct ClassFunctionPointerHelper<Class, Return, std::tuple<Arguments...>> {
|
|
||||||
using Type = Return (*)(Class *, Arguments &&...);
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename Class, typename Return, typename ArgsTuple>
|
|
||||||
using ClassFunctionPointer = typename ClassFunctionPointerHelper<Class, Return, ArgsTuple>::Type;
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
struct TypeTag{};
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_HELPER_FUNCTION_NAME_IMPL(CLASSNAME, FUNCNAME, SUFFIX) \
|
|
||||||
__ams_sf_impl_helper_##CLASSNAME##_##FUNCNAME##_##SUFFIX
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_HELPER_FUNCTION_NAME(CLASSNAME, FUNCNAME) \
|
|
||||||
AMS_SF_IMPL_HELPER_FUNCTION_NAME_IMPL(CLASSNAME, FUNCNAME, intf)
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, FUNCNAME) \
|
|
||||||
::ams::sf::impl::FunctionArgsType<AMS_SF_IMPL_HELPER_FUNCTION_NAME(CLASSNAME, FUNCNAME)>
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_CONCEPT_HELPER_FUNCTION_NAME(CLASSNAME, FUNCNAME) \
|
|
||||||
AMS_SF_IMPL_HELPER_FUNCTION_NAME_IMPL(CLASSNAME, FUNCNAME, intf_for_concept)
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DECLARE_HELPER_FUNCTIONS(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
static void AMS_SF_IMPL_HELPER_FUNCTION_NAME(CLASSNAME, NAME) ARGS { __builtin_unreachable(); } \
|
|
||||||
template<typename T, typename... Arguments> \
|
|
||||||
requires std::same_as<std::tuple<Arguments...>, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> \
|
|
||||||
static auto AMS_SF_IMPL_CONCEPT_HELPER_FUNCTION_NAME(CLASSNAME, NAME) (T &t, std::tuple<Arguments...> a) { \
|
|
||||||
return [&]<size_t... Ix>(std::index_sequence<Ix...>) { \
|
|
||||||
return t.NAME(std::forward<typename std::tuple_element<Ix, decltype(a)>::type>(std::get<Ix>(a))...); \
|
|
||||||
}(std::make_index_sequence<sizeof...(Arguments)>()); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DECLARE_HELPERS(CLASSNAME, CMD_MACRO) \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DECLARE_HELPER_FUNCTIONS)
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DECLARE_CONCEPT_REQUIREMENT(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
{ AMS_SF_IMPL_CONCEPT_HELPER_FUNCTION_NAME(CLASSNAME, NAME) (impl, std::declval<AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)>()) } -> ::ams::sf::impl::ServiceCommandResult;
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DEFINE_CONCEPT(CLASSNAME, CMD_MACRO) \
|
|
||||||
template<typename Impl> \
|
|
||||||
concept Is##CLASSNAME = requires (Impl &impl) { \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DECLARE_CONCEPT_REQUIREMENT) \
|
|
||||||
};
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_FUNCTION_POINTER_TYPE(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
::ams::sf::impl::ClassFunctionPointer<CLASSNAME, RETURN, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)>
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DECLARE_FUNCTION_POINTER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
AMS_SF_IMPL_FUNCTION_POINTER_TYPE(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) NAME;
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
template<typename ...Arguments> \
|
|
||||||
requires std::same_as<std::tuple<Arguments...>, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> \
|
|
||||||
RETURN Invoke##NAME##ByCommandTable (Arguments &&... args) { \
|
|
||||||
return this->cmd_table->NAME(this, std::forward<Arguments>(args)...); \
|
|
||||||
} \
|
|
||||||
template<typename ...Arguments> \
|
|
||||||
requires (::ams::sf::impl::Invokable<AMS_SF_IMPL_HELPER_FUNCTION_NAME(CLASSNAME, NAME), Arguments...> && \
|
|
||||||
std::same_as<std::tuple<Arguments...>, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)>) \
|
|
||||||
ALWAYS_INLINE RETURN NAME (Arguments &&... args) { \
|
|
||||||
return this->Invoke##NAME##ByCommandTable(std::forward<Arguments>(args)...); \
|
|
||||||
} \
|
|
||||||
template<typename ...Arguments> \
|
|
||||||
requires (::ams::sf::impl::Invokable<AMS_SF_IMPL_HELPER_FUNCTION_NAME(CLASSNAME, NAME), Arguments...> && \
|
|
||||||
!std::same_as<std::tuple<Arguments...>, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)>) \
|
|
||||||
ALWAYS_INLINE RETURN NAME (Arguments &&... args) { \
|
|
||||||
return [this] <typename... CorrectArguments, typename... PassedArguments> ALWAYS_INLINE_LAMBDA (::ams::sf::impl::TypeTag<std::tuple<CorrectArguments...>>, PassedArguments &&...args_) -> RETURN { \
|
|
||||||
return this->template NAME<CorrectArguments...>(std::forward<CorrectArguments>(args_)...); \
|
|
||||||
}(::ams::sf::impl::TypeTag<AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)>{}, std::forward<Arguments>(args)...); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION_INVOKER_HOLDER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
template<typename ...Arguments> \
|
|
||||||
requires std::same_as<std::tuple<Arguments...>, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> \
|
|
||||||
static RETURN NAME##Invoker (CLASSNAME *_this, Arguments &&... args) { \
|
|
||||||
return static_cast<ImplHolder *>(_this)->NAME(std::forward<Arguments>(args)...); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION_INVOKER_POINTER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
template<typename ...Arguments> \
|
|
||||||
requires std::same_as<std::tuple<Arguments...>, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> \
|
|
||||||
static RETURN NAME##Invoker (CLASSNAME *_this, Arguments &&... args) { \
|
|
||||||
return static_cast<ImplPointer *>(_this)->NAME(std::forward<Arguments>(args)...); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION_INVOKER_SHARED_POINTER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
template<typename ...Arguments> \
|
|
||||||
requires std::same_as<std::tuple<Arguments...>, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> \
|
|
||||||
static RETURN NAME##Invoker (CLASSNAME *_this, Arguments &&... args) { \
|
|
||||||
return static_cast<ImplSharedPointer *>(_this)->NAME(std::forward<Arguments>(args)...); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION_IMPL(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
template<typename ...Arguments> \
|
|
||||||
requires (std::same_as<std::tuple<Arguments...>, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> && \
|
|
||||||
std::same_as<RETURN, decltype(impl.NAME(std::declval<Arguments>()...))>) \
|
|
||||||
RETURN NAME (Arguments &&... args) { \
|
|
||||||
return this->impl.NAME(std::forward<Arguments>(args)...); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION_IMPL_PTR(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
template<typename ...Arguments> \
|
|
||||||
requires (std::same_as<std::tuple<Arguments...>, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> && \
|
|
||||||
std::same_as<RETURN, decltype(impl->NAME(std::declval<Arguments>()...))>) \
|
|
||||||
RETURN NAME (Arguments &&... args) { \
|
|
||||||
return this->impl->NAME(std::forward<Arguments>(args)...); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DEFINE_INTERFACE_IMPL_FUNCTION_POINTER_HOLDER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
template<typename A> struct NAME##FunctionPointerHolder; \
|
|
||||||
\
|
|
||||||
template<typename ...Arguments> \
|
|
||||||
requires std::same_as<std::tuple<Arguments...>, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> \
|
|
||||||
struct NAME##FunctionPointerHolder<std::tuple<Arguments...>> { \
|
|
||||||
static constexpr auto Value = static_cast<AMS_SF_IMPL_FUNCTION_POINTER_TYPE(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX)>(&NAME##Invoker<Arguments...>); \
|
|
||||||
};
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DEFINE_INTERFACE_SERVICE_COMMAND_META_HOLDER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
template<typename ServiceImpl, typename A> struct NAME##ServiceCommandMetaHolder; \
|
|
||||||
\
|
|
||||||
template<typename ServiceImpl, typename ...Arguments> \
|
|
||||||
requires std::same_as<std::tuple<Arguments...>, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> \
|
|
||||||
struct NAME##ServiceCommandMetaHolder<ServiceImpl, std::tuple<Arguments...>> { \
|
|
||||||
static constexpr auto Value = ::ams::sf::impl::MakeServiceCommandMeta<VERSION_MIN, VERSION_MAX, CMD_ID, &ServiceImpl::template Invoke##NAME##ByCommandTable<Arguments...>, RETURN, CLASSNAME, Arguments...>(); \
|
|
||||||
};
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DEFINE_INTERFACE_COMMAND_POINTER_TABLE_MEMBER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
.NAME = NAME##FunctionPointerHolder<AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)>::Value,
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DEFINE_CMIF_SERVICE_COMMAND_META_TABLE_ENTRY(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
NAME##ServiceCommandMetaHolder<ServiceImpl, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)>::Value,
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
struct Print;
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DEFINE_CLASS(BASECLASS, CLASSNAME, CMD_MACRO) \
|
|
||||||
class CLASSNAME : public BASECLASS { \
|
|
||||||
NON_COPYABLE(CLASSNAME); \
|
|
||||||
NON_MOVEABLE(CLASSNAME); \
|
|
||||||
private: \
|
|
||||||
struct CommandPointerTable { \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DECLARE_FUNCTION_POINTER) \
|
|
||||||
}; \
|
|
||||||
private: \
|
|
||||||
const CommandPointerTable * const cmd_table; \
|
|
||||||
private: \
|
|
||||||
CLASSNAME() = delete; \
|
|
||||||
protected: \
|
|
||||||
constexpr CLASSNAME(const CommandPointerTable *ct) \
|
|
||||||
: cmd_table(ct) { /* ... */ } \
|
|
||||||
virtual ~CLASSNAME() { /* ... */ } \
|
|
||||||
public: \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION) \
|
|
||||||
private: \
|
|
||||||
template<typename S, typename T> \
|
|
||||||
requires ((std::same_as<CLASSNAME, S> && !std::same_as<CLASSNAME, T>&& Is##CLASSNAME<T>) && \
|
|
||||||
(::ams::sf::IsMitmServiceObject<S> == ::ams::sf::IsMitmServiceImpl<T>)) \
|
|
||||||
struct ImplGenerator { \
|
|
||||||
public: \
|
|
||||||
class ImplHolder : public S { \
|
|
||||||
private: \
|
|
||||||
T impl; \
|
|
||||||
public: \
|
|
||||||
template<typename... Args> requires std::constructible_from<T, Args...> \
|
|
||||||
constexpr ImplHolder(Args &&... args) \
|
|
||||||
: S(std::addressof(CommandPointerTableImpl)), impl(std::forward<Args>(args)...) \
|
|
||||||
{ \
|
|
||||||
/* ... */ \
|
|
||||||
} \
|
|
||||||
ALWAYS_INLINE T &GetImpl() { return this->impl; } \
|
|
||||||
ALWAYS_INLINE const T &GetImpl() const { return this->impl; } \
|
|
||||||
\
|
|
||||||
template<typename U = S> requires ::ams::sf::IsMitmServiceObject<S> && std::same_as<U, S> \
|
|
||||||
static ALWAYS_INLINE bool ShouldMitm(os::ProcessId p, ncm::ProgramId r) { return T::ShouldMitm(p, r); } \
|
|
||||||
private: \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION_INVOKER_HOLDER) \
|
|
||||||
public: \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION_IMPL) \
|
|
||||||
private: \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_INTERFACE_IMPL_FUNCTION_POINTER_HOLDER) \
|
|
||||||
public: \
|
|
||||||
static constexpr CommandPointerTable CommandPointerTableImpl = { \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_INTERFACE_COMMAND_POINTER_TABLE_MEMBER) \
|
|
||||||
}; \
|
|
||||||
}; \
|
|
||||||
static_assert(Is##CLASSNAME<ImplHolder>); \
|
|
||||||
\
|
|
||||||
class ImplPointer : public S { \
|
|
||||||
private: \
|
|
||||||
T *impl; \
|
|
||||||
public: \
|
|
||||||
constexpr ImplPointer(T *t) \
|
|
||||||
: S(std::addressof(CommandPointerTableImpl)), impl(t) \
|
|
||||||
{ \
|
|
||||||
/* ... */ \
|
|
||||||
} \
|
|
||||||
ALWAYS_INLINE T &GetImpl() { return *this->impl; } \
|
|
||||||
ALWAYS_INLINE const T &GetImpl() const { return *this->impl; } \
|
|
||||||
private: \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION_INVOKER_POINTER) \
|
|
||||||
public: \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION_IMPL_PTR) \
|
|
||||||
private: \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_INTERFACE_IMPL_FUNCTION_POINTER_HOLDER) \
|
|
||||||
public: \
|
|
||||||
static constexpr CommandPointerTable CommandPointerTableImpl = { \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_INTERFACE_COMMAND_POINTER_TABLE_MEMBER) \
|
|
||||||
}; \
|
|
||||||
}; \
|
|
||||||
\
|
|
||||||
class ImplSharedPointer : public S { \
|
|
||||||
private: \
|
|
||||||
std::shared_ptr<T> impl; \
|
|
||||||
public: \
|
|
||||||
constexpr ImplSharedPointer(std::shared_ptr<T> &&t) \
|
|
||||||
: S(std::addressof(CommandPointerTableImpl)), impl(std::move(t)) \
|
|
||||||
{ \
|
|
||||||
/* ... */ \
|
|
||||||
} \
|
|
||||||
ALWAYS_INLINE T &GetImpl() { return *this->impl; } \
|
|
||||||
ALWAYS_INLINE const T &GetImpl() const { return *this->impl; } \
|
|
||||||
private: \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION_INVOKER_SHARED_POINTER) \
|
|
||||||
public: \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION_IMPL_PTR) \
|
|
||||||
private: \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_INTERFACE_IMPL_FUNCTION_POINTER_HOLDER) \
|
|
||||||
public: \
|
|
||||||
static constexpr CommandPointerTable CommandPointerTableImpl = { \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_INTERFACE_COMMAND_POINTER_TABLE_MEMBER) \
|
|
||||||
}; \
|
|
||||||
}; \
|
|
||||||
static_assert(Is##CLASSNAME<ImplHolder>); \
|
|
||||||
}; \
|
|
||||||
private: \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_INTERFACE_SERVICE_COMMAND_META_HOLDER) \
|
|
||||||
public: \
|
|
||||||
template<typename T> requires (!std::same_as<CLASSNAME, T>&& Is##CLASSNAME<T>) \
|
|
||||||
using ImplHolder = typename ImplGenerator<CLASSNAME, T>::ImplHolder; \
|
|
||||||
\
|
|
||||||
template<typename T> requires (!std::same_as<CLASSNAME, T>&& Is##CLASSNAME<T>) \
|
|
||||||
using ImplPointer = typename ImplGenerator<CLASSNAME, T>::ImplPointer; \
|
|
||||||
\
|
|
||||||
template<typename T> requires (!std::same_as<CLASSNAME, T>&& Is##CLASSNAME<T> && \
|
|
||||||
std::derived_from<T, std::enable_shared_from_this<T>>) \
|
|
||||||
using ImplSharedPointer = typename ImplGenerator<CLASSNAME, T>::ImplSharedPointer; \
|
|
||||||
\
|
|
||||||
AMS_SF_CMIF_IMPL_DEFINE_SERVICE_DISPATCH_TABLE { \
|
|
||||||
CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_CMIF_SERVICE_COMMAND_META_TABLE_ENTRY) \
|
|
||||||
}; \
|
|
||||||
};
|
|
||||||
|
|
||||||
#define AMS_SF_METHOD_INFO_6(CLASSNAME, HANDLER, CMD_ID, RETURN, NAME, ARGS) \
|
|
||||||
HANDLER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, hos::Version_Min, hos::Version_Max)
|
|
||||||
|
|
||||||
#define AMS_SF_METHOD_INFO_7(CLASSNAME, HANDLER, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN) \
|
|
||||||
HANDLER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, hos::Version_Max)
|
|
||||||
|
|
||||||
#define AMS_SF_METHOD_INFO_8(CLASSNAME, HANDLER, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
HANDLER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX)
|
|
||||||
|
|
||||||
#define AMS_SF_METHOD_INFO_X(_, _0, _1, _2, _3, _4, _5, _6, _7, FUNC, ...) FUNC
|
|
||||||
|
|
||||||
#define AMS_SF_METHOD_INFO(...) \
|
|
||||||
AMS_SF_METHOD_INFO_X(, ## __VA_ARGS__, AMS_SF_METHOD_INFO_8(__VA_ARGS__), AMS_SF_METHOD_INFO_7(__VA_ARGS__), AMS_SF_METHOD_INFO_6(__VA_ARGS__))
|
|
||||||
|
|
||||||
#define AMS_SF_DEFINE_INTERFACE(CLASSNAME, CMD_MACRO) \
|
|
||||||
AMS_SF_IMPL_DECLARE_HELPERS(CLASSNAME,CMD_MACRO) \
|
|
||||||
AMS_SF_IMPL_DEFINE_CONCEPT(CLASSNAME, CMD_MACRO) \
|
|
||||||
AMS_SF_IMPL_DEFINE_CLASS( ::ams::sf::IServiceObject, CLASSNAME, CMD_MACRO) \
|
|
||||||
static_assert(Is##CLASSNAME<CLASSNAME>);
|
|
||||||
|
|
||||||
#define AMS_SF_DEFINE_MITM_INTERFACE(CLASSNAME, CMD_MACRO) \
|
|
||||||
AMS_SF_IMPL_DECLARE_HELPERS(CLASSNAME,CMD_MACRO) \
|
|
||||||
AMS_SF_IMPL_DEFINE_CONCEPT(CLASSNAME, CMD_MACRO) \
|
|
||||||
AMS_SF_IMPL_DEFINE_CLASS(::ams::sf::IMitmServiceObject, CLASSNAME, CMD_MACRO) \
|
|
||||||
static_assert(Is##CLASSNAME<CLASSNAME>);
|
|
||||||
|
|
||||||
#define AMS_SF_IMPL_DECLARE_INTERFACE_METHODS(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \
|
|
||||||
RETURN NAME ARGS;
|
|
||||||
|
|
||||||
#define AMS_SF_DECLARE_INTERFACE_METHODS(CMD_MACRO) \
|
|
||||||
CMD_MACRO(_, AMS_SF_IMPL_DECLARE_INTERFACE_METHODS)
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <vapours.hpp>
|
||||||
|
|
||||||
|
namespace ams::sf::impl {
|
||||||
|
|
||||||
|
template<typename Interface, typename Base, typename ImplHolder, typename ImplGetter, typename Root>
|
||||||
|
class ImplTemplateBaseT;
|
||||||
|
|
||||||
|
template<typename Interface, typename Base, typename ImplHolder, typename ImplGetter>
|
||||||
|
class ImplTemplateBase : public ImplTemplateBaseT<Interface, Base, ImplHolder, ImplGetter, Interface> {
|
||||||
|
private:
|
||||||
|
using BaseImpl = ImplTemplateBaseT<Interface, Base, ImplHolder, ImplGetter, Interface>;
|
||||||
|
public:
|
||||||
|
using BaseImpl::BaseImpl;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <vapours.hpp>
|
||||||
|
|
||||||
|
namespace ams::sf::impl {
|
||||||
|
|
||||||
|
class ServiceObjectImplBase2 {
|
||||||
|
private:
|
||||||
|
std::atomic<u32> m_ref_count;
|
||||||
|
protected:
|
||||||
|
constexpr ServiceObjectImplBase2() : m_ref_count(1) { /* ... */ }
|
||||||
|
|
||||||
|
void AddReferenceImpl() {
|
||||||
|
const auto prev = m_ref_count.fetch_add(1);
|
||||||
|
AMS_ABORT_UNLESS(prev < std::numeric_limits<u32>::max());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ReleaseImpl() {
|
||||||
|
const auto prev = m_ref_count.fetch_sub(1);
|
||||||
|
AMS_ABORT_UNLESS(prev != 0);
|
||||||
|
return prev == 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <vapours.hpp>
|
||||||
|
|
||||||
|
namespace ams::sf {
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
struct StatelessDummyAllocator;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename A>
|
||||||
|
class StatelessAllocationPolicy {
|
||||||
|
public:
|
||||||
|
static constexpr bool HasStatefulAllocator = false;
|
||||||
|
using Allocator = impl::StatelessDummyAllocator;
|
||||||
|
|
||||||
|
template<typename>
|
||||||
|
using StatelessAllocator = A;
|
||||||
|
|
||||||
|
template<typename>
|
||||||
|
static void *AllocateAligned(size_t size, size_t align) {
|
||||||
|
return A().Allocate(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename>
|
||||||
|
static void DeallocateAligned(void *ptr, size_t size, size_t align) {
|
||||||
|
A().Deallocate(ptr, size);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<template<typename> typename A>
|
||||||
|
class StatelessTypedAllocationPolicy {
|
||||||
|
public:
|
||||||
|
static constexpr bool HasStatefulAllocator = false;
|
||||||
|
using Allocator = impl::StatelessDummyAllocator;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
using StatelessAllocator = A<T>;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
static void *AllocateAligned(size_t size, size_t align) {
|
||||||
|
return StatelessAllocator<T>().Allocate(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
static void DeallocateAligned(void *ptr, size_t size, size_t align) {
|
||||||
|
StatelessAllocator<T>().Deallocate(ptr, size);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename A>
|
||||||
|
class StatefulAllocationPolicy {
|
||||||
|
public:
|
||||||
|
static constexpr bool HasStatefulAllocator = true;
|
||||||
|
using Allocator = A;
|
||||||
|
|
||||||
|
static void *AllocateAligned(Allocator *allocator, size_t size, size_t align) {
|
||||||
|
return allocator->Allocate(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void DeallocateAligned(Allocator *allocator, void *ptr, size_t size, size_t align) {
|
||||||
|
allocator->Deallocate(ptr, size);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
concept IsStatefulPolicy = T::HasStatefulAllocator;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <stratosphere/sf/sf_common.hpp>
|
||||||
|
#include <stratosphere/sf/sf_allocation_policies.hpp>
|
||||||
|
|
||||||
|
namespace ams::sf {
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
void *DefaultAllocateImpl(size_t size, size_t align, size_t offset);
|
||||||
|
void DefaultDeallocateImpl(void *ptr, size_t size, size_t align, size_t offset);
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class DefaultAllocationPolicyAllocator {
|
||||||
|
private:
|
||||||
|
struct Holder {
|
||||||
|
MemoryResource *allocator;
|
||||||
|
typename std::aligned_storage<sizeof(T), alignof(T)>::type storage;
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
void *Allocate(size_t size) {
|
||||||
|
AMS_ASSERT(size == sizeof(T));
|
||||||
|
return DefaultAllocateImpl(sizeof(Holder), alignof(Holder), offsetof(Holder, storage));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Deallocate(void *ptr, size_t size) {
|
||||||
|
AMS_ASSERT(size == sizeof(T));
|
||||||
|
return DefaultDeallocateImpl(ptr, sizeof(Holder), alignof(Holder), offsetof(Holder, storage));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
using DefaultAllocationPolicy = StatelessTypedAllocationPolicy<impl::DefaultAllocationPolicyAllocator>;
|
||||||
|
|
||||||
|
MemoryResource *GetGlobalDefaultMemoryResource();
|
||||||
|
MemoryResource *GetCurrentEffectiveMemoryResource();
|
||||||
|
MemoryResource *GetCurrentMemoryResource();
|
||||||
|
MemoryResource *GetNewDeleteMemoryResource();
|
||||||
|
|
||||||
|
MemoryResource *SetGlobalDefaultMemoryResource(MemoryResource *mr);
|
||||||
|
MemoryResource *SetCurrentMemoryResource(MemoryResource *mr);
|
||||||
|
|
||||||
|
class ScopedCurrentMemoryResourceSetter {
|
||||||
|
NON_COPYABLE(ScopedCurrentMemoryResourceSetter);
|
||||||
|
NON_MOVEABLE(ScopedCurrentMemoryResourceSetter);
|
||||||
|
private:
|
||||||
|
MemoryResource *m_prev;
|
||||||
|
public:
|
||||||
|
explicit ScopedCurrentMemoryResourceSetter(MemoryResource *mr);
|
||||||
|
~ScopedCurrentMemoryResourceSetter();
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <stratosphere/sf/sf_common.hpp>
|
||||||
|
#include <stratosphere/sf/sf_allocation_policies.hpp>
|
||||||
|
|
||||||
|
namespace ams::sf {
|
||||||
|
|
||||||
|
struct ExpHeapAllocator {
|
||||||
|
using Policy = StatefulAllocationPolicy<ExpHeapAllocator>;
|
||||||
|
|
||||||
|
lmem::HeapHandle _handle;
|
||||||
|
os::SdkMutexType _mutex;
|
||||||
|
|
||||||
|
void Attach(lmem::HeapHandle h) {
|
||||||
|
this->_handle = h;
|
||||||
|
os::InitializeSdkMutex(std::addressof(this->_mutex));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Detach() {
|
||||||
|
this->_handle = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *Allocate(size_t size) {
|
||||||
|
os::LockSdkMutex(std::addressof(this->_mutex));
|
||||||
|
auto ptr = lmem::AllocateFromExpHeap(this->_handle, size);
|
||||||
|
os::UnlockSdkMutex(std::addressof(this->_mutex));
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Deallocate(void *ptr, size_t size) {
|
||||||
|
os::LockSdkMutex(std::addressof(this->_mutex));
|
||||||
|
lmem::FreeToExpHeap(this->_handle, ptr);
|
||||||
|
os::UnlockSdkMutex(std::addressof(this->_mutex));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
static_assert(util::is_pod<ExpHeapAllocator>::value);
|
||||||
|
|
||||||
|
template<size_t Size, typename Tag = void>
|
||||||
|
struct ExpHeapStaticAllocator {
|
||||||
|
using Policy = StatelessAllocationPolicy<ExpHeapStaticAllocator<Size, Tag>>;
|
||||||
|
|
||||||
|
struct Globals {
|
||||||
|
ExpHeapAllocator allocator;
|
||||||
|
typename std::aligned_storage<Size == 0 ? 1 : Size>::type buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
static constinit inline Globals _globals;
|
||||||
|
|
||||||
|
|
||||||
|
static void Initialize(int option) {
|
||||||
|
_globals.allocator.Attach(lmem::CreateExpHeap(std::addressof(_globals.buffer), Size, option));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Initialize(lmem::HeapHandle handle) {
|
||||||
|
_globals.allocator.Attach(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *Allocate(size_t size) {
|
||||||
|
return _globals.allocator.Allocate(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Deallocate(void *ptr, size_t size) {
|
||||||
|
return _globals.allocator.Deallocate(ptr, size);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <stratosphere/sf/sf_common.hpp>
|
||||||
|
#include <stratosphere/sf/sf_allocation_policies.hpp>
|
||||||
|
|
||||||
|
namespace ams::sf {
|
||||||
|
|
||||||
|
struct MemoryResourceAllocationPolicy {
|
||||||
|
static constexpr bool HasStatefulAllocator = true;
|
||||||
|
using Allocator = MemoryResource;
|
||||||
|
|
||||||
|
static void *AllocateAligned(MemoryResource *mr, size_t size, size_t align) {
|
||||||
|
return mr->allocate(size, align);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void DeallocateAligned(MemoryResource *mr, void *ptr, size_t size, size_t align) {
|
||||||
|
return mr->deallocate(ptr, size, align);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct MemoryResourceStaticAllocator {
|
||||||
|
static constinit inline MemoryResource *g_memory_resource = nullptr;
|
||||||
|
|
||||||
|
static constexpr void Initialize(MemoryResource *mr) {
|
||||||
|
g_memory_resource = mr;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Policy {
|
||||||
|
static constexpr bool HasStatefulAllocator = false;
|
||||||
|
using Allocator = MemoryResource;
|
||||||
|
|
||||||
|
template<typename>
|
||||||
|
using StatelessAllocator = Allocator;
|
||||||
|
|
||||||
|
template<typename>
|
||||||
|
static void *AllocateAligned(size_t size, size_t align) {
|
||||||
|
return g_memory_resource->allocate(size, align);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename>
|
||||||
|
static void DeallocateAligned(void *ptr, size_t size, size_t align) {
|
||||||
|
g_memory_resource->deallocate(ptr, size, align);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,352 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <vapours.hpp>
|
||||||
|
#include <stratosphere/sf/sf_common.hpp>
|
||||||
|
#include <stratosphere/sf/impl/sf_impl_template_base.hpp>
|
||||||
|
#include <stratosphere/sf/sf_object_impl_factory.hpp>
|
||||||
|
#include <stratosphere/sf/sf_memory_resource.hpp>
|
||||||
|
#include <stratosphere/sf/sf_default_allocation_policy.hpp>
|
||||||
|
|
||||||
|
namespace ams::sf {
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
template<typename>
|
||||||
|
struct IsSmartPointer : public std::false_type{};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct IsSmartPointer<SharedPointer<T>> : public std::true_type{};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct IsSmartPointer<std::shared_ptr<T>> : public std::true_type{};
|
||||||
|
|
||||||
|
template<typename T, typename D>
|
||||||
|
struct IsSmartPointer<std::unique_ptr<T, D>> : public std::true_type{};
|
||||||
|
|
||||||
|
template<typename Impl>
|
||||||
|
struct UnmanagedEmplaceImplHolderBaseGetter {
|
||||||
|
using Type = Impl;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Impl> requires (std::is_abstract<Impl>::value )
|
||||||
|
struct UnmanagedEmplaceImplHolderBaseGetter<Impl> {
|
||||||
|
class Impl2 : public Impl {
|
||||||
|
public:
|
||||||
|
using Impl::Impl;
|
||||||
|
private:
|
||||||
|
constexpr virtual void AddReference() override { /* ... */ }
|
||||||
|
constexpr virtual void Release() override { /* ... */ }
|
||||||
|
};
|
||||||
|
|
||||||
|
using Type = Impl2;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Impl>
|
||||||
|
class UnmanagedEmplacedImplHolder {
|
||||||
|
template<typename, typename, typename, typename, typename>
|
||||||
|
friend class impl::ImplTemplateBaseT;
|
||||||
|
private:
|
||||||
|
using Impl2 = typename UnmanagedEmplaceImplHolderBaseGetter<Impl>::Type;
|
||||||
|
static_assert(!std::is_abstract<Impl2>::value);
|
||||||
|
private:
|
||||||
|
Impl2 m_impl;
|
||||||
|
private:
|
||||||
|
template<typename... Args>
|
||||||
|
constexpr explicit UnmanagedEmplacedImplHolder(Args &&... args) : m_impl(std::forward<Args>(args)...) { /* ... */ }
|
||||||
|
public:
|
||||||
|
static constexpr Impl *GetImplPointer(UnmanagedEmplacedImplHolder *holder) {
|
||||||
|
return std::addressof(holder->m_impl);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Impl>
|
||||||
|
class EmplacedImplHolder : private Impl {
|
||||||
|
template<typename, typename, typename, typename, typename>
|
||||||
|
friend class impl::ImplTemplateBaseT;
|
||||||
|
private:
|
||||||
|
template<typename... Args>
|
||||||
|
constexpr explicit EmplacedImplHolder(Args &&... args) : Impl(std::forward<Args>(args)...) { /* ... */ }
|
||||||
|
public:
|
||||||
|
static constexpr Impl *GetImplPointer(EmplacedImplHolder *holder) {
|
||||||
|
return holder;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface>
|
||||||
|
static constexpr Impl *GetEmplacedImplPointerImpl(const SharedPointer<Interface> &sp) {
|
||||||
|
using Base = impl::ImplTemplateBase<Interface, Interface, EmplacedImplHolder, EmplacedImplHolder>;
|
||||||
|
return static_cast<Base *>(sp.Get());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Impl> requires (IsSmartPointer<Impl>::value)
|
||||||
|
class EmplacedImplHolder<Impl> : private Impl {
|
||||||
|
template<typename, typename, typename, typename, typename>
|
||||||
|
friend class impl::ImplTemplateBaseT;
|
||||||
|
private:
|
||||||
|
template<typename... Args>
|
||||||
|
constexpr explicit EmplacedImplHolder(Args &&... args) : Impl(std::forward<Args>(args)...) { /* ... */ }
|
||||||
|
public:
|
||||||
|
static constexpr auto *GetImplPointer(EmplacedImplHolder *holder) {
|
||||||
|
return static_cast<Impl *>(holder)->operator ->();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface>
|
||||||
|
static constexpr Impl *GetEmplacedImplPointerImpl(const SharedPointer<Interface> &sp) {
|
||||||
|
using Base = impl::ImplTemplateBase<Interface, Interface, EmplacedImplHolder, EmplacedImplHolder>;
|
||||||
|
return static_cast<Base *>(sp.Get());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
using SmartPointerHolder = EmplacedImplHolder<T>;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class ManagedPointerHolder {
|
||||||
|
template<typename, typename, typename, typename, typename>
|
||||||
|
friend class impl::ImplTemplateBaseT;
|
||||||
|
private:
|
||||||
|
T *m_p;
|
||||||
|
private:
|
||||||
|
constexpr explicit ManagedPointerHolder(T *p) : m_p(p) { /* ... */ }
|
||||||
|
constexpr ~ManagedPointerHolder() { m_p->Release(); }
|
||||||
|
|
||||||
|
static constexpr T *GetImplPointer(ManagedPointerHolder *holder) {
|
||||||
|
return holder->m_p;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class UnmanagedPointerHolder {
|
||||||
|
template<typename, typename, typename, typename, typename>
|
||||||
|
friend class impl::ImplTemplateBaseT;
|
||||||
|
private:
|
||||||
|
T *m_p;
|
||||||
|
private:
|
||||||
|
constexpr explicit UnmanagedPointerHolder(T *p) : m_p(p) { /* ... */ }
|
||||||
|
|
||||||
|
static constexpr T *GetImplPointer(UnmanagedPointerHolder *holder) {
|
||||||
|
return holder->m_p;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename Impl>
|
||||||
|
class UnmanagedServiceObject final : public impl::ImplTemplateBase<Interface, Interface, impl::UnmanagedEmplacedImplHolder<Impl>, impl::UnmanagedEmplacedImplHolder<Impl>> {
|
||||||
|
private:
|
||||||
|
using ImplBase = impl::ImplTemplateBase<Interface, Interface, impl::UnmanagedEmplacedImplHolder<Impl>, impl::UnmanagedEmplacedImplHolder<Impl>>;
|
||||||
|
public:
|
||||||
|
using ImplBase::ImplBase;
|
||||||
|
|
||||||
|
constexpr virtual void AddReference() override { /* ... */ }
|
||||||
|
constexpr virtual void Release() override { /* ... */ }
|
||||||
|
|
||||||
|
constexpr Impl &GetImpl() { return impl::UnmanagedEmplacedImplHolder<Impl>::GetImplPointer(this); }
|
||||||
|
|
||||||
|
constexpr SharedPointer<Interface> GetShared() { return SharedPointer<Interface>(this, false); }
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Interface, typename T>
|
||||||
|
class UnmanagedServiceObjectByPointer final : public impl::ImplTemplateBase<Interface, Interface, impl::UnmanagedPointerHolder<T>, impl::UnmanagedPointerHolder<T>> {
|
||||||
|
private:
|
||||||
|
using ImplBase = impl::ImplTemplateBase<Interface, Interface, impl::UnmanagedPointerHolder<T>, impl::UnmanagedPointerHolder<T>>;
|
||||||
|
public:
|
||||||
|
constexpr explicit UnmanagedServiceObjectByPointer(T *ptr) : ImplBase(ptr) { /* ... */ }
|
||||||
|
|
||||||
|
constexpr virtual void AddReference() override { /* ... */ }
|
||||||
|
constexpr virtual void Release() override { /* ... */ }
|
||||||
|
|
||||||
|
constexpr SharedPointer<Interface> GetShared() { return SharedPointer<Interface>(this, false); }
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Policy>
|
||||||
|
class ObjectFactory;
|
||||||
|
|
||||||
|
template<typename Interface, typename Impl>
|
||||||
|
class EmplacedRef : public SharedPointer<Interface> {
|
||||||
|
template<typename> friend class ObjectFactory;
|
||||||
|
private:
|
||||||
|
constexpr explicit EmplacedRef(Interface *ptr, bool incref) : SharedPointer<Interface>(ptr, incref) { /* ... */ }
|
||||||
|
public:
|
||||||
|
constexpr EmplacedRef() { /* ... */ }
|
||||||
|
|
||||||
|
constexpr Impl &GetImpl() const {
|
||||||
|
return *impl::EmplacedImplHolder<Impl>::template GetEmplacedImplPointerImpl<Interface>(*this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Policy> requires (!IsStatefulPolicy<Policy>)
|
||||||
|
class ObjectFactory<Policy> {
|
||||||
|
private:
|
||||||
|
template<typename Interface, typename Holder, typename T>
|
||||||
|
static constexpr SharedPointer<Interface> CreateSharedForPointer(T t) {
|
||||||
|
using Base = impl::ImplTemplateBase<Interface, Interface, Holder, Holder>;
|
||||||
|
return SharedPointer<Interface>(ObjectImplFactory<Base, Policy>::Create(std::forward<T>(t)), false);
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
template<typename Interface, typename Impl, typename... Args>
|
||||||
|
static constexpr EmplacedRef<Interface, Impl> CreateSharedEmplaced(Args &&... args) {
|
||||||
|
using Base = impl::ImplTemplateBase<Interface, Interface, impl::EmplacedImplHolder<Impl>, impl::EmplacedImplHolder<Impl>>;
|
||||||
|
return EmplacedRef<Interface, Impl>(ObjectImplFactory<Base, Policy>::Create(std::forward<Args>(args)...), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, typename... Args>
|
||||||
|
static constexpr SharedPointer<T> CreateUserSharedObject(Args &&... args) {
|
||||||
|
return SharedPointer<T>(ObjectImplFactory<T, Policy>::Create(std::forward<Args>(args)...), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Impl, typename Interface>
|
||||||
|
static constexpr Impl *GetEmplacedImplPointer(const SharedPointer<Interface> &sp) {
|
||||||
|
return impl::EmplacedImplHolder<Impl>::template GetEmplacedImplPointerImpl<Interface>(sp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename Smart>
|
||||||
|
static constexpr SharedPointer<Interface> CreateShared(Smart &&sp) {
|
||||||
|
return CreateSharedForPointer<Interface, impl::SmartPointerHolder<typename std::decay<decltype(sp)>::type>>(std::forward<Smart>(sp));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename T>
|
||||||
|
static constexpr SharedPointer<Interface> CreateShared(T *p) {
|
||||||
|
return CreateSharedForPointer<Interface, impl::ManagedPointerHolder<T>>(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename T>
|
||||||
|
static constexpr SharedPointer<Interface> CreateSharedWithoutManagement(T *p) {
|
||||||
|
return CreateSharedForPointer<Interface, impl::UnmanagedPointerHolder<T>>(p);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Policy> requires (IsStatefulPolicy<Policy>)
|
||||||
|
class ObjectFactory<Policy> {
|
||||||
|
public:
|
||||||
|
using Allocator = typename Policy::Allocator;
|
||||||
|
private:
|
||||||
|
template<typename Interface, typename Holder, typename T>
|
||||||
|
static constexpr SharedPointer<Interface> CreateSharedForPointer(Allocator *a, T t) {
|
||||||
|
using Base = impl::ImplTemplateBase<Interface, Interface, Holder, Holder>;
|
||||||
|
return SharedPointer<Interface>(ObjectImplFactory<Base, Policy>::Create(a, std::forward<T>(t)), false);
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
template<typename Interface, typename Impl, typename... Args>
|
||||||
|
static constexpr EmplacedRef<Interface, Impl> CreateSharedEmplaced(Allocator *a, Args &&... args) {
|
||||||
|
using Base = impl::ImplTemplateBase<Interface, Interface, impl::EmplacedImplHolder<Impl>, impl::EmplacedImplHolder<Impl>>;
|
||||||
|
return EmplacedRef<Interface, Impl>(ObjectImplFactory<Base, Policy>::Create(a, std::forward<Args>(args)...), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, typename... Args>
|
||||||
|
static constexpr SharedPointer<T> CreateUserSharedObject(Allocator *a, Args &&... args) {
|
||||||
|
return SharedPointer<T>(ObjectImplFactory<T, Policy>::Create(a, std::forward<Args>(args)...), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Impl, typename Interface>
|
||||||
|
static constexpr Impl *GetEmplacedImplPointer(const SharedPointer<Interface> &sp) {
|
||||||
|
return impl::EmplacedImplHolder<Impl>::template GetEmplacedImplPointerImpl<Interface>(sp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename Smart>
|
||||||
|
static constexpr SharedPointer<Interface> CreateShared(Allocator *a, Smart &&sp) {
|
||||||
|
return CreateSharedForPointer<Interface, impl::SmartPointerHolder<typename std::decay<decltype(sp)>::type>>(a, std::forward<Smart>(sp));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename T>
|
||||||
|
static constexpr SharedPointer<Interface> CreateShared(Allocator *a, T *p) {
|
||||||
|
return CreateSharedForPointer<Interface, impl::ManagedPointerHolder<T>>(a, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename T>
|
||||||
|
static constexpr SharedPointer<Interface> CreateSharedWithoutManagement(Allocator *a, T *p) {
|
||||||
|
return CreateSharedForPointer<Interface, impl::UnmanagedPointerHolder<T>>(a, p);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Policy>
|
||||||
|
class StatefulObjectFactory {
|
||||||
|
public:
|
||||||
|
using Allocator = typename Policy::Allocator;
|
||||||
|
private:
|
||||||
|
using StaticObjectFactory = ObjectFactory<Policy>;
|
||||||
|
private:
|
||||||
|
Allocator *m_allocator;
|
||||||
|
public:
|
||||||
|
constexpr explicit StatefulObjectFactory(Allocator *a) : m_allocator(a) { /* ... */ }
|
||||||
|
|
||||||
|
template<typename Interface, typename Impl, typename... Args>
|
||||||
|
constexpr EmplacedRef<Interface, Impl> CreateSharedEmplaced(Args &&... args) {
|
||||||
|
return StaticObjectFactory::template CreateSharedEmplaced<Interface, Impl>(m_allocator, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Impl, typename Interface>
|
||||||
|
static constexpr Impl *GetEmplacedImplPointer(const SharedPointer<Interface> &sp) {
|
||||||
|
return StaticObjectFactory::template GetEmplacedImplPointer<Impl, Interface>(sp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename Smart>
|
||||||
|
constexpr SharedPointer<Interface> CreateShared(Allocator *a, Smart &&sp) {
|
||||||
|
return StaticObjectFactory::template CreateShared<Interface>(m_allocator, std::forward<Smart>(sp));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename T>
|
||||||
|
constexpr SharedPointer<Interface> CreateShared(Allocator *a, T *p) {
|
||||||
|
return StaticObjectFactory::template CreateShared<Interface>(m_allocator, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename T>
|
||||||
|
constexpr SharedPointer<Interface> CreateSharedWithoutManagement(Allocator *a, T *p) {
|
||||||
|
return StaticObjectFactory::template CreateSharedWithoutManagement<Interface>(m_allocator, p);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
using DefaultObjectFactory = ObjectFactory<DefaultAllocationPolicy>;
|
||||||
|
using MemoryResourceObjectFactory = ObjectFactory<MemoryResourceAllocationPolicy>;
|
||||||
|
|
||||||
|
template<typename Interface, typename Impl, typename... Args>
|
||||||
|
inline EmplacedRef<Interface, Impl> CreateSharedObjectEmplaced(Args &&... args) {
|
||||||
|
return DefaultObjectFactory::CreateSharedEmplaced<Interface, Impl>(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename Impl, typename... Args>
|
||||||
|
inline EmplacedRef<Interface, Impl> CreateSharedObjectEmplaced(MemoryResource *mr, Args &&... args) {
|
||||||
|
return MemoryResourceObjectFactory::CreateSharedEmplaced<Interface, Impl>(mr, std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename Smart>
|
||||||
|
inline SharedPointer<Interface> CreateSharedObject(Smart &&sp) {
|
||||||
|
return DefaultObjectFactory::CreateShared<Interface, Smart>(std::forward<Smart>(sp));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename Smart>
|
||||||
|
inline SharedPointer<Interface> CreateSharedObject(MemoryResource *mr, Smart &&sp) {
|
||||||
|
return MemoryResourceObjectFactory::CreateShared<Interface, Smart>(mr, std::forward<Smart>(sp));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename T>
|
||||||
|
inline SharedPointer<Interface> CreateSharedObject(T *ptr) {
|
||||||
|
return DefaultObjectFactory::CreateShared<Interface, T>(std::move(ptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename T>
|
||||||
|
inline SharedPointer<Interface> CreateSharedObjectWithoutManagement(T *ptr) {
|
||||||
|
return DefaultObjectFactory::CreateSharedWithoutManagement<Interface, T>(std::move(ptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Interface, typename T>
|
||||||
|
inline SharedPointer<Interface> CreateSharedObjectWithoutManagement(MemoryResource *mr, T *ptr) {
|
||||||
|
return DefaultObjectFactory::CreateSharedWithoutManagement<Interface, T>(mr, std::move(ptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,156 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <vapours.hpp>
|
||||||
|
#include <stratosphere/sf/sf_common.hpp>
|
||||||
|
#include <stratosphere/sf/sf_allocation_policies.hpp>
|
||||||
|
#include <stratosphere/sf/impl/sf_service_object_impl.hpp>
|
||||||
|
|
||||||
|
namespace ams::sf {
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
struct StatelessDummyAllocator{};
|
||||||
|
|
||||||
|
template<typename Base, typename Policy>
|
||||||
|
class ObjectImplFactoryWithStatelessAllocator {
|
||||||
|
public:
|
||||||
|
class Object;
|
||||||
|
using Allocator = StatelessDummyAllocator;
|
||||||
|
using StatelessAllocator = typename Policy::StatelessAllocator<Object>;
|
||||||
|
|
||||||
|
class Object final : private ::ams::sf::impl::ServiceObjectImplBase2, public Base {
|
||||||
|
NON_COPYABLE(Object);
|
||||||
|
NON_MOVEABLE(Object);
|
||||||
|
friend class ObjectImplFactoryWithStatelessAllocator;
|
||||||
|
private:
|
||||||
|
template<typename... Args>
|
||||||
|
explicit Object(Args &&... args) : Base(std::forward<Args>(args)...) { /* ... */ }
|
||||||
|
|
||||||
|
static void *operator new(size_t size) {
|
||||||
|
return Policy::template AllocateAligned<Object>(size, alignof(Object));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void operator delete(void *ptr, size_t size) {
|
||||||
|
return Policy::template DeallocateAligned<Object>(ptr, size, alignof(Object));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *operator new(size_t size, Allocator *);
|
||||||
|
static void operator delete(void *ptr, Allocator *);
|
||||||
|
|
||||||
|
void DisposeImpl() {
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
void AddReference() {
|
||||||
|
ServiceObjectImplBase2::AddReferenceImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Release() {
|
||||||
|
if (ServiceObjectImplBase2::ReleaseImpl()) {
|
||||||
|
this->DisposeImpl();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Allocator *GetAllocator() const {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename... Args>
|
||||||
|
static Object *Create(Args &&... args) {
|
||||||
|
return new Object(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename... Args>
|
||||||
|
static Object *Create(Allocator *, Args &&... args) {
|
||||||
|
return new Object(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Base, typename Policy>
|
||||||
|
class ObjectImplFactoryWithStatefulAllocator {
|
||||||
|
public:
|
||||||
|
using Allocator = typename Policy::Allocator;
|
||||||
|
|
||||||
|
class Object final : private ::ams::sf::impl::ServiceObjectImplBase2, public Base {
|
||||||
|
NON_COPYABLE(Object);
|
||||||
|
NON_MOVEABLE(Object);
|
||||||
|
friend class ObjectImplFactoryWithStatefulAllocator;
|
||||||
|
private:
|
||||||
|
Allocator *m_allocator;
|
||||||
|
private:
|
||||||
|
template<typename... Args>
|
||||||
|
explicit Object(Args &&... args) : Base(std::forward<Args>(args)...) { /* ... */ }
|
||||||
|
|
||||||
|
static void *operator new(size_t size);
|
||||||
|
|
||||||
|
static void operator delete(void *ptr, size_t size) {
|
||||||
|
/* ... */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *operator new(size_t size, Allocator *a) {
|
||||||
|
return Policy::AllocateAligned(a, size, alignof(Object));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void operator delete(void *ptr, Allocator *a) {
|
||||||
|
return Policy::DeallocateAligned(a, ptr, sizeof(Object), alignof(Object));
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisposeImpl() {
|
||||||
|
Allocator *a = this->GetAllocator();
|
||||||
|
this->~Object();
|
||||||
|
operator delete(this, a);
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
void AddReference() {
|
||||||
|
ServiceObjectImplBase2::AddReferenceImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Release() {
|
||||||
|
if (ServiceObjectImplBase2::ReleaseImpl()) {
|
||||||
|
this->DisposeImpl();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Allocator *GetAllocator() const {
|
||||||
|
return m_allocator;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename... Args>
|
||||||
|
static Object *Create(Allocator *a, Args &&... args) {
|
||||||
|
auto *ptr = new (a) Object(std::forward<Args>(args)...);
|
||||||
|
if (ptr != nullptr) {
|
||||||
|
ptr->m_allocator = a;
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Base, typename Policy>
|
||||||
|
class ObjectImplFactory;
|
||||||
|
|
||||||
|
template<typename Base, typename Policy> requires (!IsStatefulPolicy<Policy>)
|
||||||
|
class ObjectImplFactory<Base, Policy> : public impl::ObjectImplFactoryWithStatelessAllocator<Base, Policy>{};
|
||||||
|
|
||||||
|
template<typename Base, typename Policy> requires (IsStatefulPolicy<Policy>)
|
||||||
|
class ObjectImplFactory<Base, Policy> : public impl::ObjectImplFactoryWithStatefulAllocator<Base, Policy>{};
|
||||||
|
|
||||||
|
}
|
|
@ -13,10 +13,9 @@
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "sf_common.hpp"
|
#include <stratosphere/sf/sf_common.hpp>
|
||||||
#include "cmif/sf_cmif_pointer_and_size.hpp"
|
#include <stratosphere/sf/cmif/sf_cmif_pointer_and_size.hpp>
|
||||||
|
|
||||||
namespace ams::sf {
|
namespace ams::sf {
|
||||||
|
|
||||||
|
@ -35,8 +34,9 @@ namespace ams::sf {
|
||||||
template<typename T>
|
template<typename T>
|
||||||
concept OutEnabled = (std::is_trivial<T>::value || IsOutForceEnabled<T>::value) && !std::is_pointer<T>::value;
|
concept OutEnabled = (std::is_trivial<T>::value || IsOutForceEnabled<T>::value) && !std::is_pointer<T>::value;
|
||||||
|
|
||||||
template<typename T> requires OutEnabled<T>
|
template<typename T>
|
||||||
class Out : public impl::OutBaseTag {
|
class Out : public impl::OutBaseTag {
|
||||||
|
static_assert(OutEnabled<T>);
|
||||||
public:
|
public:
|
||||||
static constexpr size_t TypeSize = sizeof(T);
|
static constexpr size_t TypeSize = sizeof(T);
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -15,12 +15,13 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "sf_common.hpp"
|
#include <stratosphere/sf/sf_common.hpp>
|
||||||
#include "sf_out.hpp"
|
#include <stratosphere/sf/sf_out.hpp>
|
||||||
|
#include <stratosphere/sf/sf_shared_object.hpp>
|
||||||
|
|
||||||
namespace ams::sf {
|
namespace ams::sf {
|
||||||
|
|
||||||
class IServiceObject {
|
class IServiceObject : public ISharedObject {
|
||||||
public:
|
public:
|
||||||
virtual ~IServiceObject() { /* ... */ }
|
virtual ~IServiceObject() { /* ... */ }
|
||||||
};
|
};
|
||||||
|
@ -50,71 +51,4 @@ namespace ams::sf {
|
||||||
{ T::ShouldMitm(c) } -> std::same_as<bool>;
|
{ T::ShouldMitm(c) } -> std::same_as<bool>;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Interface, typename Impl, typename... Arguments>
|
|
||||||
requires std::constructible_from<Impl, Arguments...>
|
|
||||||
constexpr ALWAYS_INLINE std::shared_ptr<typename Interface::ImplHolder<Impl>> MakeShared(Arguments &&... args) {
|
|
||||||
return std::make_shared<typename Interface::ImplHolder<Impl>>(std::forward<Arguments>(args)...);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Interface, typename Impl, typename... Arguments>
|
|
||||||
requires (std::constructible_from<Impl, Arguments...> && std::derived_from<Impl, std::enable_shared_from_this<Impl>>)
|
|
||||||
constexpr ALWAYS_INLINE std::shared_ptr<typename Interface::ImplSharedPointer<Impl>> MakeShared(Arguments &&... args) {
|
|
||||||
return std::make_shared<typename Interface::ImplSharedPointer<Impl>>(std::make_shared<Impl>(std::forward<Arguments>(args)...));
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
class ServiceObjectAllocatorImpl {
|
|
||||||
private:
|
|
||||||
template<typename>
|
|
||||||
friend class ServiceObjectAllocatorImpl;
|
|
||||||
public:
|
|
||||||
using value_type = T;
|
|
||||||
private:
|
|
||||||
MemoryResource * const memory_resource;
|
|
||||||
public:
|
|
||||||
constexpr ServiceObjectAllocatorImpl(MemoryResource *mr) : memory_resource(mr) { /* ... */ }
|
|
||||||
|
|
||||||
template<typename U>
|
|
||||||
constexpr ServiceObjectAllocatorImpl(const ServiceObjectAllocatorImpl<U> &rhs) : memory_resource(rhs.memory_resource) { /* ... */ }
|
|
||||||
|
|
||||||
value_type *allocate(size_t n) const {
|
|
||||||
void *mem = this->memory_resource->Allocate(n * sizeof(value_type), alignof(value_type));
|
|
||||||
AMS_ABORT_UNLESS(mem != nullptr);
|
|
||||||
return static_cast<value_type *>(mem);
|
|
||||||
}
|
|
||||||
|
|
||||||
void deallocate(void *p, size_t n) const {
|
|
||||||
this->memory_resource->Deallocate(p, n * sizeof(value_type), alignof(value_type));
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename U>
|
|
||||||
inline bool operator==(const ServiceObjectAllocatorImpl<U> &rhs) const {
|
|
||||||
return this->memory_resource->is_equal(*rhs->memory_resource);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename U>
|
|
||||||
inline bool operator!=(const ServiceObjectAllocatorImpl<U> &rhs) const {
|
|
||||||
return !(*this == rhs);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Interface, typename Impl>
|
|
||||||
using ServiceObjectAllocator = ServiceObjectAllocatorImpl<typename Interface::ImplHolder<Impl>>;
|
|
||||||
|
|
||||||
template<typename Interface, typename Impl, typename Allocator, typename... Arguments>
|
|
||||||
requires std::constructible_from<Impl, Arguments...>
|
|
||||||
constexpr ALWAYS_INLINE std::shared_ptr<typename Interface::ImplHolder<Impl>> AllocateShared(const Allocator &allocator, Arguments &&... args) {
|
|
||||||
return std::allocate_shared<typename Interface::ImplHolder<Impl>>(allocator, std::forward<Arguments>(args)...);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Interface, typename Impl>
|
|
||||||
constexpr ALWAYS_INLINE std::shared_ptr<typename Interface::ImplPointer<Impl>> GetSharedPointerTo(Impl *impl) {
|
|
||||||
return std::make_shared<typename Interface::ImplPointer<Impl>>(impl);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Interface, typename Impl>
|
|
||||||
constexpr ALWAYS_INLINE std::shared_ptr<typename Interface::ImplPointer<Impl>> GetSharedPointerTo(Impl &impl) {
|
|
||||||
return GetSharedPointerTo<Interface, Impl>(std::addressof(impl));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,199 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <stratosphere/sf/sf_common.hpp>
|
||||||
|
#include <stratosphere/sf/sf_out.hpp>
|
||||||
|
|
||||||
|
namespace ams::sf {
|
||||||
|
|
||||||
|
class ISharedObject {
|
||||||
|
NON_COPYABLE(ISharedObject);
|
||||||
|
NON_MOVEABLE(ISharedObject);
|
||||||
|
protected:
|
||||||
|
constexpr ISharedObject() { /* ... */ }
|
||||||
|
~ISharedObject() { /* ... */ }
|
||||||
|
public:
|
||||||
|
constexpr virtual void AddReference() = 0;
|
||||||
|
constexpr virtual void Release() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
class SharedPointerBase {
|
||||||
|
private:
|
||||||
|
ISharedObject *m_ptr;
|
||||||
|
private:
|
||||||
|
constexpr void AddReferenceImpl() const {
|
||||||
|
if (m_ptr != nullptr) {
|
||||||
|
m_ptr->AddReference();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr void ReleaseImpl() const {
|
||||||
|
if (m_ptr != nullptr) {
|
||||||
|
m_ptr->Release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
constexpr SharedPointerBase() : m_ptr(nullptr) { /* ... */ }
|
||||||
|
|
||||||
|
constexpr SharedPointerBase(ISharedObject *ptr, bool incref) : m_ptr(ptr) {
|
||||||
|
if (incref) {
|
||||||
|
this->AddReferenceImpl();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr ~SharedPointerBase() {
|
||||||
|
this->ReleaseImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr SharedPointerBase(const SharedPointerBase &rhs) : m_ptr(rhs.m_ptr) {
|
||||||
|
this->AddReferenceImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr SharedPointerBase(SharedPointerBase &&rhs) : m_ptr(rhs.m_ptr) {
|
||||||
|
rhs.m_ptr = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr SharedPointerBase &operator=(const SharedPointerBase &rhs) {
|
||||||
|
SharedPointerBase tmp(rhs);
|
||||||
|
tmp.swap(*this);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr SharedPointerBase &operator=(SharedPointerBase &&rhs) {
|
||||||
|
SharedPointerBase tmp(std::move(rhs));
|
||||||
|
tmp.swap(*this);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr void swap(SharedPointerBase &rhs) {
|
||||||
|
std::swap(m_ptr, rhs.m_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr ISharedObject *Detach() {
|
||||||
|
ISharedObject *ret = m_ptr;
|
||||||
|
m_ptr = nullptr;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr ISharedObject *Get() const {
|
||||||
|
return m_ptr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename I>
|
||||||
|
class SharedPointer {
|
||||||
|
template<typename> friend class ::ams::sf::SharedPointer;
|
||||||
|
template<typename> friend class ::ams::sf::Out;
|
||||||
|
public:
|
||||||
|
using Interface = I;
|
||||||
|
private:
|
||||||
|
impl::SharedPointerBase m_base;
|
||||||
|
public:
|
||||||
|
constexpr SharedPointer() : m_base() { /* ... */ }
|
||||||
|
|
||||||
|
constexpr SharedPointer(std::nullptr_t) : m_base() { /* ... */ }
|
||||||
|
|
||||||
|
constexpr SharedPointer(Interface *ptr, bool incref) : m_base(static_cast<ISharedObject *>(ptr), incref) { /* ... */ }
|
||||||
|
|
||||||
|
constexpr SharedPointer(const SharedPointer &rhs) : m_base(rhs.m_base) { /* ... */ }
|
||||||
|
|
||||||
|
constexpr SharedPointer(SharedPointer &&rhs) : m_base(std::move(rhs.m_base)) { /* ... */ }
|
||||||
|
|
||||||
|
template<typename U> requires std::derived_from<U, Interface>
|
||||||
|
constexpr SharedPointer(const SharedPointer<U> &rhs) : m_base(rhs.m_base) { /* ... */ }
|
||||||
|
|
||||||
|
template<typename U> requires std::derived_from<U, Interface>
|
||||||
|
constexpr SharedPointer(SharedPointer<U> &&rhs) : m_base(std::move(rhs.m_base)) { /* ... */ }
|
||||||
|
|
||||||
|
constexpr SharedPointer &operator=(std::nullptr_t) {
|
||||||
|
SharedPointer().swap(*this);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr SharedPointer &operator=(const SharedPointer &rhs) {
|
||||||
|
SharedPointer tmp(rhs);
|
||||||
|
tmp.swap(*this);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr SharedPointer &operator=(SharedPointer &&rhs) {
|
||||||
|
SharedPointer tmp(std::move(rhs));
|
||||||
|
tmp.swap(*this);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename U> requires std::derived_from<U, Interface>
|
||||||
|
constexpr SharedPointer &operator=(const SharedPointer<U> &rhs) {
|
||||||
|
SharedPointer tmp(rhs);
|
||||||
|
tmp.swap(*this);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename U> requires std::derived_from<U, Interface>
|
||||||
|
constexpr SharedPointer &operator=(SharedPointer<U> &&rhs) {
|
||||||
|
SharedPointer tmp(std::move(rhs));
|
||||||
|
tmp.swap(*this);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr void swap(SharedPointer &rhs) {
|
||||||
|
m_base.swap(rhs.m_base);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr Interface *Detach() {
|
||||||
|
return static_cast<Interface *>(m_base.Detach());
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr void Reset() {
|
||||||
|
*this = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr Interface *Get() const {
|
||||||
|
return static_cast<Interface *>(m_base.Get());
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr Interface *operator->() const {
|
||||||
|
AMS_ASSERT(this->Get() != nullptr);
|
||||||
|
return this->Get();
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr bool operator!() const {
|
||||||
|
return this->Get() == nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr bool operator==(std::nullptr_t) const {
|
||||||
|
return this->Get() == nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr bool operator!=(std::nullptr_t) const {
|
||||||
|
return this->Get() != nullptr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Interface>
|
||||||
|
constexpr void Swap(SharedPointer<Interface> &lhs, SharedPointer<Interface> &rhs) {
|
||||||
|
lhs.swap(rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr inline void ReleaseSharedObject(ISharedObject *ptr) {
|
||||||
|
ptr->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <stratosphere/sf/sf_default_allocation_policy.hpp>
|
||||||
|
|
||||||
|
namespace ams::sf {
|
||||||
|
|
||||||
|
using StandardAllocationPolicy = DefaultAllocationPolicy;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <stratosphere/sf/sf_common.hpp>
|
||||||
|
#include <stratosphere/sf/sf_allocation_policies.hpp>
|
||||||
|
|
||||||
|
namespace ams::sf {
|
||||||
|
|
||||||
|
template<template<typename> class StdAllocator>
|
||||||
|
class StdAllocationPolicy {
|
||||||
|
public:
|
||||||
|
static constexpr bool HasStatefulAllocator = false;
|
||||||
|
using Allocator = impl::StatelessDummyAllocator;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct StatelessAllocator {
|
||||||
|
static void *Allocate(size_t size) {
|
||||||
|
return StdAllocator<T>().allocate(size / sizeof(T));
|
||||||
|
}
|
||||||
|
static void Deallocate(void *ptr, size_t size) {
|
||||||
|
StdAllocator<T>().deallocate(static_cast<T *>(ptr), size / sizeof(T));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
static void *AllocateAligned(size_t size, size_t align) {
|
||||||
|
return StdAllocator<T>().allocate(size / sizeof(T));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
static void DeallocateAligned(void *ptr, size_t size, size_t align) {
|
||||||
|
StdAllocator<T>().deallocate(static_cast<T *>(ptr), size / sizeof(T));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -19,13 +19,9 @@
|
||||||
#include <stratosphere/sm/sm_types.hpp>
|
#include <stratosphere/sm/sm_types.hpp>
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
namespace ams::sm::impl {
|
#define AMS_SM_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65000, Result, AtmosphereGetRecord, (sf::Out<sm::ServiceRecord> record, sm::ServiceName service), (record, service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65001, void, AtmosphereListRecords, (const sf::OutArray<sm::ServiceRecord> &records, sf::Out<u64> out_count, u64 offset), (records, out_count, offset)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65002, void, AtmosphereGetRecordSize, (sf::Out<u64> record_size), (record_size))
|
||||||
|
|
||||||
#define AMS_SM_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::sm::impl, IDebugMonitorInterface, AMS_SM_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 65000, Result, AtmosphereGetRecord, (sf::Out<ServiceRecord> record, ServiceName service)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65001, void, AtmosphereListRecords, (const sf::OutArray<ServiceRecord> &records, sf::Out<u64> out_count, u64 offset)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65002, void, AtmosphereGetRecordSize, (sf::Out<u64> record_size))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IDebugMonitorInterface, AMS_SM_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,15 +19,11 @@
|
||||||
#include <stratosphere/sm/sm_types.hpp>
|
#include <stratosphere/sm/sm_types.hpp>
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
namespace ams::sm::impl {
|
#define AMS_SM_I_MANAGER_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, RegisterProcess, (os::ProcessId process_id, const sf::InBuffer &acid_sac, const sf::InBuffer &aci_sac), (process_id, acid_sac, aci_sac)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, UnregisterProcess, (os::ProcessId process_id), (process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65000, void, AtmosphereEndInitDefers, (), ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65001, void, AtmosphereHasMitm, (sf::Out<bool> out, sm::ServiceName service), (out, service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65002, Result, AtmosphereRegisterProcess, (os::ProcessId process_id, ncm::ProgramId program_id, cfg::OverrideStatus override_status, const sf::InBuffer &acid_sac, const sf::InBuffer &aci_sac), (process_id, program_id, override_status, acid_sac, aci_sac))
|
||||||
|
|
||||||
#define AMS_SM_I_MANAGER_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::sm::impl, IManagerInterface, AMS_SM_I_MANAGER_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, RegisterProcess, (os::ProcessId process_id, const sf::InBuffer &acid_sac, const sf::InBuffer &aci_sac)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, UnregisterProcess, (os::ProcessId process_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65000, void, AtmosphereEndInitDefers, ()) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65001, void, AtmosphereHasMitm, (sf::Out<bool> out, ServiceName service)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65002, Result, AtmosphereRegisterProcess, (os::ProcessId process_id, ncm::ProgramId program_id, cfg::OverrideStatus override_status, const sf::InBuffer &acid_sac, const sf::InBuffer &aci_sac))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IManagerInterface, AMS_SM_I_MANAGER_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,24 +19,20 @@
|
||||||
#include <stratosphere/sm/sm_types.hpp>
|
#include <stratosphere/sm/sm_types.hpp>
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
namespace ams::sm::impl {
|
#define AMS_SM_I_USER_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, RegisterClient, (const sf::ClientProcessId &client_process_id), (client_process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, GetServiceHandle, (sf::OutMoveHandle out_h, sm::ServiceName service), (out_h, service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, RegisterService, (sf::OutMoveHandle out_h, sm::ServiceName service, u32 max_sessions, bool is_light), (out_h, service, max_sessions, is_light)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, UnregisterService, (sm::ServiceName service), (service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, DetachClient, (const sf::ClientProcessId &client_process_id), (client_process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65000, Result, AtmosphereInstallMitm, (sf::OutMoveHandle srv_h, sf::OutMoveHandle qry_h, sm::ServiceName service), (srv_h, qry_h, service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65001, Result, AtmosphereUninstallMitm, (sm::ServiceName service), (service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65003, Result, AtmosphereAcknowledgeMitmSession, (sf::Out<sm::MitmProcessInfo> client_info, sf::OutMoveHandle fwd_h, sm::ServiceName service), (client_info, fwd_h, service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65004, Result, AtmosphereHasMitm, (sf::Out<bool> out, sm::ServiceName service), (out, service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65005, Result, AtmosphereWaitMitm, (sm::ServiceName service), (service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65006, Result, AtmosphereDeclareFutureMitm, (sm::ServiceName service), (service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65007, Result, AtmosphereClearFutureMitm, (sm::ServiceName service), (service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65100, Result, AtmosphereHasService, (sf::Out<bool> out, sm::ServiceName service), (out, service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65101, Result, AtmosphereWaitService, (sm::ServiceName service), (service))
|
||||||
|
|
||||||
#define AMS_SM_I_USER_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::sm::impl, IUserInterface, AMS_SM_I_USER_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, RegisterClient, (const sf::ClientProcessId &client_process_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, GetServiceHandle, (sf::OutMoveHandle out_h, ServiceName service)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, RegisterService, (sf::OutMoveHandle out_h, ServiceName service, u32 max_sessions, bool is_light)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, UnregisterService, (ServiceName service)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, DetachClient, (const sf::ClientProcessId &client_process_id)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65000, Result, AtmosphereInstallMitm, (sf::OutMoveHandle srv_h, sf::OutMoveHandle qry_h, ServiceName service)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65001, Result, AtmosphereUninstallMitm, (ServiceName service)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65003, Result, AtmosphereAcknowledgeMitmSession, (sf::Out<MitmProcessInfo> client_info, sf::OutMoveHandle fwd_h, ServiceName service)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65004, Result, AtmosphereHasMitm, (sf::Out<bool> out, ServiceName service)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65005, Result, AtmosphereWaitMitm, (ServiceName service)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65006, Result, AtmosphereDeclareFutureMitm, (ServiceName service)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65007, Result, AtmosphereClearFutureMitm, (ServiceName service)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65100, Result, AtmosphereHasService, (sf::Out<bool> out, ServiceName service)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 65101, Result, AtmosphereWaitService, (ServiceName service))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IUserInterface, AMS_SM_I_USER_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -20,20 +20,15 @@
|
||||||
#include <stratosphere/spl/spl_types.hpp>
|
#include <stratosphere/spl/spl_types.hpp>
|
||||||
#include <stratosphere/spl/impl/spl_general_interface.hpp>
|
#include <stratosphere/spl/impl/spl_general_interface.hpp>
|
||||||
|
|
||||||
namespace ams::spl::impl {
|
#define AMS_SPL_I_CRYPTO_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, GenerateAesKek, (sf::Out<spl::AccessKey> out_access_key, spl::KeySource key_source, u32 generation, u32 option), (out_access_key, key_source, generation, option)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, LoadAesKey, (s32 keyslot, spl::AccessKey access_key, spl::KeySource key_source), (keyslot, access_key, key_source)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, GenerateAesKey, (sf::Out<spl::AesKey> out_key, spl::AccessKey access_key, spl::KeySource key_source), (out_key, access_key, key_source)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 14, Result, DecryptAesKey, (sf::Out<spl::AesKey> out_key, spl::KeySource key_source, u32 generation, u32 option), (out_key, key_source, generation, option)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 15, Result, ComputeCtr, (const sf::OutNonSecureBuffer &out_buf, s32 keyslot, const sf::InNonSecureBuffer &in_buf, spl::IvCtr iv_ctr), (out_buf, keyslot, in_buf, iv_ctr)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 16, Result, ComputeCmac, (sf::Out<spl::Cmac> out_cmac, s32 keyslot, const sf::InPointerBuffer &in_buf), (out_cmac, keyslot, in_buf)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 21, Result, AllocateAesKeySlot, (sf::Out<s32> out_keyslot), (out_keyslot)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 22, Result, DeallocateAesKeySlot, (s32 keyslot), (keyslot)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 23, Result, GetAesKeySlotAvailableEvent, (sf::OutCopyHandle out_hnd), (out_hnd))
|
||||||
|
|
||||||
#define AMS_SPL_I_CRYPTO_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE_WITH_BASE(ams::spl::impl, ICryptoInterface, ::ams::spl::impl::IGeneralInterface, AMS_SPL_I_CRYPTO_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SPL_I_GENERAL_INTERFACE_INTERFACE_INFO(C, H) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, GenerateAesKek, (sf::Out<AccessKey> out_access_key, KeySource key_source, u32 generation, u32 option)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, LoadAesKey, (s32 keyslot, AccessKey access_key, KeySource key_source)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, GenerateAesKey, (sf::Out<AesKey> out_key, AccessKey access_key, KeySource key_source)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 14, Result, DecryptAesKey, (sf::Out<AesKey> out_key, KeySource key_source, u32 generation, u32 option)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 15, Result, ComputeCtr, (const sf::OutNonSecureBuffer &out_buf, s32 keyslot, const sf::InNonSecureBuffer &in_buf, IvCtr iv_ctr)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 16, Result, ComputeCmac, (sf::Out<Cmac> out_cmac, s32 keyslot, const sf::InPointerBuffer &in_buf)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 21, Result, AllocateAesKeySlot, (sf::Out<s32> out_keyslot)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 22, Result, DeallocateAesKeySlot, (s32 keyslot)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 23, Result, GetAesKeySlotAvailableEvent, (sf::OutCopyHandle out_hnd))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(ICryptoInterface, AMS_SPL_I_CRYPTO_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,37 +19,33 @@
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
#include <stratosphere/spl/spl_types.hpp>
|
#include <stratosphere/spl/spl_types.hpp>
|
||||||
|
|
||||||
namespace ams::spl::impl {
|
#define AMS_SPL_I_DEPRECATED_GENERAL_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, GetConfig, (sf::Out<u64> out, u32 which), (out, which)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, ModularExponentiate, (const sf::OutPointerBuffer &out, const sf::InPointerBuffer &base, const sf::InPointerBuffer &exp, const sf::InPointerBuffer &mod), (out, base, exp, mod)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, GenerateAesKek, (sf::Out<spl::AccessKey> out_access_key, spl::KeySource key_source, u32 generation, u32 option), (out_access_key, key_source, generation, option)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, LoadAesKey, (s32 keyslot, spl::AccessKey access_key, spl::KeySource key_source), (keyslot, access_key, key_source)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, GenerateAesKey, (sf::Out<spl::AesKey> out_key, spl::AccessKey access_key, spl::KeySource key_source), (out_key, access_key, key_source)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, SetConfig, (u32 which, u64 value), (which, value)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 7, Result, GenerateRandomBytes, (const sf::OutPointerBuffer &out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 9, Result, DecryptAndStoreGcKey, (const sf::InPointerBuffer &src, spl::AccessKey access_key, spl::KeySource key_source, u32 option), (src, access_key, key_source, option)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 10, Result, DecryptGcMessage, (sf::Out<u32> out_size, const sf::OutPointerBuffer &out, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod, const sf::InPointerBuffer &label_digest), (out_size, out, base, mod, label_digest)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 11, Result, IsDevelopment, (sf::Out<bool> is_dev), (is_dev)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 12, Result, GenerateSpecificAesKey, (sf::Out<spl::AesKey> out_key, spl::KeySource key_source, u32 generation, u32 which), (out_key, key_source, generation, which)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 13, Result, DecryptDeviceUniqueData, (const sf::OutPointerBuffer &dst, const sf::InPointerBuffer &src, spl::AccessKey access_key, spl::KeySource key_source, u32 option), (dst, src, access_key, key_source, option)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 14, Result, DecryptAesKey, (sf::Out<spl::AesKey> out_key, spl::KeySource key_source, u32 generation, u32 option), (out_key, key_source, generation, option)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 15, Result, ComputeCtrDeprecated, (const sf::OutBuffer &out_buf, s32 keyslot, const sf::InBuffer &in_buf, spl::IvCtr iv_ctr), (out_buf, keyslot, in_buf, iv_ctr), hos::Version_1_0_0, hos::Version_1_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 15, Result, ComputeCtr, (const sf::OutNonSecureBuffer &out_buf, s32 keyslot, const sf::InNonSecureBuffer &in_buf, spl::IvCtr iv_ctr), (out_buf, keyslot, in_buf, iv_ctr), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 16, Result, ComputeCmac, (sf::Out<spl::Cmac> out_cmac, s32 keyslot, const sf::InPointerBuffer &in_buf), (out_cmac, keyslot, in_buf)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 17, Result, LoadEsDeviceKey, (const sf::InPointerBuffer &src, spl::AccessKey access_key, spl::KeySource key_source, u32 option), (src, access_key, key_source, option)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 18, Result, PrepareEsTitleKeyDeprecated, (sf::Out<spl::AccessKey> out_access_key, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod, const sf::InPointerBuffer &label_digest), (out_access_key, base, mod, label_digest), hos::Version_1_0_0, hos::Version_2_3_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 18, Result, PrepareEsTitleKey, (sf::Out<spl::AccessKey> out_access_key, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod, const sf::InPointerBuffer &label_digest, u32 generation), (out_access_key, base, mod, label_digest, generation), hos::Version_3_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 19, Result, LoadPreparedAesKey, (s32 keyslot, spl::AccessKey access_key), (keyslot, access_key)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 20, Result, PrepareCommonEsTitleKeyDeprecated, (sf::Out<spl::AccessKey> out_access_key, spl::KeySource key_source), (out_access_key, key_source), hos::Version_2_0_0, hos::Version_2_3_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 20, Result, PrepareCommonEsTitleKey, (sf::Out<spl::AccessKey> out_access_key, spl::KeySource key_source, u32 generation), (out_access_key, key_source, generation), hos::Version_3_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 21, Result, AllocateAesKeySlot, (sf::Out<s32> out_keyslot), (out_keyslot)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 22, Result, DeallocateAesKeySlot, (s32 keyslot), (keyslot)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 23, Result, GetAesKeySlotAvailableEvent, (sf::OutCopyHandle out_hnd), (out_hnd)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 24, Result, SetBootReason, (spl::BootReasonValue boot_reason), (boot_reason), hos::Version_3_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 25, Result, GetBootReason, (sf::Out<spl::BootReasonValue> out), (out), hos::Version_3_0_0)
|
||||||
|
|
||||||
#define AMS_SPL_I_DEPRECATED_GENERAL_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::spl::impl, IDeprecatedGeneralInterface, AMS_SPL_I_DEPRECATED_GENERAL_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, GetConfig, (sf::Out<u64> out, u32 which)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, ModularExponentiate, (const sf::OutPointerBuffer &out, const sf::InPointerBuffer &base, const sf::InPointerBuffer &exp, const sf::InPointerBuffer &mod)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 2, Result, GenerateAesKek, (sf::Out<AccessKey> out_access_key, KeySource key_source, u32 generation, u32 option)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3, Result, LoadAesKey, (s32 keyslot, AccessKey access_key, KeySource key_source)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 4, Result, GenerateAesKey, (sf::Out<AesKey> out_key, AccessKey access_key, KeySource key_source)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, SetConfig, (u32 which, u64 value)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, GenerateRandomBytes, (const sf::OutPointerBuffer &out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, Result, DecryptAndStoreGcKey, (const sf::InPointerBuffer &src, AccessKey access_key, KeySource key_source, u32 option)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, DecryptGcMessage, (sf::Out<u32> out_size, const sf::OutPointerBuffer &out, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod, const sf::InPointerBuffer &label_digest)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 11, Result, IsDevelopment, (sf::Out<bool> is_dev)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 12, Result, GenerateSpecificAesKey, (sf::Out<AesKey> out_key, KeySource key_source, u32 generation, u32 which)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 13, Result, DecryptDeviceUniqueData, (const sf::OutPointerBuffer &dst, const sf::InPointerBuffer &src, AccessKey access_key, KeySource key_source, u32 option)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 14, Result, DecryptAesKey, (sf::Out<AesKey> out_key, KeySource key_source, u32 generation, u32 option)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 15, Result, ComputeCtrDeprecated, (const sf::OutBuffer &out_buf, s32 keyslot, const sf::InBuffer &in_buf, IvCtr iv_ctr), hos::Version_1_0_0, hos::Version_1_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 15, Result, ComputeCtr, (const sf::OutNonSecureBuffer &out_buf, s32 keyslot, const sf::InNonSecureBuffer &in_buf, IvCtr iv_ctr), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 16, Result, ComputeCmac, (sf::Out<Cmac> out_cmac, s32 keyslot, const sf::InPointerBuffer &in_buf)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 17, Result, LoadEsDeviceKey, (const sf::InPointerBuffer &src, AccessKey access_key, KeySource key_source, u32 option)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 18, Result, PrepareEsTitleKeyDeprecated, (sf::Out<AccessKey> out_access_key, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod, const sf::InPointerBuffer &label_digest), hos::Version_1_0_0, hos::Version_2_3_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 18, Result, PrepareEsTitleKey, (sf::Out<AccessKey> out_access_key, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod, const sf::InPointerBuffer &label_digest, u32 generation), hos::Version_3_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 19, Result, LoadPreparedAesKey, (s32 keyslot, AccessKey access_key)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 20, Result, PrepareCommonEsTitleKeyDeprecated, (sf::Out<AccessKey> out_access_key, KeySource key_source), hos::Version_2_0_0, hos::Version_2_3_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 20, Result, PrepareCommonEsTitleKey, (sf::Out<AccessKey> out_access_key, KeySource key_source, u32 generation), hos::Version_3_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 21, Result, AllocateAesKeySlot, (sf::Out<s32> out_keyslot)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 22, Result, DeallocateAesKeySlot, (s32 keyslot)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 23, Result, GetAesKeySlotAvailableEvent, (sf::OutCopyHandle out_hnd)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 24, Result, SetBootReason, (spl::BootReasonValue boot_reason), hos::Version_3_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 25, Result, GetBootReason, (sf::Out<spl::BootReasonValue> out), hos::Version_3_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IDeprecatedGeneralInterface, AMS_SPL_I_DEPRECATED_GENERAL_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -20,13 +20,8 @@
|
||||||
#include <stratosphere/spl/spl_types.hpp>
|
#include <stratosphere/spl/spl_types.hpp>
|
||||||
#include <stratosphere/spl/impl/spl_crypto_interface.hpp>
|
#include <stratosphere/spl/impl/spl_crypto_interface.hpp>
|
||||||
|
|
||||||
namespace ams::spl::impl {
|
#define AMS_SPL_I_DEVICE_UNIQUE_DATA_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 13, Result, DecryptDeviceUniqueDataDeprecated, (const sf::OutPointerBuffer &dst, const sf::InPointerBuffer &src, spl::AccessKey access_key, spl::KeySource key_source, u32 option), (dst, src, access_key, key_source, option), hos::Version_Min, hos::Version_4_1_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 13, Result, DecryptDeviceUniqueData, (const sf::OutPointerBuffer &dst, const sf::InPointerBuffer &src, spl::AccessKey access_key, spl::KeySource key_source), (dst, src, access_key, key_source), hos::Version_5_0_0)
|
||||||
|
|
||||||
#define AMS_SPL_I_DEVICE_UNIQUE_DATA_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE_WITH_BASE(ams::spl::impl, IDeviceUniqueDataInterface, ::ams::spl::impl::ICryptoInterface, AMS_SPL_I_DEVICE_UNIQUE_DATA_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SPL_I_CRYPTO_INTERFACE_INTERFACE_INFO(C, H) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 13, Result, DecryptDeviceUniqueDataDeprecated, (const sf::OutPointerBuffer &dst, const sf::InPointerBuffer &src, AccessKey access_key, KeySource key_source, u32 option), hos::Version_Min, hos::Version_4_1_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 13, Result, DecryptDeviceUniqueData, (const sf::OutPointerBuffer &dst, const sf::InPointerBuffer &src, AccessKey access_key, KeySource key_source), hos::Version_5_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IDeviceUniqueDataInterface, AMS_SPL_I_DEVICE_UNIQUE_DATA_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -20,19 +20,14 @@
|
||||||
#include <stratosphere/spl/spl_types.hpp>
|
#include <stratosphere/spl/spl_types.hpp>
|
||||||
#include <stratosphere/spl/impl/spl_device_unique_data_interface.hpp>
|
#include <stratosphere/spl/impl/spl_device_unique_data_interface.hpp>
|
||||||
|
|
||||||
namespace ams::spl::impl {
|
#define AMS_SPL_I_ES_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 17, Result, LoadEsDeviceKeyDeprecated, (const sf::InPointerBuffer &src, spl::AccessKey access_key, spl::KeySource key_source, u32 option), (src, access_key, key_source, option), hos::Version_Min, hos::Version_4_1_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 17, Result, LoadEsDeviceKey, (const sf::InPointerBuffer &src, spl::AccessKey access_key, spl::KeySource key_source), (src, access_key, key_source), hos::Version_5_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 18, Result, PrepareEsTitleKey, (sf::Out<spl::AccessKey> out_access_key, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod, const sf::InPointerBuffer &label_digest, u32 generation), (out_access_key, base, mod, label_digest, generation)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 20, Result, PrepareCommonEsTitleKey, (sf::Out<spl::AccessKey> out_access_key, spl::KeySource key_source, u32 generation), (out_access_key, key_source, generation), hos::Version_2_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 28, Result, DecryptAndStoreDrmDeviceCertKey, (const sf::InPointerBuffer &src, spl::AccessKey access_key, spl::KeySource key_source), (src, access_key, key_source), hos::Version_5_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 29, Result, ModularExponentiateWithDrmDeviceCertKey, (const sf::OutPointerBuffer &out, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod), (out, base, mod), hos::Version_5_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 31, Result, PrepareEsArchiveKey, (sf::Out<spl::AccessKey> out_access_key, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod, const sf::InPointerBuffer &label_digest, u32 generation), (out_access_key, base, mod, label_digest, generation), hos::Version_6_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 32, Result, LoadPreparedAesKey, (s32 keyslot, spl::AccessKey access_key), (keyslot, access_key), hos::Version_6_0_0)
|
||||||
|
|
||||||
#define AMS_SPL_I_ES_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE_WITH_BASE(ams::spl::impl, IEsInterface, ::ams::spl::impl::IDeviceUniqueDataInterface, AMS_SPL_I_ES_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SPL_I_DEVICE_UNIQUE_DATA_INTERFACE_INTERFACE_INFO(C, H) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 17, Result, LoadEsDeviceKeyDeprecated, (const sf::InPointerBuffer &src, AccessKey access_key, KeySource key_source, u32 option), hos::Version_Min, hos::Version_4_1_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 17, Result, LoadEsDeviceKey, (const sf::InPointerBuffer &src, AccessKey access_key, KeySource key_source), hos::Version_5_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 18, Result, PrepareEsTitleKey, (sf::Out<AccessKey> out_access_key, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod, const sf::InPointerBuffer &label_digest, u32 generation)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 20, Result, PrepareCommonEsTitleKey, (sf::Out<AccessKey> out_access_key, KeySource key_source, u32 generation), hos::Version_2_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 28, Result, DecryptAndStoreDrmDeviceCertKey, (const sf::InPointerBuffer &src, AccessKey access_key, KeySource key_source), hos::Version_5_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 29, Result, ModularExponentiateWithDrmDeviceCertKey, (const sf::OutPointerBuffer &out, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod), hos::Version_5_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 31, Result, PrepareEsArchiveKey, (sf::Out<AccessKey> out_access_key, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod, const sf::InPointerBuffer &label_digest, u32 generation), hos::Version_6_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 32, Result, LoadPreparedAesKey, (s32 keyslot, AccessKey access_key), hos::Version_6_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IEsInterface, AMS_SPL_I_ES_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -20,17 +20,12 @@
|
||||||
#include <stratosphere/spl/spl_types.hpp>
|
#include <stratosphere/spl/spl_types.hpp>
|
||||||
#include <stratosphere/spl/impl/spl_crypto_interface.hpp>
|
#include <stratosphere/spl/impl/spl_crypto_interface.hpp>
|
||||||
|
|
||||||
namespace ams::spl::impl {
|
#define AMS_SPL_I_FS_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 9, Result, DecryptAndStoreGcKeyDeprecated, (const sf::InPointerBuffer &src, spl::AccessKey access_key, spl::KeySource key_source, u32 option), (src, access_key, key_source, option), hos::Version_Min, hos::Version_4_1_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 9, Result, DecryptAndStoreGcKey, (const sf::InPointerBuffer &src, spl::AccessKey access_key, spl::KeySource key_source), (src, access_key, key_source), hos::Version_5_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 10, Result, DecryptGcMessage, (sf::Out<u32> out_size, const sf::OutPointerBuffer &out, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod, const sf::InPointerBuffer &label_digest), (out_size, out, base, mod, label_digest)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 12, Result, GenerateSpecificAesKey, (sf::Out<spl::AesKey> out_key, spl::KeySource key_source, u32 generation, u32 which), (out_key, key_source, generation, which)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 19, Result, LoadPreparedAesKey, (s32 keyslot, spl::AccessKey access_key), (keyslot, access_key)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 31, Result, GetPackage2Hash, (const sf::OutPointerBuffer &dst), (dst), hos::Version_5_0_0)
|
||||||
|
|
||||||
#define AMS_SPL_I_FS_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE_WITH_BASE(ams::spl::impl, IFsInterface, ::ams::spl::impl::ICryptoInterface, AMS_SPL_I_FS_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SPL_I_CRYPTO_INTERFACE_INTERFACE_INFO(C, H) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, Result, DecryptAndStoreGcKeyDeprecated, (const sf::InPointerBuffer &src, AccessKey access_key, KeySource key_source, u32 option), hos::Version_Min, hos::Version_4_1_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 9, Result, DecryptAndStoreGcKey, (const sf::InPointerBuffer &src, AccessKey access_key, KeySource key_source), hos::Version_5_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 10, Result, DecryptGcMessage, (sf::Out<u32> out_size, const sf::OutPointerBuffer &out, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod, const sf::InPointerBuffer &label_digest)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 12, Result, GenerateSpecificAesKey, (sf::Out<AesKey> out_key, KeySource key_source, u32 generation, u32 which)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 19, Result, LoadPreparedAesKey, (s32 keyslot, AccessKey access_key)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 31, Result, GetPackage2Hash, (const sf::OutPointerBuffer &dst), hos::Version_5_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IFsInterface, AMS_SPL_I_FS_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,17 +19,13 @@
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
#include <stratosphere/spl/spl_types.hpp>
|
#include <stratosphere/spl/spl_types.hpp>
|
||||||
|
|
||||||
namespace ams::spl::impl {
|
#define AMS_SPL_I_GENERAL_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, GetConfig, (sf::Out<u64> out, u32 which), (out, which)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, ModularExponentiate, (const sf::OutPointerBuffer &out, const sf::InPointerBuffer &base, const sf::InPointerBuffer &exp, const sf::InPointerBuffer &mod), (out, base, exp, mod)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 5, Result, SetConfig, (u32 which, u64 value), (which, value)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 7, Result, GenerateRandomBytes, (const sf::OutPointerBuffer &out), (out)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 11, Result, IsDevelopment, (sf::Out<bool> is_dev), (is_dev)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 24, Result, SetBootReason, (spl::BootReasonValue boot_reason), (boot_reason), hos::Version_3_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 25, Result, GetBootReason, (sf::Out<spl::BootReasonValue> out), (out), hos::Version_3_0_0)
|
||||||
|
|
||||||
#define AMS_SPL_I_GENERAL_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::spl::impl, IGeneralInterface, AMS_SPL_I_GENERAL_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, GetConfig, (sf::Out<u64> out, u32 which)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 1, Result, ModularExponentiate, (const sf::OutPointerBuffer &out, const sf::InPointerBuffer &base, const sf::InPointerBuffer &exp, const sf::InPointerBuffer &mod)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 5, Result, SetConfig, (u32 which, u64 value)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 7, Result, GenerateRandomBytes, (const sf::OutPointerBuffer &out)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 11, Result, IsDevelopment, (sf::Out<bool> is_dev)) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 24, Result, SetBootReason, (spl::BootReasonValue boot_reason), hos::Version_3_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 25, Result, GetBootReason, (sf::Out<spl::BootReasonValue> out), hos::Version_3_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IGeneralInterface, AMS_SPL_I_GENERAL_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -20,12 +20,7 @@
|
||||||
#include <stratosphere/spl/spl_types.hpp>
|
#include <stratosphere/spl/spl_types.hpp>
|
||||||
#include <stratosphere/spl/impl/spl_device_unique_data_interface.hpp>
|
#include <stratosphere/spl/impl/spl_device_unique_data_interface.hpp>
|
||||||
|
|
||||||
namespace ams::spl::impl {
|
#define AMS_SPL_I_MANU_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 30, Result, ReencryptDeviceUniqueData, (const sf::OutPointerBuffer &out, const sf::InPointerBuffer &src, spl::AccessKey access_key_dec, spl::KeySource source_dec, spl::AccessKey access_key_enc, spl::KeySource source_enc, u32 option), (out, src, access_key_dec, source_dec, access_key_enc, source_enc, option))
|
||||||
|
|
||||||
#define AMS_SPL_I_MANU_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE_WITH_BASE(ams::spl::impl, IManuInterface, ::ams::spl::impl::IDeviceUniqueDataInterface, AMS_SPL_I_MANU_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SPL_I_DEVICE_UNIQUE_DATA_INTERFACE_INTERFACE_INFO(C, H) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 30, Result, ReencryptDeviceUniqueData, (const sf::OutPointerBuffer &out, const sf::InPointerBuffer &src, AccessKey access_key_dec, KeySource source_dec, AccessKey access_key_enc, KeySource source_enc, u32 option)) \
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IManuInterface, AMS_SPL_I_MANU_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,11 +19,7 @@
|
||||||
#include <stratosphere/sf.hpp>
|
#include <stratosphere/sf.hpp>
|
||||||
#include <stratosphere/spl/spl_types.hpp>
|
#include <stratosphere/spl/spl_types.hpp>
|
||||||
|
|
||||||
namespace ams::spl::impl {
|
#define AMS_SPL_I_RANDOM_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, GenerateRandomBytes, (const sf::OutBuffer &out), (out))
|
||||||
|
|
||||||
#define AMS_SPL_I_RANDOM_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE(ams::spl::impl, IRandomInterface, AMS_SPL_I_RANDOM_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SF_METHOD_INFO(C, H, 0, Result, GenerateRandomBytes, (const sf::OutBuffer &out))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IRandomInterface, AMS_SPL_I_RANDOM_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
|
@ -20,13 +20,8 @@
|
||||||
#include <stratosphere/spl/spl_types.hpp>
|
#include <stratosphere/spl/spl_types.hpp>
|
||||||
#include <stratosphere/spl/impl/spl_device_unique_data_interface.hpp>
|
#include <stratosphere/spl/impl/spl_device_unique_data_interface.hpp>
|
||||||
|
|
||||||
namespace ams::spl::impl {
|
#define AMS_SPL_I_SSL_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 26, Result, DecryptAndStoreSslClientCertKey, (const sf::InPointerBuffer &src, spl::AccessKey access_key, spl::KeySource key_source), (src, access_key, key_source), hos::Version_5_0_0) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 27, Result, ModularExponentiateWithSslClientCertKey, (const sf::OutPointerBuffer &out, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod), (out, base, mod), hos::Version_5_0_0)
|
||||||
|
|
||||||
#define AMS_SPL_I_SSL_INTERFACE_INTERFACE_INFO(C, H) \
|
AMS_SF_DEFINE_INTERFACE_WITH_BASE(ams::spl::impl, ISslInterface, ::ams::spl::impl::IDeviceUniqueDataInterface, AMS_SPL_I_SSL_INTERFACE_INTERFACE_INFO)
|
||||||
AMS_SPL_I_DEVICE_UNIQUE_DATA_INTERFACE_INTERFACE_INFO(C, H) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 26, Result, DecryptAndStoreSslClientCertKey, (const sf::InPointerBuffer &src, AccessKey access_key, KeySource key_source), hos::Version_5_0_0) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 27, Result, ModularExponentiateWithSslClientCertKey, (const sf::OutPointerBuffer &out, const sf::InPointerBuffer &base, const sf::InPointerBuffer &mod), hos::Version_5_0_0)
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(ISslInterface, AMS_SPL_I_SSL_INTERFACE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ namespace ams::capsrv::server {
|
||||||
this->server_manager_holder.emplace();
|
this->server_manager_holder.emplace();
|
||||||
|
|
||||||
/* Register the service. */
|
/* Register the service. */
|
||||||
R_ABORT_UNLESS((this->server_manager_holder->RegisterServer<Interface, Service>(ServiceName, MaxSessions, sf::GetSharedPointerTo<Interface>(*this->service_holder))));
|
R_ABORT_UNLESS((this->server_manager_holder->RegisterObjectForServer(this->service_holder->GetShared(), ServiceName, MaxSessions)));
|
||||||
|
|
||||||
/* Initialize the idle event, we're idle initially. */
|
/* Initialize the idle event, we're idle initially. */
|
||||||
os::InitializeEvent(std::addressof(this->idle_event), true, os::EventClearMode_ManualClear);
|
os::InitializeEvent(std::addressof(this->idle_event), true, os::EventClearMode_ManualClear);
|
||||||
|
|
|
@ -26,12 +26,12 @@ namespace ams::capsrv::server {
|
||||||
static constexpr inline size_t MaxSessions = 2;
|
static constexpr inline size_t MaxSessions = 2;
|
||||||
static constexpr inline sm::ServiceName ServiceName = sm::ServiceName::Encode("caps:dc");
|
static constexpr inline sm::ServiceName ServiceName = sm::ServiceName::Encode("caps:dc");
|
||||||
|
|
||||||
using Interface = IDecoderControlService;
|
using ServiceHolderType = sf::UnmanagedServiceObject<IDecoderControlService, DecoderControlService>;
|
||||||
using Service = DecoderControlService;
|
|
||||||
using ServerOptions = sf::hipc::DefaultServerManagerOptions;
|
using ServerOptions = sf::hipc::DefaultServerManagerOptions;
|
||||||
using ServerManager = sf::hipc::ServerManager<NumServers, ServerOptions, MaxSessions>;
|
using ServerManager = sf::hipc::ServerManager<NumServers, ServerOptions, MaxSessions>;
|
||||||
private:
|
private:
|
||||||
std::optional<Service> service_holder;
|
std::optional<ServiceHolderType> service_holder;
|
||||||
std::optional<ServerManager> server_manager_holder;
|
std::optional<ServerManager> server_manager_holder;
|
||||||
os::EventType idle_event;
|
os::EventType idle_event;
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -16,17 +16,17 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <stratosphere.hpp>
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
#define AMS_CAPSRV_DECODER_CONTROL_SERVICE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3001, Result, DecodeJpeg, (const sf::OutNonSecureBuffer &out, const sf::InBuffer &in, u32 width, u32 height, const capsrv::ScreenShotDecodeOption &option), (out, in, width, height, option))
|
||||||
|
|
||||||
|
AMS_SF_DEFINE_INTERFACE(ams::capsrv::server, IDecoderControlService, AMS_CAPSRV_DECODER_CONTROL_SERVICE_INTERFACE_INFO)
|
||||||
|
|
||||||
namespace ams::capsrv::server {
|
namespace ams::capsrv::server {
|
||||||
|
|
||||||
#define AMS_CAPSRV_DECODER_CONTROL_SERVICE_INTERFACE_INFO(C, H) \
|
|
||||||
AMS_SF_METHOD_INFO(C, H, 3001, Result, DecodeJpeg, (const sf::OutNonSecureBuffer &out, const sf::InBuffer &in, u32 width, u32 height, const ScreenShotDecodeOption &option))
|
|
||||||
|
|
||||||
AMS_SF_DEFINE_INTERFACE(IDecoderControlService, AMS_CAPSRV_DECODER_CONTROL_SERVICE_INTERFACE_INFO)
|
|
||||||
|
|
||||||
class DecoderControlService final {
|
class DecoderControlService final {
|
||||||
public:
|
public:
|
||||||
Result DecodeJpeg(const sf::OutNonSecureBuffer &out, const sf::InBuffer &in, u32 width, u32 height, const ScreenShotDecodeOption &option);
|
Result DecodeJpeg(const sf::OutNonSecureBuffer &out, const sf::InBuffer &in, u32 width, u32 height, const ScreenShotDecodeOption &option);
|
||||||
};
|
};
|
||||||
static_assert(IsIDecoderControlService<DecoderControlService>);
|
static_assert(IsIDecoderControlService<DecoderControlService>);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ namespace ams::erpt::srv {
|
||||||
|
|
||||||
class Attachment;
|
class Attachment;
|
||||||
|
|
||||||
class AttachmentImpl final {
|
class AttachmentImpl {
|
||||||
private:
|
private:
|
||||||
Attachment *attachment;
|
Attachment *attachment;
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
namespace ams::erpt::srv {
|
namespace ams::erpt::srv {
|
||||||
|
|
||||||
class ContextImpl final {
|
class ContextImpl {
|
||||||
public:
|
public:
|
||||||
Result SubmitContext(const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer);
|
Result SubmitContext(const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer);
|
||||||
Result CreateReportV0(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &meta_buffer);
|
Result CreateReportV0(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &meta_buffer);
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
namespace ams::erpt::srv {
|
namespace ams::erpt::srv {
|
||||||
|
|
||||||
lmem::HeapHandle g_heap_handle;
|
lmem::HeapHandle g_heap_handle;
|
||||||
|
ams::sf::ExpHeapAllocator g_sf_allocator;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
@ -79,6 +80,8 @@ namespace ams::erpt::srv {
|
||||||
|
|
||||||
R_ABORT_UNLESS(MountSystemSaveData());
|
R_ABORT_UNLESS(MountSystemSaveData());
|
||||||
|
|
||||||
|
g_sf_allocator.Attach(g_heap_handle);
|
||||||
|
|
||||||
for (auto i = 0; i < CategoryId_Count; i++) {
|
for (auto i = 0; i < CategoryId_Count; i++) {
|
||||||
Context *ctx = new Context(static_cast<CategoryId>(i), 1);
|
Context *ctx = new Context(static_cast<CategoryId>(i), 1);
|
||||||
AMS_ABORT_UNLESS(ctx != nullptr);
|
AMS_ABORT_UNLESS(ctx != nullptr);
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
namespace ams::erpt::srv {
|
namespace ams::erpt::srv {
|
||||||
|
|
||||||
class ManagerImpl final : public util::IntrusiveListBaseNode<ManagerImpl> {
|
class ManagerImpl : public util::IntrusiveListBaseNode<ManagerImpl> {
|
||||||
private:
|
private:
|
||||||
os::SystemEvent system_event;
|
os::SystemEvent system_event;
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -20,7 +20,7 @@ namespace ams::erpt::srv {
|
||||||
|
|
||||||
class Report;
|
class Report;
|
||||||
|
|
||||||
class ReportImpl final {
|
class ReportImpl {
|
||||||
private:
|
private:
|
||||||
Report *report;
|
Report *report;
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -21,6 +21,8 @@
|
||||||
|
|
||||||
namespace ams::erpt::srv {
|
namespace ams::erpt::srv {
|
||||||
|
|
||||||
|
extern ams::sf::ExpHeapAllocator g_sf_allocator;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
struct ErrorReportServerOptions {
|
struct ErrorReportServerOptions {
|
||||||
|
@ -39,26 +41,40 @@ namespace ams::erpt::srv {
|
||||||
|
|
||||||
alignas(os::ThreadStackAlignment) u8 g_server_thread_stack[16_KB];
|
alignas(os::ThreadStackAlignment) u8 g_server_thread_stack[16_KB];
|
||||||
|
|
||||||
|
enum PortIndex {
|
||||||
|
PortIndex_Report,
|
||||||
|
PortIndex_Context,
|
||||||
|
};
|
||||||
|
|
||||||
class ErrorReportServiceManager : public ams::sf::hipc::ServerManager<ErrorReportNumServers, ErrorReportServerOptions, ErrorReportMaxSessions> {
|
class ErrorReportServiceManager : public ams::sf::hipc::ServerManager<ErrorReportNumServers, ErrorReportServerOptions, ErrorReportMaxSessions> {
|
||||||
private:
|
private:
|
||||||
os::ThreadType thread;
|
os::ThreadType thread;
|
||||||
std::shared_ptr<erpt::sf::IContext> context_session_object;
|
ams::sf::UnmanagedServiceObject<erpt::sf::IContext, erpt::srv::ContextImpl> context_session_object;
|
||||||
private:
|
private:
|
||||||
static void ThreadFunction(void *_this) {
|
static void ThreadFunction(void *_this) {
|
||||||
reinterpret_cast<ErrorReportServiceManager *>(_this)->SetupAndLoopProcess();
|
reinterpret_cast<ErrorReportServiceManager *>(_this)->SetupAndLoopProcess();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetupAndLoopProcess();
|
void SetupAndLoopProcess();
|
||||||
public:
|
|
||||||
ErrorReportServiceManager(erpt::srv::ContextImpl *c)
|
|
||||||
: context_session_object(ams::sf::GetSharedPointerTo<erpt::sf::IContext, erpt::srv::ContextImpl>(c))
|
|
||||||
{
|
|
||||||
/* ... */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
virtual Result OnNeedsToAccept(int port_index, Server *server) override {
|
||||||
|
switch (port_index) {
|
||||||
|
case PortIndex_Report:
|
||||||
|
{
|
||||||
|
auto intf = ams::sf::ObjectFactory<ams::sf::ExpHeapAllocator::Policy>::CreateSharedEmplaced<erpt::sf::ISession, erpt::srv::SessionImpl>(std::addressof(g_sf_allocator));
|
||||||
|
AMS_ABORT_UNLESS(intf != nullptr);
|
||||||
|
return this->AcceptImpl(server, intf);
|
||||||
|
}
|
||||||
|
case PortIndex_Context:
|
||||||
|
return AcceptImpl(server, this->context_session_object.GetShared());
|
||||||
|
default:
|
||||||
|
return erpt::ResultNotSupported();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public:
|
||||||
Result Initialize() {
|
Result Initialize() {
|
||||||
R_ABORT_UNLESS((this->RegisterServer<erpt::sf::IContext, erpt::srv::ContextImpl>(ErrorReportContextServiceName, ErrorReportContextSessions, this->context_session_object)));
|
R_ABORT_UNLESS(this->RegisterServer(PortIndex_Context, ErrorReportContextServiceName, ErrorReportContextSessions));
|
||||||
R_ABORT_UNLESS((this->RegisterServer<erpt::sf::ISession, erpt::srv::SessionImpl>(ErrorReportReportServiceName, ErrorReportReportSessions)));
|
R_ABORT_UNLESS(this->RegisterServer(PortIndex_Report, ErrorReportReportServiceName, ErrorReportReportSessions));
|
||||||
|
|
||||||
this->ResumeProcessing();
|
this->ResumeProcessing();
|
||||||
|
|
||||||
|
@ -117,8 +133,7 @@ namespace ams::erpt::srv {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
constinit erpt::srv::ContextImpl g_context_object;
|
ErrorReportServiceManager g_erpt_server_manager;
|
||||||
ErrorReportServiceManager g_erpt_server_manager(std::addressof(g_context_object));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue