From 816d03f7d96278c5b3d2604f94901270b10d4167 Mon Sep 17 00:00:00 2001 From: Narr the Reg Date: Fri, 9 Feb 2024 10:31:35 -0600 Subject: service: bcat: Address review issues --- src/core/CMakeLists.txt | 8 +-- src/core/file_sys/errors.h | 1 + src/core/hle/service/bcat/bcat.cpp | 30 +++++----- src/core/hle/service/bcat/bcat_interface.cpp | 61 --------------------- src/core/hle/service/bcat/bcat_interface.h | 40 -------------- src/core/hle/service/bcat/bcat_result.h | 5 -- src/core/hle/service/bcat/bcat_service.cpp | 31 ++++++----- src/core/hle/service/bcat/bcat_service.h | 6 +- src/core/hle/service/bcat/bcat_types.h | 10 +++- .../bcat/delivery_cache_directory_service.cpp | 23 ++++---- .../bcat/delivery_cache_directory_service.h | 6 +- .../service/bcat/delivery_cache_file_service.cpp | 11 ++-- .../hle/service/bcat/delivery_cache_file_service.h | 2 +- .../bcat/delivery_cache_progress_service.cpp | 4 +- .../bcat/delivery_cache_storage_service.cpp | 16 +++--- .../service/bcat/delivery_cache_storage_service.h | 4 +- .../bcat/news/newly_arrived_event_holder.cpp | 8 ++- .../service/bcat/news/newly_arrived_event_holder.h | 4 +- .../hle/service/bcat/news/news_data_service.cpp | 4 +- src/core/hle/service/bcat/news/news_data_service.h | 4 +- .../service/bcat/news/news_database_service.cpp | 6 +- .../hle/service/bcat/news/news_database_service.h | 6 +- src/core/hle/service/bcat/news/news_interface.cpp | 63 --------------------- src/core/hle/service/bcat/news/news_interface.h | 35 ------------ src/core/hle/service/bcat/news/news_service.cpp | 4 +- src/core/hle/service/bcat/news/news_service.h | 4 +- .../service/bcat/news/overwrite_event_holder.cpp | 8 ++- .../hle/service/bcat/news/overwrite_event_holder.h | 4 +- src/core/hle/service/bcat/news/service_creator.cpp | 64 ++++++++++++++++++++++ src/core/hle/service/bcat/news/service_creator.h | 35 ++++++++++++ src/core/hle/service/bcat/service_creator.cpp | 62 +++++++++++++++++++++ src/core/hle/service/bcat/service_creator.h | 40 ++++++++++++++ src/core/hle/service/service.cpp | 2 +- 33 files changed, 310 insertions(+), 301 deletions(-) delete mode 100644 src/core/hle/service/bcat/bcat_interface.cpp delete mode 100644 src/core/hle/service/bcat/bcat_interface.h delete mode 100644 src/core/hle/service/bcat/news/news_interface.cpp delete mode 100644 src/core/hle/service/bcat/news/news_interface.h create mode 100644 src/core/hle/service/bcat/news/service_creator.cpp create mode 100644 src/core/hle/service/bcat/news/service_creator.h create mode 100644 src/core/hle/service/bcat/service_creator.cpp create mode 100644 src/core/hle/service/bcat/service_creator.h diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 539e09894..c7157ff4c 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -518,16 +518,14 @@ add_library(core STATIC hle/service/bcat/news/news_data_service.h hle/service/bcat/news/news_database_service.cpp hle/service/bcat/news/news_database_service.h - hle/service/bcat/news/news_interface.cpp - hle/service/bcat/news/news_interface.h hle/service/bcat/news/news_service.cpp hle/service/bcat/news/news_service.h hle/service/bcat/news/overwrite_event_holder.cpp hle/service/bcat/news/overwrite_event_holder.h + hle/service/bcat/news/service_creator.cpp + hle/service/bcat/news/service_creator.h hle/service/bcat/bcat.cpp hle/service/bcat/bcat.h - hle/service/bcat/bcat_interface.cpp - hle/service/bcat/bcat_interface.h hle/service/bcat/bcat_result.h hle/service/bcat/bcat_service.cpp hle/service/bcat/bcat_service.h @@ -541,6 +539,8 @@ add_library(core STATIC hle/service/bcat/delivery_cache_progress_service.h hle/service/bcat/delivery_cache_storage_service.cpp hle/service/bcat/delivery_cache_storage_service.h + hle/service/bcat/service_creator.cpp + hle/service/bcat/service_creator.h hle/service/bpc/bpc.cpp hle/service/bpc/bpc.h hle/service/btdrv/btdrv.cpp diff --git a/src/core/file_sys/errors.h b/src/core/file_sys/errors.h index d4e0eb6f4..b22767bf5 100644 --- a/src/core/file_sys/errors.h +++ b/src/core/file_sys/errors.h @@ -91,6 +91,7 @@ constexpr Result ResultWriteNotPermitted{ErrorModule::FS, 6203}; constexpr Result ResultUnsupportedSetSizeForIndirectStorage{ErrorModule::FS, 6325}; constexpr Result ResultUnsupportedWriteForCompressedStorage{ErrorModule::FS, 6387}; constexpr Result ResultUnsupportedOperateRangeForCompressedStorage{ErrorModule::FS, 6388}; +constexpr Result ResultPermissionDenied{ErrorModule::FS, 6400}; constexpr Result ResultBufferAllocationFailed{ErrorModule::FS, 6705}; } // namespace FileSys diff --git a/src/core/hle/service/bcat/bcat.cpp b/src/core/hle/service/bcat/bcat.cpp index 02995ddee..ea8b15998 100644 --- a/src/core/hle/service/bcat/bcat.cpp +++ b/src/core/hle/service/bcat/bcat.cpp @@ -3,8 +3,8 @@ #include "core/hle/service/bcat/backend/backend.h" #include "core/hle/service/bcat/bcat.h" -#include "core/hle/service/bcat/bcat_interface.h" -#include "core/hle/service/bcat/news/news_interface.h" +#include "core/hle/service/bcat/news/service_creator.h" +#include "core/hle/service/bcat/service_creator.h" #include "core/hle/service/server_manager.h" namespace Service::BCAT { @@ -13,24 +13,24 @@ void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); server_manager->RegisterNamedService("bcat:a", - std::make_shared(system, "bcat:a")); + std::make_shared(system, "bcat:a")); server_manager->RegisterNamedService("bcat:m", - std::make_shared(system, "bcat:m")); + std::make_shared(system, "bcat:m")); server_manager->RegisterNamedService("bcat:u", - std::make_shared(system, "bcat:u")); + std::make_shared(system, "bcat:u")); server_manager->RegisterNamedService("bcat:s", - std::make_shared(system, "bcat:s")); + std::make_shared(system, "bcat:s")); server_manager->RegisterNamedService( - "news:a", std::make_shared(system, 0xffffffff, "news:a")); - server_manager->RegisterNamedService("news:p", - std::make_shared(system, 0x1, "news:p")); - server_manager->RegisterNamedService("news:c", - std::make_shared(system, 0x2, "news:c")); - server_manager->RegisterNamedService("news:v", - std::make_shared(system, 0x4, "news:v")); - server_manager->RegisterNamedService("news:m", - std::make_shared(system, 0xd, "news:m")); + "news:a", std::make_shared(system, 0xffffffff, "news:a")); + server_manager->RegisterNamedService( + "news:p", std::make_shared(system, 0x1, "news:p")); + server_manager->RegisterNamedService( + "news:c", std::make_shared(system, 0x2, "news:c")); + server_manager->RegisterNamedService( + "news:v", std::make_shared(system, 0x4, "news:v")); + server_manager->RegisterNamedService( + "news:m", std::make_shared(system, 0xd, "news:m")); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/bcat/bcat_interface.cpp b/src/core/hle/service/bcat/bcat_interface.cpp deleted file mode 100644 index 2d9a0efcc..000000000 --- a/src/core/hle/service/bcat/bcat_interface.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/bcat/bcat_interface.h" -#include "core/hle/service/bcat/bcat_service.h" -#include "core/hle/service/bcat/delivery_cache_storage_service.h" -#include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/filesystem/filesystem.h" - -namespace Service::BCAT { - -std::unique_ptr CreateBackendFromSettings([[maybe_unused]] Core::System& system, - DirectoryGetter getter) { - return std::make_unique(std::move(getter)); -} - -BcatInterface::BcatInterface(Core::System& system_, const char* name_) - : ServiceFramework{system_, name_}, fsc{system.GetFileSystemController()} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&BcatInterface::CreateBcatService>, "CreateBcatService"}, - {1, C<&BcatInterface::CreateDeliveryCacheStorageService>, "CreateDeliveryCacheStorageService"}, - {2, C<&BcatInterface::CreateDeliveryCacheStorageServiceWithApplicationId>, "CreateDeliveryCacheStorageServiceWithApplicationId"}, - {3, nullptr, "CreateDeliveryCacheProgressService"}, - {4, nullptr, "CreateDeliveryCacheProgressServiceWithApplicationId"}, - }; - // clang-format on - - RegisterHandlers(functions); - - backend = - CreateBackendFromSettings(system_, [this](u64 tid) { return fsc.GetBCATDirectory(tid); }); -} - -BcatInterface::~BcatInterface() = default; - -Result BcatInterface::CreateBcatService(OutInterface out_interface) { - LOG_INFO(Service_BCAT, "called"); - *out_interface = std::make_shared(system, *backend); - R_SUCCEED(); -} - -Result BcatInterface::CreateDeliveryCacheStorageService( - OutInterface out_interface) { - LOG_INFO(Service_BCAT, "called"); - - const auto title_id = system.GetApplicationProcessProgramID(); - *out_interface = - std::make_shared(system, fsc.GetBCATDirectory(title_id)); - R_SUCCEED(); -} - -Result BcatInterface::CreateDeliveryCacheStorageServiceWithApplicationId( - u64 title_id, OutInterface out_interface) { - LOG_DEBUG(Service_BCAT, "called, title_id={:016X}", title_id); - *out_interface = - std::make_shared(system, fsc.GetBCATDirectory(title_id)); - R_SUCCEED(); -} - -} // namespace Service::BCAT diff --git a/src/core/hle/service/bcat/bcat_interface.h b/src/core/hle/service/bcat/bcat_interface.h deleted file mode 100644 index 9282b57bb..000000000 --- a/src/core/hle/service/bcat/bcat_interface.h +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Core { -class System; -} - -namespace Service::FileSystem { -class FileSystemController; -} - -namespace Service::BCAT { -class BcatBackend; -class IBcatService; -class IDeliveryCacheStorageService; - -class BcatInterface final : public ServiceFramework { -public: - explicit BcatInterface(Core::System& system_, const char* name_); - ~BcatInterface() override; - -private: - Result CreateBcatService(OutInterface out_interface); - - Result CreateDeliveryCacheStorageService( - OutInterface out_interface); - - Result CreateDeliveryCacheStorageServiceWithApplicationId( - u64 title_id, OutInterface out_interface); - - std::unique_ptr backend; - Service::FileSystem::FileSystemController& fsc; -}; - -} // namespace Service::BCAT diff --git a/src/core/hle/service/bcat/bcat_result.h b/src/core/hle/service/bcat/bcat_result.h index d711924b1..edf8a6564 100644 --- a/src/core/hle/service/bcat/bcat_result.h +++ b/src/core/hle/service/bcat/bcat_result.h @@ -12,9 +12,4 @@ constexpr Result ResultFailedOpenEntity{ErrorModule::BCAT, 2}; constexpr Result ResultEntityAlreadyOpen{ErrorModule::BCAT, 6}; constexpr Result ResultNoOpenEntry{ErrorModule::BCAT, 7}; -// The command to clear the delivery cache just calls fs IFileSystem DeleteFile on all of the -// files and if any of them have a non-zero result it just forwards that result. This is the FS -// error code for permission denied, which is the closest approximation of this scenario. -constexpr Result ResultFailedClearCache{ErrorModule::FS, 6400}; - } // namespace Service::BCAT diff --git a/src/core/hle/service/bcat/bcat_service.cpp b/src/core/hle/service/bcat/bcat_service.cpp index 2eacec3ae..63b1072d2 100644 --- a/src/core/hle/service/bcat/bcat_service.cpp +++ b/src/core/hle/service/bcat/bcat_service.cpp @@ -4,6 +4,7 @@ #include "common/hex_util.h" #include "common/string_util.h" #include "core/core.h" +#include "core/file_sys/errors.h" #include "core/hle/service/bcat/backend/backend.h" #include "core/hle/service/bcat/bcat_result.h" #include "core/hle/service/bcat/bcat_service.h" @@ -14,7 +15,7 @@ namespace Service::BCAT { -u64 GetCurrentBuildID(const Core::System::CurrentBuildProcessID& id) { +static u64 GetCurrentBuildID(const Core::System::CurrentBuildProcessID& id) { u64 out{}; std::memcpy(&out, id.data(), sizeof(u64)); return out; @@ -28,8 +29,8 @@ IBcatService::IBcatService(Core::System& system_, BcatBackend& backend_) }} { // clang-format off static const FunctionInfo functions[] = { - {10100, C<&IBcatService::RequestSyncDeliveryCache>, "RequestSyncDeliveryCache"}, - {10101, C<&IBcatService::RequestSyncDeliveryCacheWithDirectoryName>, "RequestSyncDeliveryCacheWithDirectoryName"}, + {10100, D<&IBcatService::RequestSyncDeliveryCache>, "RequestSyncDeliveryCache"}, + {10101, D<&IBcatService::RequestSyncDeliveryCacheWithDirectoryName>, "RequestSyncDeliveryCacheWithDirectoryName"}, {10200, nullptr, "CancelSyncDeliveryCacheRequest"}, {20100, nullptr, "RequestSyncDeliveryCacheWithApplicationId"}, {20101, nullptr, "RequestSyncDeliveryCacheWithApplicationIdAndDirectoryName"}, @@ -38,7 +39,7 @@ IBcatService::IBcatService(Core::System& system_, BcatBackend& backend_) {20400, nullptr, "RegisterSystemApplicationDeliveryTask"}, {20401, nullptr, "UnregisterSystemApplicationDeliveryTask"}, {20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"}, - {30100, C<&IBcatService::SetPassphrase>, "SetPassphrase"}, + {30100, D<&IBcatService::SetPassphrase>, "SetPassphrase"}, {30101, nullptr, "Unknown30101"}, {30102, nullptr, "Unknown30102"}, {30200, nullptr, "RegisterBackgroundDeliveryTask"}, @@ -46,11 +47,11 @@ IBcatService::IBcatService(Core::System& system_, BcatBackend& backend_) {30202, nullptr, "BlockDeliveryTask"}, {30203, nullptr, "UnblockDeliveryTask"}, {30210, nullptr, "SetDeliveryTaskTimer"}, - {30300, C<&IBcatService::RegisterSystemApplicationDeliveryTasks>, "RegisterSystemApplicationDeliveryTasks"}, + {30300, D<&IBcatService::RegisterSystemApplicationDeliveryTasks>, "RegisterSystemApplicationDeliveryTasks"}, {90100, nullptr, "EnumerateBackgroundDeliveryTask"}, {90101, nullptr, "Unknown90101"}, {90200, nullptr, "GetDeliveryList"}, - {90201, C<&IBcatService::ClearDeliveryCacheStorage>, "ClearDeliveryCacheStorage"}, + {90201, D<&IBcatService::ClearDeliveryCacheStorage>, "ClearDeliveryCacheStorage"}, {90202, nullptr, "ClearDeliveryTaskSubscriptionStatus"}, {90300, nullptr, "GetPushNotificationLog"}, {90301, nullptr, "Unknown90301"}, @@ -76,7 +77,7 @@ Result IBcatService::RequestSyncDeliveryCache( } Result IBcatService::RequestSyncDeliveryCacheWithDirectoryName( - DirectoryName name_raw, OutInterface out_interface) { + const DirectoryName& name_raw, OutInterface out_interface) { const auto name = Common::StringFromFixedZeroTerminatedBuffer(name_raw.data(), name_raw.size()); LOG_DEBUG(Service_BCAT, "called, name={}", name); @@ -91,19 +92,19 @@ Result IBcatService::RequestSyncDeliveryCacheWithDirectoryName( R_SUCCEED(); } -Result IBcatService::SetPassphrase(u64 title_id, +Result IBcatService::SetPassphrase(u64 application_id, InBuffer passphrase_buffer) { - LOG_DEBUG(Service_BCAT, "called, title_id={:016X}, passphrase={}", title_id, + LOG_DEBUG(Service_BCAT, "called, application_id={:016X}, passphrase={}", application_id, Common::HexToString(passphrase_buffer)); - R_UNLESS(title_id != 0, ResultInvalidArgument); + R_UNLESS(application_id != 0, ResultInvalidArgument); R_UNLESS(passphrase_buffer.size() <= 0x40, ResultInvalidArgument); Passphrase passphrase{}; std::memcpy(passphrase.data(), passphrase_buffer.data(), std::min(passphrase.size(), passphrase_buffer.size())); - backend.SetPassphrase(title_id, passphrase); + backend.SetPassphrase(application_id, passphrase); R_SUCCEED(); } @@ -112,11 +113,11 @@ Result IBcatService::RegisterSystemApplicationDeliveryTasks() { R_SUCCEED(); } -Result IBcatService::ClearDeliveryCacheStorage(u64 title_id) { - LOG_DEBUG(Service_BCAT, "called, title_id={:016X}", title_id); +Result IBcatService::ClearDeliveryCacheStorage(u64 application_id) { + LOG_DEBUG(Service_BCAT, "called, title_id={:016X}", application_id); - R_UNLESS(title_id != 0, ResultInvalidArgument); - R_UNLESS(backend.Clear(title_id), ResultFailedClearCache); + R_UNLESS(application_id != 0, ResultInvalidArgument); + R_UNLESS(backend.Clear(application_id), FileSys::ResultPermissionDenied); R_SUCCEED(); } diff --git a/src/core/hle/service/bcat/bcat_service.h b/src/core/hle/service/bcat/bcat_service.h index 3e1ed98c3..dda5a2d5f 100644 --- a/src/core/hle/service/bcat/bcat_service.h +++ b/src/core/hle/service/bcat/bcat_service.h @@ -26,13 +26,13 @@ private: Result RequestSyncDeliveryCache(OutInterface out_interface); Result RequestSyncDeliveryCacheWithDirectoryName( - DirectoryName name, OutInterface out_interface); + const DirectoryName& name, OutInterface out_interface); - Result SetPassphrase(u64 title_id, InBuffer passphrase_buffer); + Result SetPassphrase(u64 application_id, InBuffer passphrase_buffer); Result RegisterSystemApplicationDeliveryTasks(); - Result ClearDeliveryCacheStorage(u64 title_id); + Result ClearDeliveryCacheStorage(u64 application_id); private: ProgressServiceBackend& GetProgressBackend(SyncType type); diff --git a/src/core/hle/service/bcat/bcat_types.h b/src/core/hle/service/bcat/bcat_types.h index a56f9248f..b35dab7c5 100644 --- a/src/core/hle/service/bcat/bcat_types.h +++ b/src/core/hle/service/bcat/bcat_types.h @@ -3,9 +3,13 @@ #pragma once +#include +#include + #include "common/common_funcs.h" #include "common/common_types.h" #include "core/file_sys/vfs/vfs_types.h" +#include "core/hle/result.h" namespace Service::BCAT { @@ -44,17 +48,19 @@ struct TitleIDVersion { struct DeliveryCacheProgressImpl { DeliveryCacheProgressStatus status; - Result result = ResultSuccess; + Result result; DirectoryName current_directory; FileName current_file; s64 current_downloaded_bytes; ///< Bytes downloaded on current file. s64 current_total_bytes; ///< Bytes total on current file. s64 total_downloaded_bytes; ///< Bytes downloaded on overall download. s64 total_bytes; ///< Bytes total on overall download. - INSERT_PADDING_BYTES( + INSERT_PADDING_BYTES_NOINIT( 0x198); ///< Appears to be unused in official code, possibly reserved for future use. }; static_assert(sizeof(DeliveryCacheProgressImpl) == 0x200, "DeliveryCacheProgressImpl has incorrect size."); +static_assert(std::is_trivial_v, + "DeliveryCacheProgressImpl type must be trivially copyable."); } // namespace Service::BCAT diff --git a/src/core/hle/service/bcat/delivery_cache_directory_service.cpp b/src/core/hle/service/bcat/delivery_cache_directory_service.cpp index 8bda1168a..01f08a2fc 100644 --- a/src/core/hle/service/bcat/delivery_cache_directory_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_directory_service.cpp @@ -12,7 +12,7 @@ namespace Service::BCAT { // The digest is only used to determine if a file is unique compared to others of the same name. // Since the algorithm isn't ever checked in game, MD5 is safe. -BcatDigest DigestFile(const FileSys::VirtualFile& file) { +static BcatDigest DigestFile(const FileSys::VirtualFile& file) { BcatDigest out{}; const auto bytes = file->ReadAllBytes(); mbedtls_md5_ret(bytes.data(), bytes.size(), out.data()); @@ -24,9 +24,9 @@ IDeliveryCacheDirectoryService::IDeliveryCacheDirectoryService(Core::System& sys : ServiceFramework{system_, "IDeliveryCacheDirectoryService"}, root(std::move(root_)) { // clang-format off static const FunctionInfo functions[] = { - {0, C<&IDeliveryCacheDirectoryService::Open>, "Open"}, - {1, C<&IDeliveryCacheDirectoryService::Read>, "Read"}, - {2, C<&IDeliveryCacheDirectoryService::GetCount>, "GetCount"}, + {0, D<&IDeliveryCacheDirectoryService::Open>, "Open"}, + {1, D<&IDeliveryCacheDirectoryService::Read>, "Read"}, + {2, D<&IDeliveryCacheDirectoryService::GetCount>, "GetCount"}, }; // clang-format on @@ -35,13 +35,13 @@ IDeliveryCacheDirectoryService::IDeliveryCacheDirectoryService(Core::System& sys IDeliveryCacheDirectoryService::~IDeliveryCacheDirectoryService() = default; -Result IDeliveryCacheDirectoryService::Open(DirectoryName dir_name_raw) { +Result IDeliveryCacheDirectoryService::Open(const DirectoryName& dir_name_raw) { const auto dir_name = Common::StringFromFixedZeroTerminatedBuffer(dir_name_raw.data(), dir_name_raw.size()); LOG_DEBUG(Service_BCAT, "called, dir_name={}", dir_name); - // R_TRY(VerifyNameValidDir(dir_name_raw)); + R_TRY(VerifyNameValidDir(dir_name_raw)); R_UNLESS(current_dir == nullptr, ResultEntityAlreadyOpen); const auto dir = root->GetSubdirectory(dir_name); @@ -51,15 +51,14 @@ Result IDeliveryCacheDirectoryService::Open(DirectoryName dir_name_raw) { } Result IDeliveryCacheDirectoryService::Read( - Out out_buffer_size, - OutArray out_buffer) { + Out out_count, OutArray out_buffer) { LOG_DEBUG(Service_BCAT, "called, write_size={:016X}", out_buffer.size()); R_UNLESS(current_dir != nullptr, ResultNoOpenEntry); const auto files = current_dir->GetFiles(); - *out_buffer_size = static_cast(std::min(files.size(), out_buffer.size())); - std::transform(files.begin(), files.begin() + *out_buffer_size, out_buffer.begin(), + *out_count = static_cast(std::min(files.size(), out_buffer.size())); + std::transform(files.begin(), files.begin() + *out_count, out_buffer.begin(), [](const auto& file) { FileName name{}; std::memcpy(name.data(), file->GetName().data(), @@ -69,12 +68,12 @@ Result IDeliveryCacheDirectoryService::Read( R_SUCCEED(); } -Result IDeliveryCacheDirectoryService::GetCount(Out out_count) { +Result IDeliveryCacheDirectoryService::GetCount(Out out_count) { LOG_DEBUG(Service_BCAT, "called"); R_UNLESS(current_dir != nullptr, ResultNoOpenEntry); - *out_count = static_cast(current_dir->GetFiles().size()); + *out_count = static_cast(current_dir->GetFiles().size()); R_SUCCEED(); } diff --git a/src/core/hle/service/bcat/delivery_cache_directory_service.h b/src/core/hle/service/bcat/delivery_cache_directory_service.h index f544d0947..b902c6495 100644 --- a/src/core/hle/service/bcat/delivery_cache_directory_service.h +++ b/src/core/hle/service/bcat/delivery_cache_directory_service.h @@ -21,10 +21,10 @@ public: ~IDeliveryCacheDirectoryService() override; private: - Result Open(DirectoryName dir_name_raw); - Result Read(Out out_buffer_size, + Result Open(const DirectoryName& dir_name_raw); + Result Read(Out out_count, OutArray out_buffer); - Result GetCount(Out out_count); + Result GetCount(Out out_count); FileSys::VirtualDir root; FileSys::VirtualDir current_dir; diff --git a/src/core/hle/service/bcat/delivery_cache_file_service.cpp b/src/core/hle/service/bcat/delivery_cache_file_service.cpp index c91efd47e..b75fac4bf 100644 --- a/src/core/hle/service/bcat/delivery_cache_file_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_file_service.cpp @@ -14,10 +14,10 @@ IDeliveryCacheFileService::IDeliveryCacheFileService(Core::System& system_, : ServiceFramework{system_, "IDeliveryCacheFileService"}, root(std::move(root_)) { // clang-format off static const FunctionInfo functions[] = { - {0, C<&IDeliveryCacheFileService::Open>, "Open"}, - {1, C<&IDeliveryCacheFileService::Read>, "Read"}, - {2, C<&IDeliveryCacheFileService::GetSize>, "GetSize"}, - {3, C<&IDeliveryCacheFileService::GetDigest>, "GetDigest"}, + {0, D<&IDeliveryCacheFileService::Open>, "Open"}, + {1, D<&IDeliveryCacheFileService::Read>, "Read"}, + {2, D<&IDeliveryCacheFileService::GetSize>, "GetSize"}, + {3, D<&IDeliveryCacheFileService::GetDigest>, "GetDigest"}, }; // clang-format on @@ -26,7 +26,8 @@ IDeliveryCacheFileService::IDeliveryCacheFileService(Core::System& system_, IDeliveryCacheFileService::~IDeliveryCacheFileService() = default; -Result IDeliveryCacheFileService::Open(DirectoryName dir_name_raw, FileName file_name_raw) { +Result IDeliveryCacheFileService::Open(const DirectoryName& dir_name_raw, + const FileName& file_name_raw) { const auto dir_name = Common::StringFromFixedZeroTerminatedBuffer(dir_name_raw.data(), dir_name_raw.size()); const auto file_name = diff --git a/src/core/hle/service/bcat/delivery_cache_file_service.h b/src/core/hle/service/bcat/delivery_cache_file_service.h index 7583b4d1d..e1012e687 100644 --- a/src/core/hle/service/bcat/delivery_cache_file_service.h +++ b/src/core/hle/service/bcat/delivery_cache_file_service.h @@ -20,7 +20,7 @@ public: ~IDeliveryCacheFileService() override; private: - Result Open(DirectoryName dir_name_raw, FileName file_name_raw); + Result Open(const DirectoryName& dir_name_raw, const FileName& file_name_raw); Result Read(Out out_buffer_size, u64 offset, OutBuffer out_buffer); Result GetSize(Out out_size); diff --git a/src/core/hle/service/bcat/delivery_cache_progress_service.cpp b/src/core/hle/service/bcat/delivery_cache_progress_service.cpp index 94d341f7e..79e7e0d95 100644 --- a/src/core/hle/service/bcat/delivery_cache_progress_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_progress_service.cpp @@ -13,8 +13,8 @@ IDeliveryCacheProgressService::IDeliveryCacheProgressService(Core::System& syste : ServiceFramework{system_, "IDeliveryCacheProgressService"}, event{event_}, impl{impl_} { // clang-format off static const FunctionInfo functions[] = { - {0, C<&IDeliveryCacheProgressService::GetEvent>, "Get"}, - {0, C<&IDeliveryCacheProgressService::GetImpl>, "Get"}, + {0, D<&IDeliveryCacheProgressService::GetEvent>, "Get"}, + {1, D<&IDeliveryCacheProgressService::GetImpl>, "Get"}, }; // clang-format on diff --git a/src/core/hle/service/bcat/delivery_cache_storage_service.cpp b/src/core/hle/service/bcat/delivery_cache_storage_service.cpp index 5d03df1e7..4c79d71f4 100644 --- a/src/core/hle/service/bcat/delivery_cache_storage_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_storage_service.cpp @@ -14,9 +14,9 @@ IDeliveryCacheStorageService::IDeliveryCacheStorageService(Core::System& system_ : ServiceFramework{system_, "IDeliveryCacheStorageService"}, root(std::move(root_)) { // clang-format off static const FunctionInfo functions[] = { - {0, C<&IDeliveryCacheStorageService::CreateFileService>, "CreateFileService"}, - {1, C<&IDeliveryCacheStorageService::CreateDirectoryService>, "CreateDirectoryService"}, - {2, C<&IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory>, "EnumerateDeliveryCacheDirectory"}, + {0, D<&IDeliveryCacheStorageService::CreateFileService>, "CreateFileService"}, + {1, D<&IDeliveryCacheStorageService::CreateDirectoryService>, "CreateDirectoryService"}, + {10, D<&IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory>, "EnumerateDeliveryCacheDirectory"}, }; // clang-format on @@ -42,15 +42,15 @@ Result IDeliveryCacheStorageService::CreateDirectoryService( } Result IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory( - Out out_directories_size, + Out out_directory_count, OutArray out_directories) { LOG_DEBUG(Service_BCAT, "called, size={:016X}", out_directories.size()); - *out_directories_size = - static_cast(std::min(out_directories.size(), entries.size() - next_read_index)); + *out_directory_count = + static_cast(std::min(out_directories.size(), entries.size() - next_read_index)); memcpy(out_directories.data(), entries.data() + next_read_index, - *out_directories_size * sizeof(DirectoryName)); - next_read_index += *out_directories_size; + *out_directory_count * sizeof(DirectoryName)); + next_read_index += *out_directory_count; R_SUCCEED(); } diff --git a/src/core/hle/service/bcat/delivery_cache_storage_service.h b/src/core/hle/service/bcat/delivery_cache_storage_service.h index 1e86d3dbf..3b8dfb1a3 100644 --- a/src/core/hle/service/bcat/delivery_cache_storage_service.h +++ b/src/core/hle/service/bcat/delivery_cache_storage_service.h @@ -25,12 +25,12 @@ private: Result CreateFileService(OutInterface out_interface); Result CreateDirectoryService(OutInterface out_interface); Result EnumerateDeliveryCacheDirectory( - Out out_directories_size, + Out out_directory_count, OutArray out_directories); FileSys::VirtualDir root; std::vector entries; - u64 next_read_index = 0; + std::size_t next_read_index = 0; }; } // namespace Service::BCAT diff --git a/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp b/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp index b3f9e4683..5be167fce 100644 --- a/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp +++ b/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp @@ -4,7 +4,7 @@ #include "core/hle/service/bcat/news/newly_arrived_event_holder.h" #include "core/hle/service/cmif_serialization.h" -namespace Service::BCAT { +namespace Service::News { INewlyArrivedEventHolder::INewlyArrivedEventHolder(Core::System& system_) : ServiceFramework{system_, "INewlyArrivedEventHolder"}, service_context{ @@ -20,7 +20,9 @@ INewlyArrivedEventHolder::INewlyArrivedEventHolder(Core::System& system_) arrived_event = service_context.CreateEvent("INewlyArrivedEventHolder::ArrivedEvent"); } -INewlyArrivedEventHolder::~INewlyArrivedEventHolder() = default; +INewlyArrivedEventHolder::~INewlyArrivedEventHolder() { + service_context.CloseEvent(arrived_event); +} Result INewlyArrivedEventHolder::Get(OutCopyHandle out_event) { LOG_INFO(Service_BCAT, "called"); @@ -29,4 +31,4 @@ Result INewlyArrivedEventHolder::Get(OutCopyHandle out_e R_SUCCEED(); } -} // namespace Service::BCAT +} // namespace Service::News diff --git a/src/core/hle/service/bcat/news/newly_arrived_event_holder.h b/src/core/hle/service/bcat/news/newly_arrived_event_holder.h index af19d81a7..6cc9ae099 100644 --- a/src/core/hle/service/bcat/news/newly_arrived_event_holder.h +++ b/src/core/hle/service/bcat/news/newly_arrived_event_holder.h @@ -16,7 +16,7 @@ class KEvent; class KReadableEvent; } // namespace Kernel -namespace Service::BCAT { +namespace Service::News { class INewlyArrivedEventHolder final : public ServiceFramework { public: @@ -30,4 +30,4 @@ private: KernelHelpers::ServiceContext service_context; }; -} // namespace Service::BCAT +} // namespace Service::News diff --git a/src/core/hle/service/bcat/news/news_data_service.cpp b/src/core/hle/service/bcat/news/news_data_service.cpp index eba2e6064..08103c9c3 100644 --- a/src/core/hle/service/bcat/news/news_data_service.cpp +++ b/src/core/hle/service/bcat/news/news_data_service.cpp @@ -3,7 +3,7 @@ #include "core/hle/service/bcat/news/news_data_service.h" -namespace Service::BCAT { +namespace Service::News { INewsDataService::INewsDataService(Core::System& system_) : ServiceFramework{system_, "INewsDataService"} { @@ -22,4 +22,4 @@ INewsDataService::INewsDataService(Core::System& system_) INewsDataService::~INewsDataService() = default; -} // namespace Service::BCAT +} // namespace Service::News diff --git a/src/core/hle/service/bcat/news/news_data_service.h b/src/core/hle/service/bcat/news/news_data_service.h index 441e0ea8e..12082ada4 100644 --- a/src/core/hle/service/bcat/news/news_data_service.h +++ b/src/core/hle/service/bcat/news/news_data_service.h @@ -9,7 +9,7 @@ namespace Core { class System; } -namespace Service::BCAT { +namespace Service::News { class INewsDataService final : public ServiceFramework { public: @@ -17,4 +17,4 @@ public: ~INewsDataService() override; }; -} // namespace Service::BCAT +} // namespace Service::News diff --git a/src/core/hle/service/bcat/news/news_database_service.cpp b/src/core/hle/service/bcat/news/news_database_service.cpp index 3b4b33901..18109f9b0 100644 --- a/src/core/hle/service/bcat/news/news_database_service.cpp +++ b/src/core/hle/service/bcat/news/news_database_service.cpp @@ -4,7 +4,7 @@ #include "core/hle/service/bcat/news/news_database_service.h" #include "core/hle/service/cmif_serialization.h" -namespace Service::BCAT { +namespace Service::News { INewsDatabaseService::INewsDatabaseService(Core::System& system_) : ServiceFramework{system_, "INewsDatabaseService"} { @@ -25,11 +25,11 @@ INewsDatabaseService::INewsDatabaseService(Core::System& system_) INewsDatabaseService::~INewsDatabaseService() = default; -Result INewsDatabaseService::Count(Out out_count, +Result INewsDatabaseService::Count(Out out_count, InBuffer buffer_data) { LOG_WARNING(Service_BCAT, "(STUBBED) called, buffer_size={}", buffer_data.size()); *out_count = 0; R_SUCCEED(); } -} // namespace Service::BCAT +} // namespace Service::News diff --git a/src/core/hle/service/bcat/news/news_database_service.h b/src/core/hle/service/bcat/news/news_database_service.h index dd09a1662..f5916634b 100644 --- a/src/core/hle/service/bcat/news/news_database_service.h +++ b/src/core/hle/service/bcat/news/news_database_service.h @@ -10,7 +10,7 @@ namespace Core { class System; } -namespace Service::BCAT { +namespace Service::News { class INewsDatabaseService final : public ServiceFramework { public: @@ -18,7 +18,7 @@ public: ~INewsDatabaseService() override; private: - Result Count(Out out_count, InBuffer buffer_data); + Result Count(Out out_count, InBuffer buffer_data); }; -} // namespace Service::BCAT +} // namespace Service::News diff --git a/src/core/hle/service/bcat/news/news_interface.cpp b/src/core/hle/service/bcat/news/news_interface.cpp deleted file mode 100644 index 0eaef2ddc..000000000 --- a/src/core/hle/service/bcat/news/news_interface.cpp +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "core/hle/service/bcat/news/newly_arrived_event_holder.h" -#include "core/hle/service/bcat/news/news_data_service.h" -#include "core/hle/service/bcat/news/news_database_service.h" -#include "core/hle/service/bcat/news/news_interface.h" -#include "core/hle/service/bcat/news/news_service.h" -#include "core/hle/service/bcat/news/overwrite_event_holder.h" -#include "core/hle/service/cmif_serialization.h" - -namespace Service::BCAT { - -NewsInterface::NewsInterface(Core::System& system_, u32 permissions_, const char* name_) - : ServiceFramework{system_, name_}, permissions{permissions_} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&NewsInterface::CreateNewsService>, "CreateNewsService"}, - {1, C<&NewsInterface::CreateNewlyArrivedEventHolder>, "CreateNewlyArrivedEventHolder"}, - {2, C<&NewsInterface::CreateNewsDataService>, "CreateNewsDataService"}, - {3, C<&NewsInterface::CreateNewsDatabaseService>, "CreateNewsDatabaseService"}, - {4, C<&NewsInterface::CreateOverwriteEventHolder>, "CreateOverwriteEventHolder"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -NewsInterface::~NewsInterface() = default; - -Result NewsInterface::CreateNewsService(OutInterface out_interface) { - LOG_INFO(Service_BCAT, "called"); - *out_interface = std::make_shared(system); - R_SUCCEED(); -} - -Result NewsInterface::CreateNewlyArrivedEventHolder( - OutInterface out_interface) { - LOG_INFO(Service_BCAT, "called"); - *out_interface = std::make_shared(system); - R_SUCCEED(); -} - -Result NewsInterface::CreateNewsDataService(OutInterface out_interface) { - LOG_INFO(Service_BCAT, "called"); - *out_interface = std::make_shared(system); - R_SUCCEED(); -} - -Result NewsInterface::CreateNewsDatabaseService(OutInterface out_interface) { - LOG_INFO(Service_BCAT, "called"); - *out_interface = std::make_shared(system); - R_SUCCEED(); -} - -Result NewsInterface::CreateOverwriteEventHolder( - OutInterface out_interface) { - LOG_INFO(Service_BCAT, "called"); - *out_interface = std::make_shared(system); - R_SUCCEED(); -} - -} // namespace Service::BCAT diff --git a/src/core/hle/service/bcat/news/news_interface.h b/src/core/hle/service/bcat/news/news_interface.h deleted file mode 100644 index d95edba3d..000000000 --- a/src/core/hle/service/bcat/news/news_interface.h +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Core { -class System; -} - -namespace Service::BCAT { -class INewsService; -class INewlyArrivedEventHolder; -class INewsDataService; -class INewsDatabaseService; -class IOverwriteEventHolder; - -class NewsInterface final : public ServiceFramework { -public: - explicit NewsInterface(Core::System& system_, u32 permissions_, const char* name_); - ~NewsInterface() override; - -private: - Result CreateNewsService(OutInterface out_interface); - Result CreateNewlyArrivedEventHolder(OutInterface out_interface); - Result CreateNewsDataService(OutInterface out_interface); - Result CreateNewsDatabaseService(OutInterface out_interface); - Result CreateOverwriteEventHolder(OutInterface out_interface); - - u32 permissions; -}; - -} // namespace Service::BCAT diff --git a/src/core/hle/service/bcat/news/news_service.cpp b/src/core/hle/service/bcat/news/news_service.cpp index 372937351..e19cea7b5 100644 --- a/src/core/hle/service/bcat/news/news_service.cpp +++ b/src/core/hle/service/bcat/news/news_service.cpp @@ -4,7 +4,7 @@ #include "core/hle/service/bcat/news/news_service.h" #include "core/hle/service/cmif_serialization.h" -namespace Service::BCAT { +namespace Service::News { INewsService::INewsService(Core::System& system_) : ServiceFramework{system_, "INewsService"} { // clang-format off @@ -43,4 +43,4 @@ Result INewsService::GetSubscriptionStatus(Out out_status, R_SUCCEED(); } -} // namespace Service::BCAT +} // namespace Service::News diff --git a/src/core/hle/service/bcat/news/news_service.h b/src/core/hle/service/bcat/news/news_service.h index bb2e49848..8d06be9d6 100644 --- a/src/core/hle/service/bcat/news/news_service.h +++ b/src/core/hle/service/bcat/news/news_service.h @@ -10,7 +10,7 @@ namespace Core { class System; } -namespace Service::BCAT { +namespace Service::News { class INewsService final : public ServiceFramework { public: @@ -21,4 +21,4 @@ private: Result GetSubscriptionStatus(Out out_status, InBuffer buffer_data); }; -} // namespace Service::BCAT +} // namespace Service::News diff --git a/src/core/hle/service/bcat/news/overwrite_event_holder.cpp b/src/core/hle/service/bcat/news/overwrite_event_holder.cpp index 4b06bfc5e..c32a5ca8f 100644 --- a/src/core/hle/service/bcat/news/overwrite_event_holder.cpp +++ b/src/core/hle/service/bcat/news/overwrite_event_holder.cpp @@ -4,7 +4,7 @@ #include "core/hle/service/bcat/news/overwrite_event_holder.h" #include "core/hle/service/cmif_serialization.h" -namespace Service::BCAT { +namespace Service::News { IOverwriteEventHolder::IOverwriteEventHolder(Core::System& system_) : ServiceFramework{system_, "IOverwriteEventHolder"}, service_context{system_, @@ -19,7 +19,9 @@ IOverwriteEventHolder::IOverwriteEventHolder(Core::System& system_) overwrite_event = service_context.CreateEvent("IOverwriteEventHolder::OverwriteEvent"); } -IOverwriteEventHolder::~IOverwriteEventHolder() = default; +IOverwriteEventHolder::~IOverwriteEventHolder() { + service_context.CloseEvent(overwrite_event); +} Result IOverwriteEventHolder::Get(OutCopyHandle out_event) { LOG_INFO(Service_BCAT, "called"); @@ -28,4 +30,4 @@ Result IOverwriteEventHolder::Get(OutCopyHandle out_even R_SUCCEED(); } -} // namespace Service::BCAT +} // namespace Service::News diff --git a/src/core/hle/service/bcat/news/overwrite_event_holder.h b/src/core/hle/service/bcat/news/overwrite_event_holder.h index 4b016b2fe..cdc87d782 100644 --- a/src/core/hle/service/bcat/news/overwrite_event_holder.h +++ b/src/core/hle/service/bcat/news/overwrite_event_holder.h @@ -16,7 +16,7 @@ class KEvent; class KReadableEvent; } // namespace Kernel -namespace Service::BCAT { +namespace Service::News { class IOverwriteEventHolder final : public ServiceFramework { public: @@ -30,4 +30,4 @@ private: KernelHelpers::ServiceContext service_context; }; -} // namespace Service::BCAT +} // namespace Service::News diff --git a/src/core/hle/service/bcat/news/service_creator.cpp b/src/core/hle/service/bcat/news/service_creator.cpp new file mode 100644 index 000000000..d5ba5dff7 --- /dev/null +++ b/src/core/hle/service/bcat/news/service_creator.cpp @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "core/hle/service/bcat/news/newly_arrived_event_holder.h" +#include "core/hle/service/bcat/news/news_data_service.h" +#include "core/hle/service/bcat/news/news_database_service.h" +#include "core/hle/service/bcat/news/news_service.h" +#include "core/hle/service/bcat/news/overwrite_event_holder.h" +#include "core/hle/service/bcat/news/service_creator.h" +#include "core/hle/service/cmif_serialization.h" + +namespace Service::News { + +IServiceCreator::IServiceCreator(Core::System& system_, u32 permissions_, const char* name_) + : ServiceFramework{system_, name_}, permissions{permissions_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&IServiceCreator::CreateNewsService>, "CreateNewsService"}, + {1, C<&IServiceCreator::CreateNewlyArrivedEventHolder>, "CreateNewlyArrivedEventHolder"}, + {2, C<&IServiceCreator::CreateNewsDataService>, "CreateNewsDataService"}, + {3, C<&IServiceCreator::CreateNewsDatabaseService>, "CreateNewsDatabaseService"}, + {4, C<&IServiceCreator::CreateOverwriteEventHolder>, "CreateOverwriteEventHolder"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +IServiceCreator::~IServiceCreator() = default; + +Result IServiceCreator::CreateNewsService(OutInterface out_interface) { + LOG_INFO(Service_BCAT, "called"); + *out_interface = std::make_shared(system); + R_SUCCEED(); +} + +Result IServiceCreator::CreateNewlyArrivedEventHolder( + OutInterface out_interface) { + LOG_INFO(Service_BCAT, "called"); + *out_interface = std::make_shared(system); + R_SUCCEED(); +} + +Result IServiceCreator::CreateNewsDataService(OutInterface out_interface) { + LOG_INFO(Service_BCAT, "called"); + *out_interface = std::make_shared(system); + R_SUCCEED(); +} + +Result IServiceCreator::CreateNewsDatabaseService( + OutInterface out_interface) { + LOG_INFO(Service_BCAT, "called"); + *out_interface = std::make_shared(system); + R_SUCCEED(); +} + +Result IServiceCreator::CreateOverwriteEventHolder( + OutInterface out_interface) { + LOG_INFO(Service_BCAT, "called"); + *out_interface = std::make_shared(system); + R_SUCCEED(); +} + +} // namespace Service::News diff --git a/src/core/hle/service/bcat/news/service_creator.h b/src/core/hle/service/bcat/news/service_creator.h new file mode 100644 index 000000000..5a62e7c1a --- /dev/null +++ b/src/core/hle/service/bcat/news/service_creator.h @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Core { +class System; +} + +namespace Service::News { +class INewsService; +class INewlyArrivedEventHolder; +class INewsDataService; +class INewsDatabaseService; +class IOverwriteEventHolder; + +class IServiceCreator final : public ServiceFramework { +public: + explicit IServiceCreator(Core::System& system_, u32 permissions_, const char* name_); + ~IServiceCreator() override; + +private: + Result CreateNewsService(OutInterface out_interface); + Result CreateNewlyArrivedEventHolder(OutInterface out_interface); + Result CreateNewsDataService(OutInterface out_interface); + Result CreateNewsDatabaseService(OutInterface out_interface); + Result CreateOverwriteEventHolder(OutInterface out_interface); + + u32 permissions; +}; + +} // namespace Service::News diff --git a/src/core/hle/service/bcat/service_creator.cpp b/src/core/hle/service/bcat/service_creator.cpp new file mode 100644 index 000000000..ca339e5a6 --- /dev/null +++ b/src/core/hle/service/bcat/service_creator.cpp @@ -0,0 +1,62 @@ +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/service/bcat/bcat_service.h" +#include "core/hle/service/bcat/delivery_cache_storage_service.h" +#include "core/hle/service/bcat/service_creator.h" +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/filesystem/filesystem.h" + +namespace Service::BCAT { + +std::unique_ptr CreateBackendFromSettings([[maybe_unused]] Core::System& system, + DirectoryGetter getter) { + return std::make_unique(std::move(getter)); +} + +IServiceCreator::IServiceCreator(Core::System& system_, const char* name_) + : ServiceFramework{system_, name_}, fsc{system.GetFileSystemController()} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IServiceCreator::CreateBcatService>, "CreateBcatService"}, + {1, D<&IServiceCreator::CreateDeliveryCacheStorageService>, "CreateDeliveryCacheStorageService"}, + {2, D<&IServiceCreator::CreateDeliveryCacheStorageServiceWithApplicationId>, "CreateDeliveryCacheStorageServiceWithApplicationId"}, + {3, nullptr, "CreateDeliveryCacheProgressService"}, + {4, nullptr, "CreateDeliveryCacheProgressServiceWithApplicationId"}, + }; + // clang-format on + + RegisterHandlers(functions); + + backend = + CreateBackendFromSettings(system_, [this](u64 tid) { return fsc.GetBCATDirectory(tid); }); +} + +IServiceCreator::~IServiceCreator() = default; + +Result IServiceCreator::CreateBcatService(ClientProcessId process_id, + OutInterface out_interface) { + LOG_INFO(Service_BCAT, "called, process_id={}", process_id.pid); + *out_interface = std::make_shared(system, *backend); + R_SUCCEED(); +} + +Result IServiceCreator::CreateDeliveryCacheStorageService( + ClientProcessId process_id, OutInterface out_interface) { + LOG_INFO(Service_BCAT, "called, process_id={}", process_id.pid); + + const auto title_id = system.GetApplicationProcessProgramID(); + *out_interface = + std::make_shared(system, fsc.GetBCATDirectory(title_id)); + R_SUCCEED(); +} + +Result IServiceCreator::CreateDeliveryCacheStorageServiceWithApplicationId( + u64 application_id, OutInterface out_interface) { + LOG_DEBUG(Service_BCAT, "called, application_id={:016X}", application_id); + *out_interface = std::make_shared( + system, fsc.GetBCATDirectory(application_id)); + R_SUCCEED(); +} + +} // namespace Service::BCAT diff --git a/src/core/hle/service/bcat/service_creator.h b/src/core/hle/service/bcat/service_creator.h new file mode 100644 index 000000000..50e663324 --- /dev/null +++ b/src/core/hle/service/bcat/service_creator.h @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Core { +class System; +} + +namespace Service::FileSystem { +class FileSystemController; +} + +namespace Service::BCAT { +class BcatBackend; +class IBcatService; +class IDeliveryCacheStorageService; + +class IServiceCreator final : public ServiceFramework { +public: + explicit IServiceCreator(Core::System& system_, const char* name_); + ~IServiceCreator() override; + +private: + Result CreateBcatService(ClientProcessId process_id, OutInterface out_interface); + + Result CreateDeliveryCacheStorageService( + ClientProcessId process_id, OutInterface out_interface); + + Result CreateDeliveryCacheStorageServiceWithApplicationId( + u64 application_id, OutInterface out_interface); + + std::unique_ptr backend; + Service::FileSystem::FileSystemController& fsc; +}; + +} // namespace Service::BCAT diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 06cbad268..f68c3c686 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -15,7 +15,7 @@ #include "core/hle/service/aoc/aoc_u.h" #include "core/hle/service/apm/apm.h" #include "core/hle/service/audio/audio.h" -#include "core/hle/service/bcat/bcat_module.h" +#include "core/hle/service/bcat/bcat.h" #include "core/hle/service/bpc/bpc.h" #include "core/hle/service/btdrv/btdrv.h" #include "core/hle/service/btm/btm.h" -- cgit v1.2.3