diff --git a/libstratosphere/include/stratosphere.hpp b/libstratosphere/include/stratosphere.hpp index 7a51e59e..9fffefa9 100644 --- a/libstratosphere/include/stratosphere.hpp +++ b/libstratosphere/include/stratosphere.hpp @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include diff --git a/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_attachment.hpp b/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_attachment.hpp index cf403c4b..0d44e892 100644 --- a/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_attachment.hpp +++ b/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_attachment.hpp @@ -19,33 +19,14 @@ namespace ams::erpt::sf { - class IAttachment : public ams::sf::IServiceObject { - protected: - enum class CommandId { - Open = 0, - Read = 1, - SetFlags = 2, - GetFlags = 3, - Close = 4, - GetSize = 5, - }; - public: - /* Actual commands. */ - virtual Result Open(const AttachmentId &attachment_id) = 0; - virtual Result Read(ams::sf::Out out_count, const ams::sf::OutBuffer &out_buffer) = 0; - virtual Result SetFlags(AttachmentFlagSet flags) = 0; - virtual Result GetFlags(ams::sf::Out out) = 0; - virtual Result Close() = 0; - virtual Result GetSize(ams::sf::Out out) = 0; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(Open), - MAKE_SERVICE_COMMAND_META(Read), - MAKE_SERVICE_COMMAND_META(SetFlags), - MAKE_SERVICE_COMMAND_META(GetFlags), - MAKE_SERVICE_COMMAND_META(Close), - MAKE_SERVICE_COMMAND_META(GetSize), - }; - }; + #define AMS_ERPT_I_ATTACHMENT_INTERFACE_INFO(C, H) \ + 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 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 out)) \ + AMS_SF_METHOD_INFO(C, H, 4, Result, Close, ()) \ + AMS_SF_METHOD_INFO(C, H, 5, Result, GetSize, (ams::sf::Out out)) + + AMS_SF_DEFINE_INTERFACE(IAttachment, AMS_ERPT_I_ATTACHMENT_INTERFACE_INFO) } \ No newline at end of file diff --git a/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_context.hpp b/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_context.hpp index 85d18ef4..47cc5401 100644 --- a/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_context.hpp +++ b/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_context.hpp @@ -22,48 +22,20 @@ namespace ams::erpt::sf { - class IContext : public ams::sf::IServiceObject { - protected: - enum class CommandId { - SubmitContext = 0, - CreateReport = 1, - SetInitialLaunchSettingsCompletionTime = 2, - ClearInitialLaunchSettingsCompletionTime = 3, - UpdatePowerOnTime = 4, - UpdateAwakeTime = 5, - SubmitMultipleCategoryContext = 6, - UpdateApplicationLaunchTime = 7, - ClearApplicationLaunchTime = 8, - SubmitAttachment = 9, - CreateReportWithAttachments = 10, - }; - public: - /* Actual commands. */ - virtual Result SubmitContext(const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer) = 0; - virtual Result CreateReport(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &meta_buffer) = 0; - virtual Result SetInitialLaunchSettingsCompletionTime(const time::SteadyClockTimePoint &time_point) = 0; - virtual Result ClearInitialLaunchSettingsCompletionTime() = 0; - virtual Result UpdatePowerOnTime() = 0; - virtual Result UpdateAwakeTime() = 0; - virtual Result SubmitMultipleCategoryContext(const MultipleCategoryContextEntry &ctx_entry, const ams::sf::InBuffer &str_buffer) = 0; - virtual Result UpdateApplicationLaunchTime() = 0; - virtual Result ClearApplicationLaunchTime() = 0; - virtual Result SubmitAttachment(ams::sf::Out out, const ams::sf::InBuffer &attachment_name, const ams::sf::InBuffer &attachment_data) = 0; - virtual Result CreateReportWithAttachments(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &str_buffer, const ams::sf::InBuffer &attachment_ids_buffer) = 0; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(SubmitContext), - MAKE_SERVICE_COMMAND_META(CreateReport), - MAKE_SERVICE_COMMAND_META(SetInitialLaunchSettingsCompletionTime, hos::Version_3_0_0), - MAKE_SERVICE_COMMAND_META(ClearInitialLaunchSettingsCompletionTime, hos::Version_3_0_0), - MAKE_SERVICE_COMMAND_META(UpdatePowerOnTime, hos::Version_3_0_0), - MAKE_SERVICE_COMMAND_META(UpdateAwakeTime, hos::Version_3_0_0), - MAKE_SERVICE_COMMAND_META(SubmitMultipleCategoryContext, hos::Version_5_0_0), - MAKE_SERVICE_COMMAND_META(UpdateApplicationLaunchTime, hos::Version_6_0_0), - MAKE_SERVICE_COMMAND_META(ClearApplicationLaunchTime, hos::Version_6_0_0), - MAKE_SERVICE_COMMAND_META(SubmitAttachment, hos::Version_8_0_0), - MAKE_SERVICE_COMMAND_META(CreateReportWithAttachments, hos::Version_8_0_0), - }; - }; + #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)) \ + AMS_SF_METHOD_INFO(C, H, 1, Result, CreateReport, (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, 2, Result, SetInitialLaunchSettingsCompletionTime, (const time::SteadyClockTimePoint &time_point), 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, 4, Result, UpdatePowerOnTime, (), 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, 6, Result, SubmitMultipleCategoryContext, (const MultipleCategoryContextEntry &ctx_entry, const ams::sf::InBuffer &str_buffer), hos::Version_5_0_0) \ + AMS_SF_METHOD_INFO(C, H, 7, Result, UpdateApplicationLaunchTime, (), hos::Version_6_0_0) \ + AMS_SF_METHOD_INFO(C, H, 8, Result, ClearApplicationLaunchTime, (), hos::Version_6_0_0) \ + AMS_SF_METHOD_INFO(C, H, 9, Result, SubmitAttachment, (ams::sf::Out 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, (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) + + + AMS_SF_DEFINE_INTERFACE(IContext, AMS_ERPT_I_CONTEXT_INTERFACE_INFO) } \ No newline at end of file diff --git a/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_manager.hpp b/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_manager.hpp index 43329a6f..01fe4353 100644 --- a/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_manager.hpp +++ b/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_manager.hpp @@ -19,33 +19,15 @@ namespace ams::erpt::sf { - class IManager : public ams::sf::IServiceObject { - protected: - enum class CommandId { - GetReportList = 0, - GetEvent = 1, - CleanupReports = 2, - DeleteReport = 3, - GetStorageUsageStatistics = 4, - GetAttachmentList = 5, - }; - public: - /* Actual commands. */ - virtual Result GetReportList(const ams::sf::OutBuffer &out_list, ReportType type_filter) = 0; - virtual Result GetEvent(ams::sf::OutCopyHandle out) = 0; - virtual Result CleanupReports() = 0; - virtual Result DeleteReport(const ReportId &report_id) = 0; - virtual Result GetStorageUsageStatistics(ams::sf::Out out) = 0; - virtual Result GetAttachmentList(const ams::sf::OutBuffer &out_buf, const ReportId &report_id) = 0; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(GetReportList), - MAKE_SERVICE_COMMAND_META(GetEvent), - MAKE_SERVICE_COMMAND_META(CleanupReports, hos::Version_4_0_0), - MAKE_SERVICE_COMMAND_META(DeleteReport, hos::Version_5_0_0), - MAKE_SERVICE_COMMAND_META(GetStorageUsageStatistics, hos::Version_5_0_0), - MAKE_SERVICE_COMMAND_META(GetAttachmentList, hos::Version_8_0_0), - }; - }; + #define AMS_ERPT_I_MANAGER_INTERFACE_INFO(C, H) \ + AMS_SF_METHOD_INFO(C, H, 0, Result, GetReportList, (const ams::sf::OutBuffer &out_list, ReportType type_filter)) \ + AMS_SF_METHOD_INFO(C, H, 1, Result, GetEvent, (ams::sf::OutCopyHandle out)) \ + AMS_SF_METHOD_INFO(C, H, 2, Result, CleanupReports, (), hos::Version_4_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, 4, Result, GetStorageUsageStatistics, (ams::sf::Out 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) } \ No newline at end of file diff --git a/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_report.hpp b/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_report.hpp index cc053ad8..2d8171c9 100644 --- a/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_report.hpp +++ b/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_report.hpp @@ -19,33 +19,15 @@ namespace ams::erpt::sf { - class IReport : public ams::sf::IServiceObject { - protected: - enum class CommandId { - Open = 0, - Read = 1, - SetFlags = 2, - GetFlags = 3, - Close = 4, - GetSize = 5, - }; - public: - /* Actual commands. */ - virtual Result Open(const ReportId &report_id) = 0; - virtual Result Read(ams::sf::Out out_count, const ams::sf::OutBuffer &out_buffer) = 0; - virtual Result SetFlags(ReportFlagSet flags) = 0; - virtual Result GetFlags(ams::sf::Out out) = 0; - virtual Result Close() = 0; - virtual Result GetSize(ams::sf::Out out) = 0; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(Open), - MAKE_SERVICE_COMMAND_META(Read), - MAKE_SERVICE_COMMAND_META(SetFlags), - MAKE_SERVICE_COMMAND_META(GetFlags), - MAKE_SERVICE_COMMAND_META(Close), - MAKE_SERVICE_COMMAND_META(GetSize), - }; - }; + #define AMS_ERPT_I_REPORT_INTERFACE_INFO(C, H) \ + 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 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 out)) \ + AMS_SF_METHOD_INFO(C, H, 4, Result, Close, ()) \ + AMS_SF_METHOD_INFO(C, H, 5, Result, GetSize, (ams::sf::Out out)) + + + AMS_SF_DEFINE_INTERFACE(IReport, AMS_ERPT_I_REPORT_INTERFACE_INFO) } \ No newline at end of file diff --git a/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_session.hpp b/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_session.hpp index 739d0bde..c61e2222 100644 --- a/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_session.hpp +++ b/libstratosphere/include/stratosphere/erpt/sf/erpt_sf_i_session.hpp @@ -22,24 +22,11 @@ namespace ams::erpt::sf { - class ISession : public ams::sf::IServiceObject { - protected: - enum class CommandId { - OpenReport = 0, - OpenManager = 1, - OpenAttachment = 2, - }; - public: - /* Actual commands. */ - virtual Result OpenReport(ams::sf::Out> out) = 0; - virtual Result OpenManager(ams::sf::Out> out) = 0; - virtual Result OpenAttachment(ams::sf::Out> out) = 0; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(OpenReport), - MAKE_SERVICE_COMMAND_META(OpenManager), - MAKE_SERVICE_COMMAND_META(OpenAttachment, hos::Version_8_0_0), - }; - }; + #define AMS_ERPT_I_SESSION_INTERFACE_INFO(C, H) \ + AMS_SF_METHOD_INFO(C, H, 0, Result, OpenReport, (ams::sf::Out> out)) \ + AMS_SF_METHOD_INFO(C, H, 1, Result, OpenManager, (ams::sf::Out> out)) \ + AMS_SF_METHOD_INFO(C, H, 2, Result, OpenAttachment, (ams::sf::Out> out), hos::Version_8_0_0) + + AMS_SF_DEFINE_INTERFACE(ISession, AMS_ERPT_I_SESSION_INTERFACE_INFO) } \ No newline at end of file diff --git a/libstratosphere/include/stratosphere/fatal.hpp b/libstratosphere/include/stratosphere/fatal.hpp index 52ad0b05..00025c56 100644 --- a/libstratosphere/include/stratosphere/fatal.hpp +++ b/libstratosphere/include/stratosphere/fatal.hpp @@ -16,4 +16,7 @@ #pragma once -#include "fatal/fatal_types.hpp" +#include + +#include +#include diff --git a/libstratosphere/include/stratosphere/fatal/impl/fatal_i_private_service.hpp b/libstratosphere/include/stratosphere/fatal/impl/fatal_i_private_service.hpp new file mode 100644 index 00000000..59e2b70b --- /dev/null +++ b/libstratosphere/include/stratosphere/fatal/impl/fatal_i_private_service.hpp @@ -0,0 +1,29 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include + +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)) + + AMS_SF_DEFINE_INTERFACE(IPrivateService, AMS_FATAL_I_PRIVATE_SERVICE_INTERFACE_INFO) + +} diff --git a/libstratosphere/include/stratosphere/fatal/impl/fatal_i_service.hpp b/libstratosphere/include/stratosphere/fatal/impl/fatal_i_service.hpp new file mode 100644 index 00000000..36922e78 --- /dev/null +++ b/libstratosphere/include/stratosphere/fatal/impl/fatal_i_service.hpp @@ -0,0 +1,31 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include + +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)) \ + 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) + +} diff --git a/libstratosphere/include/stratosphere/fs/fs_path_tool.hpp b/libstratosphere/include/stratosphere/fs/fs_path_tool.hpp index 37f2c5b5..9d9e145b 100644 --- a/libstratosphere/include/stratosphere/fs/fs_path_tool.hpp +++ b/libstratosphere/include/stratosphere/fs/fs_path_tool.hpp @@ -14,8 +14,8 @@ * along with this program. If not, see . */ #pragma once -#include "fs_common.hpp" -#include "../fssrv/fssrv_sf_path.hpp" +#include +#include namespace ams::fs { diff --git a/libstratosphere/include/stratosphere/fs/fs_path_utils.hpp b/libstratosphere/include/stratosphere/fs/fs_path_utils.hpp index 63cb917d..59174ce2 100644 --- a/libstratosphere/include/stratosphere/fs/fs_path_utils.hpp +++ b/libstratosphere/include/stratosphere/fs/fs_path_utils.hpp @@ -14,8 +14,8 @@ * along with this program. If not, see . */ #pragma once -#include "fs_common.hpp" -#include "../fssrv/fssrv_sf_path.hpp" +#include +#include namespace ams::fs { diff --git a/libstratosphere/include/stratosphere/fs/fs_query_range.hpp b/libstratosphere/include/stratosphere/fs/fs_query_range.hpp index 2456f48d..35e684c9 100644 --- a/libstratosphere/include/stratosphere/fs/fs_query_range.hpp +++ b/libstratosphere/include/stratosphere/fs/fs_query_range.hpp @@ -14,8 +14,8 @@ * along with this program. If not, see . */ #pragma once -#include "fs_common.hpp" -#include "fs_file.hpp" +#include +#include namespace ams::fs { diff --git a/libstratosphere/include/stratosphere/fs/fsa/fs_ifile.hpp b/libstratosphere/include/stratosphere/fs/fsa/fs_ifile.hpp index 42224011..2d262639 100644 --- a/libstratosphere/include/stratosphere/fs/fsa/fs_ifile.hpp +++ b/libstratosphere/include/stratosphere/fs/fsa/fs_ifile.hpp @@ -14,10 +14,10 @@ * along with this program. If not, see . */ #pragma once -#include "../fs_common.hpp" -#include "../fs_file.hpp" -#include "../fs_filesystem.hpp" -#include "../fs_operate_range.hpp" +#include +#include +#include +#include namespace ams::fs::fsa { diff --git a/libstratosphere/include/stratosphere/fssrv.hpp b/libstratosphere/include/stratosphere/fssrv.hpp index 91d83951..a2fb95b3 100644 --- a/libstratosphere/include/stratosphere/fssrv.hpp +++ b/libstratosphere/include/stratosphere/fssrv.hpp @@ -15,7 +15,8 @@ */ #pragma once -#include +#include +#include #include #include #include diff --git a/libstratosphere/include/stratosphere/fssrv/interface_adapters/fssrv_filesystem_interface_adapter.hpp b/libstratosphere/include/stratosphere/fssrv/interface_adapters/fssrv_filesystem_interface_adapter.hpp index 4355176d..a62bda66 100644 --- a/libstratosphere/include/stratosphere/fssrv/interface_adapters/fssrv_filesystem_interface_adapter.hpp +++ b/libstratosphere/include/stratosphere/fssrv/interface_adapters/fssrv_filesystem_interface_adapter.hpp @@ -14,13 +14,16 @@ * along with this program. If not, see . */ #pragma once -#include "../../fs/fs_common.hpp" -#include "../../fs/fs_file.hpp" -#include "../../fs/fs_directory.hpp" -#include "../../fs/fs_filesystem.hpp" -#include "../../fs/fs_query_range.hpp" -#include "../../fssrv/fssrv_sf_path.hpp" -#include "../../fssystem/fssystem_utility.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace ams::fs::fsa { @@ -34,17 +37,8 @@ namespace ams::fssrv::impl { class FileSystemInterfaceAdapter; - class FileInterfaceAdapter final : public ams::sf::IServiceObject { + class FileInterfaceAdapter final { NON_COPYABLE(FileInterfaceAdapter); - public: - enum class CommandId { - Read = 0, - Write = 1, - Flush = 2, - SetSize = 3, - GetSize = 4, - OperateRange = 5, - }; private: std::shared_ptr parent_filesystem; std::unique_ptr base_file; @@ -62,27 +56,11 @@ namespace ams::fssrv::impl { Result SetSize(s64 size); Result GetSize(ams::sf::Out out); Result OperateRange(ams::sf::Out out, s32 op_id, s64 offset, s64 size); - public: - DEFINE_SERVICE_DISPATCH_TABLE { - /* 1.0.0- */ - MAKE_SERVICE_COMMAND_META(Read), - MAKE_SERVICE_COMMAND_META(Write), - MAKE_SERVICE_COMMAND_META(Flush), - MAKE_SERVICE_COMMAND_META(SetSize), - MAKE_SERVICE_COMMAND_META(GetSize), - - /* 4.0.0- */ - MAKE_SERVICE_COMMAND_META(OperateRange, hos::Version_4_0_0), - }; }; + static_assert(fssrv::sf::IsIFile); - class DirectoryInterfaceAdapter final : public ams::sf::IServiceObject { + class DirectoryInterfaceAdapter final { NON_COPYABLE(DirectoryInterfaceAdapter); - public: - enum class CommandId { - Read = 0, - GetEntryCount = 1, - }; private: std::shared_ptr parent_filesystem; std::unique_ptr base_dir; @@ -94,39 +72,11 @@ namespace ams::fssrv::impl { /* Command API */ Result Read(ams::sf::Out out, const ams::sf::OutBuffer &out_entries); Result GetEntryCount(ams::sf::Out out); - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(Read), - MAKE_SERVICE_COMMAND_META(GetEntryCount), - }; }; + static_assert(fssrv::sf::IsIDirectory); - class FileSystemInterfaceAdapter final : public std::enable_shared_from_this, public ams::sf::IServiceObject { + class FileSystemInterfaceAdapter final : public std::enable_shared_from_this { NON_COPYABLE(FileSystemInterfaceAdapter); - public: - enum class CommandId { - /* 1.0.0+ */ - CreateFile = 0, - DeleteFile = 1, - CreateDirectory = 2, - DeleteDirectory = 3, - DeleteDirectoryRecursively = 4, - RenameFile = 5, - RenameDirectory = 6, - GetEntryType = 7, - OpenFile = 8, - OpenDirectory = 9, - Commit = 10, - GetFreeSpaceSize = 11, - GetTotalSpaceSize = 12, - - /* 3.0.0+ */ - CleanDirectoryRecursively = 13, - GetFileTimeStampRaw = 14, - - /* 4.0.0+ */ - QueryEntry = 15, - }; private: std::shared_ptr base_fs; std::unique_lock mount_count_semaphore; @@ -153,8 +103,8 @@ namespace ams::fssrv::impl { 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 GetEntryType(ams::sf::Out out, const fssrv::sf::Path &path); - Result OpenFile(ams::sf::Out> out, const fssrv::sf::Path &path, u32 mode); - Result OpenDirectory(ams::sf::Out> out, const fssrv::sf::Path &path, u32 mode); + Result OpenFile(ams::sf::Out> out, const fssrv::sf::Path &path, u32 mode); + Result OpenDirectory(ams::sf::Out> out, const fssrv::sf::Path &path, u32 mode); Result Commit(); Result GetFreeSpaceSize(ams::sf::Out out, const fssrv::sf::Path &path); Result GetTotalSpaceSize(ams::sf::Out out, const fssrv::sf::Path &path); @@ -163,30 +113,6 @@ namespace ams::fssrv::impl { Result GetFileTimeStampRaw(ams::sf::Out out, const fssrv::sf::Path &path); Result QueryEntry(const ams::sf::OutBuffer &out_buf, const ams::sf::InBuffer &in_buf, s32 query_id, const fssrv::sf::Path &path); - public: - DEFINE_SERVICE_DISPATCH_TABLE { - /* 1.0.0- */ - MAKE_SERVICE_COMMAND_META(CreateFile), - MAKE_SERVICE_COMMAND_META(DeleteFile), - MAKE_SERVICE_COMMAND_META(CreateDirectory), - MAKE_SERVICE_COMMAND_META(DeleteDirectory), - MAKE_SERVICE_COMMAND_META(DeleteDirectoryRecursively), - MAKE_SERVICE_COMMAND_META(RenameFile), - MAKE_SERVICE_COMMAND_META(RenameDirectory), - MAKE_SERVICE_COMMAND_META(GetEntryType), - MAKE_SERVICE_COMMAND_META(OpenFile), - MAKE_SERVICE_COMMAND_META(OpenDirectory), - MAKE_SERVICE_COMMAND_META(Commit), - MAKE_SERVICE_COMMAND_META(GetFreeSpaceSize), - MAKE_SERVICE_COMMAND_META(GetTotalSpaceSize), - - /* 3.0.0- */ - MAKE_SERVICE_COMMAND_META(CleanDirectoryRecursively, hos::Version_3_0_0), - MAKE_SERVICE_COMMAND_META(GetFileTimeStampRaw, hos::Version_3_0_0), - - /* 4.0.0- */ - MAKE_SERVICE_COMMAND_META(QueryEntry, hos::Version_4_0_0), - }; }; } diff --git a/libstratosphere/include/stratosphere/fssrv/interface_adapters/fssrv_storage_interface_adapter.hpp b/libstratosphere/include/stratosphere/fssrv/interface_adapters/fssrv_storage_interface_adapter.hpp index 6170e3f0..c1a74b42 100644 --- a/libstratosphere/include/stratosphere/fssrv/interface_adapters/fssrv_storage_interface_adapter.hpp +++ b/libstratosphere/include/stratosphere/fssrv/interface_adapters/fssrv_storage_interface_adapter.hpp @@ -14,9 +14,10 @@ * along with this program. If not, see . */ #pragma once -#include "../../fs/fs_common.hpp" -#include "../../fs/fs_query_range.hpp" -#include "../../fssystem/fssystem_utility.hpp" +#include +#include +#include +#include namespace ams::fs { @@ -26,17 +27,8 @@ namespace ams::fs { namespace ams::fssrv::impl { - class StorageInterfaceAdapter final : public ams::sf::IServiceObject { + class StorageInterfaceAdapter final { NON_COPYABLE(StorageInterfaceAdapter); - public: - enum class CommandId { - Read = 0, - Write = 1, - Flush = 2, - SetSize = 3, - GetSize = 4, - OperateRange = 5, - }; private: /* TODO: Nintendo uses fssystem::AsynchronousAccessStorage here. */ std::shared_ptr base_storage; @@ -53,7 +45,7 @@ namespace ams::fssrv::impl { ~StorageInterfaceAdapter(); private: std::optional> AcquireCacheInvalidationReadLock(); - private: + public: /* Command API. */ Result Read(s64 offset, const ams::sf::OutNonSecureBuffer &buffer, s64 size); Result Write(s64 offset, const ams::sf::InNonSecureBuffer &buffer, s64 size); @@ -61,18 +53,7 @@ namespace ams::fssrv::impl { Result SetSize(s64 size); Result GetSize(ams::sf::Out out); Result OperateRange(ams::sf::Out out, s32 op_id, s64 offset, s64 size); - public: - DEFINE_SERVICE_DISPATCH_TABLE { - /* 1.0.0- */ - MAKE_SERVICE_COMMAND_META(Read), - MAKE_SERVICE_COMMAND_META(Write), - MAKE_SERVICE_COMMAND_META(Flush), - MAKE_SERVICE_COMMAND_META(SetSize), - MAKE_SERVICE_COMMAND_META(GetSize), - - /* 4.0.0- */ - MAKE_SERVICE_COMMAND_META(OperateRange, hos::Version_4_0_0), - }; }; + static_assert(fssrv::sf::IsIStorage); } diff --git a/libstratosphere/include/stratosphere/fssrv/sf/fssrv_sf_idirectory.hpp b/libstratosphere/include/stratosphere/fssrv/sf/fssrv_sf_idirectory.hpp new file mode 100644 index 00000000..422a06dd --- /dev/null +++ b/libstratosphere/include/stratosphere/fssrv/sf/fssrv_sf_idirectory.hpp @@ -0,0 +1,29 @@ +/* + * 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 . + */ +#pragma once +#include +#include +#include + +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 out, const ams::sf::OutBuffer &out_entries)) \ + AMS_SF_METHOD_INFO(C, H, 1, Result, GetEntryCount, (ams::sf::Out out)) + + AMS_SF_DEFINE_INTERFACE(IDirectory, AMS_FSSRV_I_DIRECTORY_INTERFACE_INFO) + +} diff --git a/libstratosphere/include/stratosphere/fssrv/sf/fssrv_sf_ifile.hpp b/libstratosphere/include/stratosphere/fssrv/sf/fssrv_sf_ifile.hpp new file mode 100644 index 00000000..03d30b29 --- /dev/null +++ b/libstratosphere/include/stratosphere/fssrv/sf/fssrv_sf_ifile.hpp @@ -0,0 +1,34 @@ +/* + * 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 . + */ +#pragma once +#include +#include +#include +#include + +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 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 out)) \ + AMS_SF_METHOD_INFO(C, H, 5, Result, OperateRange, (ams::sf::Out out, s32 op_id, s64 offset, s64 size), hos::Version_4_0_0) \ + + AMS_SF_DEFINE_INTERFACE(IFile, AMS_FSSRV_I_FILE_INTERFACE_INFO) + +} diff --git a/libstratosphere/include/stratosphere/fssrv/sf/fssrv_sf_ifilesystem.hpp b/libstratosphere/include/stratosphere/fssrv/sf/fssrv_sf_ifilesystem.hpp new file mode 100644 index 00000000..90fa215e --- /dev/null +++ b/libstratosphere/include/stratosphere/fssrv/sf/fssrv_sf_ifilesystem.hpp @@ -0,0 +1,47 @@ +/* + * 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 . + */ +#pragma once +#include +#include +#include +#include +#include +#include +#include + +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)) \ + 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 out, const ams::fssrv::sf::Path &path)) \ + AMS_SF_METHOD_INFO(C, H, 8, Result, OpenFile, (ams::sf::Out> out, const ams::fssrv::sf::Path &path, u32 mode)) \ + AMS_SF_METHOD_INFO(C, H, 9, Result, OpenDirectory, (ams::sf::Out> 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 out, const ams::fssrv::sf::Path &path)) \ + AMS_SF_METHOD_INFO(C, H, 12, Result, GetTotalSpaceSize, (ams::sf::Out 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 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) + +} diff --git a/libstratosphere/include/stratosphere/fssrv/sf/fssrv_sf_istorage.hpp b/libstratosphere/include/stratosphere/fssrv/sf/fssrv_sf_istorage.hpp new file mode 100644 index 00000000..5f8cb761 --- /dev/null +++ b/libstratosphere/include/stratosphere/fssrv/sf/fssrv_sf_istorage.hpp @@ -0,0 +1,34 @@ +/* + * 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 . + */ +#pragma once +#include +#include +#include +#include + +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)) \ + 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 out)) \ + AMS_SF_METHOD_INFO(C, H, 5, Result, OperateRange, (ams::sf::Out out, s32 op_id, s64 offset, s64 size), hos::Version_4_0_0) + + AMS_SF_DEFINE_INTERFACE(IStorage, AMS_FSSRV_I_STORAGE_INTERFACE_INFO) + +} diff --git a/libstratosphere/include/stratosphere/fssrv/fssrv_sf_path.hpp b/libstratosphere/include/stratosphere/fssrv/sf/fssrv_sf_path.hpp similarity index 100% rename from libstratosphere/include/stratosphere/fssrv/fssrv_sf_path.hpp rename to libstratosphere/include/stratosphere/fssrv/sf/fssrv_sf_path.hpp diff --git a/libstratosphere/include/stratosphere/hos/hos_types.hpp b/libstratosphere/include/stratosphere/hos/hos_types.hpp index b93c6e73..8a31591a 100644 --- a/libstratosphere/include/stratosphere/hos/hos_types.hpp +++ b/libstratosphere/include/stratosphere/hos/hos_types.hpp @@ -60,6 +60,4 @@ namespace ams::hos { Version_Max = ::ams::TargetFirmware_Max, }; - - } diff --git a/libstratosphere/include/stratosphere/ldr.hpp b/libstratosphere/include/stratosphere/ldr.hpp index c278de69..20f40cbd 100644 --- a/libstratosphere/include/stratosphere/ldr.hpp +++ b/libstratosphere/include/stratosphere/ldr.hpp @@ -19,3 +19,6 @@ #include #include #include +#include +#include +#include \ No newline at end of file diff --git a/libstratosphere/include/stratosphere/ldr/impl/ldr_debug_monitor_interface.hpp b/libstratosphere/include/stratosphere/ldr/impl/ldr_debug_monitor_interface.hpp new file mode 100644 index 00000000..328ae400 --- /dev/null +++ b/libstratosphere/include/stratosphere/ldr/impl/ldr_debug_monitor_interface.hpp @@ -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 . + */ + +#pragma once +#include +#include +#include + +namespace ams::ldr::impl { + + #define AMS_LDR_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO(C, H) \ + AMS_SF_METHOD_INFO(C, H, 0, Result, SetProgramArguments, (ncm::ProgramId program_id, const sf::InPointerBuffer &args, u32 args_size)) \ + AMS_SF_METHOD_INFO(C, H, 1, Result, FlushArguments, ()) \ + AMS_SF_METHOD_INFO(C, H, 2, Result, GetProcessModuleInfo, (sf::Out count, const sf::OutPointerArray &out, os::ProcessId process_id)) \ + AMS_SF_METHOD_INFO(C, H, 65000, void, AtmosphereHasLaunchedProgram, (sf::Out out, ncm::ProgramId program_id)) + + AMS_SF_DEFINE_INTERFACE(IDebugMonitorInterface, AMS_LDR_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO) + +} diff --git a/libstratosphere/include/stratosphere/ldr/impl/ldr_process_manager_interface.hpp b/libstratosphere/include/stratosphere/ldr/impl/ldr_process_manager_interface.hpp new file mode 100644 index 00000000..946ef636 --- /dev/null +++ b/libstratosphere/include/stratosphere/ldr/impl/ldr_process_manager_interface.hpp @@ -0,0 +1,36 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include + +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, PinId id, u32 flags, sf::CopyHandle reslimit_h)) \ + AMS_SF_METHOD_INFO(C, H, 1, Result, GetProgramInfo, (sf::Out out_program_info, const ncm::ProgramLocation &loc)) \ + AMS_SF_METHOD_INFO(C, H, 2, Result, PinProgram, (sf::Out 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 out, ncm::ProgramId program_id)) \ + AMS_SF_METHOD_INFO(C, H, 65001, Result, AtmosphereGetProgramInfo, (sf::Out out_program_info, sf::Out out_status, const ncm::ProgramLocation &loc)) \ + AMS_SF_METHOD_INFO(C, H, 65002, Result, AtmospherePinProgram, (sf::Out out_id, const ncm::ProgramLocation &loc, const cfg::OverrideStatus &override_status)) + + AMS_SF_DEFINE_INTERFACE(IProcessManagerInterface, AMS_LDR_I_PROCESS_MANAGER_INTERFACE_INTERFACE_INFO) + +} diff --git a/libstratosphere/include/stratosphere/ldr/impl/ldr_shell_interface.hpp b/libstratosphere/include/stratosphere/ldr/impl/ldr_shell_interface.hpp new file mode 100644 index 00000000..5e3e3118 --- /dev/null +++ b/libstratosphere/include/stratosphere/ldr/impl/ldr_shell_interface.hpp @@ -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 . + */ + +#pragma once +#include +#include +#include + +namespace ams::ldr::impl { + + #define AMS_LDR_I_SHELL_INTERFACE_INTERFACE_INFO(C, H) \ + AMS_SF_METHOD_INFO(C, H, 0, Result, SetProgramArguments, (ncm::ProgramId program_id, const sf::InPointerBuffer &args, u32 args_size)) \ + 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) + +} diff --git a/libstratosphere/include/stratosphere/lr/lr_i_add_on_content_location_resolver.hpp b/libstratosphere/include/stratosphere/lr/lr_i_add_on_content_location_resolver.hpp index 70a8a58b..64495307 100644 --- a/libstratosphere/include/stratosphere/lr/lr_i_add_on_content_location_resolver.hpp +++ b/libstratosphere/include/stratosphere/lr/lr_i_add_on_content_location_resolver.hpp @@ -19,34 +19,14 @@ namespace ams::lr { - class IAddOnContentLocationResolver : public sf::IServiceObject { - protected: - enum class CommandId { - ResolveAddOnContentPath = 0, - RegisterAddOnContentStorageDeprecated = 1, - RegisterAddOnContentStorage = 1, - UnregisterAllAddOnContentPath = 2, - RefreshApplicationAddOnContent = 3, - UnregisterApplicationAddOnContent = 4, - }; - public: - /* Actual commands. */ - virtual Result ResolveAddOnContentPath(sf::Out out, ncm::DataId id) = 0; - virtual Result RegisterAddOnContentStorageDeprecated(ncm::DataId id, ncm::StorageId storage_id) = 0; - virtual Result RegisterAddOnContentStorage(ncm::DataId id, ncm::ApplicationId application_id, ncm::StorageId storage_id) = 0; - virtual Result UnregisterAllAddOnContentPath() = 0; - virtual Result RefreshApplicationAddOnContent(const sf::InArray &ids) = 0; - virtual Result UnregisterApplicationAddOnContent(ncm::ApplicationId id) = 0; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(ResolveAddOnContentPath, hos::Version_2_0_0), - MAKE_SERVICE_COMMAND_META(RegisterAddOnContentStorageDeprecated, hos::Version_2_0_0, hos::Version_8_1_0), - MAKE_SERVICE_COMMAND_META(RegisterAddOnContentStorage, hos::Version_9_0_0), - MAKE_SERVICE_COMMAND_META(UnregisterAllAddOnContentPath, hos::Version_2_0_0), - MAKE_SERVICE_COMMAND_META(RefreshApplicationAddOnContent, hos::Version_9_0_0), - MAKE_SERVICE_COMMAND_META(UnregisterApplicationAddOnContent, hos::Version_9_0_0), - }; - }; + #define AMS_LR_I_ADD_ON_CONTENT_LOCATION_RESOLVER_INTERFACE_INFO(C, H) \ + AMS_SF_METHOD_INFO(C, H, 0, Result, ResolveAddOnContentPath, (sf::Out 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 &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) } diff --git a/libstratosphere/include/stratosphere/lr/lr_i_location_resolver.hpp b/libstratosphere/include/stratosphere/lr/lr_i_location_resolver.hpp index d9d8d9da..29dec9f5 100644 --- a/libstratosphere/include/stratosphere/lr/lr_i_location_resolver.hpp +++ b/libstratosphere/include/stratosphere/lr/lr_i_location_resolver.hpp @@ -19,97 +19,35 @@ namespace ams::lr { - class ILocationResolver : public sf::IServiceObject { - NON_COPYABLE(ILocationResolver); - NON_MOVEABLE(ILocationResolver); - protected: - enum class CommandId { - ResolveProgramPath = 0, - RedirectProgramPath = 1, - ResolveApplicationControlPath = 2, - ResolveApplicationHtmlDocumentPath = 3, - ResolveDataPath = 4, - RedirectApplicationControlPathDeprecated = 5, - RedirectApplicationControlPath = 5, - RedirectApplicationHtmlDocumentPathDeprecated = 6, - RedirectApplicationHtmlDocumentPath = 6, - ResolveApplicationLegalInformationPath = 7, - RedirectApplicationLegalInformationPathDeprecated = 8, - RedirectApplicationLegalInformationPath = 8, - Refresh = 9, - RedirectApplicationProgramPathDeprecated = 10, - RedirectApplicationProgramPath = 10, - ClearApplicationRedirectionDeprecated = 11, - ClearApplicationRedirection = 11, - EraseProgramRedirection = 12, - EraseApplicationControlRedirection = 13, - EraseApplicationHtmlDocumentRedirection = 14, - EraseApplicationLegalInformationRedirection = 15, - ResolveProgramPathForDebug = 16, - RedirectProgramPathForDebug = 17, - RedirectApplicationProgramPathForDebugDeprecated = 18, - RedirectApplicationProgramPathForDebug = 18, - EraseProgramRedirectionForDebug = 19, - }; - public: - ILocationResolver() { /* ... */ } - public: - /* Actual commands. */ - virtual Result ResolveProgramPath(sf::Out out, ncm::ProgramId id) = 0; - virtual Result RedirectProgramPath(const Path &path, ncm::ProgramId id) = 0; - virtual Result ResolveApplicationControlPath(sf::Out out, ncm::ProgramId id) = 0; - virtual Result ResolveApplicationHtmlDocumentPath(sf::Out out, ncm::ProgramId id) = 0; - virtual Result ResolveDataPath(sf::Out out, ncm::DataId id) = 0; - virtual Result RedirectApplicationControlPathDeprecated(const Path &path, ncm::ProgramId id) = 0; - virtual Result RedirectApplicationControlPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) = 0; - virtual Result RedirectApplicationHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id) = 0; - virtual Result RedirectApplicationHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) = 0; - virtual Result ResolveApplicationLegalInformationPath(sf::Out out, ncm::ProgramId id) = 0; - virtual Result RedirectApplicationLegalInformationPathDeprecated(const Path &path, ncm::ProgramId id) = 0; - virtual Result RedirectApplicationLegalInformationPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) = 0; - virtual Result Refresh() = 0; - virtual Result RedirectApplicationProgramPathDeprecated(const Path &path, ncm::ProgramId id) = 0; - virtual Result RedirectApplicationProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) = 0; - virtual Result ClearApplicationRedirectionDeprecated() = 0; - virtual Result ClearApplicationRedirection(const sf::InArray &excluding_ids) = 0; - virtual Result EraseProgramRedirection(ncm::ProgramId id) = 0; - virtual Result EraseApplicationControlRedirection(ncm::ProgramId id) = 0; - virtual Result EraseApplicationHtmlDocumentRedirection(ncm::ProgramId id) = 0; - virtual Result EraseApplicationLegalInformationRedirection(ncm::ProgramId id) = 0; - virtual Result ResolveProgramPathForDebug(sf::Out out, ncm::ProgramId id) = 0; - virtual Result RedirectProgramPathForDebug(const Path &path, ncm::ProgramId id) = 0; - virtual Result RedirectApplicationProgramPathForDebugDeprecated(const Path &path, ncm::ProgramId id) = 0; - virtual Result RedirectApplicationProgramPathForDebug(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) = 0; - virtual Result EraseProgramRedirectionForDebug(ncm::ProgramId id) = 0; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(ResolveProgramPath), - MAKE_SERVICE_COMMAND_META(RedirectProgramPath), - MAKE_SERVICE_COMMAND_META(ResolveApplicationControlPath), - MAKE_SERVICE_COMMAND_META(ResolveApplicationHtmlDocumentPath), - MAKE_SERVICE_COMMAND_META(ResolveDataPath), - MAKE_SERVICE_COMMAND_META(RedirectApplicationControlPathDeprecated, hos::Version_1_0_0, hos::Version_8_1_0), - MAKE_SERVICE_COMMAND_META(RedirectApplicationControlPath, hos::Version_9_0_0), - MAKE_SERVICE_COMMAND_META(RedirectApplicationHtmlDocumentPathDeprecated, hos::Version_1_0_0, hos::Version_8_1_0), - MAKE_SERVICE_COMMAND_META(RedirectApplicationHtmlDocumentPath, hos::Version_9_0_0), - MAKE_SERVICE_COMMAND_META(ResolveApplicationLegalInformationPath), - MAKE_SERVICE_COMMAND_META(RedirectApplicationLegalInformationPathDeprecated, hos::Version_1_0_0, hos::Version_8_1_0), - MAKE_SERVICE_COMMAND_META(RedirectApplicationLegalInformationPath, hos::Version_9_0_0), - MAKE_SERVICE_COMMAND_META(Refresh), - MAKE_SERVICE_COMMAND_META(RedirectApplicationProgramPathDeprecated, hos::Version_5_0_0, hos::Version_8_1_0), - MAKE_SERVICE_COMMAND_META(RedirectApplicationProgramPath, hos::Version_9_0_0), - MAKE_SERVICE_COMMAND_META(ClearApplicationRedirectionDeprecated, hos::Version_5_0_0, hos::Version_8_1_0), - MAKE_SERVICE_COMMAND_META(ClearApplicationRedirection, hos::Version_9_0_0), - MAKE_SERVICE_COMMAND_META(EraseProgramRedirection, hos::Version_5_0_0), - MAKE_SERVICE_COMMAND_META(EraseApplicationControlRedirection, hos::Version_5_0_0), - MAKE_SERVICE_COMMAND_META(EraseApplicationHtmlDocumentRedirection, hos::Version_5_0_0), - MAKE_SERVICE_COMMAND_META(EraseApplicationLegalInformationRedirection, hos::Version_5_0_0), - MAKE_SERVICE_COMMAND_META(ResolveProgramPathForDebug, hos::Version_7_0_0), - MAKE_SERVICE_COMMAND_META(RedirectProgramPathForDebug, hos::Version_7_0_0), - MAKE_SERVICE_COMMAND_META(RedirectApplicationProgramPathForDebugDeprecated, hos::Version_7_0_0, hos::Version_8_1_0), - MAKE_SERVICE_COMMAND_META(RedirectApplicationProgramPathForDebug, hos::Version_9_0_0), - MAKE_SERVICE_COMMAND_META(EraseProgramRedirectionForDebug, hos::Version_7_0_0), - }; - }; + #define AMS_LR_I_LOCATION_RESOLVER_INTERFACE_INFO(C, H) \ + AMS_SF_METHOD_INFO(C, H, 0, Result, ResolveProgramPath, (sf::Out out, ncm::ProgramId id)) \ + AMS_SF_METHOD_INFO(C, H, 1, Result, RedirectProgramPath, (const Path &path, ncm::ProgramId id)) \ + AMS_SF_METHOD_INFO(C, H, 2, Result, ResolveApplicationControlPath, (sf::Out out, ncm::ProgramId id)) \ + AMS_SF_METHOD_INFO(C, H, 3, Result, ResolveApplicationHtmlDocumentPath, (sf::Out out, ncm::ProgramId id)) \ + AMS_SF_METHOD_INFO(C, H, 4, Result, ResolveDataPath, (sf::Out out, ncm::DataId id)) \ + 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, 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, RedirectApplicationHtmlDocumentPathDeprecated, (const Path &path, ncm::ProgramId id), hos::Version_1_0_0, hos::Version_8_1_1) \ + 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, 7, Result, ResolveApplicationLegalInformationPath, (sf::Out out, ncm::ProgramId id)) \ + 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, 8, Result, RedirectApplicationLegalInformationPath, (const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id), hos::Version_9_0_0) \ + AMS_SF_METHOD_INFO(C, H, 9, Result, Refresh, ()) \ + 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, 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, ClearApplicationRedirectionDeprecated, (), hos::Version_5_0_0, hos::Version_8_1_1) \ + AMS_SF_METHOD_INFO(C, H, 11, Result, ClearApplicationRedirection, (const sf::InArray &excluding_ids), hos::Version_9_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, 13, Result, EraseApplicationControlRedirection, (ncm::ProgramId 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, 15, Result, EraseApplicationLegalInformationRedirection, (ncm::ProgramId id), hos::Version_5_0_0) \ + AMS_SF_METHOD_INFO(C, H, 16, Result, ResolveProgramPathForDebug, (sf::Out out, ncm::ProgramId id), hos::Version_7_0_0) \ + 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, RedirectApplicationProgramPathForDebugDeprecated, (const Path &path, ncm::ProgramId id), hos::Version_7_0_0, hos::Version_8_1_1) \ + 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) } diff --git a/libstratosphere/include/stratosphere/lr/lr_i_location_resolver_manager.hpp b/libstratosphere/include/stratosphere/lr/lr_i_location_resolver_manager.hpp index 5d9c5518..79cac08e 100644 --- a/libstratosphere/include/stratosphere/lr/lr_i_location_resolver_manager.hpp +++ b/libstratosphere/include/stratosphere/lr/lr_i_location_resolver_manager.hpp @@ -22,20 +22,12 @@ namespace ams::lr { - class ILocationResolverManager : public sf::IServiceObject { - protected: - enum class CommandId { - OpenLocationResolver = 0, - OpenRegisteredLocationResolver = 1, - RefreshLocationResolver = 2, - OpenAddOnContentLocationResolver = 3, - }; - public: - /* Actual commands. */ - virtual Result OpenLocationResolver(sf::Out> out, ncm::StorageId storage_id) = 0; - virtual Result OpenRegisteredLocationResolver(sf::Out> out) = 0; - virtual Result RefreshLocationResolver(ncm::StorageId storage_id) = 0; - virtual Result OpenAddOnContentLocationResolver(sf::Out> out) = 0; - }; + #define AMS_LR_I_LOCATION_RESOLVER_MANAGER_INTERFACE_INFO(C, H) \ + AMS_SF_METHOD_INFO(C, H, 0, Result, OpenLocationResolver, (sf::Out> out, ncm::StorageId storage_id)) \ + AMS_SF_METHOD_INFO(C, H, 1, Result, OpenRegisteredLocationResolver, (sf::Out> 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> out), hos::Version_2_0_0) + + AMS_SF_DEFINE_INTERFACE(ILocationResolverManager, AMS_LR_I_LOCATION_RESOLVER_MANAGER_INTERFACE_INFO) } diff --git a/libstratosphere/include/stratosphere/lr/lr_i_registered_location_resolver.hpp b/libstratosphere/include/stratosphere/lr/lr_i_registered_location_resolver.hpp index 837dfbc8..d628c5a5 100644 --- a/libstratosphere/include/stratosphere/lr/lr_i_registered_location_resolver.hpp +++ b/libstratosphere/include/stratosphere/lr/lr_i_registered_location_resolver.hpp @@ -19,57 +19,22 @@ namespace ams::lr { - class IRegisteredLocationResolver : public sf::IServiceObject { - protected: - enum class CommandId { - ResolveProgramPath = 0, - RegisterProgramPathDeprecated = 1, - RegisterProgramPath = 1, - UnregisterProgramPath = 2, - RedirectProgramPathDeprecated = 3, - RedirectProgramPath = 3, - ResolveHtmlDocumentPath = 4, - RegisterHtmlDocumentPathDeprecated = 5, - RegisterHtmlDocumentPath = 5, - UnregisterHtmlDocumentPath = 6, - RedirectHtmlDocumentPathDeprecated = 7, - RedirectHtmlDocumentPath = 7, - Refresh = 8, - RefreshExcluding = 9, - }; - public: - /* Actual commands. */ - virtual Result ResolveProgramPath(sf::Out out, ncm::ProgramId id) = 0; - virtual Result RegisterProgramPathDeprecated(const Path &path, ncm::ProgramId id) = 0; - virtual Result RegisterProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) = 0; - virtual Result UnregisterProgramPath(ncm::ProgramId id) = 0; - virtual Result RedirectProgramPathDeprecated(const Path &path, ncm::ProgramId id) = 0; - virtual Result RedirectProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) = 0; - virtual Result ResolveHtmlDocumentPath(sf::Out out, ncm::ProgramId id) = 0; - virtual Result RegisterHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id) = 0; - virtual Result RegisterHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) = 0; - virtual Result UnregisterHtmlDocumentPath(ncm::ProgramId id) = 0; - virtual Result RedirectHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id) = 0; - virtual Result RedirectHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) = 0; - virtual Result Refresh() = 0; - virtual Result RefreshExcluding(const sf::InArray &ids) = 0; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(ResolveProgramPath), - MAKE_SERVICE_COMMAND_META(RegisterProgramPathDeprecated, hos::Version_1_0_0, hos::Version_8_1_0), - MAKE_SERVICE_COMMAND_META(RegisterProgramPath, hos::Version_9_0_0), - MAKE_SERVICE_COMMAND_META(UnregisterProgramPath), - MAKE_SERVICE_COMMAND_META(RedirectProgramPathDeprecated, hos::Version_1_0_0, hos::Version_8_1_0), - MAKE_SERVICE_COMMAND_META(RedirectProgramPath, hos::Version_9_0_0), - MAKE_SERVICE_COMMAND_META(ResolveHtmlDocumentPath, hos::Version_2_0_0), - MAKE_SERVICE_COMMAND_META(RegisterHtmlDocumentPathDeprecated, hos::Version_2_0_0, hos::Version_8_1_0), - MAKE_SERVICE_COMMAND_META(RegisterHtmlDocumentPath, hos::Version_9_0_0), - MAKE_SERVICE_COMMAND_META(UnregisterHtmlDocumentPath, hos::Version_2_0_0), - MAKE_SERVICE_COMMAND_META(RedirectHtmlDocumentPathDeprecated, hos::Version_2_0_0, hos::Version_8_1_0), - MAKE_SERVICE_COMMAND_META(RedirectHtmlDocumentPath, hos::Version_9_0_0), - MAKE_SERVICE_COMMAND_META(Refresh, hos::Version_7_0_0), - MAKE_SERVICE_COMMAND_META(RefreshExcluding, hos::Version_9_0_0), - }; - }; + #define AMS_LR_I_REGISTERED_LOCATION_RESOLVER_INTERFACE_INFO(C, H) \ + AMS_SF_METHOD_INFO(C, H, 0, Result, ResolveProgramPath, (sf::Out 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 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 &ids), hos::Version_9_0_0) + + AMS_SF_DEFINE_INTERFACE(IRegisteredLocationResolver, AMS_LR_I_REGISTERED_LOCATION_RESOLVER_INTERFACE_INFO) } diff --git a/libstratosphere/include/stratosphere/lr/lr_location_resolver_manager_impl.hpp b/libstratosphere/include/stratosphere/lr/lr_location_resolver_manager_impl.hpp index 6711cab7..25e57188 100644 --- a/libstratosphere/include/stratosphere/lr/lr_location_resolver_manager_impl.hpp +++ b/libstratosphere/include/stratosphere/lr/lr_location_resolver_manager_impl.hpp @@ -21,7 +21,7 @@ namespace ams::lr { - class LocationResolverManagerImpl final : public ILocationResolverManager { + class LocationResolverManagerImpl final { private: /* Resolver storage. */ ncm::BoundedMap, 5> location_resolvers; @@ -31,17 +31,11 @@ namespace ams::lr { os::Mutex mutex{false}; public: /* Actual commands. */ - virtual Result OpenLocationResolver(sf::Out> out, ncm::StorageId storage_id) override; - virtual Result OpenRegisteredLocationResolver(sf::Out> out) override; - virtual Result RefreshLocationResolver(ncm::StorageId storage_id) override; - virtual Result OpenAddOnContentLocationResolver(sf::Out> out) override; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(OpenLocationResolver), - MAKE_SERVICE_COMMAND_META(OpenRegisteredLocationResolver), - MAKE_SERVICE_COMMAND_META(RefreshLocationResolver), - MAKE_SERVICE_COMMAND_META(OpenAddOnContentLocationResolver, hos::Version_2_0_0), - }; + Result OpenLocationResolver(sf::Out> out, ncm::StorageId storage_id); + Result OpenRegisteredLocationResolver(sf::Out> out); + Result RefreshLocationResolver(ncm::StorageId storage_id); + Result OpenAddOnContentLocationResolver(sf::Out> out); }; + static_assert(IsILocationResolverManager); } diff --git a/libstratosphere/include/stratosphere/ncm/ncm_content_manager_impl.hpp b/libstratosphere/include/stratosphere/ncm/ncm_content_manager_impl.hpp index 244aa3ff..ecff3306 100644 --- a/libstratosphere/include/stratosphere/ncm/ncm_content_manager_impl.hpp +++ b/libstratosphere/include/stratosphere/ncm/ncm_content_manager_impl.hpp @@ -67,7 +67,7 @@ namespace ams::ncm { }; static_assert(util::is_pod::value); - class ContentManagerImpl final : public IContentManager { + class ContentManagerImpl final { private: constexpr static size_t MaxContentStorageRoots = 8; constexpr static size_t MaxContentMetaDatabaseRoots = 8; @@ -131,21 +131,22 @@ namespace ams::ncm { Result EnsureAndMountSystemSaveData(const char *mount, const SystemSaveDataInfo &info) const; public: /* Actual commands. */ - virtual Result CreateContentStorage(StorageId storage_id) override; - virtual Result CreateContentMetaDatabase(StorageId storage_id) override; - virtual Result VerifyContentStorage(StorageId storage_id) override; - virtual Result VerifyContentMetaDatabase(StorageId storage_id) override; - virtual Result OpenContentStorage(sf::Out> out, StorageId storage_id) override; - virtual Result OpenContentMetaDatabase(sf::Out> out, StorageId storage_id) override; - virtual Result CloseContentStorageForcibly(StorageId storage_id) override; - virtual Result CloseContentMetaDatabaseForcibly(StorageId storage_id) override; - virtual Result CleanupContentMetaDatabase(StorageId storage_id) override; - virtual Result ActivateContentStorage(StorageId storage_id) override; - virtual Result InactivateContentStorage(StorageId storage_id) override; - virtual Result ActivateContentMetaDatabase(StorageId storage_id) override; - virtual Result InactivateContentMetaDatabase(StorageId storage_id) override; - virtual Result InvalidateRightsIdCache() override; - virtual Result GetMemoryReport(sf::Out out) override; + Result CreateContentStorage(StorageId storage_id); + Result CreateContentMetaDatabase(StorageId storage_id); + Result VerifyContentStorage(StorageId storage_id); + Result VerifyContentMetaDatabase(StorageId storage_id); + Result OpenContentStorage(sf::Out> out, StorageId storage_id); + Result OpenContentMetaDatabase(sf::Out> out, StorageId storage_id); + Result CloseContentStorageForcibly(StorageId storage_id); + Result CloseContentMetaDatabaseForcibly(StorageId storage_id); + Result CleanupContentMetaDatabase(StorageId storage_id); + Result ActivateContentStorage(StorageId storage_id); + Result InactivateContentStorage(StorageId storage_id); + Result ActivateContentMetaDatabase(StorageId storage_id); + Result InactivateContentMetaDatabase(StorageId storage_id); + Result InvalidateRightsIdCache(); + Result GetMemoryReport(sf::Out out); }; + static_assert(IsIContentManager); } diff --git a/libstratosphere/include/stratosphere/ncm/ncm_i_content_manager.hpp b/libstratosphere/include/stratosphere/ncm/ncm_i_content_manager.hpp index 1ddfd6aa..c65867ab 100644 --- a/libstratosphere/include/stratosphere/ncm/ncm_i_content_manager.hpp +++ b/libstratosphere/include/stratosphere/ncm/ncm_i_content_manager.hpp @@ -20,59 +20,23 @@ namespace ams::ncm { - class IContentManager : public sf::IServiceObject { - protected: - enum class CommandId { - CreateContentStorage = 0, - CreateContentMetaDatabase = 1, - VerifyContentStorage = 2, - VerifyContentMetaDatabase = 3, - OpenContentStorage = 4, - OpenContentMetaDatabase = 5, - CloseContentStorageForcibly = 6, - CloseContentMetaDatabaseForcibly = 7, - CleanupContentMetaDatabase = 8, - ActivateContentStorage = 9, - InactivateContentStorage = 10, - ActivateContentMetaDatabase = 11, - InactivateContentMetaDatabase = 12, - InvalidateRightsIdCache = 13, - GetMemoryReport = 14, - }; - public: - virtual Result CreateContentStorage(StorageId storage_id) = 0; - virtual Result CreateContentMetaDatabase(StorageId storage_id) = 0; - virtual Result VerifyContentStorage(StorageId storage_id) = 0; - virtual Result VerifyContentMetaDatabase(StorageId storage_id) = 0; - virtual Result OpenContentStorage(sf::Out> out, StorageId storage_id) = 0; - virtual Result OpenContentMetaDatabase(sf::Out> out, StorageId storage_id) = 0; - virtual Result CloseContentStorageForcibly(StorageId storage_id) = 0; - virtual Result CloseContentMetaDatabaseForcibly(StorageId storage_id) = 0; - virtual Result CleanupContentMetaDatabase(StorageId storage_id) = 0; - virtual Result ActivateContentStorage(StorageId storage_id) = 0; - virtual Result InactivateContentStorage(StorageId storage_id) = 0; - virtual Result ActivateContentMetaDatabase(StorageId storage_id) = 0; - virtual Result InactivateContentMetaDatabase(StorageId storage_id) = 0; - virtual Result InvalidateRightsIdCache() = 0; - virtual Result GetMemoryReport(sf::Out out) = 0; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(CreateContentStorage), - MAKE_SERVICE_COMMAND_META(CreateContentMetaDatabase), - MAKE_SERVICE_COMMAND_META(VerifyContentStorage), - MAKE_SERVICE_COMMAND_META(VerifyContentMetaDatabase), - MAKE_SERVICE_COMMAND_META(OpenContentStorage), - MAKE_SERVICE_COMMAND_META(OpenContentMetaDatabase), - MAKE_SERVICE_COMMAND_META(CloseContentStorageForcibly, hos::Version_1_0_0, hos::Version_1_0_0), - MAKE_SERVICE_COMMAND_META(CloseContentMetaDatabaseForcibly, hos::Version_1_0_0, hos::Version_1_0_0), - MAKE_SERVICE_COMMAND_META(CleanupContentMetaDatabase), - MAKE_SERVICE_COMMAND_META(ActivateContentStorage, hos::Version_2_0_0), - MAKE_SERVICE_COMMAND_META(InactivateContentStorage, hos::Version_2_0_0), - MAKE_SERVICE_COMMAND_META(ActivateContentMetaDatabase, hos::Version_2_0_0), - MAKE_SERVICE_COMMAND_META(InactivateContentMetaDatabase, hos::Version_2_0_0), - MAKE_SERVICE_COMMAND_META(InvalidateRightsIdCache, hos::Version_9_0_0), - MAKE_SERVICE_COMMAND_META(GetMemoryReport, hos::Version_10_0_0), - }; - }; + #define AMS_NCM_I_CONTENT_MANAGER_INTERFACE_INFO(C, H) \ + 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> out, StorageId storage_id)) \ + AMS_SF_METHOD_INFO(C, H, 5, Result, OpenContentMetaDatabase, (sf::Out> 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 out), hos::Version_10_0_0) + + AMS_SF_DEFINE_INTERFACE(IContentManager, AMS_NCM_I_CONTENT_MANAGER_INTERFACE_INFO); } diff --git a/libstratosphere/include/stratosphere/ncm/ncm_i_content_meta_database.hpp b/libstratosphere/include/stratosphere/ncm/ncm_i_content_meta_database.hpp index 98b001c2..b7d81067 100644 --- a/libstratosphere/include/stratosphere/ncm/ncm_i_content_meta_database.hpp +++ b/libstratosphere/include/stratosphere/ncm/ncm_i_content_meta_database.hpp @@ -19,84 +19,31 @@ namespace ams::ncm { - class IContentMetaDatabase : public sf::IServiceObject { - protected: - enum class CommandId { - Set = 0, - Get = 1, - Remove = 2, - GetContentIdByType = 3, - ListContentInfo = 4, - List = 5, - GetLatestContentMetaKey = 6, - ListApplication = 7, - Has = 8, - HasAll = 9, - GetSize = 10, - GetRequiredSystemVersion = 11, - GetPatchId = 12, - DisableForcibly = 13, - LookupOrphanContent = 14, - Commit = 15, - HasContent = 16, - ListContentMetaInfo = 17, - GetAttributes = 18, - GetRequiredApplicationVersion = 19, - GetContentIdByTypeAndIdOffset = 20, - GetCount = 21, - GetOwnerApplicationId = 22, - }; - public: - /* Actual commands. */ - virtual Result Set(const ContentMetaKey &key, sf::InBuffer value) = 0; - virtual Result Get(sf::Out out_size, const ContentMetaKey &key, sf::OutBuffer out_value) = 0; - virtual Result Remove(const ContentMetaKey &key) = 0; - virtual Result GetContentIdByType(sf::Out out_content_id, const ContentMetaKey &key, ContentType type) = 0; - virtual Result ListContentInfo(sf::Out out_entries_written, const sf::OutArray &out_info, const ContentMetaKey &key, s32 offset) = 0; - virtual Result List(sf::Out out_entries_total, sf::Out out_entries_written, const sf::OutArray &out_info, ContentMetaType meta_type, ApplicationId application_id, u64 min, u64 max, ContentInstallType install_type) = 0; - virtual Result GetLatestContentMetaKey(sf::Out out_key, u64 id) = 0; - virtual Result ListApplication(sf::Out out_entries_total, sf::Out out_entries_written, const sf::OutArray &out_keys, ContentMetaType meta_type) = 0; - virtual Result Has(sf::Out out, const ContentMetaKey &key) = 0; - virtual Result HasAll(sf::Out out, const sf::InArray &keys) = 0; - virtual Result GetSize(sf::Out out_size, const ContentMetaKey &key) = 0; - virtual Result GetRequiredSystemVersion(sf::Out out_version, const ContentMetaKey &key) = 0; - virtual Result GetPatchId(sf::Out out_patch_id, const ContentMetaKey &key) = 0; - virtual Result DisableForcibly() = 0; - virtual Result LookupOrphanContent(const sf::OutArray &out_orphaned, const sf::InArray &content_ids) = 0; - virtual Result Commit() = 0; - virtual Result HasContent(sf::Out out, const ContentMetaKey &key, const ContentId &content_id) = 0; - virtual Result ListContentMetaInfo(sf::Out out_entries_written, const sf::OutArray &out_meta_info, const ContentMetaKey &key, s32 offset) = 0; - virtual Result GetAttributes(sf::Out out_attributes, const ContentMetaKey &key) = 0; - virtual Result GetRequiredApplicationVersion(sf::Out out_version, const ContentMetaKey &key) = 0; - virtual Result GetContentIdByTypeAndIdOffset(sf::Out out_content_id, const ContentMetaKey &key, ContentType type, u8 id_offset) = 0; - virtual Result GetCount(sf::Out out_count) = 0; - virtual Result GetOwnerApplicationId(sf::Out out_id, const ContentMetaKey &key) = 0; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(Set), - MAKE_SERVICE_COMMAND_META(Get), - MAKE_SERVICE_COMMAND_META(Remove), - MAKE_SERVICE_COMMAND_META(GetContentIdByType), - MAKE_SERVICE_COMMAND_META(ListContentInfo), - MAKE_SERVICE_COMMAND_META(List), - MAKE_SERVICE_COMMAND_META(GetLatestContentMetaKey), - MAKE_SERVICE_COMMAND_META(ListApplication), - MAKE_SERVICE_COMMAND_META(Has), - MAKE_SERVICE_COMMAND_META(HasAll), - MAKE_SERVICE_COMMAND_META(GetSize), - MAKE_SERVICE_COMMAND_META(GetRequiredSystemVersion), - MAKE_SERVICE_COMMAND_META(GetPatchId), - MAKE_SERVICE_COMMAND_META(DisableForcibly), - MAKE_SERVICE_COMMAND_META(LookupOrphanContent), - MAKE_SERVICE_COMMAND_META(Commit), - MAKE_SERVICE_COMMAND_META(HasContent), - MAKE_SERVICE_COMMAND_META(ListContentMetaInfo), - MAKE_SERVICE_COMMAND_META(GetAttributes), - MAKE_SERVICE_COMMAND_META(GetRequiredApplicationVersion, hos::Version_2_0_0), - MAKE_SERVICE_COMMAND_META(GetContentIdByTypeAndIdOffset, hos::Version_5_0_0), - MAKE_SERVICE_COMMAND_META(GetCount, hos::Version_10_0_0), - MAKE_SERVICE_COMMAND_META(GetOwnerApplicationId, hos::Version_10_0_0), - }; - }; + #define AMS_NCM_I_CONTENT_META_DATABASE_INTERFACE_INFO(C, H) \ + 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 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 out_content_id, const ContentMetaKey &key, ContentType type)) \ + AMS_SF_METHOD_INFO(C, H, 4, Result, ListContentInfo, (sf::Out out_entries_written, const sf::OutArray &out_info, const ContentMetaKey &key, s32 offset)) \ + AMS_SF_METHOD_INFO(C, H, 5, Result, List, (sf::Out out_entries_total, sf::Out out_entries_written, const sf::OutArray &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 out_key, u64 id)) \ + AMS_SF_METHOD_INFO(C, H, 7, Result, ListApplication, (sf::Out out_entries_total, sf::Out out_entries_written, const sf::OutArray &out_keys, ContentMetaType meta_type)) \ + AMS_SF_METHOD_INFO(C, H, 8, Result, Has, (sf::Out out, const ContentMetaKey &key)) \ + AMS_SF_METHOD_INFO(C, H, 9, Result, HasAll, (sf::Out out, const sf::InArray &keys)) \ + AMS_SF_METHOD_INFO(C, H, 10, Result, GetSize, (sf::Out out_size, const ContentMetaKey &key)) \ + AMS_SF_METHOD_INFO(C, H, 11, Result, GetRequiredSystemVersion, (sf::Out out_version, const ContentMetaKey &key)) \ + AMS_SF_METHOD_INFO(C, H, 12, Result, GetPatchId, (sf::Out 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 &out_orphaned, const sf::InArray &content_ids)) \ + AMS_SF_METHOD_INFO(C, H, 15, Result, Commit, ()) \ + AMS_SF_METHOD_INFO(C, H, 16, Result, HasContent, (sf::Out out, const ContentMetaKey &key, const ContentId &content_id)) \ + AMS_SF_METHOD_INFO(C, H, 17, Result, ListContentMetaInfo, (sf::Out out_entries_written, const sf::OutArray &out_meta_info, const ContentMetaKey &key, s32 offset)) \ + AMS_SF_METHOD_INFO(C, H, 18, Result, GetAttributes, (sf::Out out_attributes, const ContentMetaKey &key)) \ + AMS_SF_METHOD_INFO(C, H, 19, Result, GetRequiredApplicationVersion, (sf::Out out_version, const ContentMetaKey &key), hos::Version_2_0_0) \ + AMS_SF_METHOD_INFO(C, H, 20, Result, GetContentIdByTypeAndIdOffset, (sf::Out 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 out_count), hos::Version_10_0_0) \ + AMS_SF_METHOD_INFO(C, H, 22, Result, GetOwnerApplicationId, (sf::Out out_id, const ContentMetaKey &key), hos::Version_10_0_0) + + AMS_SF_DEFINE_INTERFACE(IContentMetaDatabase, AMS_NCM_I_CONTENT_META_DATABASE_INTERFACE_INFO) } diff --git a/libstratosphere/include/stratosphere/ncm/ncm_i_content_storage.hpp b/libstratosphere/include/stratosphere/ncm/ncm_i_content_storage.hpp index abe07067..6ab43bb9 100644 --- a/libstratosphere/include/stratosphere/ncm/ncm_i_content_storage.hpp +++ b/libstratosphere/include/stratosphere/ncm/ncm_i_content_storage.hpp @@ -22,109 +22,38 @@ namespace ams::ncm { - class IContentStorage : public sf::IServiceObject { - NON_COPYABLE(IContentStorage); - NON_MOVEABLE(IContentStorage); - protected: - enum class CommandId { - GeneratePlaceHolderId = 0, - CreatePlaceHolder = 1, - DeletePlaceHolder = 2, - HasPlaceHolder = 3, - WritePlaceHolder = 4, - Register = 5, - Delete = 6, - Has = 7, - GetPath = 8, - GetPlaceHolderPath = 9, - CleanupAllPlaceHolder = 10, - ListPlaceHolder = 11, - GetContentCount = 12, - ListContentId = 13, - GetSizeFromContentId = 14, - DisableForcibly = 15, - RevertToPlaceHolder = 16, - SetPlaceHolderSize = 17, - ReadContentIdFile = 18, - GetRightsIdFromPlaceHolderIdDeprecated = 19, - GetRightsIdFromPlaceHolderId = 19, - GetRightsIdFromContentIdDeprecated = 20, - GetRightsIdFromContentId = 20, - WriteContentForDebug = 21, - GetFreeSpaceSize = 22, - GetTotalSpaceSize = 23, - FlushPlaceHolder = 24, - GetSizeFromPlaceHolderId = 25, - RepairInvalidFileAttribute = 26, - GetRightsIdFromPlaceHolderIdWithCache = 27, - }; - public: - IContentStorage() { /* ... */ } - public: - virtual Result GeneratePlaceHolderId(sf::Out out) = 0; - virtual Result CreatePlaceHolder(PlaceHolderId placeholder_id, ContentId content_id, s64 size) = 0; - virtual Result DeletePlaceHolder(PlaceHolderId placeholder_id) = 0; - virtual Result HasPlaceHolder(sf::Out out, PlaceHolderId placeholder_id) = 0; - virtual Result WritePlaceHolder(PlaceHolderId placeholder_id, s64 offset, sf::InBuffer data) = 0; - virtual Result Register(PlaceHolderId placeholder_id, ContentId content_id) = 0; - virtual Result Delete(ContentId content_id) = 0; - virtual Result Has(sf::Out out, ContentId content_id) = 0; - virtual Result GetPath(sf::Out out, ContentId content_id) = 0; - virtual Result GetPlaceHolderPath(sf::Out out, PlaceHolderId placeholder_id) = 0; - virtual Result CleanupAllPlaceHolder() = 0; - virtual Result ListPlaceHolder(sf::Out out_count, const sf::OutArray &out_buf) = 0; - virtual Result GetContentCount(sf::Out out_count) = 0; - virtual Result ListContentId(sf::Out out_count, const sf::OutArray &out_buf, s32 start_offset) = 0; - virtual Result GetSizeFromContentId(sf::Out out_size, ContentId content_id) = 0; - virtual Result DisableForcibly() = 0; - virtual Result RevertToPlaceHolder(PlaceHolderId placeholder_id, ContentId old_content_id, ContentId new_content_id) = 0; - virtual Result SetPlaceHolderSize(PlaceHolderId placeholder_id, s64 size) = 0; - virtual Result ReadContentIdFile(sf::OutBuffer buf, ContentId content_id, s64 offset) = 0; - virtual Result GetRightsIdFromPlaceHolderIdDeprecated(sf::Out out_rights_id, PlaceHolderId placeholder_id) = 0; - virtual Result GetRightsIdFromPlaceHolderId(sf::Out out_rights_id, PlaceHolderId placeholder_id) = 0; - virtual Result GetRightsIdFromContentIdDeprecated(sf::Out out_rights_id, ContentId content_id) = 0; - virtual Result GetRightsIdFromContentId(sf::Out out_rights_id, ContentId content_id) = 0; - virtual Result WriteContentForDebug(ContentId content_id, s64 offset, sf::InBuffer data) = 0; - virtual Result GetFreeSpaceSize(sf::Out out_size) = 0; - virtual Result GetTotalSpaceSize(sf::Out out_size) = 0; - virtual Result FlushPlaceHolder() = 0; - virtual Result GetSizeFromPlaceHolderId(sf::Out out, PlaceHolderId placeholder_id) = 0; - virtual Result RepairInvalidFileAttribute() = 0; - virtual Result GetRightsIdFromPlaceHolderIdWithCache(sf::Out out_rights_id, PlaceHolderId placeholder_id, ContentId cache_content_id) = 0; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(GeneratePlaceHolderId), - MAKE_SERVICE_COMMAND_META(CreatePlaceHolder), - MAKE_SERVICE_COMMAND_META(DeletePlaceHolder), - MAKE_SERVICE_COMMAND_META(HasPlaceHolder), - MAKE_SERVICE_COMMAND_META(WritePlaceHolder), - MAKE_SERVICE_COMMAND_META(Register), - MAKE_SERVICE_COMMAND_META(Delete), - MAKE_SERVICE_COMMAND_META(Has), - MAKE_SERVICE_COMMAND_META(GetPath), - MAKE_SERVICE_COMMAND_META(GetPlaceHolderPath), - MAKE_SERVICE_COMMAND_META(CleanupAllPlaceHolder), - MAKE_SERVICE_COMMAND_META(ListPlaceHolder), - MAKE_SERVICE_COMMAND_META(GeneratePlaceHolderId), - MAKE_SERVICE_COMMAND_META(GetContentCount), - MAKE_SERVICE_COMMAND_META(ListContentId), - MAKE_SERVICE_COMMAND_META(GetSizeFromContentId), - MAKE_SERVICE_COMMAND_META(DisableForcibly), - MAKE_SERVICE_COMMAND_META(RevertToPlaceHolder, hos::Version_2_0_0), - MAKE_SERVICE_COMMAND_META(SetPlaceHolderSize, hos::Version_2_0_0), - MAKE_SERVICE_COMMAND_META(ReadContentIdFile, hos::Version_2_0_0), - MAKE_SERVICE_COMMAND_META(GetRightsIdFromPlaceHolderIdDeprecated, hos::Version_2_0_0, hos::Version_2_3_0), - MAKE_SERVICE_COMMAND_META(GetRightsIdFromPlaceHolderId, hos::Version_3_0_0), - MAKE_SERVICE_COMMAND_META(GetRightsIdFromContentIdDeprecated, hos::Version_2_0_0, hos::Version_2_3_0), - MAKE_SERVICE_COMMAND_META(GetRightsIdFromContentId, hos::Version_3_0_0), - MAKE_SERVICE_COMMAND_META(WriteContentForDebug, hos::Version_2_0_0), - MAKE_SERVICE_COMMAND_META(GetFreeSpaceSize, hos::Version_2_0_0), - MAKE_SERVICE_COMMAND_META(GetTotalSpaceSize, hos::Version_2_0_0), - MAKE_SERVICE_COMMAND_META(FlushPlaceHolder, hos::Version_3_0_0), - MAKE_SERVICE_COMMAND_META(GetSizeFromPlaceHolderId, hos::Version_4_0_0), - MAKE_SERVICE_COMMAND_META(RepairInvalidFileAttribute, hos::Version_4_0_0), - MAKE_SERVICE_COMMAND_META(GetRightsIdFromPlaceHolderIdWithCache, hos::Version_8_0_0), - }; - }; + #define AMS_NCM_I_CONTENT_STORAGE_INTERFACE_INFO(C, H) \ + AMS_SF_METHOD_INFO(C, H, 0, Result, GeneratePlaceHolderId, (sf::Out 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 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 out, ContentId content_id)) \ + AMS_SF_METHOD_INFO(C, H, 8, Result, GetPath, (sf::Out out, ContentId content_id)) \ + AMS_SF_METHOD_INFO(C, H, 9, Result, GetPlaceHolderPath, (sf::Out out, PlaceHolderId placeholder_id)) \ + AMS_SF_METHOD_INFO(C, H, 10, Result, CleanupAllPlaceHolder, ()) \ + AMS_SF_METHOD_INFO(C, H, 11, Result, ListPlaceHolder, (sf::Out out_count, const sf::OutArray &out_buf)) \ + AMS_SF_METHOD_INFO(C, H, 12, Result, GetContentCount, (sf::Out out_count)) \ + AMS_SF_METHOD_INFO(C, H, 13, Result, ListContentId, (sf::Out out_count, const sf::OutArray &out_buf, s32 start_offset)) \ + AMS_SF_METHOD_INFO(C, H, 14, Result, GetSizeFromContentId, (sf::Out 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 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 out_rights_id, PlaceHolderId placeholder_id), hos::Version_3_0_0) \ + AMS_SF_METHOD_INFO(C, H, 20, Result, GetRightsIdFromContentIdDeprecated, (sf::Out 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 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 out_size), hos::Version_2_0_0) \ + AMS_SF_METHOD_INFO(C, H, 23, Result, GetTotalSpaceSize, (sf::Out 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 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 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) } diff --git a/libstratosphere/include/stratosphere/ns.hpp b/libstratosphere/include/stratosphere/ns.hpp new file mode 100644 index 00000000..8e7d2a60 --- /dev/null +++ b/libstratosphere/include/stratosphere/ns.hpp @@ -0,0 +1,19 @@ +/* + * 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 . + */ + +#pragma once + +#include diff --git a/libstratosphere/include/stratosphere/ns/impl/ns_i_async.hpp b/libstratosphere/include/stratosphere/ns/impl/ns_i_async.hpp new file mode 100644 index 00000000..1d4885da --- /dev/null +++ b/libstratosphere/include/stratosphere/ns/impl/ns_i_async.hpp @@ -0,0 +1,31 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include + +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)) + + AMS_SF_DEFINE_INTERFACE(IAsyncResult, AMS_NS_I_ASYNC_RESULT_INTERFACE_INFO) + +} diff --git a/libstratosphere/include/stratosphere/pgl/sf/pgl_sf_i_event_observer.hpp b/libstratosphere/include/stratosphere/pgl/sf/pgl_sf_i_event_observer.hpp index d3e147e9..d212ab30 100644 --- a/libstratosphere/include/stratosphere/pgl/sf/pgl_sf_i_event_observer.hpp +++ b/libstratosphere/include/stratosphere/pgl/sf/pgl_sf_i_event_observer.hpp @@ -22,21 +22,10 @@ namespace ams::pgl::sf { - class IEventObserver : public ams::sf::IServiceObject { - protected: - enum class CommandId { - GetProcessEventHandle = 0, - GetProcessEventInfo = 1, - }; - public: - /* Actual commands. */ - virtual Result GetProcessEventHandle(ams::sf::OutCopyHandle out) = 0; - virtual Result GetProcessEventInfo(ams::sf::Out out) = 0; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(GetProcessEventHandle), - MAKE_SERVICE_COMMAND_META(GetProcessEventInfo), - }; - }; + #define AMS_PGL_I_EVENT_OBSERVER_INTERFACE_INFO(C, H) \ + 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 out)) + + AMS_SF_DEFINE_INTERFACE(IEventObserver, AMS_PGL_I_EVENT_OBSERVER_INTERFACE_INFO); } \ No newline at end of file diff --git a/libstratosphere/include/stratosphere/pgl/sf/pgl_sf_i_shell_interface.hpp b/libstratosphere/include/stratosphere/pgl/sf/pgl_sf_i_shell_interface.hpp index c44d7292..9046b2ef 100644 --- a/libstratosphere/include/stratosphere/pgl/sf/pgl_sf_i_shell_interface.hpp +++ b/libstratosphere/include/stratosphere/pgl/sf/pgl_sf_i_shell_interface.hpp @@ -23,52 +23,22 @@ namespace ams::pgl::sf { - class IShellInterface : public ams::sf::IServiceObject { - protected: - enum class CommandId { - LaunchProgram = 0, - TerminateProcess = 1, - LaunchProgramFromHost = 2, - GetHostContentMetaInfo = 4, - GetApplicationProcessId = 5, - BoostSystemMemoryResourceLimit = 6, - IsProcessTracked = 7, - EnableApplicationCrashReport = 8, - IsApplicationCrashReportEnabled = 9, - EnableApplicationAllThreadDumpOnCrash = 10, - TriggerApplicationSnapShotDumper = 12, - GetShellEventObserver = 20, - }; - public: - /* Actual commands. */ - virtual Result LaunchProgram(ams::sf::Out out, const ncm::ProgramLocation &loc, u32 pm_flags, u8 pgl_flags) = 0; - virtual Result TerminateProcess(os::ProcessId process_id) = 0; - virtual Result LaunchProgramFromHost(ams::sf::Out out, const ams::sf::InBuffer &content_path, u32 pm_flags) = 0; - virtual Result GetHostContentMetaInfo(ams::sf::Out out, const ams::sf::InBuffer &content_path) = 0; - virtual Result GetApplicationProcessId(ams::sf::Out out) = 0; - virtual Result BoostSystemMemoryResourceLimit(u64 size) = 0; - virtual Result IsProcessTracked(ams::sf::Out out, os::ProcessId process_id) = 0; - virtual Result EnableApplicationCrashReport(bool enabled) = 0; - virtual Result IsApplicationCrashReportEnabled(ams::sf::Out out) = 0; - virtual Result EnableApplicationAllThreadDumpOnCrash(bool enabled) = 0; - virtual Result TriggerApplicationSnapShotDumper(SnapShotDumpType dump_type, const ams::sf::InBuffer &arg) = 0; + #define AMS_PGL_I_SHELL_INTERFACE_INTERFACE_INFO(C, H) \ + AMS_SF_METHOD_INFO(C, H, 0, Result, LaunchProgram, (ams::sf::Out 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 out, const ams::sf::InBuffer &content_path, u32 pm_flags)) \ + AMS_SF_METHOD_INFO(C, H, 4, Result, GetHostContentMetaInfo, (ams::sf::Out out, const ams::sf::InBuffer &content_path)) \ + AMS_SF_METHOD_INFO(C, H, 5, Result, GetApplicationProcessId, (ams::sf::Out out)) \ + AMS_SF_METHOD_INFO(C, H, 6, Result, BoostSystemMemoryResourceLimit, (u64 size)) \ + AMS_SF_METHOD_INFO(C, H, 7, Result, IsProcessTracked, (ams::sf::Out 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 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> out)) + + AMS_SF_DEFINE_INTERFACE(IShellInterface, AMS_PGL_I_SHELL_INTERFACE_INTERFACE_INFO); + - virtual Result GetShellEventObserver(ams::sf::Out> out) = 0; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(LaunchProgram), - MAKE_SERVICE_COMMAND_META(TerminateProcess), - MAKE_SERVICE_COMMAND_META(LaunchProgramFromHost), - MAKE_SERVICE_COMMAND_META(GetHostContentMetaInfo), - MAKE_SERVICE_COMMAND_META(GetApplicationProcessId), - MAKE_SERVICE_COMMAND_META(BoostSystemMemoryResourceLimit), - MAKE_SERVICE_COMMAND_META(IsProcessTracked), - MAKE_SERVICE_COMMAND_META(EnableApplicationCrashReport), - MAKE_SERVICE_COMMAND_META(IsApplicationCrashReportEnabled), - MAKE_SERVICE_COMMAND_META(EnableApplicationAllThreadDumpOnCrash), - MAKE_SERVICE_COMMAND_META(TriggerApplicationSnapShotDumper), - MAKE_SERVICE_COMMAND_META(GetShellEventObserver), - }; - }; } \ No newline at end of file diff --git a/libstratosphere/include/stratosphere/pgl/srv/pgl_srv_shell_interface.hpp b/libstratosphere/include/stratosphere/pgl/srv/pgl_srv_shell_interface.hpp index 40f74f3b..3487c550 100644 --- a/libstratosphere/include/stratosphere/pgl/srv/pgl_srv_shell_interface.hpp +++ b/libstratosphere/include/stratosphere/pgl/srv/pgl_srv_shell_interface.hpp @@ -20,7 +20,7 @@ namespace ams::pgl::srv { - class ShellInterface final : public pgl::sf::IShellInterface { + class ShellInterface final { NON_COPYABLE(ShellInterface); NON_MOVEABLE(ShellInterface); private: @@ -34,19 +34,20 @@ namespace ams::pgl::srv { } public: /* Interface commands. */ - virtual Result LaunchProgram(ams::sf::Out out, const ncm::ProgramLocation &loc, u32 pm_flags, u8 pgl_flags) override final; - virtual Result TerminateProcess(os::ProcessId process_id) override final; - virtual Result LaunchProgramFromHost(ams::sf::Out out, const ams::sf::InBuffer &content_path, u32 pm_flags) override final; - virtual Result GetHostContentMetaInfo(ams::sf::Out out, const ams::sf::InBuffer &content_path) override final; - virtual Result GetApplicationProcessId(ams::sf::Out out) override final; - virtual Result BoostSystemMemoryResourceLimit(u64 size) override final; - virtual Result IsProcessTracked(ams::sf::Out out, os::ProcessId process_id) override final; - virtual Result EnableApplicationCrashReport(bool enabled) override final; - virtual Result IsApplicationCrashReportEnabled(ams::sf::Out out) override final; - virtual Result EnableApplicationAllThreadDumpOnCrash(bool enabled) override final; - virtual Result TriggerApplicationSnapShotDumper(SnapShotDumpType dump_type, const ams::sf::InBuffer &arg) override final; + Result LaunchProgram(ams::sf::Out out, const ncm::ProgramLocation &loc, u32 pm_flags, u8 pgl_flags); + Result TerminateProcess(os::ProcessId process_id); + Result LaunchProgramFromHost(ams::sf::Out out, const ams::sf::InBuffer &content_path, u32 pm_flags); + Result GetHostContentMetaInfo(ams::sf::Out out, const ams::sf::InBuffer &content_path); + Result GetApplicationProcessId(ams::sf::Out out); + Result BoostSystemMemoryResourceLimit(u64 size); + Result IsProcessTracked(ams::sf::Out out, os::ProcessId process_id); + Result EnableApplicationCrashReport(bool enabled); + Result IsApplicationCrashReportEnabled(ams::sf::Out out); + Result EnableApplicationAllThreadDumpOnCrash(bool enabled); + Result TriggerApplicationSnapShotDumper(SnapShotDumpType dump_type, const ams::sf::InBuffer &arg); - virtual Result GetShellEventObserver(ams::sf::Out> out) override final; + Result GetShellEventObserver(ams::sf::Out> out); }; + static_assert(pgl::sf::IsIShellInterface); } diff --git a/libstratosphere/include/stratosphere/pm.hpp b/libstratosphere/include/stratosphere/pm.hpp index 801993fc..5b252aef 100644 --- a/libstratosphere/include/stratosphere/pm.hpp +++ b/libstratosphere/include/stratosphere/pm.hpp @@ -16,8 +16,12 @@ #pragma once -#include "pm/pm_types.hpp" -#include "pm/pm_boot_mode_api.hpp" -#include "pm/pm_info_api.hpp" -#include "pm/pm_shell_api.hpp" -#include "pm/pm_dmnt_api.hpp" \ No newline at end of file +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/libstratosphere/include/stratosphere/pm/impl/pm_boot_mode_interface.hpp b/libstratosphere/include/stratosphere/pm/impl/pm_boot_mode_interface.hpp new file mode 100644 index 00000000..9f37bacc --- /dev/null +++ b/libstratosphere/include/stratosphere/pm/impl/pm_boot_mode_interface.hpp @@ -0,0 +1,30 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include + +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 out)) \ + AMS_SF_METHOD_INFO(C, H, 1, void, SetMaintenanceBoot, ()) + + AMS_SF_DEFINE_INTERFACE(IBootModeInterface, AMS_PM_I_BOOT_MODE_INTERFACE_INTERFACE_INFO) + +} diff --git a/libstratosphere/include/stratosphere/pm/impl/pm_debug_monitor_interface.hpp b/libstratosphere/include/stratosphere/pm/impl/pm_debug_monitor_interface.hpp new file mode 100644 index 00000000..1e3bfa6d --- /dev/null +++ b/libstratosphere/include/stratosphere/pm/impl/pm_debug_monitor_interface.hpp @@ -0,0 +1,50 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include + +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 out_count, const sf::OutArray &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 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 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 out_loc, sf::Out out_status, os::ProcessId process_id)) \ + AMS_SF_METHOD_INFO(C, H, 65001, Result, AtmosphereGetCurrentLimitInfo, (sf::Out out_cur_val, sf::Out 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 out_count, const sf::OutBuffer &out_buf, u64 unused)) \ + AMS_SF_METHOD_INFO(C, H, 1, Result, GetExceptionProcessIdList, (sf::Out out_count, const sf::OutArray &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 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 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 out_loc, sf::Out out_status, os::ProcessId process_id)) \ + AMS_SF_METHOD_INFO(C, H, 65001, Result, AtmosphereGetCurrentLimitInfo, (sf::Out out_cur_val, sf::Out out_lim_val, u32 group, u32 resource)) + + AMS_SF_DEFINE_INTERFACE(IDeprecatedDebugMonitorInterface, AMS_PM_I_DEPRECATED_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO) + +} diff --git a/libstratosphere/include/stratosphere/pm/impl/pm_information_interface.hpp b/libstratosphere/include/stratosphere/pm/impl/pm_information_interface.hpp new file mode 100644 index 00000000..c09b3b20 --- /dev/null +++ b/libstratosphere/include/stratosphere/pm/impl/pm_information_interface.hpp @@ -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 . + */ + +#pragma once +#include +#include +#include + +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 out, os::ProcessId process_id)) \ + AMS_SF_METHOD_INFO(C, H, 65000, Result, AtmosphereGetProcessId, (sf::Out out, ncm::ProgramId program_id)) \ + AMS_SF_METHOD_INFO(C, H, 65001, Result, AtmosphereHasLaunchedProgram, (sf::Out out, ncm::ProgramId program_id)) \ + AMS_SF_METHOD_INFO(C, H, 65002, Result, AtmosphereGetProcessInfo, (sf::Out out_loc, sf::Out out_status, os::ProcessId process_id)) + + AMS_SF_DEFINE_INTERFACE(IInformationInterface, AMS_PM_I_INFORMATION_INTERFACE_INTERFACE_INFO) + +} diff --git a/libstratosphere/include/stratosphere/pm/impl/pm_shell_interface.hpp b/libstratosphere/include/stratosphere/pm/impl/pm_shell_interface.hpp new file mode 100644 index 00000000..1343b791 --- /dev/null +++ b/libstratosphere/include/stratosphere/pm/impl/pm_shell_interface.hpp @@ -0,0 +1,52 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include + +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 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 out)) \ + AMS_SF_METHOD_INFO(C, H, 5, void, NotifyBootFinished, ()) \ + AMS_SF_METHOD_INFO(C, H, 6, Result, GetApplicationProcessIdForShell, (sf::Out 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 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 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 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) + +} diff --git a/libstratosphere/include/stratosphere/psc/sf/psc_sf_i_pm_module.hpp b/libstratosphere/include/stratosphere/psc/sf/psc_sf_i_pm_module.hpp index 5673bd4a..42fd75d3 100644 --- a/libstratosphere/include/stratosphere/psc/sf/psc_sf_i_pm_module.hpp +++ b/libstratosphere/include/stratosphere/psc/sf/psc_sf_i_pm_module.hpp @@ -21,30 +21,13 @@ namespace ams::psc::sf { - class IPmModule : public ams::sf::IServiceObject { - protected: - enum class CommandId { - Initialize = 0, - GetRequest = 1, - Acknowledge = 2, - Finalize = 3, - AcknowledgeEx = 4, - }; - public: - /* Actual commands. */ - virtual Result Initialize(ams::sf::OutCopyHandle out, psc::PmModuleId module_id, const ams::sf::InBuffer &child_list) = 0; - virtual Result GetRequest(ams::sf::Out out_state, ams::sf::Out out_flags) = 0; - virtual Result Acknowledge() = 0; - virtual Result Finalize() = 0; - virtual Result AcknowledgeEx(PmState state) = 0; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(Initialize), - MAKE_SERVICE_COMMAND_META(GetRequest), - MAKE_SERVICE_COMMAND_META(Acknowledge), - MAKE_SERVICE_COMMAND_META(Finalize), - MAKE_SERVICE_COMMAND_META(AcknowledgeEx, hos::Version_5_1_0), - }; - }; + #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)) \ + AMS_SF_METHOD_INFO(C, H, 1, Result, GetRequest, (ams::sf::Out out_state, ams::sf::Out 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) } \ No newline at end of file diff --git a/libstratosphere/include/stratosphere/psc/sf/psc_sf_i_pm_service.hpp b/libstratosphere/include/stratosphere/psc/sf/psc_sf_i_pm_service.hpp index f4bf8cc8..f4dffbeb 100644 --- a/libstratosphere/include/stratosphere/psc/sf/psc_sf_i_pm_service.hpp +++ b/libstratosphere/include/stratosphere/psc/sf/psc_sf_i_pm_service.hpp @@ -20,18 +20,9 @@ namespace ams::psc::sf { - class IPmService : public ams::sf::IServiceObject { - protected: - enum class CommandId { - Initialize = 0, - }; - public: - /* Actual commands. */ - virtual Result Initialize(ams::sf::Out> out) = 0; - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(Initialize), - }; - }; + #define AMS_PSC_I_PM_SERVICE_INTERFACE_INFO(C, H) \ + AMS_SF_METHOD_INFO(C, H, 0, Result, Initialize, (ams::sf::Out> out)) + + AMS_SF_DEFINE_INTERFACE(IPmService, AMS_PSC_I_PM_SERVICE_INTERFACE_INFO) } \ No newline at end of file diff --git a/libstratosphere/include/stratosphere/ro.hpp b/libstratosphere/include/stratosphere/ro.hpp index a5972ab3..d3a69522 100644 --- a/libstratosphere/include/stratosphere/ro.hpp +++ b/libstratosphere/include/stratosphere/ro.hpp @@ -16,4 +16,6 @@ #pragma once -#include "ro/ro_types.hpp" +#include +#include +#include diff --git a/libstratosphere/include/stratosphere/ro/impl/ro_debug_monitor_interface.hpp b/libstratosphere/include/stratosphere/ro/impl/ro_debug_monitor_interface.hpp new file mode 100644 index 00000000..40e703a8 --- /dev/null +++ b/libstratosphere/include/stratosphere/ro/impl/ro_debug_monitor_interface.hpp @@ -0,0 +1,29 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include + +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 out_count, const sf::OutArray &out_infos, os::ProcessId process_id)) + + AMS_SF_DEFINE_INTERFACE(IDebugMonitorInterface, AMS_RO_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO) + +} diff --git a/libstratosphere/include/stratosphere/ro/impl/ro_ro_interface.hpp b/libstratosphere/include/stratosphere/ro/impl/ro_ro_interface.hpp new file mode 100644 index 00000000..624d1e5d --- /dev/null +++ b/libstratosphere/include/stratosphere/ro/impl/ro_ro_interface.hpp @@ -0,0 +1,34 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include + +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 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, RegisterModuleInfoEx, (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) + +} diff --git a/libstratosphere/include/stratosphere/sf.hpp b/libstratosphere/include/stratosphere/sf.hpp index 333391f7..77568edf 100644 --- a/libstratosphere/include/stratosphere/sf.hpp +++ b/libstratosphere/include/stratosphere/sf.hpp @@ -28,6 +28,7 @@ #include #include #include +#include #include diff --git a/libstratosphere/include/stratosphere/sf/cmif/sf_cmif_service_dispatch.hpp b/libstratosphere/include/stratosphere/sf/cmif/sf_cmif_service_dispatch.hpp index cca03664..4ee1c3f6 100644 --- a/libstratosphere/include/stratosphere/sf/cmif/sf_cmif_service_dispatch.hpp +++ b/libstratosphere/include/stratosphere/sf/cmif/sf_cmif_service_dispatch.hpp @@ -114,7 +114,7 @@ namespace ams::sf::cmif { explicit constexpr ServiceDispatchTable(Entries... entries) : impl::ServiceDispatchTableImpl(entries...) { /* ... */ } }; - #define DEFINE_SERVICE_DISPATCH_TABLE \ + #define AMS_SF_CMIF_IMPL_DEFINE_SERVICE_DISPATCH_TABLE \ template \ static constexpr inline ::ams::sf::cmif::ServiceDispatchTable s_CmifServiceDispatchTable @@ -127,23 +127,21 @@ namespace ams::sf::cmif { } }; - template + template requires sf::IsServiceObject struct ServiceDispatchTraits { - static_assert(std::is_base_of::value, "ServiceObjects must derive from sf::IServiceObject"); - using ProcessHandlerType = decltype(ServiceDispatchMeta::ProcessHandler); static constexpr inline auto DispatchTable = T::template s_CmifServiceDispatchTable; using DispatchTableType = decltype(DispatchTable); - static constexpr ProcessHandlerType ProcessHandlerImpl = ServiceObjectTraits::IsMitmServiceObject ? (&impl::ServiceDispatchTableBase::ProcessMessageForMitm) - : (&impl::ServiceDispatchTableBase::ProcessMessage); + static constexpr ProcessHandlerType ProcessHandlerImpl = sf::IsMitmServiceObject ? (&impl::ServiceDispatchTableBase::ProcessMessageForMitm) + : (&impl::ServiceDispatchTableBase::ProcessMessage); static constexpr inline ServiceDispatchMeta Meta{&DispatchTable, ProcessHandlerImpl}; }; template - NX_CONSTEXPR const ServiceDispatchMeta *GetServiceDispatchMeta() { + constexpr ALWAYS_INLINE const ServiceDispatchMeta *GetServiceDispatchMeta() { return &ServiceDispatchTraits::Meta; } diff --git a/libstratosphere/include/stratosphere/sf/hipc/sf_hipc_server_manager.hpp b/libstratosphere/include/stratosphere/sf/hipc/sf_hipc_server_manager.hpp index fabff0f9..bb002012 100644 --- a/libstratosphere/include/stratosphere/sf/hipc/sf_hipc_server_manager.hpp +++ b/libstratosphere/include/stratosphere/sf/hipc/sf_hipc_server_manager.hpp @@ -69,12 +69,12 @@ namespace ams::sf::hipc { virtual void CreateSessionObjectHolder(cmif::ServiceObjectHolder *out_obj, std::shared_ptr<::Service> *out_fsrv) const = 0; }; - template> + template class Server : public ServerBase { NON_COPYABLE(Server); NON_MOVEABLE(Server); private: - static constexpr bool IsMitmServer = ServiceObjectTraits::IsMitmServiceObject; + static constexpr bool IsMitmServer = sf::IsMitmServiceObject; public: Server(Handle ph, sm::ServiceName sn, bool m, cmif::ServiceObjectHolder &&sh) : ServerBase(ph, sn, m, std::forward(sh)) { /* ... */ @@ -145,14 +145,14 @@ namespace ams::sf::hipc { void ProcessDeferredSessions(); - template> + template void RegisterServerImpl(Handle port_handle, sm::ServiceName service_name, bool managed, cmif::ServiceObjectHolder &&static_holder) { /* Allocate server memory. */ auto *server = this->AllocateServer(); AMS_ABORT_UNLESS(server != nullptr); - new (server) Server(port_handle, service_name, managed, std::forward(static_holder)); + new (server) Server(port_handle, service_name, managed, std::forward(static_holder)); - if constexpr (!ServiceObjectTraits::IsMitmServiceObject) { + if constexpr (!sf::IsMitmServiceObject) { /* Non-mitm server. */ os::SetWaitableHolderUserData(server, static_cast(UserDataTag::Server)); } else { @@ -163,9 +163,9 @@ namespace ams::sf::hipc { os::LinkWaitableHolder(std::addressof(this->waitable_manager), server); } - template - static constexpr inline std::shared_ptr MakeSharedMitm(std::shared_ptr<::Service> &&s, const sm::MitmProcessInfo &client_info) { - return std::make_shared(std::forward>(s), client_info); + template + static constexpr inline std::shared_ptr MakeSharedMitm(std::shared_ptr<::Service> &&s, const sm::MitmProcessInfo &client_info) { + return sf::MakeShared(std::forward>(s), client_info); } Result InstallMitmServerImpl(Handle *out_port_handle, sm::ServiceName service_name, MitmQueryFunction query_func); @@ -187,21 +187,18 @@ namespace ams::sf::hipc { os::InitializeWaitableManager(std::addressof(this->waitlist)); } - template> - void RegisterServer(Handle port_handle, std::shared_ptr static_object = nullptr) { - static_assert(!ServiceObjectTraits::IsMitmServiceObject, "RegisterServer requires non-mitm object. Use RegisterMitmServer instead."); + template> requires (sf::IsServiceObject && !sf::IsMitmServiceObject) + void RegisterServer(Handle port_handle, std::shared_ptr static_object = nullptr) { /* Register server. */ cmif::ServiceObjectHolder static_holder; if (static_object != nullptr) { static_holder = cmif::ServiceObjectHolder(std::move(static_object)); } - this->RegisterServerImpl(port_handle, sm::InvalidServiceName, false, std::move(static_holder)); + this->RegisterServerImpl(port_handle, sm::InvalidServiceName, false, std::move(static_holder)); } - template> - Result RegisterServer(sm::ServiceName service_name, size_t max_sessions, std::shared_ptr static_object = nullptr) { - static_assert(!ServiceObjectTraits::IsMitmServiceObject, "RegisterServer requires non-mitm object. Use RegisterMitmServer instead."); - + template> requires (sf::IsServiceObject && !sf::IsMitmServiceObject) + Result RegisterServer(sm::ServiceName service_name, size_t max_sessions, std::shared_ptr static_object = nullptr) { /* Register service. */ Handle port_handle; R_TRY(sm::RegisterService(&port_handle, service_name, max_sessions, false)); @@ -211,19 +208,18 @@ namespace ams::sf::hipc { if (static_object != nullptr) { static_holder = cmif::ServiceObjectHolder(std::move(static_object)); } - this->RegisterServerImpl(port_handle, service_name, true, std::move(static_holder)); + this->RegisterServerImpl(port_handle, service_name, true, std::move(static_holder)); return ResultSuccess(); } - template> + template> + requires (sf::IsMitmServiceObject && sf::IsMitmServiceImpl) Result RegisterMitmServer(sm::ServiceName service_name) { - static_assert(ServiceObjectTraits::IsMitmServiceObject, "RegisterMitmServer requires mitm object. Use RegisterServer instead."); - /* Install mitm service. */ Handle port_handle; R_TRY(this->InstallMitmServerImpl(&port_handle, service_name, &ServiceImpl::ShouldMitm)); - this->RegisterServerImpl(port_handle, service_name, true, cmif::ServiceObjectHolder()); + this->RegisterServerImpl(port_handle, service_name, true, cmif::ServiceObjectHolder()); return ResultSuccess(); } diff --git a/libstratosphere/include/stratosphere/sf/impl/sf_impl_command_serialization.hpp b/libstratosphere/include/stratosphere/sf/impl/sf_impl_command_serialization.hpp index 2247d6de..aae4a5d2 100644 --- a/libstratosphere/include/stratosphere/sf/impl/sf_impl_command_serialization.hpp +++ b/libstratosphere/include/stratosphere/sf/impl/sf_impl_command_serialization.hpp @@ -368,22 +368,13 @@ namespace ams::sf::impl { size_t out_object_index; }; - template + template struct CommandMetaInfo { - private: - template - static R GetReturnTypeImpl(R(C::*)(A...)); - - template - static C *GetClassTypePointerImpl(R(C::*)(A...)); - - template - static std::tuple::type...> GetArgsImpl(R(C::*)(A...)); public: - using ReturnType = decltype(GetReturnTypeImpl(MemberFunction)); - using ClassTypePointer = decltype(GetClassTypePointerImpl(MemberFunction)); - using ArgsType = decltype(GetArgsImpl(MemberFunction)); - using ClassType = typename std::remove_pointer::type; + using ReturnType = Return; + using ClassType = Class; + using ClassTypePointer = ClassType *; + using ArgsType = std::tuple::type...>; static constexpr bool ReturnsResult = std::is_same::value; static constexpr bool ReturnsVoid = std::is_same::value; @@ -1045,9 +1036,9 @@ namespace ams::sf::impl { return ResultSuccess(); } - template + template constexpr Result InvokeServiceCommandImpl(CmifOutHeader **out_header_ptr, cmif::ServiceDispatchContext &ctx, const cmif::PointerAndSize &in_raw_data) { - using CommandMeta = CommandMetaInfo; + using CommandMeta = CommandMetaInfo; using ImplProcessorType = HipcCommandProcessor; using BufferArrayType = std::array; using OutHandleHolderType = OutHandleHolder; @@ -1113,7 +1104,7 @@ namespace ams::sf::impl { } if constexpr (CommandMeta::ReturnsResult) { - const auto command_result = std::apply([=](auto&&... args) { return (this_ptr->*ServiceCommandImpl)(args...); }, args_tuple); + const auto command_result = std::apply([=](auto&&... args) { return (this_ptr->*ServiceCommandImpl)(std::forward(args)...); }, args_tuple); if (R_FAILED(command_result)) { cmif::PointerAndSize out_raw_data; ctx.processor->PrepareForErrorReply(ctx, out_raw_data, runtime_metadata); @@ -1121,7 +1112,7 @@ namespace ams::sf::impl { return command_result; } } else { - std::apply([=](auto&&... args) { (this_ptr->*ServiceCommandImpl)(args...); }, args_tuple); + std::apply([=](auto&&... args) { (this_ptr->*ServiceCommandImpl)(std::forward(args)...); }, args_tuple); } } @@ -1148,18 +1139,16 @@ namespace ams::sf::impl { } -namespace ams::sf { +namespace ams::sf::impl { - template - inline static constexpr cmif::ServiceCommandMeta MakeServiceCommandMeta() { + template + consteval inline cmif::ServiceCommandMeta MakeServiceCommandMeta() { return { - .hosver_low = Low, + .hosver_low = Low, .hosver_high = High, - .cmd_id = static_cast(CommandId), - .handler = ::ams::sf::impl::InvokeServiceCommandImpl, + .cmd_id = static_cast(CommandId), + .handler = ::ams::sf::impl::InvokeServiceCommandImpl, }; } } - -#define MAKE_SERVICE_COMMAND_META(Name, ...) ::ams::sf::MakeServiceCommandMeta() diff --git a/libstratosphere/include/stratosphere/sf/impl/sf_impl_service_object_macros.hpp b/libstratosphere/include/stratosphere/sf/impl/sf_impl_service_object_macros.hpp new file mode 100644 index 00000000..2d251f58 --- /dev/null +++ b/libstratosphere/include/stratosphere/sf/impl/sf_impl_service_object_macros.hpp @@ -0,0 +1,293 @@ +/* + * 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 . + */ + +#pragma once +#include + +namespace ams::sf::impl { + + template + concept ServiceCommandResult = std::same_as<::ams::Result, T> || std::same_as; + + template + concept Invokable = requires (Arguments &&... args) { + { F(std::forward(args)...) }; + }; + + struct FunctionTraits { + public: + template + static std::tuple GetArgsImpl(R(A...)); + }; + + template + using FunctionArgsType = decltype(FunctionTraits::GetArgsImpl(F)); + + template + struct ClassFunctionPointerHelper; + + template + struct ClassFunctionPointerHelper> { + using Type = Return (*)(Class *, Arguments &&...); + }; + + template + using ClassFunctionPointer = typename ClassFunctionPointerHelper::Type; + + template + 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 + + #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 \ + requires std::same_as, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> \ + static auto AMS_SF_IMPL_CONCEPT_HELPER_FUNCTION_NAME(CLASSNAME, NAME) (T &t, std::tuple a) { \ + return [&](std::index_sequence) { \ + return t.NAME(std::forward::type>(std::get(a))...); \ + }(std::make_index_sequence()); \ + } + + #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::ServiceCommandResult; + + #define AMS_SF_IMPL_DEFINE_CONCEPT(CLASSNAME, CMD_MACRO) \ + template \ + 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 + + #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 \ + requires std::same_as, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> \ + RETURN Invoke##NAME##ByCommandTable (Arguments &&... args) { \ + return this->cmd_table->NAME(this, std::forward(args)...); \ + } \ + template \ + requires (::ams::sf::impl::Invokable && \ + std::same_as, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)>) \ + ALWAYS_INLINE RETURN NAME (Arguments &&... args) { \ + return this->Invoke##NAME##ByCommandTable(std::forward(args)...); \ + } \ + template \ + requires (::ams::sf::impl::Invokable && \ + !std::same_as, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)>) \ + ALWAYS_INLINE RETURN NAME (Arguments &&... args) { \ + return [this] ALWAYS_INLINE_LAMBDA (::ams::sf::impl::TypeTag>, PassedArguments &&...args_) -> RETURN { \ + return this->template NAME(std::forward(args_)...); \ + }(::ams::sf::impl::TypeTag{}, std::forward(args)...); \ + } + + #define AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION_INVOKER_HOLDER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \ + template \ + requires std::same_as, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> \ + static RETURN NAME##Invoker (CLASSNAME *_this, Arguments &&... args) { \ + return static_cast(_this)->NAME(std::forward(args)...); \ + } + + #define AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION_INVOKER_POINTER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \ + template \ + requires std::same_as, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> \ + static RETURN NAME##Invoker (CLASSNAME *_this, Arguments &&... args) { \ + return static_cast(_this)->NAME(std::forward(args)...); \ + } + + #define AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION_IMPL(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \ + template \ + requires (std::same_as, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> && \ + std::same_as()...))>) \ + RETURN NAME (Arguments &&... args) { \ + return this->impl.NAME(std::forward(args)...); \ + } + + #define AMS_SF_IMPL_DECLARE_INTERFACE_FUNCTION_IMPL_PTR(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \ + template \ + requires (std::same_as, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> && \ + std::same_asNAME(std::declval()...))>) \ + RETURN NAME (Arguments &&... args) { \ + return this->impl->NAME(std::forward(args)...); \ + } + + #define AMS_SF_IMPL_DEFINE_INTERFACE_IMPL_FUNCTION_POINTER_HOLDER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \ + template struct NAME##FunctionPointerHolder; \ + \ + template \ + requires std::same_as, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> \ + struct NAME##FunctionPointerHolder> { \ + static constexpr auto Value = static_cast(&NAME##Invoker); \ + }; + + #define AMS_SF_IMPL_DEFINE_INTERFACE_SERVICE_COMMAND_META_HOLDER(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \ + template struct NAME##ServiceCommandMetaHolder; \ + \ + template \ + requires std::same_as, AMS_SF_IMPL_HELPER_FUNCTION_ARGS(CLASSNAME, NAME)> \ + struct NAME##ServiceCommandMetaHolder> { \ + static constexpr auto Value = ::ams::sf::impl::MakeServiceCommandMeta, 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::Value, + + #define AMS_SF_IMPL_DEFINE_CMIF_SERVICE_COMMAND_META_TABLE_ENTRY(CLASSNAME, CMD_ID, RETURN, NAME, ARGS, VERSION_MIN, VERSION_MAX) \ + NAME##ServiceCommandMetaHolder::Value, + + template + 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 \ + requires ((std::same_as && !std::same_as&& Is##CLASSNAME) && \ + (::ams::sf::IsMitmServiceObject == ::ams::sf::IsMitmServiceImpl)) \ + struct ImplGenerator { \ + public: \ + class ImplHolder : public S { \ + private: \ + T impl; \ + public: \ + template requires std::constructible_from \ + constexpr ImplHolder(Args &&... args) \ + : S(std::addressof(CommandPointerTableImpl)), impl(std::forward(args)...) \ + { \ + /* ... */ \ + } \ + ALWAYS_INLINE T &GetImpl() { return this->impl; } \ + ALWAYS_INLINE const T &GetImpl() const { return this->impl; } \ + \ + template requires ::ams::sf::IsMitmServiceObject && std::same_as \ + 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); \ + \ + 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) \ + }; \ + }; \ + static_assert(Is##CLASSNAME); \ + }; \ + private: \ + CMD_MACRO(CLASSNAME, AMS_SF_IMPL_DEFINE_INTERFACE_SERVICE_COMMAND_META_HOLDER) \ + public: \ + template requires (!std::same_as&& Is##CLASSNAME) \ + using ImplHolder = typename ImplGenerator::ImplHolder; \ + \ + template requires (!std::same_as&& Is##CLASSNAME) \ + using ImplPointer = typename ImplGenerator::ImplPointer; \ + \ + 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); + + #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); + + #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) + +} \ No newline at end of file diff --git a/libstratosphere/include/stratosphere/sf/sf_service_object.hpp b/libstratosphere/include/stratosphere/sf/sf_service_object.hpp index 70b93ec6..7406be54 100644 --- a/libstratosphere/include/stratosphere/sf/sf_service_object.hpp +++ b/libstratosphere/include/stratosphere/sf/sf_service_object.hpp @@ -25,38 +25,44 @@ namespace ams::sf { virtual ~IServiceObject() { /* ... */ } }; + template + concept IsServiceObject = std::derived_from; + class IMitmServiceObject : public IServiceObject { + public: + virtual ~IMitmServiceObject() { /* ... */ } + }; + + class MitmServiceImplBase { protected: std::shared_ptr<::Service> forward_service; sm::MitmProcessInfo client_info; public: - IMitmServiceObject(std::shared_ptr<::Service> &&s, const sm::MitmProcessInfo &c) : forward_service(std::move(s)), client_info(c) { /* ... */ } - - virtual ~IMitmServiceObject() { /* ... */ } - - static bool ShouldMitm(os::ProcessId process_id, ncm::ProgramId program_id); + MitmServiceImplBase(std::shared_ptr<::Service> &&s, const sm::MitmProcessInfo &c) : forward_service(std::move(s)), client_info(c) { /* ... */ } }; - /* Utility. */ - #define SF_MITM_SERVICE_OBJECT_CTOR(cls) cls(std::shared_ptr<::Service> &&s, const sm::MitmProcessInfo &c) : ::ams::sf::IMitmServiceObject(std::forward>(s), c) - template - struct ServiceObjectTraits { - static_assert(std::is_base_of::value, "ServiceObjectTraits requires ServiceObject"); + concept IsMitmServiceObject = IsServiceObject && std::derived_from; - static constexpr bool IsMitmServiceObject = std::is_base_of::value; - - struct SharedPointerHelper { - - static constexpr void EmptyDelete(T *) { /* Empty deleter, for fake shared pointer. */ } - - static constexpr std::shared_ptr GetEmptyDeleteSharedPointer(T *srv_obj) { - return std::shared_ptr(srv_obj, EmptyDelete); - } - - }; + template + concept IsMitmServiceImpl = requires (std::shared_ptr<::Service> &&s, const sm::MitmProcessInfo &c) { + { T(std::forward>(s), c) }; + { T::ShouldMitm(c) } -> std::same_as; }; + template requires std::constructible_from + constexpr ALWAYS_INLINE std::shared_ptr> MakeShared(Arguments &&... args) { + return std::make_shared>(std::forward(args)...); + } + template + constexpr ALWAYS_INLINE std::shared_ptr> GetSharedPointerTo(Impl *impl) { + return std::make_shared>(impl); + } + + template + constexpr ALWAYS_INLINE std::shared_ptr> GetSharedPointerTo(Impl &impl) { + return GetSharedPointerTo(std::addressof(impl)); + } } \ No newline at end of file diff --git a/libstratosphere/include/stratosphere/sm.hpp b/libstratosphere/include/stratosphere/sm.hpp index d5c4456d..98e3f83a 100644 --- a/libstratosphere/include/stratosphere/sm.hpp +++ b/libstratosphere/include/stratosphere/sm.hpp @@ -16,9 +16,13 @@ #pragma once -#include "sm/sm_types.hpp" -#include "sm/sm_api.hpp" -#include "sm/sm_mitm_api.hpp" -#include "sm/sm_scoped_holder.hpp" +#include +#include +#include +#include -#include "sm/sm_manager_api.hpp" +#include + +#include +#include +#include diff --git a/libstratosphere/include/stratosphere/sm/impl/sm_debug_monitor_interface.hpp b/libstratosphere/include/stratosphere/sm/impl/sm_debug_monitor_interface.hpp new file mode 100644 index 00000000..af79293c --- /dev/null +++ b/libstratosphere/include/stratosphere/sm/impl/sm_debug_monitor_interface.hpp @@ -0,0 +1,31 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include + +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 record, ServiceName service)) \ + AMS_SF_METHOD_INFO(C, H, 65001, void, AtmosphereListRecords, (const sf::OutArray &records, sf::Out out_count, u64 offset)) \ + AMS_SF_METHOD_INFO(C, H, 65002, void, AtmosphereGetRecordSize, (sf::Out record_size)) + + AMS_SF_DEFINE_INTERFACE(IDebugMonitorInterface, AMS_SM_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO) + +} diff --git a/libstratosphere/include/stratosphere/sm/impl/sm_manager_interface.hpp b/libstratosphere/include/stratosphere/sm/impl/sm_manager_interface.hpp new file mode 100644 index 00000000..6037bafe --- /dev/null +++ b/libstratosphere/include/stratosphere/sm/impl/sm_manager_interface.hpp @@ -0,0 +1,33 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include + +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)) \ + 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 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) + +} diff --git a/libstratosphere/include/stratosphere/sm/impl/sm_user_interface.hpp b/libstratosphere/include/stratosphere/sm/impl/sm_user_interface.hpp new file mode 100644 index 00000000..84316285 --- /dev/null +++ b/libstratosphere/include/stratosphere/sm/impl/sm_user_interface.hpp @@ -0,0 +1,40 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include + +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)) \ + 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, 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 client_info, sf::OutMoveHandle fwd_h, ServiceName service)) \ + AMS_SF_METHOD_INFO(C, H, 65004, Result, AtmosphereHasMitm, (sf::Out 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, 65100, Result, AtmosphereHasService, (sf::Out 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) + +} diff --git a/libstratosphere/include/stratosphere/spl.hpp b/libstratosphere/include/stratosphere/spl.hpp index d8b7518f..e9ec412f 100644 --- a/libstratosphere/include/stratosphere/spl.hpp +++ b/libstratosphere/include/stratosphere/spl.hpp @@ -16,6 +16,15 @@ #pragma once -#include "spl/spl_types.hpp" -#include "spl/spl_api.hpp" -#include "spl/smc/spl_smc.hpp" \ No newline at end of file +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/libstratosphere/include/stratosphere/spl/impl/spl_crypto_interface.hpp b/libstratosphere/include/stratosphere/spl/impl/spl_crypto_interface.hpp new file mode 100644 index 00000000..d3e68b95 --- /dev/null +++ b/libstratosphere/include/stratosphere/spl/impl/spl_crypto_interface.hpp @@ -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 . + */ + +#pragma once +#include +#include +#include +#include + +namespace ams::spl::impl { + + #define AMS_SPL_I_CRYPTO_INTERFACE_INTERFACE_INFO(C, H) \ + AMS_SPL_I_GENERAL_INTERFACE_INTERFACE_INFO(C, H) \ + AMS_SF_METHOD_INFO(C, H, 2, Result, GenerateAesKek, (sf::Out 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 out_key, AccessKey access_key, KeySource key_source)) \ + AMS_SF_METHOD_INFO(C, H, 14, Result, DecryptAesKey, (sf::Out 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 out_cmac, s32 keyslot, const sf::InPointerBuffer &in_buf)) \ + AMS_SF_METHOD_INFO(C, H, 21, Result, AllocateAesKeySlot, (sf::Out 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) + +} diff --git a/libstratosphere/include/stratosphere/spl/impl/spl_deprecated_general_interface.hpp b/libstratosphere/include/stratosphere/spl/impl/spl_deprecated_general_interface.hpp new file mode 100644 index 00000000..e6d85f06 --- /dev/null +++ b/libstratosphere/include/stratosphere/spl/impl/spl_deprecated_general_interface.hpp @@ -0,0 +1,54 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include + +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 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 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 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 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 is_dev)) \ + AMS_SF_METHOD_INFO(C, H, 12, Result, GenerateSpecificAesKey, (sf::Out 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 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 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 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 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 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 out_access_key, KeySource key_source, u32 generation), hos::Version_3_0_0) \ + 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 out), hos::Version_3_0_0) + + AMS_SF_DEFINE_INTERFACE(IDeprecatedGeneralInterface, AMS_SPL_I_DEPRECATED_GENERAL_INTERFACE_INTERFACE_INFO) + +} diff --git a/libstratosphere/include/stratosphere/spl/impl/spl_device_unique_data_interface.hpp b/libstratosphere/include/stratosphere/spl/impl/spl_device_unique_data_interface.hpp new file mode 100644 index 00000000..307f238c --- /dev/null +++ b/libstratosphere/include/stratosphere/spl/impl/spl_device_unique_data_interface.hpp @@ -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 . + */ + +#pragma once +#include +#include +#include +#include + +namespace ams::spl::impl { + + #define AMS_SPL_I_DEVICE_UNIQUE_DATA_INTERFACE_INTERFACE_INFO(C, H) \ + 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) + +} diff --git a/libstratosphere/include/stratosphere/spl/impl/spl_es_interface.hpp b/libstratosphere/include/stratosphere/spl/impl/spl_es_interface.hpp new file mode 100644 index 00000000..e29ddc74 --- /dev/null +++ b/libstratosphere/include/stratosphere/spl/impl/spl_es_interface.hpp @@ -0,0 +1,38 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include +#include + +namespace ams::spl::impl { + + #define AMS_SPL_I_ES_INTERFACE_INTERFACE_INFO(C, H) \ + 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 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 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 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) + +} diff --git a/libstratosphere/include/stratosphere/spl/impl/spl_fs_interface.hpp b/libstratosphere/include/stratosphere/spl/impl/spl_fs_interface.hpp new file mode 100644 index 00000000..d487280e --- /dev/null +++ b/libstratosphere/include/stratosphere/spl/impl/spl_fs_interface.hpp @@ -0,0 +1,36 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include +#include + +namespace ams::spl::impl { + + #define AMS_SPL_I_FS_INTERFACE_INTERFACE_INFO(C, H) \ + 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 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 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) + +} diff --git a/libstratosphere/include/stratosphere/spl/impl/spl_general_interface.hpp b/libstratosphere/include/stratosphere/spl/impl/spl_general_interface.hpp new file mode 100644 index 00000000..28f596b9 --- /dev/null +++ b/libstratosphere/include/stratosphere/spl/impl/spl_general_interface.hpp @@ -0,0 +1,35 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include + +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 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 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 out), hos::Version_3_0_0) + + AMS_SF_DEFINE_INTERFACE(IGeneralInterface, AMS_SPL_I_GENERAL_INTERFACE_INTERFACE_INFO) + +} diff --git a/libstratosphere/include/stratosphere/spl/impl/spl_manu_interface.hpp b/libstratosphere/include/stratosphere/spl/impl/spl_manu_interface.hpp new file mode 100644 index 00000000..5e9695dd --- /dev/null +++ b/libstratosphere/include/stratosphere/spl/impl/spl_manu_interface.hpp @@ -0,0 +1,31 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include +#include + +namespace ams::spl::impl { + + #define AMS_SPL_I_MANU_INTERFACE_INTERFACE_INFO(C, H) \ + 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) + +} diff --git a/libstratosphere/include/stratosphere/spl/impl/spl_random_interface.hpp b/libstratosphere/include/stratosphere/spl/impl/spl_random_interface.hpp new file mode 100644 index 00000000..6181ccc3 --- /dev/null +++ b/libstratosphere/include/stratosphere/spl/impl/spl_random_interface.hpp @@ -0,0 +1,29 @@ +/* + * 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 . + */ + +#pragma once +#include +#include +#include + +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)) + + AMS_SF_DEFINE_INTERFACE(IRandomInterface, AMS_SPL_I_RANDOM_INTERFACE_INTERFACE_INFO) + +} diff --git a/libstratosphere/include/stratosphere/spl/impl/spl_ssl_interface.hpp b/libstratosphere/include/stratosphere/spl/impl/spl_ssl_interface.hpp new file mode 100644 index 00000000..3df104ef --- /dev/null +++ b/libstratosphere/include/stratosphere/spl/impl/spl_ssl_interface.hpp @@ -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 . + */ + +#pragma once +#include +#include +#include +#include + +namespace ams::spl::impl { + + #define AMS_SPL_I_SSL_INTERFACE_INTERFACE_INFO(C, H) \ + 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) + +} diff --git a/libstratosphere/include/stratosphere/spl/smc/spl_smc.hpp b/libstratosphere/include/stratosphere/spl/smc/spl_smc.hpp index 3d83ac74..38a98d5d 100644 --- a/libstratosphere/include/stratosphere/spl/smc/spl_smc.hpp +++ b/libstratosphere/include/stratosphere/spl/smc/spl_smc.hpp @@ -20,54 +20,47 @@ namespace ams::spl::smc { /* Helpers for converting arguments. */ - inline u32 GetCryptAesMode(CipherMode mode, u32 keyslot) { + inline u32 GetComputeAesMode(CipherMode mode, u32 keyslot) { return static_cast((static_cast(mode) << 4) | (keyslot & 7)); } - inline u32 GetUnwrapEsKeyOption(EsKeyType type, u32 generation) { + inline u32 GetPrepareEsDeviceUniqueKeyOption(EsCommonKeyType type, u32 generation) { return static_cast((static_cast(type) << 6) | (generation & 0x3F)); } /* Functions. */ - Result SetConfig(SplConfigItem which, const u64 *value, size_t num_qwords); - Result GetConfig(u64 *out, size_t num_qwords, SplConfigItem which); - Result CheckStatus(Result *out, AsyncOperationKey op); - Result GetResult(Result *out, void *out_buf, size_t out_buf_size, AsyncOperationKey op); - Result ExpMod(AsyncOperationKey *out_op, const void *base, const void *exp, size_t exp_size, const void *mod); + Result SetConfig(spl::ConfigItem which, const u64 *value, size_t num_qwords); + Result GetConfig(u64 *out, size_t num_qwords, spl::ConfigItem which); + Result GetResult(Result *out, AsyncOperationKey op); + Result GetResultData(Result *out, void *out_buf, size_t out_buf_size, AsyncOperationKey op); + Result ModularExponentiate(AsyncOperationKey *out_op, const void *base, const void *exp, size_t exp_size, const void *mod); Result GenerateRandomBytes(void *out, size_t size); Result GenerateAesKek(AccessKey *out, const KeySource &source, u32 generation, u32 option); Result LoadAesKey(u32 keyslot, const AccessKey &access_key, const KeySource &source); - Result CryptAes(AsyncOperationKey *out_op, u32 mode, const IvCtr &iv_ctr, u32 dst_addr, u32 src_addr, size_t size); + Result ComputeAes(AsyncOperationKey *out_op, u32 mode, const IvCtr &iv_ctr, u32 dst_addr, u32 src_addr, size_t size); Result GenerateSpecificAesKey(AesKey *out_key, const KeySource &source, u32 generation, u32 which); Result ComputeCmac(Cmac *out_mac, u32 keyslot, const void *data, size_t size); - Result ReEncryptRsaPrivateKey(void *data, size_t size, const AccessKey &access_key_dec, const KeySource &source_dec, const AccessKey &access_key_enc, const KeySource &source_enc, u32 option); - Result DecryptOrImportRsaPrivateKey(void *data, size_t size, const AccessKey &access_key, const KeySource &source, DecryptOrImportMode mode); - Result SecureExpMod(AsyncOperationKey *out_op, const void *base, const void *mod, SecureExpModMode mode); - Result UnwrapTitleKey(AsyncOperationKey *out_op, const void *base, const void *mod, const void *label_digest, size_t label_digest_size, u32 option); - Result LoadTitleKey(u32 keyslot, const AccessKey &access_key); - Result UnwrapCommonTitleKey(AccessKey *out, const KeySource &source, u32 generation); + Result ReencryptDeviceUniqueData(void *data, size_t size, const AccessKey &access_key_dec, const KeySource &source_dec, const AccessKey &access_key_enc, const KeySource &source_enc, u32 option); + Result DecryptDeviceUniqueData(void *data, size_t size, const AccessKey &access_key, const KeySource &source, DeviceUniqueDataMode mode); + Result ModularExponentiateWithStorageKey(AsyncOperationKey *out_op, const void *base, const void *mod, ModularExponentiateWithStorageKeyMode mode); + Result PrepareEsDeviceUniqueKey(AsyncOperationKey *out_op, const void *base, const void *mod, const void *label_digest, size_t label_digest_size, u32 option); + Result LoadPreparedAesKey(u32 keyslot, const AccessKey &access_key); + Result PrepareCommonEsTitleKey(AccessKey *out, const KeySource &source, u32 generation); /* Deprecated functions. */ - Result ImportEsKey(const void *data, size_t size, const AccessKey &access_key, const KeySource &source, u32 option); - Result DecryptRsaPrivateKey(size_t *out_size, void *data, size_t size, const AccessKey &access_key, const KeySource &source, u32 option); - Result ImportSecureExpModKey(const void *data, size_t size, const AccessKey &access_key, const KeySource &source, u32 option); + Result LoadEsDeviceKey(const void *data, size_t size, const AccessKey &access_key, const KeySource &source, u32 option); + Result DecryptDeviceUniqueData(size_t *out_size, void *data, size_t size, const AccessKey &access_key, const KeySource &source, u32 option); + Result DecryptAndStoreGcKey(const void *data, size_t size, const AccessKey &access_key, const KeySource &source, u32 option); /* Atmosphere functions. */ Result AtmosphereCopyToIram(uintptr_t iram_dst, const void *dram_src, size_t size); Result AtmosphereCopyFromIram(void *dram_dst, uintptr_t iram_src, size_t size); Result AtmosphereReadWriteRegister(uint64_t address, uint32_t mask, uint32_t value, uint32_t *out_value); - Result AtmosphereWriteAddress(void *dst, const void *src, size_t size); Result AtmosphereGetEmummcConfig(void *out_config, void *out_paths, u32 storage_id); /* Helpers. */ - inline Result SetConfig(SplConfigItem which, const u64 value) { + inline Result SetConfig(spl::ConfigItem which, const u64 value) { return SetConfig(which, &value, 1); } - template - inline Result AtmosphereWriteAddress(void *dst, const T value) { - static_assert(std::is_integral::value && sizeof(T) <= 8 && (sizeof(T) & (sizeof(T) - 1)) == 0, "AtmosphereWriteAddress requires integral type."); - return AtmosphereWriteAddress(dst, &value, sizeof(T)); - } - } diff --git a/libstratosphere/include/stratosphere/spl/spl_types.hpp b/libstratosphere/include/stratosphere/spl/spl_types.hpp index b02bf1fd..21a7ba25 100644 --- a/libstratosphere/include/stratosphere/spl/spl_types.hpp +++ b/libstratosphere/include/stratosphere/spl/spl_types.hpp @@ -22,35 +22,34 @@ namespace ams::spl { namespace smc { enum class FunctionId : u32 { - SetConfig = 0xC3000401, - GetConfig = 0xC3000002, - CheckStatus = 0xC3000003, - GetResult = 0xC3000404, - ExpMod = 0xC3000E05, - GenerateRandomBytes = 0xC3000006, - GenerateAesKek = 0xC3000007, - LoadAesKey = 0xC3000008, - CryptAes = 0xC3000009, - GenerateSpecificAesKey = 0xC300000A, - ComputeCmac = 0xC300040B, - ReEncryptRsaPrivateKey = 0xC300D60C, - DecryptOrImportRsaPrivateKey = 0xC300100D, + SetConfig = 0xC3000401, + GetConfig = 0xC3000002, + GetResult = 0xC3000003, + GetResultData = 0xC3000404, + ModularExponentiate = 0xC3000E05, + GenerateRandomBytes = 0xC3000006, + GenerateAesKek = 0xC3000007, + LoadAesKey = 0xC3000008, + ComputeAes = 0xC3000009, + GenerateSpecificAesKey = 0xC300000A, + ComputeCmac = 0xC300040B, + ReencryptDeviceUniqueData = 0xC300D60C, + DecryptDeviceUniqueData = 0xC300100D, - SecureExpMod = 0xC300060F, - UnwrapTitleKey = 0xC3000610, - LoadTitleKey = 0xC3000011, - UnwrapCommonTitleKey = 0xC3000012, + ModularExponentiateWithStorageKey = 0xC300060F, + PrepareEsDeviceUniqueKey = 0xC3000610, + LoadPreparedAesKey = 0xC3000011, + PrepareCommonEsTitleKey = 0xC3000012, /* Deprecated functions. */ - ImportEsKey = 0xC300100C, - DecryptRsaPrivateKey = 0xC300100D, - ImportSecureExpModKey = 0xC300100E, + LoadEsDeviceKey = 0xC300100C, + DecryptAndStoreGcKey = 0xC300100E, /* Atmosphere functions. */ - AtmosphereIramCopy = 0xF0000201, - AtmosphereReadWriteRegister = 0xF0000002, - AtmosphereWriteAddress = 0xF0000003, - AtmosphereGetEmummcConfig = 0xF0000404, + AtmosphereIramCopy = 0xF0000201, + AtmosphereReadWriteRegister = 0xF0000002, + + AtmosphereGetEmummcConfig = 0xF0000404, }; enum class Result { @@ -61,6 +60,7 @@ namespace ams::spl { NoAsyncOperation = 4, InvalidAsyncOperation = 5, NotPermitted = 6, + NotInitialized = 7, }; constexpr inline ::ams::Result ConvertResult(Result smc_result) { @@ -69,11 +69,10 @@ namespace ams::spl { /* Convert to the list of known SecureMonitorErrors. */ const auto converted = R_MAKE_NAMESPACE_RESULT(::ams::spl, static_cast(smc_result)); - if (spl::ResultSecureMonitorError::Includes(converted)) { - return converted; - } + R_UNLESS(spl::ResultSecureMonitorError::Includes(converted), spl::ResultUnknownSecureMonitorError()); - return spl::ResultUnknownSecureMonitorError(); + /* Return the error. */ + return converted; } enum class CipherMode { @@ -82,23 +81,23 @@ namespace ams::spl { Ctr = 2, }; - enum class DecryptOrImportMode { - DecryptRsaPrivateKey = 0, - ImportLotusKey = 1, - ImportEsKey = 2, - ImportSslKey = 3, - ImportDrmKey = 4, + enum class DeviceUniqueDataMode { + DecryptDeviceUniqueData = 0, + DecryptAndStoreGcKey = 1, + DecryptAndStoreEsDeviceKey = 2, + DecryptAndStoreSslKey = 3, + DecryptAndStoreDrmDeviceCertKey = 4, }; - enum class SecureExpModMode { - Lotus = 0, - Ssl = 1, - Drm = 2, + enum class ModularExponentiateWithStorageKeyMode { + Gc = 0, + Ssl = 1, + DrmDeviceCert = 2, }; - enum class EsKeyType { - TitleKey = 0, - ElicenseKey = 1, + enum class EsCommonKeyType { + TitleKey = 0, + ArchiveKey = 1, }; struct AsyncOperationKey { @@ -196,23 +195,23 @@ namespace ams::spl { enum class ConfigItem : u32 { /* Standard config items. */ - DisableProgramVerification = 1, - DramId = 2, - SecurityEngineIrqNumber = 3, - FuseVersion = 4, - HardwareType = 5, - HardwareState = 6, - IsRecoveryBoot = 7, - DeviceId = 8, - BootReason = 9, - MemoryMode = 10, - IsDevelopmentFunctionEnabled = 11, - KernelConfiguration = 12, - IsChargerHiZModeEnabled = 13, - IsQuest = 14, - RegulatorType = 15, - DeviceUniqueKeyGeneration = 16, - Package2Hash = 17, + DisableProgramVerification = 1, + DramId = 2, + SecurityEngineInterruptNumber = 3, + FuseVersion = 4, + HardwareType = 5, + HardwareState = 6, + IsRecoveryBoot = 7, + DeviceId = 8, + BootReason = 9, + MemoryMode = 10, + IsDevelopmentFunctionEnabled = 11, + KernelConfiguration = 12, + IsChargerHiZModeEnabled = 13, + QuestState = 14, + RegulatorType = 15, + DeviceUniqueKeyGeneration = 16, + Package2Hash = 17, /* Extension config items for exosphere. */ ExosphereApiVersion = 65000, diff --git a/libstratosphere/source/ams/ams_exosphere_api.cpp b/libstratosphere/source/ams/ams_exosphere_api.cpp index e964d393..a8cf21b9 100644 --- a/libstratosphere/source/ams/ams_exosphere_api.cpp +++ b/libstratosphere/source/ams/ams_exosphere_api.cpp @@ -21,7 +21,7 @@ namespace ams::exosphere { ApiInfo GetApiInfo() { u64 exosphere_cfg; - if (spl::smc::GetConfig(&exosphere_cfg, 1, SplConfigItem_ExosphereApiVersion) != spl::smc::Result::Success) { + if (spl::smc::GetConfig(&exosphere_cfg, 1, spl::ConfigItem::ExosphereApiVersion) != spl::smc::Result::Success) { R_ABORT_UNLESS(ResultNotPresent()); } @@ -29,15 +29,15 @@ namespace ams::exosphere { } void ForceRebootToRcm() { - R_ABORT_UNLESS(spl::smc::ConvertResult(spl::smc::SetConfig(SplConfigItem_ExosphereNeedsReboot, 1))); + R_ABORT_UNLESS(spl::smc::ConvertResult(spl::smc::SetConfig(spl::ConfigItem::ExosphereNeedsReboot, 1))); } void ForceRebootToIramPayload() { - R_ABORT_UNLESS(spl::smc::ConvertResult(spl::smc::SetConfig(SplConfigItem_ExosphereNeedsReboot, 2))); + R_ABORT_UNLESS(spl::smc::ConvertResult(spl::smc::SetConfig(spl::ConfigItem::ExosphereNeedsReboot, 2))); } void ForceShutdown() { - R_ABORT_UNLESS(spl::smc::ConvertResult(spl::smc::SetConfig(SplConfigItem_ExosphereNeedsShutdown, 1))); + R_ABORT_UNLESS(spl::smc::ConvertResult(spl::smc::SetConfig(spl::ConfigItem::ExosphereNeedsShutdown, 1))); } void CopyToIram(uintptr_t iram_dst, const void *dram_src, size_t size) { @@ -52,7 +52,7 @@ namespace ams::exosphere { inline u64 GetU64ConfigItem(spl::ConfigItem cfg) { u64 tmp; - R_ABORT_UNLESS(spl::smc::ConvertResult(spl::smc::GetConfig(std::addressof(tmp), 1, static_cast<::SplConfigItem>(cfg)))); + R_ABORT_UNLESS(spl::smc::ConvertResult(spl::smc::GetConfig(std::addressof(tmp), 1, cfg))); return tmp; } diff --git a/libstratosphere/source/capsrv/server/decodersrv/decodersrv_decoder_control_server_manager.cpp b/libstratosphere/source/capsrv/server/decodersrv/decodersrv_decoder_control_server_manager.cpp index 42553cfc..b5e9a623 100644 --- a/libstratosphere/source/capsrv/server/decodersrv/decodersrv_decoder_control_server_manager.cpp +++ b/libstratosphere/source/capsrv/server/decodersrv/decodersrv_decoder_control_server_manager.cpp @@ -24,7 +24,7 @@ namespace ams::capsrv::server { this->server_manager_holder.emplace(); /* Register the service. */ - R_ABORT_UNLESS(this->server_manager_holder->RegisterServer(ServiceName, MaxSessions, sf::ServiceObjectTraits::SharedPointerHelper::GetEmptyDeleteSharedPointer(std::addressof(*this->service_holder)))); + R_ABORT_UNLESS((this->server_manager_holder->RegisterServer(ServiceName, MaxSessions, sf::GetSharedPointerTo(*this->service_holder)))); /* Initialize the idle event, we're idle initially. */ os::InitializeEvent(std::addressof(this->idle_event), true, os::EventClearMode_ManualClear); diff --git a/libstratosphere/source/capsrv/server/decodersrv/decodersrv_decoder_control_server_manager.hpp b/libstratosphere/source/capsrv/server/decodersrv/decodersrv_decoder_control_server_manager.hpp index d8db8697..3d7fdbf1 100644 --- a/libstratosphere/source/capsrv/server/decodersrv/decodersrv_decoder_control_server_manager.hpp +++ b/libstratosphere/source/capsrv/server/decodersrv/decodersrv_decoder_control_server_manager.hpp @@ -26,6 +26,7 @@ namespace ams::capsrv::server { static constexpr inline size_t MaxSessions = 2; static constexpr inline sm::ServiceName ServiceName = sm::ServiceName::Encode("caps:dc"); + using Interface = IDecoderControlService; using Service = DecoderControlService; using ServerOptions = sf::hipc::DefaultServerManagerOptions; using ServerManager = sf::hipc::ServerManager; diff --git a/libstratosphere/source/capsrv/server/decodersrv/decodersrv_decoder_control_service.hpp b/libstratosphere/source/capsrv/server/decodersrv/decodersrv_decoder_control_service.hpp index 0a095883..961018cc 100644 --- a/libstratosphere/source/capsrv/server/decodersrv/decodersrv_decoder_control_service.hpp +++ b/libstratosphere/source/capsrv/server/decodersrv/decodersrv_decoder_control_service.hpp @@ -18,17 +18,15 @@ namespace ams::capsrv::server { - class DecoderControlService final : public sf::IServiceObject { - protected: - enum class CommandId { - DecodeJpeg = 3001, - }; + #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 { public: - /* Actual commands. */ - virtual Result DecodeJpeg(const sf::OutNonSecureBuffer &out, const sf::InBuffer &in, u32 width, u32 height, const ScreenShotDecodeOption &option); - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(DecodeJpeg) - }; + Result DecodeJpeg(const sf::OutNonSecureBuffer &out, const sf::InBuffer &in, u32 width, u32 height, const ScreenShotDecodeOption &option); }; + static_assert(IsIDecoderControlService); + } \ No newline at end of file diff --git a/libstratosphere/source/erpt/srv/erpt_srv_attachment_impl.hpp b/libstratosphere/source/erpt/srv/erpt_srv_attachment_impl.hpp index 8d0e6567..05aebe94 100644 --- a/libstratosphere/source/erpt/srv/erpt_srv_attachment_impl.hpp +++ b/libstratosphere/source/erpt/srv/erpt_srv_attachment_impl.hpp @@ -20,19 +20,20 @@ namespace ams::erpt::srv { class Attachment; - class AttachmentImpl final : public erpt::sf::IAttachment { + class AttachmentImpl final { private: Attachment *attachment; public: AttachmentImpl(); ~AttachmentImpl(); public: - virtual Result Open(const AttachmentId &attachment_id) override final; - virtual Result Read(ams::sf::Out out_count, const ams::sf::OutBuffer &out_buffer) override final; - virtual Result SetFlags(AttachmentFlagSet flags) override final; - virtual Result GetFlags(ams::sf::Out out) override final; - virtual Result Close() override final; - virtual Result GetSize(ams::sf::Out out) override final; + Result Open(const AttachmentId &attachment_id); + Result Read(ams::sf::Out out_count, const ams::sf::OutBuffer &out_buffer); + Result SetFlags(AttachmentFlagSet flags); + Result GetFlags(ams::sf::Out out); + Result Close(); + Result GetSize(ams::sf::Out out); }; + static_assert(erpt::sf::IsIAttachment); } diff --git a/libstratosphere/source/erpt/srv/erpt_srv_context_impl.hpp b/libstratosphere/source/erpt/srv/erpt_srv_context_impl.hpp index 662f0202..f2660638 100644 --- a/libstratosphere/source/erpt/srv/erpt_srv_context_impl.hpp +++ b/libstratosphere/source/erpt/srv/erpt_srv_context_impl.hpp @@ -18,19 +18,20 @@ namespace ams::erpt::srv { - class ContextImpl final : public erpt::sf::IContext { + class ContextImpl final { public: - virtual Result SubmitContext(const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer) override final; - virtual Result CreateReport(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &meta_buffer) override final; - virtual Result SetInitialLaunchSettingsCompletionTime(const time::SteadyClockTimePoint &time_point) override final; - virtual Result ClearInitialLaunchSettingsCompletionTime() override final; - virtual Result UpdatePowerOnTime() override final; - virtual Result UpdateAwakeTime() override final; - virtual Result SubmitMultipleCategoryContext(const MultipleCategoryContextEntry &ctx_entry, const ams::sf::InBuffer &str_buffer) override final; - virtual Result UpdateApplicationLaunchTime() override final; - virtual Result ClearApplicationLaunchTime() override final; - virtual Result SubmitAttachment(ams::sf::Out out, const ams::sf::InBuffer &attachment_name, const ams::sf::InBuffer &attachment_data) override final; - virtual Result CreateReportWithAttachments(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &attachment_ids_buffer) override final; + Result SubmitContext(const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer); + Result CreateReport(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &meta_buffer); + Result SetInitialLaunchSettingsCompletionTime(const time::SteadyClockTimePoint &time_point); + Result ClearInitialLaunchSettingsCompletionTime(); + Result UpdatePowerOnTime(); + Result UpdateAwakeTime(); + Result SubmitMultipleCategoryContext(const MultipleCategoryContextEntry &ctx_entry, const ams::sf::InBuffer &str_buffer); + Result UpdateApplicationLaunchTime(); + Result ClearApplicationLaunchTime(); + Result SubmitAttachment(ams::sf::Out out, const ams::sf::InBuffer &attachment_name, const ams::sf::InBuffer &attachment_data); + Result CreateReportWithAttachments(ReportType report_type, const ams::sf::InBuffer &ctx_buffer, const ams::sf::InBuffer &data_buffer, const ams::sf::InBuffer &attachment_ids_buffer); }; + static_assert(erpt::sf::IsIContext); } diff --git a/libstratosphere/source/erpt/srv/erpt_srv_manager_impl.hpp b/libstratosphere/source/erpt/srv/erpt_srv_manager_impl.hpp index b75d0195..e59dddb5 100644 --- a/libstratosphere/source/erpt/srv/erpt_srv_manager_impl.hpp +++ b/libstratosphere/source/erpt/srv/erpt_srv_manager_impl.hpp @@ -18,7 +18,7 @@ namespace ams::erpt::srv { - class ManagerImpl final : public erpt::sf::IManager, public util::IntrusiveListBaseNode { + class ManagerImpl final : public util::IntrusiveListBaseNode { private: os::SystemEvent system_event; public: @@ -29,12 +29,13 @@ namespace ams::erpt::srv { public: static Result NotifyAll(); public: - virtual Result GetReportList(const ams::sf::OutBuffer &out_list, ReportType type_filter) override final; - virtual Result GetEvent(ams::sf::OutCopyHandle out) override final; - virtual Result CleanupReports() override final; - virtual Result DeleteReport(const ReportId &report_id) override final; - virtual Result GetStorageUsageStatistics(ams::sf::Out out) override final; - virtual Result GetAttachmentList(const ams::sf::OutBuffer &out_buf, const ReportId &report_id) override final; + Result GetReportList(const ams::sf::OutBuffer &out_list, ReportType type_filter); + Result GetEvent(ams::sf::OutCopyHandle out); + Result CleanupReports(); + Result DeleteReport(const ReportId &report_id); + Result GetStorageUsageStatistics(ams::sf::Out out); + Result GetAttachmentList(const ams::sf::OutBuffer &out_buf, const ReportId &report_id); }; + static_assert(erpt::sf::IsIManager); } diff --git a/libstratosphere/source/erpt/srv/erpt_srv_report_impl.hpp b/libstratosphere/source/erpt/srv/erpt_srv_report_impl.hpp index 8b60e536..c1adc252 100644 --- a/libstratosphere/source/erpt/srv/erpt_srv_report_impl.hpp +++ b/libstratosphere/source/erpt/srv/erpt_srv_report_impl.hpp @@ -20,19 +20,20 @@ namespace ams::erpt::srv { class Report; - class ReportImpl final : public erpt::sf::IReport { + class ReportImpl final { private: Report *report; public: ReportImpl(); ~ReportImpl(); public: - virtual Result Open(const ReportId &report_id) override final; - virtual Result Read(ams::sf::Out out_count, const ams::sf::OutBuffer &out_buffer) override final; - virtual Result SetFlags(ReportFlagSet flags) override final; - virtual Result GetFlags(ams::sf::Out out) override final; - virtual Result Close() override final; - virtual Result GetSize(ams::sf::Out out) override final; + Result Open(const ReportId &report_id); + Result Read(ams::sf::Out out_count, const ams::sf::OutBuffer &out_buffer); + Result SetFlags(ReportFlagSet flags); + Result GetFlags(ams::sf::Out out); + Result Close(); + Result GetSize(ams::sf::Out out); }; + static_assert(erpt::sf::IsIReport); } diff --git a/libstratosphere/source/erpt/srv/erpt_srv_service.cpp b/libstratosphere/source/erpt/srv/erpt_srv_service.cpp index b6fd8725..293a5358 100644 --- a/libstratosphere/source/erpt/srv/erpt_srv_service.cpp +++ b/libstratosphere/source/erpt/srv/erpt_srv_service.cpp @@ -42,7 +42,7 @@ namespace ams::erpt::srv { class ErrorReportServiceManager : public ams::sf::hipc::ServerManager { private: os::ThreadType thread; - std::shared_ptr context_session_object; + std::shared_ptr context_session_object; private: static void ThreadFunction(void *_this) { reinterpret_cast(_this)->SetupAndLoopProcess(); @@ -51,14 +51,14 @@ namespace ams::erpt::srv { void SetupAndLoopProcess(); public: ErrorReportServiceManager(erpt::srv::ContextImpl *c) - : context_session_object(ams::sf::ServiceObjectTraits::SharedPointerHelper::GetEmptyDeleteSharedPointer(c)) + : context_session_object(ams::sf::GetSharedPointerTo(c)) { /* ... */ } Result Initialize() { - R_ABORT_UNLESS(this->RegisterServer(ErrorReportContextServiceName, ErrorReportContextSessions, this->context_session_object)); - R_ABORT_UNLESS(this->RegisterServer(ErrorReportReportServiceName, ErrorReportReportSessions)); + R_ABORT_UNLESS((this->RegisterServer(ErrorReportContextServiceName, ErrorReportContextSessions, this->context_session_object))); + R_ABORT_UNLESS((this->RegisterServer(ErrorReportReportServiceName, ErrorReportReportSessions))); this->ResumeProcessing(); @@ -117,7 +117,7 @@ namespace ams::erpt::srv { } } - erpt::srv::ContextImpl g_context_object; + constinit erpt::srv::ContextImpl g_context_object; ErrorReportServiceManager g_erpt_server_manager(std::addressof(g_context_object)); } diff --git a/libstratosphere/source/erpt/srv/erpt_srv_session_impl.cpp b/libstratosphere/source/erpt/srv/erpt_srv_session_impl.cpp index 3a0eda8b..4aec973b 100644 --- a/libstratosphere/source/erpt/srv/erpt_srv_session_impl.cpp +++ b/libstratosphere/source/erpt/srv/erpt_srv_session_impl.cpp @@ -21,34 +21,34 @@ namespace ams::erpt::srv { - Result SessionImpl::OpenReport(ams::sf::Out> out) { - /* Create an interface. */ - auto intf = std::shared_ptr(new (std::nothrow) ReportImpl); - R_UNLESS(intf != nullptr, erpt::ResultOutOfMemory()); + namespace { - /* Return it. */ - out.SetValue(std::move(intf)); - return ResultSuccess(); + template + ALWAYS_INLINE Result OpenInterface(ams::sf::Out> &out) { + /* Define holder type. */ + using Holder = typename Interface::ImplHolder; + + /* Create an interface holder. */ + auto intf = std::shared_ptr(new (std::nothrow) Holder); + R_UNLESS(intf != nullptr, erpt::ResultOutOfMemory()); + + /* Return it. */ + out.SetValue(std::move(intf)); + return ResultSuccess(); + } + + } + + Result SessionImpl::OpenReport(ams::sf::Out> out) { + return OpenInterface(out); } Result SessionImpl::OpenManager(ams::sf::Out> out) { - /* Create an interface. */ - auto intf = std::shared_ptr(new (std::nothrow) ManagerImpl); - R_UNLESS(intf != nullptr, erpt::ResultOutOfMemory()); - - /* Return it. */ - out.SetValue(std::move(intf)); - return ResultSuccess(); + return OpenInterface(out); } Result SessionImpl::OpenAttachment(ams::sf::Out> out) { - /* Create an interface. */ - auto intf = std::shared_ptr(new (std::nothrow) AttachmentImpl); - R_UNLESS(intf != nullptr, erpt::ResultOutOfMemory()); - - /* Return it. */ - out.SetValue(std::move(intf)); - return ResultSuccess(); + return OpenInterface(out); } } diff --git a/libstratosphere/source/erpt/srv/erpt_srv_session_impl.hpp b/libstratosphere/source/erpt/srv/erpt_srv_session_impl.hpp index 4dcc165b..8d68c701 100644 --- a/libstratosphere/source/erpt/srv/erpt_srv_session_impl.hpp +++ b/libstratosphere/source/erpt/srv/erpt_srv_session_impl.hpp @@ -18,11 +18,12 @@ namespace ams::erpt::srv { - class SessionImpl final : public erpt::sf::ISession { + class SessionImpl final { public: - virtual Result OpenReport(ams::sf::Out> out) override final; - virtual Result OpenManager(ams::sf::Out> out) override final; - virtual Result OpenAttachment(ams::sf::Out> out) override final; + Result OpenReport(ams::sf::Out> out); + Result OpenManager(ams::sf::Out> out); + Result OpenAttachment(ams::sf::Out> out); }; + static_assert(erpt::sf::IsISession); } diff --git a/libstratosphere/source/fs/fsa/fs_user_filesystem.cpp b/libstratosphere/source/fs/fsa/fs_user_filesystem.cpp index c1d5bfdd..6308ef9d 100644 --- a/libstratosphere/source/fs/fsa/fs_user_filesystem.cpp +++ b/libstratosphere/source/fs/fsa/fs_user_filesystem.cpp @@ -184,7 +184,7 @@ namespace ams::fs { /* Get the space size. */ auto get_size_impl = [&]() -> Result { R_UNLESS(sub_path == nullptr || std::strcmp(sub_path, "/") == 0, fs::ResultInvalidMountName()); - R_TRY(accessor->GetFreeSpaceSize(out, path)); + R_TRY(accessor->GetFreeSpaceSize(out, "/")); return ResultSuccess(); }; @@ -214,7 +214,7 @@ namespace ams::fs { /* Get the space size. */ auto get_size_impl = [&]() -> Result { R_UNLESS(sub_path == nullptr || std::strcmp(sub_path, "/") == 0, fs::ResultInvalidMountName()); - R_TRY(accessor->GetTotalSpaceSize(out, path)); + R_TRY(accessor->GetTotalSpaceSize(out, "/")); return ResultSuccess(); }; diff --git a/libstratosphere/source/fssrv/fssrv_filesystem_interface_adapter.cpp b/libstratosphere/source/fssrv/fssrv_filesystem_interface_adapter.cpp index 75b2dbd1..23040e25 100644 --- a/libstratosphere/source/fssrv/fssrv_filesystem_interface_adapter.cpp +++ b/libstratosphere/source/fssrv/fssrv_filesystem_interface_adapter.cpp @@ -232,7 +232,7 @@ namespace ams::fssrv::impl { return this->base_fs->GetEntryType(reinterpret_cast(out.GetPointer()), normalizer.GetPath()); } - Result FileSystemInterfaceAdapter::OpenFile(ams::sf::Out> out, const fssrv::sf::Path &path, u32 mode) { + Result FileSystemInterfaceAdapter::OpenFile(ams::sf::Out> out, const fssrv::sf::Path &path, u32 mode) { auto read_lock = this->AcquireCacheInvalidationReadLock(); std::unique_lock open_count_semaphore; @@ -254,14 +254,14 @@ namespace ams::fssrv::impl { /* TODO: N creates an nn::fssystem::AsynchronousAccessFile here. */ std::shared_ptr shared_this = this->shared_from_this(); - std::shared_ptr file_intf = std::make_shared(std::move(file), std::move(shared_this), std::move(open_count_semaphore)); + auto file_intf = ams::sf::MakeShared(std::move(file), std::move(shared_this), std::move(open_count_semaphore)); R_UNLESS(file_intf != nullptr, fs::ResultAllocationFailureInFileSystemInterfaceAdapter()); out.SetValue(std::move(file_intf), target_object_id); return ResultSuccess(); } - Result FileSystemInterfaceAdapter::OpenDirectory(ams::sf::Out> out, const fssrv::sf::Path &path, u32 mode) { + Result FileSystemInterfaceAdapter::OpenDirectory(ams::sf::Out> out, const fssrv::sf::Path &path, u32 mode) { auto read_lock = this->AcquireCacheInvalidationReadLock(); std::unique_lock open_count_semaphore; @@ -281,7 +281,7 @@ namespace ams::fssrv::impl { const auto target_object_id = dir->GetDomainObjectId(); std::shared_ptr shared_this = this->shared_from_this(); - std::shared_ptr dir_intf = std::make_shared(std::move(dir), std::move(shared_this), std::move(open_count_semaphore)); + auto dir_intf = ams::sf::MakeShared(std::move(dir), std::move(shared_this), std::move(open_count_semaphore)); R_UNLESS(dir_intf != nullptr, fs::ResultAllocationFailureInFileSystemInterfaceAdapter()); out.SetValue(std::move(dir_intf), target_object_id); diff --git a/libstratosphere/source/lr/lr_add_on_content_location_resolver_impl.hpp b/libstratosphere/source/lr/lr_add_on_content_location_resolver_impl.hpp index 17c7a0c1..60e57b76 100644 --- a/libstratosphere/source/lr/lr_add_on_content_location_resolver_impl.hpp +++ b/libstratosphere/source/lr/lr_add_on_content_location_resolver_impl.hpp @@ -21,7 +21,7 @@ namespace ams::lr { - class AddOnContentLocationResolverImpl : public IAddOnContentLocationResolver { + class AddOnContentLocationResolverImpl { private: /* Storage for RegisteredData entries by data id. */ RegisteredStorages registered_storages; @@ -29,12 +29,13 @@ namespace ams::lr { AddOnContentLocationResolverImpl() : registered_storages(hos::GetVersion() < hos::Version_9_0_0 ? 0x800 : 0x2) { /* ... */ } /* Actual commands. */ - virtual Result ResolveAddOnContentPath(sf::Out out, ncm::DataId id) override; - virtual Result RegisterAddOnContentStorageDeprecated(ncm::DataId id, ncm::StorageId storage_id) override; - virtual Result RegisterAddOnContentStorage(ncm::DataId id, ncm::ApplicationId application_id, ncm::StorageId storage_id) override; - virtual Result UnregisterAllAddOnContentPath() override; - virtual Result RefreshApplicationAddOnContent(const sf::InArray &ids) override; - virtual Result UnregisterApplicationAddOnContent(ncm::ApplicationId id) override; + Result ResolveAddOnContentPath(sf::Out out, ncm::DataId id); + Result RegisterAddOnContentStorageDeprecated(ncm::DataId id, ncm::StorageId storage_id); + Result RegisterAddOnContentStorage(ncm::DataId id, ncm::ApplicationId application_id, ncm::StorageId storage_id); + Result UnregisterAllAddOnContentPath(); + Result RefreshApplicationAddOnContent(const sf::InArray &ids); + Result UnregisterApplicationAddOnContent(ncm::ApplicationId id); }; + static_assert(lr::IsIAddOnContentLocationResolver); } diff --git a/libstratosphere/source/lr/lr_api.cpp b/libstratosphere/source/lr/lr_api.cpp index 36a7cb81..39128508 100644 --- a/libstratosphere/source/lr/lr_api.cpp +++ b/libstratosphere/source/lr/lr_api.cpp @@ -42,7 +42,7 @@ namespace ams::lr { LrLocationResolver lr; R_TRY(lrOpenLocationResolver(static_cast(storage_id), std::addressof(lr))); - *out = LocationResolver(std::make_shared(lr)); + *out = LocationResolver(sf::MakeShared(lr)); return ResultSuccess(); } @@ -50,7 +50,7 @@ namespace ams::lr { LrRegisteredLocationResolver lr; R_TRY(lrOpenRegisteredLocationResolver(std::addressof(lr))); - *out = RegisteredLocationResolver(std::make_shared(lr)); + *out = RegisteredLocationResolver(sf::MakeShared(lr)); return ResultSuccess(); } diff --git a/libstratosphere/source/lr/lr_content_location_resolver_impl.hpp b/libstratosphere/source/lr/lr_content_location_resolver_impl.hpp index 5553962d..5b344bdf 100644 --- a/libstratosphere/source/lr/lr_content_location_resolver_impl.hpp +++ b/libstratosphere/source/lr/lr_content_location_resolver_impl.hpp @@ -35,32 +35,33 @@ namespace ams::lr { void GetContentStoragePath(Path *out, ncm::ContentId content_id); public: /* Actual commands. */ - virtual Result ResolveProgramPath(sf::Out out, ncm::ProgramId id) override; - virtual Result RedirectProgramPath(const Path &path, ncm::ProgramId id) override; - virtual Result ResolveApplicationControlPath(sf::Out out, ncm::ProgramId id) override; - virtual Result ResolveApplicationHtmlDocumentPath(sf::Out out, ncm::ProgramId id) override; - virtual Result ResolveDataPath(sf::Out out, ncm::DataId id) override; - virtual Result RedirectApplicationControlPathDeprecated(const Path &path, ncm::ProgramId id) override; - virtual Result RedirectApplicationControlPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override; - virtual Result RedirectApplicationHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id) override; - virtual Result RedirectApplicationHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override; - virtual Result ResolveApplicationLegalInformationPath(sf::Out out, ncm::ProgramId id) override; - virtual Result RedirectApplicationLegalInformationPathDeprecated(const Path &path, ncm::ProgramId id) override; - virtual Result RedirectApplicationLegalInformationPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override; - virtual Result Refresh() override; - virtual Result RedirectApplicationProgramPathDeprecated(const Path &path, ncm::ProgramId id) override; - virtual Result RedirectApplicationProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override; - virtual Result ClearApplicationRedirectionDeprecated() override; - virtual Result ClearApplicationRedirection(const sf::InArray &excluding_ids) override; - virtual Result EraseProgramRedirection(ncm::ProgramId id) override; - virtual Result EraseApplicationControlRedirection(ncm::ProgramId id) override; - virtual Result EraseApplicationHtmlDocumentRedirection(ncm::ProgramId id) override; - virtual Result EraseApplicationLegalInformationRedirection(ncm::ProgramId id) override; - virtual Result ResolveProgramPathForDebug(sf::Out out, ncm::ProgramId id) override; - virtual Result RedirectProgramPathForDebug(const Path &path, ncm::ProgramId id) override; - virtual Result RedirectApplicationProgramPathForDebugDeprecated(const Path &path, ncm::ProgramId id) override; - virtual Result RedirectApplicationProgramPathForDebug(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override; - virtual Result EraseProgramRedirectionForDebug(ncm::ProgramId id) override; + Result ResolveProgramPath(sf::Out out, ncm::ProgramId id); + Result RedirectProgramPath(const Path &path, ncm::ProgramId id); + Result ResolveApplicationControlPath(sf::Out out, ncm::ProgramId id); + Result ResolveApplicationHtmlDocumentPath(sf::Out out, ncm::ProgramId id); + Result ResolveDataPath(sf::Out out, ncm::DataId id); + Result RedirectApplicationControlPathDeprecated(const Path &path, ncm::ProgramId id); + Result RedirectApplicationControlPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id); + Result RedirectApplicationHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id); + Result RedirectApplicationHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id); + Result ResolveApplicationLegalInformationPath(sf::Out out, ncm::ProgramId id); + Result RedirectApplicationLegalInformationPathDeprecated(const Path &path, ncm::ProgramId id); + Result RedirectApplicationLegalInformationPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id); + Result Refresh(); + Result RedirectApplicationProgramPathDeprecated(const Path &path, ncm::ProgramId id); + Result RedirectApplicationProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id); + Result ClearApplicationRedirectionDeprecated(); + Result ClearApplicationRedirection(const sf::InArray &excluding_ids); + Result EraseProgramRedirection(ncm::ProgramId id); + Result EraseApplicationControlRedirection(ncm::ProgramId id); + Result EraseApplicationHtmlDocumentRedirection(ncm::ProgramId id); + Result EraseApplicationLegalInformationRedirection(ncm::ProgramId id); + Result ResolveProgramPathForDebug(sf::Out out, ncm::ProgramId id); + Result RedirectProgramPathForDebug(const Path &path, ncm::ProgramId id); + Result RedirectApplicationProgramPathForDebugDeprecated(const Path &path, ncm::ProgramId id); + Result RedirectApplicationProgramPathForDebug(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id); + Result EraseProgramRedirectionForDebug(ncm::ProgramId id); }; + static_assert(lr::IsILocationResolver); } diff --git a/libstratosphere/source/lr/lr_location_resolver_impl_base.hpp b/libstratosphere/source/lr/lr_location_resolver_impl_base.hpp index d8931d04..03f7c68e 100644 --- a/libstratosphere/source/lr/lr_location_resolver_impl_base.hpp +++ b/libstratosphere/source/lr/lr_location_resolver_impl_base.hpp @@ -20,7 +20,7 @@ namespace ams::lr { - class LocationResolverImplBase : public ILocationResolver { + class LocationResolverImplBase { NON_COPYABLE(LocationResolverImplBase); NON_MOVEABLE(LocationResolverImplBase); protected: diff --git a/libstratosphere/source/lr/lr_location_resolver_manager_impl.cpp b/libstratosphere/source/lr/lr_location_resolver_manager_impl.cpp index f726cdf7..fd5392c5 100644 --- a/libstratosphere/source/lr/lr_location_resolver_manager_impl.cpp +++ b/libstratosphere/source/lr/lr_location_resolver_manager_impl.cpp @@ -30,10 +30,10 @@ namespace ams::lr { /* No existing resolver is present, create one. */ if (!resolver) { if (storage_id == ncm::StorageId::Host) { - AMS_ABORT_UNLESS(this->location_resolvers.Insert(storage_id, std::make_shared())); + AMS_ABORT_UNLESS(this->location_resolvers.Insert(storage_id, sf::MakeShared())); } else { - auto content_resolver = std::make_shared(storage_id); - R_TRY(content_resolver->Refresh()); + auto content_resolver = sf::MakeShared(storage_id); + R_TRY(content_resolver->GetImpl().Refresh()); AMS_ABORT_UNLESS(this->location_resolvers.Insert(storage_id, std::move(content_resolver))); } @@ -51,7 +51,7 @@ namespace ams::lr { /* No existing resolver is present, create one. */ if (!this->registered_location_resolver) { - this->registered_location_resolver = std::make_shared(); + this->registered_location_resolver = sf::MakeShared(); } /* Copy the output interface. */ @@ -79,7 +79,7 @@ namespace ams::lr { /* No existing resolver is present, create one. */ if (!this->add_on_content_location_resolver) { - this->add_on_content_location_resolver = std::make_shared(); + this->add_on_content_location_resolver = sf::MakeShared(); } /* Copy the output interface. */ diff --git a/libstratosphere/source/lr/lr_redirect_only_location_resolver_impl.hpp b/libstratosphere/source/lr/lr_redirect_only_location_resolver_impl.hpp index a204169d..a9aee02b 100644 --- a/libstratosphere/source/lr/lr_redirect_only_location_resolver_impl.hpp +++ b/libstratosphere/source/lr/lr_redirect_only_location_resolver_impl.hpp @@ -24,32 +24,33 @@ namespace ams::lr { ~RedirectOnlyLocationResolverImpl(); public: /* Actual commands. */ - virtual Result ResolveProgramPath(sf::Out out, ncm::ProgramId id) override; - virtual Result RedirectProgramPath(const Path &path, ncm::ProgramId id) override; - virtual Result ResolveApplicationControlPath(sf::Out out, ncm::ProgramId id) override; - virtual Result ResolveApplicationHtmlDocumentPath(sf::Out out, ncm::ProgramId id) override; - virtual Result ResolveDataPath(sf::Out out, ncm::DataId id) override; - virtual Result RedirectApplicationControlPathDeprecated(const Path &path, ncm::ProgramId id) override; - virtual Result RedirectApplicationControlPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override; - virtual Result RedirectApplicationHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id) override; - virtual Result RedirectApplicationHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override; - virtual Result ResolveApplicationLegalInformationPath(sf::Out out, ncm::ProgramId id) override; - virtual Result RedirectApplicationLegalInformationPathDeprecated(const Path &path, ncm::ProgramId id) override; - virtual Result RedirectApplicationLegalInformationPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override; - virtual Result Refresh() override; - virtual Result RedirectApplicationProgramPathDeprecated(const Path &path, ncm::ProgramId id) override; - virtual Result RedirectApplicationProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override; - virtual Result ClearApplicationRedirectionDeprecated() override; - virtual Result ClearApplicationRedirection(const sf::InArray &excluding_ids) override; - virtual Result EraseProgramRedirection(ncm::ProgramId id) override; - virtual Result EraseApplicationControlRedirection(ncm::ProgramId id) override; - virtual Result EraseApplicationHtmlDocumentRedirection(ncm::ProgramId id) override; - virtual Result EraseApplicationLegalInformationRedirection(ncm::ProgramId id) override; - virtual Result ResolveProgramPathForDebug(sf::Out out, ncm::ProgramId id) override; - virtual Result RedirectProgramPathForDebug(const Path &path, ncm::ProgramId id) override; - virtual Result RedirectApplicationProgramPathForDebugDeprecated(const Path &path, ncm::ProgramId id) override; - virtual Result RedirectApplicationProgramPathForDebug(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override; - virtual Result EraseProgramRedirectionForDebug(ncm::ProgramId id) override; + Result ResolveProgramPath(sf::Out out, ncm::ProgramId id); + Result RedirectProgramPath(const Path &path, ncm::ProgramId id); + Result ResolveApplicationControlPath(sf::Out out, ncm::ProgramId id); + Result ResolveApplicationHtmlDocumentPath(sf::Out out, ncm::ProgramId id); + Result ResolveDataPath(sf::Out out, ncm::DataId id); + Result RedirectApplicationControlPathDeprecated(const Path &path, ncm::ProgramId id); + Result RedirectApplicationControlPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id); + Result RedirectApplicationHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id); + Result RedirectApplicationHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id); + Result ResolveApplicationLegalInformationPath(sf::Out out, ncm::ProgramId id); + Result RedirectApplicationLegalInformationPathDeprecated(const Path &path, ncm::ProgramId id); + Result RedirectApplicationLegalInformationPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id); + Result Refresh(); + Result RedirectApplicationProgramPathDeprecated(const Path &path, ncm::ProgramId id); + Result RedirectApplicationProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id); + Result ClearApplicationRedirectionDeprecated(); + Result ClearApplicationRedirection(const sf::InArray &excluding_ids); + Result EraseProgramRedirection(ncm::ProgramId id); + Result EraseApplicationControlRedirection(ncm::ProgramId id); + Result EraseApplicationHtmlDocumentRedirection(ncm::ProgramId id); + Result EraseApplicationLegalInformationRedirection(ncm::ProgramId id); + Result ResolveProgramPathForDebug(sf::Out out, ncm::ProgramId id); + Result RedirectProgramPathForDebug(const Path &path, ncm::ProgramId id); + Result RedirectApplicationProgramPathForDebugDeprecated(const Path &path, ncm::ProgramId id); + Result RedirectApplicationProgramPathForDebug(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id); + Result EraseProgramRedirectionForDebug(ncm::ProgramId id); }; + static_assert(lr::IsILocationResolver); } diff --git a/libstratosphere/source/lr/lr_registered_location_resolver_impl.hpp b/libstratosphere/source/lr/lr_registered_location_resolver_impl.hpp index 1a5ea699..b1399336 100644 --- a/libstratosphere/source/lr/lr_registered_location_resolver_impl.hpp +++ b/libstratosphere/source/lr/lr_registered_location_resolver_impl.hpp @@ -21,7 +21,7 @@ namespace ams::lr { - class RegisteredLocationResolverImpl : public IRegisteredLocationResolver { + class RegisteredLocationResolverImpl { private: static constexpr size_t MaxRegisteredLocationsDeprecated = 0x10; static constexpr size_t MaxRegisteredLocations = 0x20; @@ -49,20 +49,21 @@ namespace ams::lr { ~RegisteredLocationResolverImpl(); public: /* Actual commands. */ - virtual Result ResolveProgramPath(sf::Out out, ncm::ProgramId id) override; - virtual Result RegisterProgramPathDeprecated(const Path &path, ncm::ProgramId id) override; - virtual Result RegisterProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override; - virtual Result UnregisterProgramPath(ncm::ProgramId id) override; - virtual Result RedirectProgramPathDeprecated(const Path &path, ncm::ProgramId id) override; - virtual Result RedirectProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override; - virtual Result ResolveHtmlDocumentPath(sf::Out out, ncm::ProgramId id) override; - virtual Result RegisterHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id) override; - virtual Result RegisterHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override; - virtual Result UnregisterHtmlDocumentPath(ncm::ProgramId id) override; - virtual Result RedirectHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id) override; - virtual Result RedirectHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override; - virtual Result Refresh() override; - virtual Result RefreshExcluding(const sf::InArray &ids) override; + Result ResolveProgramPath(sf::Out out, ncm::ProgramId id); + Result RegisterProgramPathDeprecated(const Path &path, ncm::ProgramId id); + Result RegisterProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id); + Result UnregisterProgramPath(ncm::ProgramId id); + Result RedirectProgramPathDeprecated(const Path &path, ncm::ProgramId id); + Result RedirectProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id); + Result ResolveHtmlDocumentPath(sf::Out out, ncm::ProgramId id); + Result RegisterHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id); + Result RegisterHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id); + Result UnregisterHtmlDocumentPath(ncm::ProgramId id); + Result RedirectHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id); + Result RedirectHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id); + Result Refresh(); + Result RefreshExcluding(const sf::InArray &ids); }; + static_assert(lr::IsIRegisteredLocationResolver); } diff --git a/libstratosphere/source/lr/lr_remote_location_resolver_impl.hpp b/libstratosphere/source/lr/lr_remote_location_resolver_impl.hpp index 59093e7d..895325dc 100644 --- a/libstratosphere/source/lr/lr_remote_location_resolver_impl.hpp +++ b/libstratosphere/source/lr/lr_remote_location_resolver_impl.hpp @@ -18,7 +18,7 @@ namespace ams::lr { - class RemoteLocationResolverImpl : public ILocationResolver { + class RemoteLocationResolverImpl { private: ::LrLocationResolver srv; public: @@ -27,121 +27,122 @@ namespace ams::lr { ~RemoteLocationResolverImpl() { ::serviceClose(&srv.s); } public: /* Actual commands. */ - virtual Result ResolveProgramPath(sf::Out out, ncm::ProgramId id) override { - return lrLrResolveProgramPath(std::addressof(this->srv), id.value, out->str); + Result ResolveProgramPath(sf::Out out, ncm::ProgramId id) { + return ::lrLrResolveProgramPath(std::addressof(this->srv), id.value, out->str); } - virtual Result RedirectProgramPath(const Path &path, ncm::ProgramId id) override { - return lrLrRedirectProgramPath(std::addressof(this->srv), id.value, path.str); + Result RedirectProgramPath(const Path &path, ncm::ProgramId id) { + return ::lrLrRedirectProgramPath(std::addressof(this->srv), id.value, path.str); } - virtual Result ResolveApplicationControlPath(sf::Out out, ncm::ProgramId id) override { - return lrLrResolveApplicationControlPath(std::addressof(this->srv), id.value, out->str); + Result ResolveApplicationControlPath(sf::Out out, ncm::ProgramId id) { + return ::lrLrResolveApplicationControlPath(std::addressof(this->srv), id.value, out->str); } - virtual Result ResolveApplicationHtmlDocumentPath(sf::Out out, ncm::ProgramId id) override { - return lrLrResolveApplicationHtmlDocumentPath(std::addressof(this->srv), id.value, out->str); + Result ResolveApplicationHtmlDocumentPath(sf::Out out, ncm::ProgramId id) { + return ::lrLrResolveApplicationHtmlDocumentPath(std::addressof(this->srv), id.value, out->str); } - virtual Result ResolveDataPath(sf::Out out, ncm::DataId id) override { - return lrLrResolveDataPath(std::addressof(this->srv), id.value, out->str); + Result ResolveDataPath(sf::Out out, ncm::DataId id) { + return ::lrLrResolveDataPath(std::addressof(this->srv), id.value, out->str); } - virtual Result RedirectApplicationControlPathDeprecated(const Path &path, ncm::ProgramId id) override { - return lrLrRedirectApplicationControlPath(std::addressof(this->srv), id.value, 0, path.str); + Result RedirectApplicationControlPathDeprecated(const Path &path, ncm::ProgramId id) { + return ::lrLrRedirectApplicationControlPath(std::addressof(this->srv), id.value, 0, path.str); } - virtual Result RedirectApplicationControlPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override { - return lrLrRedirectApplicationControlPath(std::addressof(this->srv), id.value, owner_id.value, path.str); + Result RedirectApplicationControlPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) { + return ::lrLrRedirectApplicationControlPath(std::addressof(this->srv), id.value, owner_id.value, path.str); } - virtual Result RedirectApplicationHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id) override { - return lrLrRedirectApplicationHtmlDocumentPath(std::addressof(this->srv), id.value, 0, path.str); + Result RedirectApplicationHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id) { + return ::lrLrRedirectApplicationHtmlDocumentPath(std::addressof(this->srv), id.value, 0, path.str); } - virtual Result RedirectApplicationHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override { - return lrLrRedirectApplicationHtmlDocumentPath(std::addressof(this->srv), id.value, owner_id.value, path.str); + Result RedirectApplicationHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) { + return ::lrLrRedirectApplicationHtmlDocumentPath(std::addressof(this->srv), id.value, owner_id.value, path.str); } - virtual Result ResolveApplicationLegalInformationPath(sf::Out out, ncm::ProgramId id) override { - return lrLrResolveApplicationLegalInformationPath(std::addressof(this->srv), id.value, out->str); + Result ResolveApplicationLegalInformationPath(sf::Out out, ncm::ProgramId id) { + return ::lrLrResolveApplicationLegalInformationPath(std::addressof(this->srv), id.value, out->str); } - virtual Result RedirectApplicationLegalInformationPathDeprecated(const Path &path, ncm::ProgramId id) override { - return lrLrRedirectApplicationLegalInformationPath(std::addressof(this->srv), id.value, 0, path.str); + Result RedirectApplicationLegalInformationPathDeprecated(const Path &path, ncm::ProgramId id) { + return ::lrLrRedirectApplicationLegalInformationPath(std::addressof(this->srv), id.value, 0, path.str); } - virtual Result RedirectApplicationLegalInformationPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override { - return lrLrRedirectApplicationLegalInformationPath(std::addressof(this->srv), id.value, owner_id.value, path.str); + Result RedirectApplicationLegalInformationPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) { + return ::lrLrRedirectApplicationLegalInformationPath(std::addressof(this->srv), id.value, owner_id.value, path.str); } - virtual Result Refresh() override { - return lrLrRefresh(std::addressof(this->srv)); + Result Refresh() { + return ::lrLrRefresh(std::addressof(this->srv)); } - virtual Result RedirectApplicationProgramPathDeprecated(const Path &path, ncm::ProgramId id) override { + Result RedirectApplicationProgramPathDeprecated(const Path &path, ncm::ProgramId id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result RedirectApplicationProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override { + Result RedirectApplicationProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result ClearApplicationRedirectionDeprecated() override { + Result ClearApplicationRedirectionDeprecated() { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result ClearApplicationRedirection(const sf::InArray &excluding_ids) override { + Result ClearApplicationRedirection(const sf::InArray &excluding_ids) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result EraseProgramRedirection(ncm::ProgramId id) override { - return lrLrEraseProgramRedirection(std::addressof(this->srv), id.value); + Result EraseProgramRedirection(ncm::ProgramId id) { + return ::lrLrEraseProgramRedirection(std::addressof(this->srv), id.value); } - virtual Result EraseApplicationControlRedirection(ncm::ProgramId id) override { + Result EraseApplicationControlRedirection(ncm::ProgramId id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result EraseApplicationHtmlDocumentRedirection(ncm::ProgramId id) override { + Result EraseApplicationHtmlDocumentRedirection(ncm::ProgramId id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result EraseApplicationLegalInformationRedirection(ncm::ProgramId id) override { + Result EraseApplicationLegalInformationRedirection(ncm::ProgramId id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result ResolveProgramPathForDebug(sf::Out out, ncm::ProgramId id) override { + Result ResolveProgramPathForDebug(sf::Out out, ncm::ProgramId id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result RedirectProgramPathForDebug(const Path &path, ncm::ProgramId id) override { + Result RedirectProgramPathForDebug(const Path &path, ncm::ProgramId id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result RedirectApplicationProgramPathForDebugDeprecated(const Path &path, ncm::ProgramId id) override { + Result RedirectApplicationProgramPathForDebugDeprecated(const Path &path, ncm::ProgramId id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result RedirectApplicationProgramPathForDebug(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override { + Result RedirectApplicationProgramPathForDebug(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result EraseProgramRedirectionForDebug(ncm::ProgramId id) override { + Result EraseProgramRedirectionForDebug(ncm::ProgramId id) { /* TODO: libnx bindings */ AMS_ABORT(); } }; + static_assert(lr::IsILocationResolver); } diff --git a/libstratosphere/source/lr/lr_remote_registered_location_resolver_impl.hpp b/libstratosphere/source/lr/lr_remote_registered_location_resolver_impl.hpp index 3b855175..2a3367d3 100644 --- a/libstratosphere/source/lr/lr_remote_registered_location_resolver_impl.hpp +++ b/libstratosphere/source/lr/lr_remote_registered_location_resolver_impl.hpp @@ -19,7 +19,7 @@ namespace ams::lr { - class RemoteRegisteredLocationResolverImpl : public IRegisteredLocationResolver { + class RemoteRegisteredLocationResolverImpl { private: ::LrRegisteredLocationResolver srv; public: @@ -28,74 +28,75 @@ namespace ams::lr { ~RemoteRegisteredLocationResolverImpl() { ::serviceClose(&srv.s); } public: /* Actual commands. */ - virtual Result ResolveProgramPath(sf::Out out, ncm::ProgramId id) override { - return lrRegLrResolveProgramPath(std::addressof(this->srv), static_cast(id), out->str); + Result ResolveProgramPath(sf::Out out, ncm::ProgramId id) { + return ::lrRegLrResolveProgramPath(std::addressof(this->srv), static_cast(id), out->str); } - virtual Result RegisterProgramPathDeprecated(const Path &path, ncm::ProgramId id) override { + Result RegisterProgramPathDeprecated(const Path &path, ncm::ProgramId id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result RegisterProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override { + Result RegisterProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result UnregisterProgramPath(ncm::ProgramId id) override { + Result UnregisterProgramPath(ncm::ProgramId id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result RedirectProgramPathDeprecated(const Path &path, ncm::ProgramId id) override { + Result RedirectProgramPathDeprecated(const Path &path, ncm::ProgramId id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result RedirectProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override { + Result RedirectProgramPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result ResolveHtmlDocumentPath(sf::Out out, ncm::ProgramId id) override { + Result ResolveHtmlDocumentPath(sf::Out out, ncm::ProgramId id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result RegisterHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id) override { + Result RegisterHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result RegisterHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override { + Result RegisterHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result UnregisterHtmlDocumentPath(ncm::ProgramId id) override { + Result UnregisterHtmlDocumentPath(ncm::ProgramId id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result RedirectHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id) override { + Result RedirectHtmlDocumentPathDeprecated(const Path &path, ncm::ProgramId id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result RedirectHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) override { + Result RedirectHtmlDocumentPath(const Path &path, ncm::ProgramId id, ncm::ProgramId owner_id) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result Refresh() override { + Result Refresh() { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result RefreshExcluding(const sf::InArray &ids) override { + Result RefreshExcluding(const sf::InArray &ids) { /* TODO: libnx bindings */ AMS_ABORT(); } }; + static_assert(lr::IsIRegisteredLocationResolver); } diff --git a/libstratosphere/source/ncm/ncm_api.cpp b/libstratosphere/source/ncm/ncm_api.cpp index b2c3e2d9..ca392ab6 100644 --- a/libstratosphere/source/ncm/ncm_api.cpp +++ b/libstratosphere/source/ncm/ncm_api.cpp @@ -27,7 +27,7 @@ namespace ams::ncm { void Initialize() { AMS_ASSERT(g_content_manager == nullptr); R_ABORT_UNLESS(ncmInitialize()); - g_content_manager = std::make_shared(); + g_content_manager = sf::MakeShared(); } void Finalize() { diff --git a/libstratosphere/source/ncm/ncm_content_manager_impl.cpp b/libstratosphere/source/ncm/ncm_content_manager_impl.cpp index 3f4dabcb..7302acc1 100644 --- a/libstratosphere/source/ncm/ncm_content_manager_impl.cpp +++ b/libstratosphere/source/ncm/ncm_content_manager_impl.cpp @@ -553,23 +553,23 @@ namespace ams::ncm { if (storage_id == StorageId::GameCard) { /* Game card content storage is read only. */ - auto content_storage = std::make_shared(); - R_TRY(content_storage->Initialize(root->path, MakeFlatContentFilePath)); + auto content_storage = sf::MakeShared(); + R_TRY(content_storage->GetImpl().Initialize(root->path, MakeFlatContentFilePath)); root->content_storage = std::move(content_storage); } else { /* Create a content storage. */ - auto content_storage = std::make_shared(); + auto content_storage = sf::MakeShared(); /* Initialize content storage with an appropriate path function. */ switch (storage_id) { case StorageId::BuiltInSystem: - R_TRY(content_storage->Initialize(root->path, MakeFlatContentFilePath, MakeFlatPlaceHolderFilePath, false, std::addressof(this->rights_id_cache))); + R_TRY(content_storage->GetImpl().Initialize(root->path, MakeFlatContentFilePath, MakeFlatPlaceHolderFilePath, false, std::addressof(this->rights_id_cache))); break; case StorageId::SdCard: - R_TRY(content_storage->Initialize(root->path, MakeSha256HierarchicalContentFilePath_ForFat16KCluster, MakeSha256HierarchicalPlaceHolderFilePath_ForFat16KCluster, true, std::addressof(this->rights_id_cache))); + R_TRY(content_storage->GetImpl().Initialize(root->path, MakeSha256HierarchicalContentFilePath_ForFat16KCluster, MakeSha256HierarchicalPlaceHolderFilePath_ForFat16KCluster, true, std::addressof(this->rights_id_cache))); break; default: - R_TRY(content_storage->Initialize(root->path, MakeSha256HierarchicalContentFilePath_ForFat16KCluster, MakeSha256HierarchicalPlaceHolderFilePath_ForFat16KCluster, false, std::addressof(this->rights_id_cache))); + R_TRY(content_storage->GetImpl().Initialize(root->path, MakeSha256HierarchicalContentFilePath_ForFat16KCluster, MakeSha256HierarchicalPlaceHolderFilePath_ForFat16KCluster, false, std::addressof(this->rights_id_cache))); break; } @@ -617,7 +617,7 @@ namespace ams::ncm { R_TRY(root->kvs->Initialize(root->max_content_metas, root->memory_resource)); /* Create an on memory content meta database for game cards. */ - root->content_meta_database = std::make_shared(std::addressof(*root->kvs)); + root->content_meta_database = sf::MakeShared(std::addressof(*root->kvs)); } else { /* Mount save data for this root. */ R_TRY(fs::MountSystemSaveData(root->mount_name, root->info.space_id, root->info.id)); @@ -630,7 +630,7 @@ namespace ams::ncm { R_TRY(root->kvs->Load()); /* Create the content meta database. */ - root->content_meta_database = std::make_shared(std::addressof(*root->kvs), root->mount_name); + root->content_meta_database = sf::MakeShared(std::addressof(*root->kvs), root->mount_name); mount_guard.Cancel(); } diff --git a/libstratosphere/source/ncm/ncm_content_meta_database_impl_base.hpp b/libstratosphere/source/ncm/ncm_content_meta_database_impl_base.hpp index 17118062..21945868 100644 --- a/libstratosphere/source/ncm/ncm_content_meta_database_impl_base.hpp +++ b/libstratosphere/source/ncm/ncm_content_meta_database_impl_base.hpp @@ -18,7 +18,7 @@ namespace ams::ncm { - class ContentMetaDatabaseImplBase : public IContentMetaDatabase { + class ContentMetaDatabaseImplBase { NON_COPYABLE(ContentMetaDatabaseImplBase); NON_MOVEABLE(ContentMetaDatabaseImplBase); protected: @@ -52,6 +52,32 @@ namespace ams::ncm { R_TRY(this->GetContentMetaSize(out_size, key)); return this->kvs->GetValuePointer(reinterpret_cast(out_value_ptr), key); } + public: + /* Actual commands. */ + virtual Result Set(const ContentMetaKey &key, sf::InBuffer value) = 0; + virtual Result Get(sf::Out out_size, const ContentMetaKey &key, sf::OutBuffer out_value) = 0; + virtual Result Remove(const ContentMetaKey &key) = 0; + virtual Result GetContentIdByType(sf::Out out_content_id, const ContentMetaKey &key, ContentType type) = 0; + virtual Result ListContentInfo(sf::Out out_entries_written, const sf::OutArray &out_info, const ContentMetaKey &key, s32 offset) = 0; + virtual Result List(sf::Out out_entries_total, sf::Out out_entries_written, const sf::OutArray &out_info, ContentMetaType meta_type, ApplicationId application_id, u64 min, u64 max, ContentInstallType install_type) = 0; + virtual Result GetLatestContentMetaKey(sf::Out out_key, u64 id) = 0; + virtual Result ListApplication(sf::Out out_entries_total, sf::Out out_entries_written, const sf::OutArray &out_keys, ContentMetaType meta_type) = 0; + virtual Result Has(sf::Out out, const ContentMetaKey &key) = 0; + virtual Result HasAll(sf::Out out, const sf::InArray &keys) = 0; + virtual Result GetSize(sf::Out out_size, const ContentMetaKey &key) = 0; + virtual Result GetRequiredSystemVersion(sf::Out out_version, const ContentMetaKey &key) = 0; + virtual Result GetPatchId(sf::Out out_patch_id, const ContentMetaKey &key) = 0; + virtual Result DisableForcibly() = 0; + virtual Result LookupOrphanContent(const sf::OutArray &out_orphaned, const sf::InArray &content_ids) = 0; + virtual Result Commit() = 0; + virtual Result HasContent(sf::Out out, const ContentMetaKey &key, const ContentId &content_id) = 0; + virtual Result ListContentMetaInfo(sf::Out out_entries_written, const sf::OutArray &out_meta_info, const ContentMetaKey &key, s32 offset) = 0; + virtual Result GetAttributes(sf::Out out_attributes, const ContentMetaKey &key) = 0; + virtual Result GetRequiredApplicationVersion(sf::Out out_version, const ContentMetaKey &key) = 0; + virtual Result GetContentIdByTypeAndIdOffset(sf::Out out_content_id, const ContentMetaKey &key, ContentType type, u8 id_offset) = 0; + virtual Result GetCount(sf::Out out_count) = 0; + virtual Result GetOwnerApplicationId(sf::Out out_id, const ContentMetaKey &key) = 0; }; + static_assert(ncm::IsIContentMetaDatabase); } diff --git a/libstratosphere/source/ncm/ncm_content_storage_impl_base.hpp b/libstratosphere/source/ncm/ncm_content_storage_impl_base.hpp index 7991eeb2..3c094dba 100644 --- a/libstratosphere/source/ncm/ncm_content_storage_impl_base.hpp +++ b/libstratosphere/source/ncm/ncm_content_storage_impl_base.hpp @@ -18,7 +18,7 @@ namespace ams::ncm { - class ContentStorageImplBase : public IContentStorage { + class ContentStorageImplBase { NON_COPYABLE(ContentStorageImplBase); NON_MOVEABLE(ContentStorageImplBase); protected: @@ -43,6 +43,39 @@ namespace ams::ncm { } return ResultSuccess(); } + public: + /* Actual commands. */ + virtual Result GeneratePlaceHolderId(sf::Out out) = 0; + virtual Result CreatePlaceHolder(PlaceHolderId placeholder_id, ContentId content_id, s64 size) = 0; + virtual Result DeletePlaceHolder(PlaceHolderId placeholder_id) = 0; + virtual Result HasPlaceHolder(sf::Out out, PlaceHolderId placeholder_id) = 0; + virtual Result WritePlaceHolder(PlaceHolderId placeholder_id, s64 offset, sf::InBuffer data) = 0; + virtual Result Register(PlaceHolderId placeholder_id, ContentId content_id) = 0; + virtual Result Delete(ContentId content_id) = 0; + virtual Result Has(sf::Out out, ContentId content_id) = 0; + virtual Result GetPath(sf::Out out, ContentId content_id) = 0; + virtual Result GetPlaceHolderPath(sf::Out out, PlaceHolderId placeholder_id) = 0; + virtual Result CleanupAllPlaceHolder() = 0; + virtual Result ListPlaceHolder(sf::Out out_count, const sf::OutArray &out_buf) = 0; + virtual Result GetContentCount(sf::Out out_count) = 0; + virtual Result ListContentId(sf::Out out_count, const sf::OutArray &out_buf, s32 start_offset) = 0; + virtual Result GetSizeFromContentId(sf::Out out_size, ContentId content_id) = 0; + virtual Result DisableForcibly() = 0; + virtual Result RevertToPlaceHolder(PlaceHolderId placeholder_id, ContentId old_content_id, ContentId new_content_id) = 0; + virtual Result SetPlaceHolderSize(PlaceHolderId placeholder_id, s64 size) = 0; + virtual Result ReadContentIdFile(sf::OutBuffer buf, ContentId content_id, s64 offset) = 0; + virtual Result GetRightsIdFromPlaceHolderIdDeprecated(sf::Out out_rights_id, PlaceHolderId placeholder_id) = 0; + virtual Result GetRightsIdFromPlaceHolderId(sf::Out out_rights_id, PlaceHolderId placeholder_id) = 0; + virtual Result GetRightsIdFromContentIdDeprecated(sf::Out out_rights_id, ContentId content_id) = 0; + virtual Result GetRightsIdFromContentId(sf::Out out_rights_id, ContentId content_id) = 0; + virtual Result WriteContentForDebug(ContentId content_id, s64 offset, sf::InBuffer data) = 0; + virtual Result GetFreeSpaceSize(sf::Out out_size) = 0; + virtual Result GetTotalSpaceSize(sf::Out out_size) = 0; + virtual Result FlushPlaceHolder() = 0; + virtual Result GetSizeFromPlaceHolderId(sf::Out out, PlaceHolderId placeholder_id) = 0; + virtual Result RepairInvalidFileAttribute() = 0; + virtual Result GetRightsIdFromPlaceHolderIdWithCache(sf::Out out_rights_id, PlaceHolderId placeholder_id, ContentId cache_content_id) = 0; }; + static_assert(ncm::IsIContentStorage); } diff --git a/libstratosphere/source/ncm/ncm_remote_content_manager_impl.hpp b/libstratosphere/source/ncm/ncm_remote_content_manager_impl.hpp index 5ff6ca8d..59577f7a 100644 --- a/libstratosphere/source/ncm/ncm_remote_content_manager_impl.hpp +++ b/libstratosphere/source/ncm/ncm_remote_content_manager_impl.hpp @@ -20,80 +20,81 @@ namespace ams::ncm { - class RemoteContentManagerImpl final : public IContentManager { + class RemoteContentManagerImpl final { public: RemoteContentManagerImpl() { /* ... */ } ~RemoteContentManagerImpl() { /* ... */ } public: - virtual Result CreateContentStorage(StorageId storage_id) override { + Result CreateContentStorage(StorageId storage_id) { return ::ncmCreateContentStorage(static_cast(storage_id)); } - virtual Result CreateContentMetaDatabase(StorageId storage_id) override { + Result CreateContentMetaDatabase(StorageId storage_id) { return ::ncmCreateContentMetaDatabase(static_cast(storage_id)); } - virtual Result VerifyContentStorage(StorageId storage_id) override { + Result VerifyContentStorage(StorageId storage_id) { return ::ncmVerifyContentStorage(static_cast(storage_id)); } - virtual Result VerifyContentMetaDatabase(StorageId storage_id) override { + Result VerifyContentMetaDatabase(StorageId storage_id) { return ::ncmVerifyContentMetaDatabase(static_cast(storage_id)); } - virtual Result OpenContentStorage(sf::Out> out, StorageId storage_id) override { + Result OpenContentStorage(sf::Out> out, StorageId storage_id) { NcmContentStorage cs; R_TRY(::ncmOpenContentStorage(std::addressof(cs), static_cast(storage_id))); - out.SetValue(std::make_shared(cs)); + out.SetValue(sf::MakeShared(cs)); return ResultSuccess(); } - virtual Result OpenContentMetaDatabase(sf::Out> out, StorageId storage_id) override { + Result OpenContentMetaDatabase(sf::Out> out, StorageId storage_id) { NcmContentMetaDatabase db; R_TRY(::ncmOpenContentMetaDatabase(std::addressof(db), static_cast(storage_id))); - out.SetValue(std::make_shared(db)); + out.SetValue(sf::MakeShared(db)); return ResultSuccess(); } - virtual Result CloseContentStorageForcibly(StorageId storage_id) override { + Result CloseContentStorageForcibly(StorageId storage_id) { return ::ncmCloseContentStorageForcibly(static_cast(storage_id)); } - virtual Result CloseContentMetaDatabaseForcibly(StorageId storage_id) override { + Result CloseContentMetaDatabaseForcibly(StorageId storage_id) { return ::ncmCloseContentMetaDatabaseForcibly(static_cast(storage_id)); } - virtual Result CleanupContentMetaDatabase(StorageId storage_id) override { + Result CleanupContentMetaDatabase(StorageId storage_id) { return ::ncmCleanupContentMetaDatabase(static_cast(storage_id)); } - virtual Result ActivateContentStorage(StorageId storage_id) override { + Result ActivateContentStorage(StorageId storage_id) { return ::ncmActivateContentStorage(static_cast(storage_id)); } - virtual Result InactivateContentStorage(StorageId storage_id) override { + Result InactivateContentStorage(StorageId storage_id) { return ::ncmInactivateContentStorage(static_cast(storage_id)); } - virtual Result ActivateContentMetaDatabase(StorageId storage_id) override { + Result ActivateContentMetaDatabase(StorageId storage_id) { return ::ncmActivateContentMetaDatabase(static_cast(storage_id)); } - virtual Result InactivateContentMetaDatabase(StorageId storage_id) override { + Result InactivateContentMetaDatabase(StorageId storage_id) { return ::ncmInactivateContentMetaDatabase(static_cast(storage_id)); } - virtual Result InvalidateRightsIdCache() override { + Result InvalidateRightsIdCache() { return ::ncmInvalidateRightsIdCache(); } - virtual Result GetMemoryReport(sf::Out out) override { + Result GetMemoryReport(sf::Out out) { /* TODO: libnx bindings */ AMS_ABORT(); } }; + static_assert(ncm::IsIContentManager); } diff --git a/libstratosphere/source/ncm/ncm_remote_content_meta_database_impl.hpp b/libstratosphere/source/ncm/ncm_remote_content_meta_database_impl.hpp index 98fc2506..14935f46 100644 --- a/libstratosphere/source/ncm/ncm_remote_content_meta_database_impl.hpp +++ b/libstratosphere/source/ncm/ncm_remote_content_meta_database_impl.hpp @@ -18,7 +18,7 @@ namespace ams::ncm { - class RemoteContentMetaDatabaseImpl final : public IContentMetaDatabase { + class RemoteContentMetaDatabaseImpl final { private: ::NcmContentMetaDatabase srv; public: @@ -71,101 +71,101 @@ namespace ams::ncm { return reinterpret_cast(std::addressof(c)); } public: - virtual Result Set(const ContentMetaKey &key, sf::InBuffer value) override { + Result Set(const ContentMetaKey &key, sf::InBuffer value) { return ncmContentMetaDatabaseSet(std::addressof(this->srv), Convert(key), value.GetPointer(), value.GetSize()); } - virtual Result Get(sf::Out out_size, const ContentMetaKey &key, sf::OutBuffer out_value) override { + Result Get(sf::Out out_size, const ContentMetaKey &key, sf::OutBuffer out_value) { return ncmContentMetaDatabaseGet(std::addressof(this->srv), Convert(key), out_size.GetPointer(), out_value.GetPointer(), out_value.GetSize()); } - virtual Result Remove(const ContentMetaKey &key) override { + Result Remove(const ContentMetaKey &key) { return ncmContentMetaDatabaseRemove(std::addressof(this->srv), Convert(key)); } - virtual Result GetContentIdByType(sf::Out out_content_id, const ContentMetaKey &key, ContentType type) override { + Result GetContentIdByType(sf::Out out_content_id, const ContentMetaKey &key, ContentType type) { return ncmContentMetaDatabaseGetContentIdByType(std::addressof(this->srv), Convert(out_content_id.GetPointer()), Convert(key), static_cast<::NcmContentType>(type)); } - virtual Result ListContentInfo(sf::Out out_entries_written, const sf::OutArray &out_info, const ContentMetaKey &key, s32 offset) override { + Result ListContentInfo(sf::Out out_entries_written, const sf::OutArray &out_info, const ContentMetaKey &key, s32 offset) { return ncmContentMetaDatabaseListContentInfo(std::addressof(this->srv), out_entries_written.GetPointer(), Convert(out_info.GetPointer()), out_info.GetSize(), Convert(key), offset); } - virtual Result List(sf::Out out_entries_total, sf::Out out_entries_written, const sf::OutArray &out_info, ContentMetaType meta_type, ApplicationId application_id, u64 min, u64 max, ContentInstallType install_type) override { + Result List(sf::Out out_entries_total, sf::Out out_entries_written, const sf::OutArray &out_info, ContentMetaType meta_type, ApplicationId application_id, u64 min, u64 max, ContentInstallType install_type) { return ncmContentMetaDatabaseList(std::addressof(this->srv), out_entries_total.GetPointer(), out_entries_written.GetPointer(), Convert(out_info.GetPointer()), out_info.GetSize(), static_cast<::NcmContentMetaType>(meta_type), application_id.value, min, max, static_cast<::NcmContentInstallType>(install_type)); } - virtual Result GetLatestContentMetaKey(sf::Out out_key, u64 id) override { + Result GetLatestContentMetaKey(sf::Out out_key, u64 id) { return ncmContentMetaDatabaseGetLatestContentMetaKey(std::addressof(this->srv), Convert(out_key.GetPointer()), static_cast(id)); } - virtual Result ListApplication(sf::Out out_entries_total, sf::Out out_entries_written, const sf::OutArray &out_keys, ContentMetaType meta_type) override { + Result ListApplication(sf::Out out_entries_total, sf::Out out_entries_written, const sf::OutArray &out_keys, ContentMetaType meta_type) { return ncmContentMetaDatabaseListApplication(std::addressof(this->srv), out_entries_total.GetPointer(), out_entries_written.GetPointer(), Convert(out_keys.GetPointer()), out_keys.GetSize(), static_cast<::NcmContentMetaType>(meta_type)); } - virtual Result Has(sf::Out out, const ContentMetaKey &key) override { + Result Has(sf::Out out, const ContentMetaKey &key) { return ncmContentMetaDatabaseHas(std::addressof(this->srv), out.GetPointer(), Convert(key)); } - virtual Result HasAll(sf::Out out, const sf::InArray &keys) override { + Result HasAll(sf::Out out, const sf::InArray &keys) { return ncmContentMetaDatabaseHasAll(std::addressof(this->srv), out.GetPointer(), Convert(keys.GetPointer()), keys.GetSize()); } - virtual Result GetSize(sf::Out out_size, const ContentMetaKey &key) override { + Result GetSize(sf::Out out_size, const ContentMetaKey &key) { return ncmContentMetaDatabaseGetSize(std::addressof(this->srv), out_size.GetPointer(), Convert(key)); } - virtual Result GetRequiredSystemVersion(sf::Out out_version, const ContentMetaKey &key) override { + Result GetRequiredSystemVersion(sf::Out out_version, const ContentMetaKey &key) { return ncmContentMetaDatabaseGetRequiredSystemVersion(std::addressof(this->srv), out_version.GetPointer(), Convert(key)); } - virtual Result GetPatchId(sf::Out out_patch_id, const ContentMetaKey &key) override { + Result GetPatchId(sf::Out out_patch_id, const ContentMetaKey &key) { return ncmContentMetaDatabaseGetPatchId(std::addressof(this->srv), reinterpret_cast(out_patch_id.GetPointer()), Convert(key)); } - virtual Result DisableForcibly() override { + Result DisableForcibly() { return ncmContentMetaDatabaseDisableForcibly(std::addressof(this->srv)); } - virtual Result LookupOrphanContent(const sf::OutArray &out_orphaned, const sf::InArray &content_ids) override { + Result LookupOrphanContent(const sf::OutArray &out_orphaned, const sf::InArray &content_ids) { return ncmContentMetaDatabaseLookupOrphanContent(std::addressof(this->srv), out_orphaned.GetPointer(), Convert(content_ids.GetPointer()), std::min(out_orphaned.GetSize(), content_ids.GetSize())); } - virtual Result Commit() override { + Result Commit() { return ncmContentMetaDatabaseCommit(std::addressof(this->srv)); } - virtual Result HasContent(sf::Out out, const ContentMetaKey &key, const ContentId &content_id) override { + Result HasContent(sf::Out out, const ContentMetaKey &key, const ContentId &content_id) { return ncmContentMetaDatabaseHasContent(std::addressof(this->srv), out.GetPointer(), Convert(key), Convert(content_id)); } - virtual Result ListContentMetaInfo(sf::Out out_entries_written, const sf::OutArray &out_meta_info, const ContentMetaKey &key, s32 offset) override { + Result ListContentMetaInfo(sf::Out out_entries_written, const sf::OutArray &out_meta_info, const ContentMetaKey &key, s32 offset) { return ncmContentMetaDatabaseListContentMetaInfo(std::addressof(this->srv), out_entries_written.GetPointer(), out_meta_info.GetPointer(), out_meta_info.GetSize(), Convert(key), offset); } - virtual Result GetAttributes(sf::Out out_attributes, const ContentMetaKey &key) override { + Result GetAttributes(sf::Out out_attributes, const ContentMetaKey &key) { static_assert(sizeof(ContentMetaAttribute) == sizeof(u8)); return ncmContentMetaDatabaseGetAttributes(std::addressof(this->srv), Convert(key), out_attributes.GetPointer()); } - virtual Result GetRequiredApplicationVersion(sf::Out out_version, const ContentMetaKey &key) override { + Result GetRequiredApplicationVersion(sf::Out out_version, const ContentMetaKey &key) { return ncmContentMetaDatabaseGetRequiredApplicationVersion(std::addressof(this->srv), out_version.GetPointer(), Convert(key)); } - virtual Result GetContentIdByTypeAndIdOffset(sf::Out out_content_id, const ContentMetaKey &key, ContentType type, u8 id_offset) override { + Result GetContentIdByTypeAndIdOffset(sf::Out out_content_id, const ContentMetaKey &key, ContentType type, u8 id_offset) { return ncmContentMetaDatabaseGetContentIdByTypeAndIdOffset(std::addressof(this->srv), Convert(out_content_id.GetPointer()), Convert(key), static_cast<::NcmContentType>(type), id_offset); } - virtual Result GetCount(sf::Out out_count) override { + Result GetCount(sf::Out out_count) { /* TODO: libnx bindings */ AMS_ABORT(); } - virtual Result GetOwnerApplicationId(sf::Out out_id, const ContentMetaKey &key) override { + Result GetOwnerApplicationId(sf::Out out_id, const ContentMetaKey &key) { /* TODO: libnx bindings */ AMS_ABORT(); } - }; + static_assert(ncm::IsIContentMetaDatabase); } diff --git a/libstratosphere/source/ncm/ncm_remote_content_storage_impl.hpp b/libstratosphere/source/ncm/ncm_remote_content_storage_impl.hpp index a7db1d4d..32465f56 100644 --- a/libstratosphere/source/ncm/ncm_remote_content_storage_impl.hpp +++ b/libstratosphere/source/ncm/ncm_remote_content_storage_impl.hpp @@ -18,7 +18,7 @@ namespace ams::ncm { - class RemoteContentStorageImpl final : public IContentStorage { + class RemoteContentStorageImpl final { private: ::NcmContentStorage srv; public: @@ -46,85 +46,85 @@ namespace ams::ncm { return reinterpret_cast<::NcmContentId *>(std::addressof(c)); } public: - virtual Result GeneratePlaceHolderId(sf::Out out) override { + Result GeneratePlaceHolderId(sf::Out out) { return ncmContentStorageGeneratePlaceHolderId(std::addressof(this->srv), Convert(out.GetPointer())); } - virtual Result CreatePlaceHolder(PlaceHolderId placeholder_id, ContentId content_id, s64 size) override { + Result CreatePlaceHolder(PlaceHolderId placeholder_id, ContentId content_id, s64 size) { static_assert(alignof(ContentId) < alignof(PlaceHolderId)); return ncmContentStorageCreatePlaceHolder(std::addressof(this->srv), Convert(content_id), Convert(placeholder_id), size); } - virtual Result DeletePlaceHolder(PlaceHolderId placeholder_id) override { + Result DeletePlaceHolder(PlaceHolderId placeholder_id) { return ncmContentStorageDeletePlaceHolder(std::addressof(this->srv), Convert(placeholder_id)); } - virtual Result HasPlaceHolder(sf::Out out, PlaceHolderId placeholder_id) override { + Result HasPlaceHolder(sf::Out out, PlaceHolderId placeholder_id) { return ncmContentStorageHasPlaceHolder(std::addressof(this->srv), out.GetPointer(), Convert(placeholder_id)); } - virtual Result WritePlaceHolder(PlaceHolderId placeholder_id, s64 offset, sf::InBuffer data) override { + Result WritePlaceHolder(PlaceHolderId placeholder_id, s64 offset, sf::InBuffer data) { return ncmContentStorageWritePlaceHolder(std::addressof(this->srv), Convert(placeholder_id), offset, data.GetPointer(), data.GetSize()); } - virtual Result Register(PlaceHolderId placeholder_id, ContentId content_id) override { + Result Register(PlaceHolderId placeholder_id, ContentId content_id) { static_assert(alignof(ContentId) < alignof(PlaceHolderId)); return ncmContentStorageRegister(std::addressof(this->srv), Convert(content_id), Convert(placeholder_id)); } - virtual Result Delete(ContentId content_id) override { + Result Delete(ContentId content_id) { return ncmContentStorageDelete(std::addressof(this->srv), Convert(content_id)); } - virtual Result Has(sf::Out out, ContentId content_id) override { + Result Has(sf::Out out, ContentId content_id) { return ncmContentStorageHas(std::addressof(this->srv), out.GetPointer(), Convert(content_id)); } - virtual Result GetPath(sf::Out out, ContentId content_id) override { + Result GetPath(sf::Out out, ContentId content_id) { return ncmContentStorageGetPath(std::addressof(this->srv), out.GetPointer()->str, sizeof(out.GetPointer()->str), Convert(content_id)); } - virtual Result GetPlaceHolderPath(sf::Out out, PlaceHolderId placeholder_id) override { + Result GetPlaceHolderPath(sf::Out out, PlaceHolderId placeholder_id) { return ncmContentStorageGetPlaceHolderPath(std::addressof(this->srv), out.GetPointer()->str, sizeof(out.GetPointer()->str), Convert(placeholder_id)); } - virtual Result CleanupAllPlaceHolder() override { + Result CleanupAllPlaceHolder() { return ncmContentStorageCleanupAllPlaceHolder(std::addressof(this->srv)); } - virtual Result ListPlaceHolder(sf::Out out_count, const sf::OutArray &out_buf) override { + Result ListPlaceHolder(sf::Out out_count, const sf::OutArray &out_buf) { return ncmContentStorageListPlaceHolder(std::addressof(this->srv), Convert(out_buf.GetPointer()), out_buf.GetSize(), out_count.GetPointer()); } - virtual Result GetContentCount(sf::Out out_count) override { + Result GetContentCount(sf::Out out_count) { return ncmContentStorageGetContentCount(std::addressof(this->srv), out_count.GetPointer()); } - virtual Result ListContentId(sf::Out out_count, const sf::OutArray &out_buf, s32 offset) override { + Result ListContentId(sf::Out out_count, const sf::OutArray &out_buf, s32 offset) { return ncmContentStorageListContentId(std::addressof(this->srv), Convert(out_buf.GetPointer()), out_buf.GetSize(), out_count.GetPointer(), offset); } - virtual Result GetSizeFromContentId(sf::Out out_size, ContentId content_id) override { + Result GetSizeFromContentId(sf::Out out_size, ContentId content_id) { return ncmContentStorageGetSizeFromContentId(std::addressof(this->srv), out_size.GetPointer(), Convert(content_id)); } - virtual Result DisableForcibly() override { + Result DisableForcibly() { return ncmContentStorageDisableForcibly(std::addressof(this->srv)); } - virtual Result RevertToPlaceHolder(PlaceHolderId placeholder_id, ContentId old_content_id, ContentId new_content_id) override { + Result RevertToPlaceHolder(PlaceHolderId placeholder_id, ContentId old_content_id, ContentId new_content_id) { return ncmContentStorageRevertToPlaceHolder(std::addressof(this->srv), Convert(placeholder_id), Convert(old_content_id), Convert(new_content_id)); } - virtual Result SetPlaceHolderSize(PlaceHolderId placeholder_id, s64 size) override { + Result SetPlaceHolderSize(PlaceHolderId placeholder_id, s64 size) { return ncmContentStorageSetPlaceHolderSize(std::addressof(this->srv), Convert(placeholder_id), size); } - virtual Result ReadContentIdFile(sf::OutBuffer buf, ContentId content_id, s64 offset) override { + Result ReadContentIdFile(sf::OutBuffer buf, ContentId content_id, s64 offset) { return ncmContentStorageReadContentIdFile(std::addressof(this->srv), buf.GetPointer(), buf.GetSize(), Convert(content_id), offset); } - virtual Result GetRightsIdFromPlaceHolderIdDeprecated(sf::Out out_rights_id, PlaceHolderId placeholder_id) override { + Result GetRightsIdFromPlaceHolderIdDeprecated(sf::Out out_rights_id, PlaceHolderId placeholder_id) { ::NcmRightsId rights_id; R_TRY(ncmContentStorageGetRightsIdFromPlaceHolderId(std::addressof(this->srv), std::addressof(rights_id), Convert(placeholder_id))); @@ -133,7 +133,7 @@ namespace ams::ncm { return ResultSuccess(); } - virtual Result GetRightsIdFromPlaceHolderId(sf::Out out_rights_id, PlaceHolderId placeholder_id) override { + Result GetRightsIdFromPlaceHolderId(sf::Out out_rights_id, PlaceHolderId placeholder_id) { ::NcmRightsId rights_id; R_TRY(ncmContentStorageGetRightsIdFromPlaceHolderId(std::addressof(this->srv), std::addressof(rights_id), Convert(placeholder_id))); @@ -142,7 +142,7 @@ namespace ams::ncm { return ResultSuccess(); } - virtual Result GetRightsIdFromContentIdDeprecated(sf::Out out_rights_id, ContentId content_id) override { + Result GetRightsIdFromContentIdDeprecated(sf::Out out_rights_id, ContentId content_id) { ::NcmRightsId rights_id; R_TRY(ncmContentStorageGetRightsIdFromContentId(std::addressof(this->srv), std::addressof(rights_id), Convert(content_id))); @@ -151,7 +151,7 @@ namespace ams::ncm { return ResultSuccess(); } - virtual Result GetRightsIdFromContentId(sf::Out out_rights_id, ContentId content_id) override { + Result GetRightsIdFromContentId(sf::Out out_rights_id, ContentId content_id) { ::NcmRightsId rights_id; R_TRY(ncmContentStorageGetRightsIdFromContentId(std::addressof(this->srv), std::addressof(rights_id), Convert(content_id))); @@ -160,35 +160,36 @@ namespace ams::ncm { return ResultSuccess(); } - virtual Result WriteContentForDebug(ContentId content_id, s64 offset, sf::InBuffer data) override { + Result WriteContentForDebug(ContentId content_id, s64 offset, sf::InBuffer data) { return ncmContentStorageWriteContentForDebug(std::addressof(this->srv), Convert(content_id), offset, data.GetPointer(), data.GetSize()); } - virtual Result GetFreeSpaceSize(sf::Out out_size) override { + Result GetFreeSpaceSize(sf::Out out_size) { return ncmContentStorageGetFreeSpaceSize(std::addressof(this->srv), out_size.GetPointer()); } - virtual Result GetTotalSpaceSize(sf::Out out_size) override { + Result GetTotalSpaceSize(sf::Out out_size) { return ncmContentStorageGetTotalSpaceSize(std::addressof(this->srv), out_size.GetPointer()); } - virtual Result FlushPlaceHolder() override { + Result FlushPlaceHolder() { return ncmContentStorageFlushPlaceHolder(std::addressof(this->srv)); } - virtual Result GetSizeFromPlaceHolderId(sf::Out out_size, PlaceHolderId placeholder_id) override { + Result GetSizeFromPlaceHolderId(sf::Out out_size, PlaceHolderId placeholder_id) { return ncmContentStorageGetSizeFromPlaceHolderId(std::addressof(this->srv), out_size.GetPointer(), Convert(placeholder_id)); } - virtual Result RepairInvalidFileAttribute() override { + Result RepairInvalidFileAttribute() { return ncmContentStorageRepairInvalidFileAttribute(std::addressof(this->srv)); } - virtual Result GetRightsIdFromPlaceHolderIdWithCache(sf::Out out_rights_id, PlaceHolderId placeholder_id, ContentId cache_content_id) override { + Result GetRightsIdFromPlaceHolderIdWithCache(sf::Out out_rights_id, PlaceHolderId placeholder_id, ContentId cache_content_id) { static_assert(sizeof(::NcmRightsId) == sizeof(ncm::RightsId)); ::NcmRightsId *out = reinterpret_cast<::NcmRightsId *>(out_rights_id.GetPointer()); return ncmContentStorageGetRightsIdFromPlaceHolderIdWithCache(std::addressof(this->srv), out, Convert(placeholder_id), Convert(cache_content_id)); } }; + static_assert(ncm::IsIContentStorage); } diff --git a/libstratosphere/source/pgl/pgl_remote_event_observer.hpp b/libstratosphere/source/pgl/pgl_remote_event_observer.hpp index c7cf0d84..418ec6e9 100644 --- a/libstratosphere/source/pgl/pgl_remote_event_observer.hpp +++ b/libstratosphere/source/pgl/pgl_remote_event_observer.hpp @@ -18,28 +18,29 @@ namespace ams::pgl { - class RemoteEventObserver final : public pgl::sf::IEventObserver { + class RemoteEventObserver final { NON_COPYABLE(RemoteEventObserver); NON_MOVEABLE(RemoteEventObserver); private: ::PglEventObserver observer; public: constexpr RemoteEventObserver(const ::PglEventObserver &o) : observer(o) { /* ... */ } - virtual ~RemoteEventObserver() override { + ~RemoteEventObserver() { ::pglEventObserverClose(std::addressof(this->observer)); } - virtual Result GetProcessEventHandle(ams::sf::OutCopyHandle out) override { + Result GetProcessEventHandle(ams::sf::OutCopyHandle out) { ::Event ev; R_TRY(::pglEventObserverGetProcessEvent(std::addressof(this->observer), std::addressof(ev))); out.SetValue(ev.revent); return ResultSuccess(); } - virtual Result GetProcessEventInfo(ams::sf::Out out) override { + Result GetProcessEventInfo(ams::sf::Out out) { static_assert(sizeof(*out.GetPointer()) == sizeof(::PmProcessEventInfo)); return ::pglEventObserverGetProcessEventInfo(std::addressof(this->observer), reinterpret_cast<::PmProcessEventInfo *>(out.GetPointer())); } }; + static_assert(pgl::sf::IsIEventObserver); } \ No newline at end of file diff --git a/libstratosphere/source/pgl/pgl_shell_api.cpp b/libstratosphere/source/pgl/pgl_shell_api.cpp index 66c2bc2d..74229209 100644 --- a/libstratosphere/source/pgl/pgl_shell_api.cpp +++ b/libstratosphere/source/pgl/pgl_shell_api.cpp @@ -79,7 +79,7 @@ namespace ams::pgl { ::PglEventObserver obs; R_TRY(::pglGetEventObserver(std::addressof(obs))); - auto remote_observer = std::make_shared(obs); + auto remote_observer = ams::sf::MakeShared(obs); AMS_ABORT_UNLESS(remote_observer != nullptr); *out = pgl::EventObserver(remote_observer); diff --git a/libstratosphere/source/pgl/srv/pgl_srv_shell_event_observer.cpp b/libstratosphere/source/pgl/srv/pgl_srv_shell_event_observer.cpp index daaa1e0f..5b7bacec 100644 --- a/libstratosphere/source/pgl/srv/pgl_srv_shell_event_observer.cpp +++ b/libstratosphere/source/pgl/srv/pgl_srv_shell_event_observer.cpp @@ -66,13 +66,13 @@ namespace ams::pgl::srv { this->event.Signal(); } - Result EventObserverInterface::GetProcessEventHandle(ams::sf::OutCopyHandle out) { - out.SetValue(GetReference(this->observer).GetEvent().GetReadableHandle()); + Result ShellEventObserver::GetProcessEventHandle(ams::sf::OutCopyHandle out) { + out.SetValue(this->GetEvent().GetReadableHandle()); return ResultSuccess(); } - Result EventObserverInterface::GetProcessEventInfo(ams::sf::Out out) { - return GetReference(this->observer).PopEventInfo(out.GetPointer()); + Result ShellEventObserver::GetProcessEventInfo(ams::sf::Out out) { + return this->PopEventInfo(out.GetPointer()); } -} \ No newline at end of file +} diff --git a/libstratosphere/source/pgl/srv/pgl_srv_shell_event_observer.hpp b/libstratosphere/source/pgl/srv/pgl_srv_shell_event_observer.hpp index 29918a8c..30387526 100644 --- a/libstratosphere/source/pgl/srv/pgl_srv_shell_event_observer.hpp +++ b/libstratosphere/source/pgl/srv/pgl_srv_shell_event_observer.hpp @@ -56,23 +56,10 @@ namespace ams::pgl::srv { Result PopEventInfo(pm::ProcessEventInfo *out); virtual void Notify(const pm::ProcessEventInfo &info) override final; - }; - class EventObserverInterface final : public pgl::sf::IEventObserver { - private: - TYPED_STORAGE(ShellEventObserver) observer; - public: - EventObserverInterface() { - std::memset(std::addressof(this->observer), 0, sizeof(this->observer)); - new (GetPointer(this->observer)) ShellEventObserver; - } - - ~EventObserverInterface() { - GetReference(this->observer).~ShellEventObserver(); - } - public: - virtual Result GetProcessEventHandle(ams::sf::OutCopyHandle out) override final; - virtual Result GetProcessEventInfo(ams::sf::Out out) override final; + Result GetProcessEventHandle(ams::sf::OutCopyHandle out); + Result GetProcessEventInfo(ams::sf::Out out); }; + static_assert(pgl::sf::IsIEventObserver); } diff --git a/libstratosphere/source/pgl/srv/pgl_srv_shell_interface.cpp b/libstratosphere/source/pgl/srv/pgl_srv_shell_interface.cpp index 614488e2..81b2641d 100644 --- a/libstratosphere/source/pgl/srv/pgl_srv_shell_interface.cpp +++ b/libstratosphere/source/pgl/srv/pgl_srv_shell_interface.cpp @@ -69,20 +69,22 @@ namespace ams::pgl::srv { } Result ShellInterface::GetShellEventObserver(ams::sf::Out> out) { + using Interface = typename pgl::sf::IEventObserver::ImplHolder; + /* Allocate a new interface. */ - auto *observer_memory = this->memory_resource->Allocate(sizeof(EventObserverInterface), alignof(EventObserverInterface)); + auto *observer_memory = this->memory_resource->Allocate(sizeof(Interface), alignof(Interface)); AMS_ABORT_UNLESS(observer_memory != nullptr); /* Create the interface object. */ - new (observer_memory) EventObserverInterface; + new (observer_memory) Interface; /* Set the output. */ - out.SetValue(std::shared_ptr(reinterpret_cast(observer_memory), [&](EventObserverInterface *obj) { + out.SetValue(std::shared_ptr(reinterpret_cast(observer_memory), [&](Interface *obj) { /* Destroy the object. */ - obj->~EventObserverInterface(); + obj->~Interface(); /* Custom deleter: use the memory resource to free. */ - this->memory_resource->Deallocate(obj, sizeof(EventObserverInterface), alignof(EventObserverInterface)); + this->memory_resource->Deallocate(obj, sizeof(Interface), alignof(Interface)); })); return ResultSuccess(); } diff --git a/libstratosphere/source/psc/psc_pm_module.os.horizon.cpp b/libstratosphere/source/psc/psc_pm_module.os.horizon.cpp index 146e5e47..f9c10cc0 100644 --- a/libstratosphere/source/psc/psc_pm_module.os.horizon.cpp +++ b/libstratosphere/source/psc/psc_pm_module.os.horizon.cpp @@ -34,7 +34,7 @@ namespace ams::psc { ::PscPmModule module; R_TRY(::pscmGetPmModule(std::addressof(module), static_cast<::PscPmModuleId>(mid), reinterpret_cast(dependencies), dependency_count, clear_mode == os::EventClearMode_AutoClear)); - this->intf = std::make_shared(module); + this->intf = ams::sf::MakeShared(module); this->system_event.AttachReadableHandle(module.event.revent, false, clear_mode); this->initialized = true; return ResultSuccess(); diff --git a/libstratosphere/source/psc/psc_remote_pm_module.hpp b/libstratosphere/source/psc/psc_remote_pm_module.hpp index ff6451a6..6afc613f 100644 --- a/libstratosphere/source/psc/psc_remote_pm_module.hpp +++ b/libstratosphere/source/psc/psc_remote_pm_module.hpp @@ -18,41 +18,42 @@ namespace ams::psc { - class RemotePmModule final : public psc::sf::IPmModule { + class RemotePmModule final { NON_COPYABLE(RemotePmModule); NON_MOVEABLE(RemotePmModule); private: ::PscPmModule module; public: constexpr RemotePmModule(const ::PscPmModule &m) : module(m) { /* ... */ } - virtual ~RemotePmModule() override { + ~RemotePmModule() { ::pscPmModuleClose(std::addressof(this->module)); } - virtual Result Initialize(ams::sf::OutCopyHandle out, psc::PmModuleId module_id, const ams::sf::InBuffer &child_list) override final { + Result Initialize(ams::sf::OutCopyHandle out, psc::PmModuleId module_id, const ams::sf::InBuffer &child_list) { /* NOTE: This functionality is already implemented by the libnx command we use to instantiate the PscPmModule. */ AMS_ABORT(); } - virtual Result GetRequest(ams::sf::Out out_state, ams::sf::Out out_flags) override final { + Result GetRequest(ams::sf::Out out_state, ams::sf::Out out_flags) { static_assert(sizeof(PmState) == sizeof(::PscPmState)); static_assert(sizeof(PmFlagSet) == sizeof(u32)); return ::pscPmModuleGetRequest(std::addressof(this->module), reinterpret_cast<::PscPmState *>(out_state.GetPointer()), reinterpret_cast(out_flags.GetPointer())); } - virtual Result Acknowledge() override final { + Result Acknowledge() { /* NOTE: libnx does not separate acknowledge/acknowledgeEx. */ return ::pscPmModuleAcknowledge(std::addressof(this->module), static_cast<::PscPmState>(0)); } - virtual Result Finalize() override final { + Result Finalize() { return ::pscPmModuleFinalize(std::addressof(this->module)); } - virtual Result AcknowledgeEx(PmState state) override final { + Result AcknowledgeEx(PmState state) { static_assert(sizeof(state) == sizeof(::PscPmState)); return ::pscPmModuleAcknowledge(std::addressof(this->module), static_cast<::PscPmState>(state)); } }; + static_assert(psc::sf::IsIPmModule); } \ No newline at end of file diff --git a/libstratosphere/source/sf/hipc/sf_hipc_mitm_query_api.cpp b/libstratosphere/source/sf/hipc/sf_hipc_mitm_query_api.cpp index 29b3e5c5..ee6f9c18 100644 --- a/libstratosphere/source/sf/hipc/sf_hipc_mitm_query_api.cpp +++ b/libstratosphere/source/sf/hipc/sf_hipc_mitm_query_api.cpp @@ -20,11 +20,13 @@ namespace ams::sf::hipc::impl { namespace { - class MitmQueryService : public IServiceObject { - private: - enum class CommandId { - ShouldMitm = 65000, - }; + #define AMS_SF_HIPC_IMPL_I_MITM_QUERY_SERVICE_INTERFACE_INFO(C, H) \ + AMS_SF_METHOD_INFO(C, H, 65000, void, ShouldMitm, (sf::Out out, const sm::MitmProcessInfo &client_info)) + + AMS_SF_DEFINE_INTERFACE(IMitmQueryService, AMS_SF_HIPC_IMPL_I_MITM_QUERY_SERVICE_INTERFACE_INFO) + + + class MitmQueryService { private: ServerManagerBase::MitmQueryFunction query_function; public: @@ -33,11 +35,8 @@ namespace ams::sf::hipc::impl { void ShouldMitm(sf::Out out, const sm::MitmProcessInfo &client_info) { out.SetValue(this->query_function(client_info)); } - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(ShouldMitm), - }; }; + static_assert(IsIMitmQueryService); /* Globals. */ os::Mutex g_query_server_lock(false); @@ -66,7 +65,7 @@ namespace ams::sf::hipc::impl { g_constructed_server = true; } - R_ABORT_UNLESS(GetPointer(g_query_server_storage)->RegisterSession(query_handle, cmif::ServiceObjectHolder(std::make_shared(query_func)))); + R_ABORT_UNLESS(GetPointer(g_query_server_storage)->RegisterSession(query_handle, cmif::ServiceObjectHolder(sf::MakeShared(query_func)))); if (AMS_UNLIKELY(!g_registered_any)) { R_ABORT_UNLESS(os::CreateThread(std::addressof(g_query_server_process_thread), &QueryServerProcessThreadMain, GetPointer(g_query_server_storage), g_server_process_thread_stack, sizeof(g_server_process_thread_stack), AMS_GET_SYSTEM_THREAD_PRIORITY(mitm_sf, QueryServerProcessThread))); diff --git a/libstratosphere/source/sf/hipc/sf_hipc_server_domain_session_manager.cpp b/libstratosphere/source/sf/hipc/sf_hipc_server_domain_session_manager.cpp index 2177bd23..20578d12 100644 --- a/libstratosphere/source/sf/hipc/sf_hipc_server_domain_session_manager.cpp +++ b/libstratosphere/source/sf/hipc/sf_hipc_server_domain_session_manager.cpp @@ -19,15 +19,16 @@ namespace ams::sf::hipc { namespace impl { - class HipcManager : public IServiceObject { - private: - enum class CommandId { - ConvertCurrentObjectToDomain = 0, - CopyFromCurrentDomain = 1, - CloneCurrentObject = 2, - QueryPointerBufferSize = 3, - CloneCurrentObjectEx = 4, - }; + #define AMS_SF_HIPC_IMPL_I_HIPC_MANAGER_INTERFACE_INFO(C, H) \ + AMS_SF_METHOD_INFO(C, H, 0, Result, ConvertCurrentObjectToDomain, (ams::sf::Out out)) \ + AMS_SF_METHOD_INFO(C, H, 1, Result, CopyFromCurrentDomain, (ams::sf::OutMoveHandle out, ams::sf::cmif::DomainObjectId object_id)) \ + AMS_SF_METHOD_INFO(C, H, 2, Result, CloneCurrentObject, (ams::sf::OutMoveHandle out)) \ + AMS_SF_METHOD_INFO(C, H, 3, void, QueryPointerBufferSize, (ams::sf::Out out)) \ + AMS_SF_METHOD_INFO(C, H, 4, Result, CloneCurrentObjectEx, (ams::sf::OutMoveHandle out, u32 tag)) + + AMS_SF_DEFINE_INTERFACE(IHipcManager, AMS_SF_HIPC_IMPL_I_HIPC_MANAGER_INTERFACE_INFO) + + class HipcManager final { private: ServerDomainSessionManager *manager; ServerSession *session; @@ -150,16 +151,8 @@ namespace ams::sf::hipc { Result CloneCurrentObjectEx(sf::OutMoveHandle out, u32 tag) { return this->CloneCurrentObjectImpl(out.GetHandlePointer(), this->manager->GetSessionManagerByTag(tag)); } - - public: - DEFINE_SERVICE_DISPATCH_TABLE { - MAKE_SERVICE_COMMAND_META(ConvertCurrentObjectToDomain), - MAKE_SERVICE_COMMAND_META(CopyFromCurrentDomain), - MAKE_SERVICE_COMMAND_META(CloneCurrentObject), - MAKE_SERVICE_COMMAND_META(QueryPointerBufferSize), - MAKE_SERVICE_COMMAND_META(CloneCurrentObjectEx), - }; }; + static_assert(IsIHipcManager); } @@ -168,7 +161,7 @@ namespace ams::sf::hipc { /* Note: This is safe, as no additional references to the hipc manager can ever be stored. */ /* The shared pointer to stack object is definitely gross, though. */ impl::HipcManager hipc_manager(this, session); - return this->DispatchRequest(cmif::ServiceObjectHolder(std::move(ServiceObjectTraits::SharedPointerHelper::GetEmptyDeleteSharedPointer(&hipc_manager))), session, in_message, out_message); + return this->DispatchRequest(cmif::ServiceObjectHolder(sf::GetSharedPointerTo(hipc_manager)), session, in_message, out_message); } } diff --git a/libstratosphere/source/spl/smc/spl_smc.cpp b/libstratosphere/source/spl/smc/spl_smc.cpp index 232be11e..02934c7a 100644 --- a/libstratosphere/source/spl/smc/spl_smc.cpp +++ b/libstratosphere/source/spl/smc/spl_smc.cpp @@ -17,11 +17,11 @@ namespace ams::spl::smc { - Result SetConfig(SplConfigItem which, const u64 *value, size_t num_qwords) { + Result SetConfig(spl::ConfigItem which, const u64 *value, size_t num_qwords) { SecmonArgs args; args.X[0] = static_cast(FunctionId::SetConfig); - args.X[1] = which; + args.X[1] = static_cast(which); args.X[2] = 0; for (size_t i = 0; i < std::min(size_t(4), num_qwords); i++) { args.X[3 + i] = value[i]; @@ -31,11 +31,11 @@ namespace ams::spl::smc { return static_cast(args.X[0]); } - Result GetConfig(u64 *out, size_t num_qwords, SplConfigItem which) { + Result GetConfig(u64 *out, size_t num_qwords, spl::ConfigItem which) { SecmonArgs args; args.X[0] = static_cast(FunctionId::GetConfig); - args.X[1] = which; + args.X[1] = static_cast(which); svcCallSecureMonitor(&args); for (size_t i = 0; i < std::min(size_t(4), num_qwords); i++) { @@ -44,10 +44,10 @@ namespace ams::spl::smc { return static_cast(args.X[0]); } - Result CheckStatus(Result *out, AsyncOperationKey op) { + Result GetResult(Result *out, AsyncOperationKey op) { SecmonArgs args; - args.X[0] = static_cast(FunctionId::CheckStatus); + args.X[0] = static_cast(FunctionId::GetResult); args.X[1] = op.value; svcCallSecureMonitor(&args); @@ -55,10 +55,10 @@ namespace ams::spl::smc { return static_cast(args.X[0]); } - Result GetResult(Result *out, void *out_buf, size_t out_buf_size, AsyncOperationKey op) { + Result GetResultData(Result *out, void *out_buf, size_t out_buf_size, AsyncOperationKey op) { SecmonArgs args; - args.X[0] = static_cast(FunctionId::GetResult); + args.X[0] = static_cast(FunctionId::GetResultData); args.X[1] = op.value; args.X[2] = reinterpret_cast(out_buf); args.X[3] = out_buf_size; @@ -68,10 +68,10 @@ namespace ams::spl::smc { return static_cast(args.X[0]); } - Result ExpMod(AsyncOperationKey *out_op, const void *base, const void *exp, size_t exp_size, const void *mod) { + Result ModularExponentiate(AsyncOperationKey *out_op, const void *base, const void *exp, size_t exp_size, const void *mod) { SecmonArgs args; - args.X[0] = static_cast(FunctionId::ExpMod); + args.X[0] = static_cast(FunctionId::ModularExponentiate); args.X[1] = reinterpret_cast(base); args.X[2] = reinterpret_cast(exp); args.X[3] = reinterpret_cast(mod); @@ -124,10 +124,10 @@ namespace ams::spl::smc { return static_cast(args.X[0]); } - Result CryptAes(AsyncOperationKey *out_op, u32 mode, const IvCtr &iv_ctr, u32 dst_addr, u32 src_addr, size_t size) { + Result ComputeAes(AsyncOperationKey *out_op, u32 mode, const IvCtr &iv_ctr, u32 dst_addr, u32 src_addr, size_t size) { SecmonArgs args; - args.X[0] = static_cast(FunctionId::CryptAes); + args.X[0] = static_cast(FunctionId::ComputeAes); args.X[1] = mode; args.X[2] = iv_ctr.data64[0]; args.X[3] = iv_ctr.data64[1]; @@ -169,10 +169,10 @@ namespace ams::spl::smc { return static_cast(args.X[0]); } - Result ReEncryptRsaPrivateKey(void *data, size_t size, const AccessKey &access_key_dec, const KeySource &source_dec, const AccessKey &access_key_enc, const KeySource &source_enc, u32 option) { + Result ReencryptDeviceUniqueData(void *data, size_t size, const AccessKey &access_key_dec, const KeySource &source_dec, const AccessKey &access_key_enc, const KeySource &source_enc, u32 option) { SecmonArgs args; - args.X[0] = static_cast(FunctionId::ReEncryptRsaPrivateKey); + args.X[0] = static_cast(FunctionId::ReencryptDeviceUniqueData); args.X[1] = reinterpret_cast(&access_key_dec); args.X[2] = reinterpret_cast(&access_key_enc); args.X[3] = option; @@ -185,10 +185,10 @@ namespace ams::spl::smc { return static_cast(args.X[0]); } - Result DecryptOrImportRsaPrivateKey(void *data, size_t size, const AccessKey &access_key, const KeySource &source, DecryptOrImportMode mode) { + Result DecryptDeviceUniqueData(void *data, size_t size, const AccessKey &access_key, const KeySource &source, DeviceUniqueDataMode mode) { SecmonArgs args; - args.X[0] = static_cast(FunctionId::DecryptOrImportRsaPrivateKey); + args.X[0] = static_cast(FunctionId::DecryptDeviceUniqueData); args.X[1] = access_key.data64[0]; args.X[2] = access_key.data64[1]; args.X[3] = static_cast(mode); @@ -201,10 +201,10 @@ namespace ams::spl::smc { return static_cast(args.X[0]); } - Result SecureExpMod(AsyncOperationKey *out_op, const void *base, const void *mod, SecureExpModMode mode) { + Result ModularExponentiateWithStorageKey(AsyncOperationKey *out_op, const void *base, const void *mod, ModularExponentiateWithStorageKeyMode mode) { SecmonArgs args; - args.X[0] = static_cast(FunctionId::SecureExpMod); + args.X[0] = static_cast(FunctionId::ModularExponentiateWithStorageKey); args.X[1] = reinterpret_cast(base); args.X[2] = reinterpret_cast(mod); args.X[3] = static_cast(mode); @@ -214,10 +214,10 @@ namespace ams::spl::smc { return static_cast(args.X[0]); } - Result UnwrapTitleKey(AsyncOperationKey *out_op, const void *base, const void *mod, const void *label_digest, size_t label_digest_size, u32 option) { + Result PrepareEsDeviceUniqueKey(AsyncOperationKey *out_op, const void *base, const void *mod, const void *label_digest, size_t label_digest_size, u32 option) { SecmonArgs args; - args.X[0] = static_cast(FunctionId::UnwrapTitleKey); + args.X[0] = static_cast(FunctionId::PrepareEsDeviceUniqueKey); args.X[1] = reinterpret_cast(base); args.X[2] = reinterpret_cast(mod); std::memset(&args.X[3], 0, 4 * sizeof(args.X[3])); @@ -229,10 +229,10 @@ namespace ams::spl::smc { return static_cast(args.X[0]); } - Result LoadTitleKey(u32 keyslot, const AccessKey &access_key) { + Result LoadPreparedAesKey(u32 keyslot, const AccessKey &access_key) { SecmonArgs args; - args.X[0] = static_cast(FunctionId::LoadTitleKey); + args.X[0] = static_cast(FunctionId::LoadPreparedAesKey); args.X[1] = keyslot; args.X[2] = access_key.data64[0]; args.X[3] = access_key.data64[1]; @@ -241,10 +241,10 @@ namespace ams::spl::smc { return static_cast(args.X[0]); } - Result UnwrapCommonTitleKey(AccessKey *out, const KeySource &source, u32 generation) { + Result PrepareCommonEsTitleKey(AccessKey *out, const KeySource &source, u32 generation) { SecmonArgs args; - args.X[0] = static_cast(FunctionId::UnwrapCommonTitleKey); + args.X[0] = static_cast(FunctionId::PrepareCommonEsTitleKey); args.X[1] = source.data64[0]; args.X[2] = source.data64[1]; args.X[3] = generation; @@ -257,10 +257,10 @@ namespace ams::spl::smc { /* Deprecated functions. */ - Result ImportEsKey(const void *data, size_t size, const AccessKey &access_key, const KeySource &source, u32 option) { + Result LoadEsDeviceKey(const void *data, size_t size, const AccessKey &access_key, const KeySource &source, u32 option) { SecmonArgs args; - args.X[0] = static_cast(FunctionId::ImportEsKey); + args.X[0] = static_cast(FunctionId::LoadEsDeviceKey); args.X[1] = access_key.data64[0]; args.X[2] = access_key.data64[1]; args.X[3] = option; @@ -273,10 +273,10 @@ namespace ams::spl::smc { return static_cast(args.X[0]); } - Result DecryptRsaPrivateKey(size_t *out_size, void *data, size_t size, const AccessKey &access_key, const KeySource &source, u32 option) { + Result DecryptDeviceUniqueData(size_t *out_size, void *data, size_t size, const AccessKey &access_key, const KeySource &source, u32 option) { SecmonArgs args; - args.X[0] = static_cast(FunctionId::DecryptRsaPrivateKey); + args.X[0] = static_cast(FunctionId::DecryptDeviceUniqueData); args.X[1] = access_key.data64[0]; args.X[2] = access_key.data64[1]; args.X[3] = option; @@ -290,10 +290,10 @@ namespace ams::spl::smc { return static_cast(args.X[0]); } - Result ImportSecureExpModKey(const void *data, size_t size, const AccessKey &access_key, const KeySource &source, u32 option) { + Result DecryptAndStoreGcKey(const void *data, size_t size, const AccessKey &access_key, const KeySource &source, u32 option) { SecmonArgs args; - args.X[0] = static_cast(FunctionId::ImportSecureExpModKey); + args.X[0] = static_cast(FunctionId::DecryptAndStoreGcKey); args.X[1] = access_key.data64[0]; args.X[2] = access_key.data64[1]; args.X[3] = option; @@ -348,19 +348,6 @@ namespace ams::spl::smc { return static_cast(args.X[0]); } - Result AtmosphereWriteAddress(void *dst, const void *src, size_t size) { - AMS_ABORT_UNLESS(size <= sizeof(u64)); - - SecmonArgs args; - args.X[0] = static_cast(FunctionId::AtmosphereWriteAddress); - args.X[1] = reinterpret_cast(dst); - __builtin_memcpy(&args.X[1], src, size); - args.X[3] = size; - svcCallSecureMonitor(&args); - - return static_cast(args.X[0]); - } - Result AtmosphereGetEmummcConfig(void *out_config, void *out_paths, u32 storage_id) { const u64 paths = reinterpret_cast(out_paths); AMS_ABORT_UNLESS(util::IsAligned(paths, os::MemoryPageSize)); diff --git a/libstratosphere/source/spl/spl_api.cpp b/libstratosphere/source/spl/spl_api.cpp index 6e824024..f53b7537 100644 --- a/libstratosphere/source/spl/spl_api.cpp +++ b/libstratosphere/source/spl/spl_api.cpp @@ -63,7 +63,7 @@ namespace ams::spl { auto is_event_initialized = false; while (true) { R_TRY_CATCH(static_cast<::ams::Result>(f())) { - R_CATCH(spl::ResultOutOfKeyslots) { + R_CATCH(spl::ResultOutOfKeySlots) { if (!is_event_initialized) { GetAesKeySlotAvailableEvent(std::addressof(event)); is_event_initialized = true; diff --git a/libvapours/include/vapours/results/spl_results.hpp b/libvapours/include/vapours/results/spl_results.hpp index 8ea79482..f8d857e1 100644 --- a/libvapours/include/vapours/results/spl_results.hpp +++ b/libvapours/include/vapours/results/spl_results.hpp @@ -28,13 +28,14 @@ namespace ams::spl { R_DEFINE_ERROR_RESULT(SecureMonitorNoAsyncOperation, 4); R_DEFINE_ERROR_RESULT(SecureMonitorInvalidAsyncOperation, 5); R_DEFINE_ERROR_RESULT(SecureMonitorNotPermitted, 6); + R_DEFINE_ERROR_RESULT(SecureMonitorNotInitialized, 7); R_DEFINE_ERROR_RESULT(InvalidSize, 100); R_DEFINE_ERROR_RESULT(UnknownSecureMonitorError, 101); R_DEFINE_ERROR_RESULT(DecryptionFailed, 102); - R_DEFINE_ERROR_RESULT(OutOfKeyslots, 104); - R_DEFINE_ERROR_RESULT(InvalidKeyslot, 105); + R_DEFINE_ERROR_RESULT(OutOfKeySlots, 104); + R_DEFINE_ERROR_RESULT(InvalidKeySlot, 105); R_DEFINE_ERROR_RESULT(BootReasonAlreadySet, 106); R_DEFINE_ERROR_RESULT(BootReasonNotSet, 107); R_DEFINE_ERROR_RESULT(InvalidArgument, 108);