yuzu-emu
/
yuzu-mainline
Archived
1
0
Fork 0

service: bcat: Address review issues

This commit is contained in:
Narr the Reg 2024-02-09 10:31:35 -06:00
parent 909f7eb3d2
commit 816d03f7d9
29 changed files with 153 additions and 144 deletions

View File

@ -518,16 +518,14 @@ add_library(core STATIC
hle/service/bcat/news/news_data_service.h hle/service/bcat/news/news_data_service.h
hle/service/bcat/news/news_database_service.cpp hle/service/bcat/news/news_database_service.cpp
hle/service/bcat/news/news_database_service.h 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.cpp
hle/service/bcat/news/news_service.h hle/service/bcat/news/news_service.h
hle/service/bcat/news/overwrite_event_holder.cpp hle/service/bcat/news/overwrite_event_holder.cpp
hle/service/bcat/news/overwrite_event_holder.h 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.cpp
hle/service/bcat/bcat.h 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_result.h
hle/service/bcat/bcat_service.cpp hle/service/bcat/bcat_service.cpp
hle/service/bcat/bcat_service.h 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_progress_service.h
hle/service/bcat/delivery_cache_storage_service.cpp hle/service/bcat/delivery_cache_storage_service.cpp
hle/service/bcat/delivery_cache_storage_service.h 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.cpp
hle/service/bpc/bpc.h hle/service/bpc/bpc.h
hle/service/btdrv/btdrv.cpp hle/service/btdrv/btdrv.cpp

View File

@ -91,6 +91,7 @@ constexpr Result ResultWriteNotPermitted{ErrorModule::FS, 6203};
constexpr Result ResultUnsupportedSetSizeForIndirectStorage{ErrorModule::FS, 6325}; constexpr Result ResultUnsupportedSetSizeForIndirectStorage{ErrorModule::FS, 6325};
constexpr Result ResultUnsupportedWriteForCompressedStorage{ErrorModule::FS, 6387}; constexpr Result ResultUnsupportedWriteForCompressedStorage{ErrorModule::FS, 6387};
constexpr Result ResultUnsupportedOperateRangeForCompressedStorage{ErrorModule::FS, 6388}; constexpr Result ResultUnsupportedOperateRangeForCompressedStorage{ErrorModule::FS, 6388};
constexpr Result ResultPermissionDenied{ErrorModule::FS, 6400};
constexpr Result ResultBufferAllocationFailed{ErrorModule::FS, 6705}; constexpr Result ResultBufferAllocationFailed{ErrorModule::FS, 6705};
} // namespace FileSys } // namespace FileSys

View File

@ -3,8 +3,8 @@
#include "core/hle/service/bcat/backend/backend.h" #include "core/hle/service/bcat/backend/backend.h"
#include "core/hle/service/bcat/bcat.h" #include "core/hle/service/bcat/bcat.h"
#include "core/hle/service/bcat/bcat_interface.h" #include "core/hle/service/bcat/news/service_creator.h"
#include "core/hle/service/bcat/news/news_interface.h" #include "core/hle/service/bcat/service_creator.h"
#include "core/hle/service/server_manager.h" #include "core/hle/service/server_manager.h"
namespace Service::BCAT { namespace Service::BCAT {
@ -13,24 +13,24 @@ void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system); auto server_manager = std::make_unique<ServerManager>(system);
server_manager->RegisterNamedService("bcat:a", server_manager->RegisterNamedService("bcat:a",
std::make_shared<BcatInterface>(system, "bcat:a")); std::make_shared<IServiceCreator>(system, "bcat:a"));
server_manager->RegisterNamedService("bcat:m", server_manager->RegisterNamedService("bcat:m",
std::make_shared<BcatInterface>(system, "bcat:m")); std::make_shared<IServiceCreator>(system, "bcat:m"));
server_manager->RegisterNamedService("bcat:u", server_manager->RegisterNamedService("bcat:u",
std::make_shared<BcatInterface>(system, "bcat:u")); std::make_shared<IServiceCreator>(system, "bcat:u"));
server_manager->RegisterNamedService("bcat:s", server_manager->RegisterNamedService("bcat:s",
std::make_shared<BcatInterface>(system, "bcat:s")); std::make_shared<IServiceCreator>(system, "bcat:s"));
server_manager->RegisterNamedService( server_manager->RegisterNamedService(
"news:a", std::make_shared<NewsInterface>(system, 0xffffffff, "news:a")); "news:a", std::make_shared<News::IServiceCreator>(system, 0xffffffff, "news:a"));
server_manager->RegisterNamedService("news:p", server_manager->RegisterNamedService(
std::make_shared<NewsInterface>(system, 0x1, "news:p")); "news:p", std::make_shared<News::IServiceCreator>(system, 0x1, "news:p"));
server_manager->RegisterNamedService("news:c", server_manager->RegisterNamedService(
std::make_shared<NewsInterface>(system, 0x2, "news:c")); "news:c", std::make_shared<News::IServiceCreator>(system, 0x2, "news:c"));
server_manager->RegisterNamedService("news:v", server_manager->RegisterNamedService(
std::make_shared<NewsInterface>(system, 0x4, "news:v")); "news:v", std::make_shared<News::IServiceCreator>(system, 0x4, "news:v"));
server_manager->RegisterNamedService("news:m", server_manager->RegisterNamedService(
std::make_shared<NewsInterface>(system, 0xd, "news:m")); "news:m", std::make_shared<News::IServiceCreator>(system, 0xd, "news:m"));
ServerManager::RunServer(std::move(server_manager)); ServerManager::RunServer(std::move(server_manager));
} }

View File

@ -12,9 +12,4 @@ constexpr Result ResultFailedOpenEntity{ErrorModule::BCAT, 2};
constexpr Result ResultEntityAlreadyOpen{ErrorModule::BCAT, 6}; constexpr Result ResultEntityAlreadyOpen{ErrorModule::BCAT, 6};
constexpr Result ResultNoOpenEntry{ErrorModule::BCAT, 7}; 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 } // namespace Service::BCAT

View File

@ -4,6 +4,7 @@
#include "common/hex_util.h" #include "common/hex_util.h"
#include "common/string_util.h" #include "common/string_util.h"
#include "core/core.h" #include "core/core.h"
#include "core/file_sys/errors.h"
#include "core/hle/service/bcat/backend/backend.h" #include "core/hle/service/bcat/backend/backend.h"
#include "core/hle/service/bcat/bcat_result.h" #include "core/hle/service/bcat/bcat_result.h"
#include "core/hle/service/bcat/bcat_service.h" #include "core/hle/service/bcat/bcat_service.h"
@ -14,7 +15,7 @@
namespace Service::BCAT { namespace Service::BCAT {
u64 GetCurrentBuildID(const Core::System::CurrentBuildProcessID& id) { static u64 GetCurrentBuildID(const Core::System::CurrentBuildProcessID& id) {
u64 out{}; u64 out{};
std::memcpy(&out, id.data(), sizeof(u64)); std::memcpy(&out, id.data(), sizeof(u64));
return out; return out;
@ -28,8 +29,8 @@ IBcatService::IBcatService(Core::System& system_, BcatBackend& backend_)
}} { }} {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{10100, C<&IBcatService::RequestSyncDeliveryCache>, "RequestSyncDeliveryCache"}, {10100, D<&IBcatService::RequestSyncDeliveryCache>, "RequestSyncDeliveryCache"},
{10101, C<&IBcatService::RequestSyncDeliveryCacheWithDirectoryName>, "RequestSyncDeliveryCacheWithDirectoryName"}, {10101, D<&IBcatService::RequestSyncDeliveryCacheWithDirectoryName>, "RequestSyncDeliveryCacheWithDirectoryName"},
{10200, nullptr, "CancelSyncDeliveryCacheRequest"}, {10200, nullptr, "CancelSyncDeliveryCacheRequest"},
{20100, nullptr, "RequestSyncDeliveryCacheWithApplicationId"}, {20100, nullptr, "RequestSyncDeliveryCacheWithApplicationId"},
{20101, nullptr, "RequestSyncDeliveryCacheWithApplicationIdAndDirectoryName"}, {20101, nullptr, "RequestSyncDeliveryCacheWithApplicationIdAndDirectoryName"},
@ -38,7 +39,7 @@ IBcatService::IBcatService(Core::System& system_, BcatBackend& backend_)
{20400, nullptr, "RegisterSystemApplicationDeliveryTask"}, {20400, nullptr, "RegisterSystemApplicationDeliveryTask"},
{20401, nullptr, "UnregisterSystemApplicationDeliveryTask"}, {20401, nullptr, "UnregisterSystemApplicationDeliveryTask"},
{20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"}, {20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"},
{30100, C<&IBcatService::SetPassphrase>, "SetPassphrase"}, {30100, D<&IBcatService::SetPassphrase>, "SetPassphrase"},
{30101, nullptr, "Unknown30101"}, {30101, nullptr, "Unknown30101"},
{30102, nullptr, "Unknown30102"}, {30102, nullptr, "Unknown30102"},
{30200, nullptr, "RegisterBackgroundDeliveryTask"}, {30200, nullptr, "RegisterBackgroundDeliveryTask"},
@ -46,11 +47,11 @@ IBcatService::IBcatService(Core::System& system_, BcatBackend& backend_)
{30202, nullptr, "BlockDeliveryTask"}, {30202, nullptr, "BlockDeliveryTask"},
{30203, nullptr, "UnblockDeliveryTask"}, {30203, nullptr, "UnblockDeliveryTask"},
{30210, nullptr, "SetDeliveryTaskTimer"}, {30210, nullptr, "SetDeliveryTaskTimer"},
{30300, C<&IBcatService::RegisterSystemApplicationDeliveryTasks>, "RegisterSystemApplicationDeliveryTasks"}, {30300, D<&IBcatService::RegisterSystemApplicationDeliveryTasks>, "RegisterSystemApplicationDeliveryTasks"},
{90100, nullptr, "EnumerateBackgroundDeliveryTask"}, {90100, nullptr, "EnumerateBackgroundDeliveryTask"},
{90101, nullptr, "Unknown90101"}, {90101, nullptr, "Unknown90101"},
{90200, nullptr, "GetDeliveryList"}, {90200, nullptr, "GetDeliveryList"},
{90201, C<&IBcatService::ClearDeliveryCacheStorage>, "ClearDeliveryCacheStorage"}, {90201, D<&IBcatService::ClearDeliveryCacheStorage>, "ClearDeliveryCacheStorage"},
{90202, nullptr, "ClearDeliveryTaskSubscriptionStatus"}, {90202, nullptr, "ClearDeliveryTaskSubscriptionStatus"},
{90300, nullptr, "GetPushNotificationLog"}, {90300, nullptr, "GetPushNotificationLog"},
{90301, nullptr, "Unknown90301"}, {90301, nullptr, "Unknown90301"},
@ -76,7 +77,7 @@ Result IBcatService::RequestSyncDeliveryCache(
} }
Result IBcatService::RequestSyncDeliveryCacheWithDirectoryName( Result IBcatService::RequestSyncDeliveryCacheWithDirectoryName(
DirectoryName name_raw, OutInterface<IDeliveryCacheProgressService> out_interface) { const DirectoryName& name_raw, OutInterface<IDeliveryCacheProgressService> out_interface) {
const auto name = Common::StringFromFixedZeroTerminatedBuffer(name_raw.data(), name_raw.size()); const auto name = Common::StringFromFixedZeroTerminatedBuffer(name_raw.data(), name_raw.size());
LOG_DEBUG(Service_BCAT, "called, name={}", name); LOG_DEBUG(Service_BCAT, "called, name={}", name);
@ -91,19 +92,19 @@ Result IBcatService::RequestSyncDeliveryCacheWithDirectoryName(
R_SUCCEED(); R_SUCCEED();
} }
Result IBcatService::SetPassphrase(u64 title_id, Result IBcatService::SetPassphrase(u64 application_id,
InBuffer<BufferAttr_HipcPointer> passphrase_buffer) { InBuffer<BufferAttr_HipcPointer> 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)); Common::HexToString(passphrase_buffer));
R_UNLESS(title_id != 0, ResultInvalidArgument); R_UNLESS(application_id != 0, ResultInvalidArgument);
R_UNLESS(passphrase_buffer.size() <= 0x40, ResultInvalidArgument); R_UNLESS(passphrase_buffer.size() <= 0x40, ResultInvalidArgument);
Passphrase passphrase{}; Passphrase passphrase{};
std::memcpy(passphrase.data(), passphrase_buffer.data(), std::memcpy(passphrase.data(), passphrase_buffer.data(),
std::min(passphrase.size(), passphrase_buffer.size())); std::min(passphrase.size(), passphrase_buffer.size()));
backend.SetPassphrase(title_id, passphrase); backend.SetPassphrase(application_id, passphrase);
R_SUCCEED(); R_SUCCEED();
} }
@ -112,11 +113,11 @@ Result IBcatService::RegisterSystemApplicationDeliveryTasks() {
R_SUCCEED(); R_SUCCEED();
} }
Result IBcatService::ClearDeliveryCacheStorage(u64 title_id) { Result IBcatService::ClearDeliveryCacheStorage(u64 application_id) {
LOG_DEBUG(Service_BCAT, "called, title_id={:016X}", title_id); LOG_DEBUG(Service_BCAT, "called, title_id={:016X}", application_id);
R_UNLESS(title_id != 0, ResultInvalidArgument); R_UNLESS(application_id != 0, ResultInvalidArgument);
R_UNLESS(backend.Clear(title_id), ResultFailedClearCache); R_UNLESS(backend.Clear(application_id), FileSys::ResultPermissionDenied);
R_SUCCEED(); R_SUCCEED();
} }

View File

@ -26,13 +26,13 @@ private:
Result RequestSyncDeliveryCache(OutInterface<IDeliveryCacheProgressService> out_interface); Result RequestSyncDeliveryCache(OutInterface<IDeliveryCacheProgressService> out_interface);
Result RequestSyncDeliveryCacheWithDirectoryName( Result RequestSyncDeliveryCacheWithDirectoryName(
DirectoryName name, OutInterface<IDeliveryCacheProgressService> out_interface); const DirectoryName& name, OutInterface<IDeliveryCacheProgressService> out_interface);
Result SetPassphrase(u64 title_id, InBuffer<BufferAttr_HipcPointer> passphrase_buffer); Result SetPassphrase(u64 application_id, InBuffer<BufferAttr_HipcPointer> passphrase_buffer);
Result RegisterSystemApplicationDeliveryTasks(); Result RegisterSystemApplicationDeliveryTasks();
Result ClearDeliveryCacheStorage(u64 title_id); Result ClearDeliveryCacheStorage(u64 application_id);
private: private:
ProgressServiceBackend& GetProgressBackend(SyncType type); ProgressServiceBackend& GetProgressBackend(SyncType type);

View File

@ -3,9 +3,13 @@
#pragma once #pragma once
#include <array>
#include <functional>
#include "common/common_funcs.h" #include "common/common_funcs.h"
#include "common/common_types.h" #include "common/common_types.h"
#include "core/file_sys/vfs/vfs_types.h" #include "core/file_sys/vfs/vfs_types.h"
#include "core/hle/result.h"
namespace Service::BCAT { namespace Service::BCAT {
@ -44,17 +48,19 @@ struct TitleIDVersion {
struct DeliveryCacheProgressImpl { struct DeliveryCacheProgressImpl {
DeliveryCacheProgressStatus status; DeliveryCacheProgressStatus status;
Result result = ResultSuccess; Result result;
DirectoryName current_directory; DirectoryName current_directory;
FileName current_file; FileName current_file;
s64 current_downloaded_bytes; ///< Bytes downloaded on current file. s64 current_downloaded_bytes; ///< Bytes downloaded on current file.
s64 current_total_bytes; ///< Bytes total on current file. s64 current_total_bytes; ///< Bytes total on current file.
s64 total_downloaded_bytes; ///< Bytes downloaded on overall download. s64 total_downloaded_bytes; ///< Bytes downloaded on overall download.
s64 total_bytes; ///< Bytes total 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. 0x198); ///< Appears to be unused in official code, possibly reserved for future use.
}; };
static_assert(sizeof(DeliveryCacheProgressImpl) == 0x200, static_assert(sizeof(DeliveryCacheProgressImpl) == 0x200,
"DeliveryCacheProgressImpl has incorrect size."); "DeliveryCacheProgressImpl has incorrect size.");
static_assert(std::is_trivial_v<DeliveryCacheProgressImpl>,
"DeliveryCacheProgressImpl type must be trivially copyable.");
} // namespace Service::BCAT } // namespace Service::BCAT

View File

@ -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. // 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. // 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{}; BcatDigest out{};
const auto bytes = file->ReadAllBytes(); const auto bytes = file->ReadAllBytes();
mbedtls_md5_ret(bytes.data(), bytes.size(), out.data()); 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_)) { : ServiceFramework{system_, "IDeliveryCacheDirectoryService"}, root(std::move(root_)) {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, C<&IDeliveryCacheDirectoryService::Open>, "Open"}, {0, D<&IDeliveryCacheDirectoryService::Open>, "Open"},
{1, C<&IDeliveryCacheDirectoryService::Read>, "Read"}, {1, D<&IDeliveryCacheDirectoryService::Read>, "Read"},
{2, C<&IDeliveryCacheDirectoryService::GetCount>, "GetCount"}, {2, D<&IDeliveryCacheDirectoryService::GetCount>, "GetCount"},
}; };
// clang-format on // clang-format on
@ -35,13 +35,13 @@ IDeliveryCacheDirectoryService::IDeliveryCacheDirectoryService(Core::System& sys
IDeliveryCacheDirectoryService::~IDeliveryCacheDirectoryService() = default; IDeliveryCacheDirectoryService::~IDeliveryCacheDirectoryService() = default;
Result IDeliveryCacheDirectoryService::Open(DirectoryName dir_name_raw) { Result IDeliveryCacheDirectoryService::Open(const DirectoryName& dir_name_raw) {
const auto dir_name = const auto dir_name =
Common::StringFromFixedZeroTerminatedBuffer(dir_name_raw.data(), dir_name_raw.size()); Common::StringFromFixedZeroTerminatedBuffer(dir_name_raw.data(), dir_name_raw.size());
LOG_DEBUG(Service_BCAT, "called, dir_name={}", dir_name); 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); R_UNLESS(current_dir == nullptr, ResultEntityAlreadyOpen);
const auto dir = root->GetSubdirectory(dir_name); const auto dir = root->GetSubdirectory(dir_name);
@ -51,15 +51,14 @@ Result IDeliveryCacheDirectoryService::Open(DirectoryName dir_name_raw) {
} }
Result IDeliveryCacheDirectoryService::Read( Result IDeliveryCacheDirectoryService::Read(
Out<u32> out_buffer_size, Out<s32> out_count, OutArray<DeliveryCacheDirectoryEntry, BufferAttr_HipcMapAlias> out_buffer) {
OutArray<DeliveryCacheDirectoryEntry, BufferAttr_HipcMapAlias> out_buffer) {
LOG_DEBUG(Service_BCAT, "called, write_size={:016X}", out_buffer.size()); LOG_DEBUG(Service_BCAT, "called, write_size={:016X}", out_buffer.size());
R_UNLESS(current_dir != nullptr, ResultNoOpenEntry); R_UNLESS(current_dir != nullptr, ResultNoOpenEntry);
const auto files = current_dir->GetFiles(); const auto files = current_dir->GetFiles();
*out_buffer_size = static_cast<u32>(std::min(files.size(), out_buffer.size())); *out_count = static_cast<s32>(std::min(files.size(), out_buffer.size()));
std::transform(files.begin(), files.begin() + *out_buffer_size, out_buffer.begin(), std::transform(files.begin(), files.begin() + *out_count, out_buffer.begin(),
[](const auto& file) { [](const auto& file) {
FileName name{}; FileName name{};
std::memcpy(name.data(), file->GetName().data(), std::memcpy(name.data(), file->GetName().data(),
@ -69,12 +68,12 @@ Result IDeliveryCacheDirectoryService::Read(
R_SUCCEED(); R_SUCCEED();
} }
Result IDeliveryCacheDirectoryService::GetCount(Out<u32> out_count) { Result IDeliveryCacheDirectoryService::GetCount(Out<s32> out_count) {
LOG_DEBUG(Service_BCAT, "called"); LOG_DEBUG(Service_BCAT, "called");
R_UNLESS(current_dir != nullptr, ResultNoOpenEntry); R_UNLESS(current_dir != nullptr, ResultNoOpenEntry);
*out_count = static_cast<u32>(current_dir->GetFiles().size()); *out_count = static_cast<s32>(current_dir->GetFiles().size());
R_SUCCEED(); R_SUCCEED();
} }

View File

@ -21,10 +21,10 @@ public:
~IDeliveryCacheDirectoryService() override; ~IDeliveryCacheDirectoryService() override;
private: private:
Result Open(DirectoryName dir_name_raw); Result Open(const DirectoryName& dir_name_raw);
Result Read(Out<u32> out_buffer_size, Result Read(Out<s32> out_count,
OutArray<DeliveryCacheDirectoryEntry, BufferAttr_HipcMapAlias> out_buffer); OutArray<DeliveryCacheDirectoryEntry, BufferAttr_HipcMapAlias> out_buffer);
Result GetCount(Out<u32> out_count); Result GetCount(Out<s32> out_count);
FileSys::VirtualDir root; FileSys::VirtualDir root;
FileSys::VirtualDir current_dir; FileSys::VirtualDir current_dir;

View File

@ -14,10 +14,10 @@ IDeliveryCacheFileService::IDeliveryCacheFileService(Core::System& system_,
: ServiceFramework{system_, "IDeliveryCacheFileService"}, root(std::move(root_)) { : ServiceFramework{system_, "IDeliveryCacheFileService"}, root(std::move(root_)) {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, C<&IDeliveryCacheFileService::Open>, "Open"}, {0, D<&IDeliveryCacheFileService::Open>, "Open"},
{1, C<&IDeliveryCacheFileService::Read>, "Read"}, {1, D<&IDeliveryCacheFileService::Read>, "Read"},
{2, C<&IDeliveryCacheFileService::GetSize>, "GetSize"}, {2, D<&IDeliveryCacheFileService::GetSize>, "GetSize"},
{3, C<&IDeliveryCacheFileService::GetDigest>, "GetDigest"}, {3, D<&IDeliveryCacheFileService::GetDigest>, "GetDigest"},
}; };
// clang-format on // clang-format on
@ -26,7 +26,8 @@ IDeliveryCacheFileService::IDeliveryCacheFileService(Core::System& system_,
IDeliveryCacheFileService::~IDeliveryCacheFileService() = default; 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 = const auto dir_name =
Common::StringFromFixedZeroTerminatedBuffer(dir_name_raw.data(), dir_name_raw.size()); Common::StringFromFixedZeroTerminatedBuffer(dir_name_raw.data(), dir_name_raw.size());
const auto file_name = const auto file_name =

View File

@ -20,7 +20,7 @@ public:
~IDeliveryCacheFileService() override; ~IDeliveryCacheFileService() override;
private: 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<u64> out_buffer_size, u64 offset, Result Read(Out<u64> out_buffer_size, u64 offset,
OutBuffer<BufferAttr_HipcMapAlias> out_buffer); OutBuffer<BufferAttr_HipcMapAlias> out_buffer);
Result GetSize(Out<u64> out_size); Result GetSize(Out<u64> out_size);

View File

@ -13,8 +13,8 @@ IDeliveryCacheProgressService::IDeliveryCacheProgressService(Core::System& syste
: ServiceFramework{system_, "IDeliveryCacheProgressService"}, event{event_}, impl{impl_} { : ServiceFramework{system_, "IDeliveryCacheProgressService"}, event{event_}, impl{impl_} {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, C<&IDeliveryCacheProgressService::GetEvent>, "Get"}, {0, D<&IDeliveryCacheProgressService::GetEvent>, "Get"},
{0, C<&IDeliveryCacheProgressService::GetImpl>, "Get"}, {1, D<&IDeliveryCacheProgressService::GetImpl>, "Get"},
}; };
// clang-format on // clang-format on

View File

@ -14,9 +14,9 @@ IDeliveryCacheStorageService::IDeliveryCacheStorageService(Core::System& system_
: ServiceFramework{system_, "IDeliveryCacheStorageService"}, root(std::move(root_)) { : ServiceFramework{system_, "IDeliveryCacheStorageService"}, root(std::move(root_)) {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, C<&IDeliveryCacheStorageService::CreateFileService>, "CreateFileService"}, {0, D<&IDeliveryCacheStorageService::CreateFileService>, "CreateFileService"},
{1, C<&IDeliveryCacheStorageService::CreateDirectoryService>, "CreateDirectoryService"}, {1, D<&IDeliveryCacheStorageService::CreateDirectoryService>, "CreateDirectoryService"},
{2, C<&IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory>, "EnumerateDeliveryCacheDirectory"}, {10, D<&IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory>, "EnumerateDeliveryCacheDirectory"},
}; };
// clang-format on // clang-format on
@ -42,15 +42,15 @@ Result IDeliveryCacheStorageService::CreateDirectoryService(
} }
Result IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory( Result IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory(
Out<u32> out_directories_size, Out<s32> out_directory_count,
OutArray<DirectoryName, BufferAttr_HipcMapAlias> out_directories) { OutArray<DirectoryName, BufferAttr_HipcMapAlias> out_directories) {
LOG_DEBUG(Service_BCAT, "called, size={:016X}", out_directories.size()); LOG_DEBUG(Service_BCAT, "called, size={:016X}", out_directories.size());
*out_directories_size = *out_directory_count =
static_cast<u32>(std::min(out_directories.size(), entries.size() - next_read_index)); static_cast<s32>(std::min(out_directories.size(), entries.size() - next_read_index));
memcpy(out_directories.data(), entries.data() + next_read_index, memcpy(out_directories.data(), entries.data() + next_read_index,
*out_directories_size * sizeof(DirectoryName)); *out_directory_count * sizeof(DirectoryName));
next_read_index += *out_directories_size; next_read_index += *out_directory_count;
R_SUCCEED(); R_SUCCEED();
} }

View File

@ -25,12 +25,12 @@ private:
Result CreateFileService(OutInterface<IDeliveryCacheFileService> out_interface); Result CreateFileService(OutInterface<IDeliveryCacheFileService> out_interface);
Result CreateDirectoryService(OutInterface<IDeliveryCacheDirectoryService> out_interface); Result CreateDirectoryService(OutInterface<IDeliveryCacheDirectoryService> out_interface);
Result EnumerateDeliveryCacheDirectory( Result EnumerateDeliveryCacheDirectory(
Out<u32> out_directories_size, Out<s32> out_directory_count,
OutArray<DirectoryName, BufferAttr_HipcMapAlias> out_directories); OutArray<DirectoryName, BufferAttr_HipcMapAlias> out_directories);
FileSys::VirtualDir root; FileSys::VirtualDir root;
std::vector<DirectoryName> entries; std::vector<DirectoryName> entries;
u64 next_read_index = 0; std::size_t next_read_index = 0;
}; };
} // namespace Service::BCAT } // namespace Service::BCAT

View File

@ -4,7 +4,7 @@
#include "core/hle/service/bcat/news/newly_arrived_event_holder.h" #include "core/hle/service/bcat/news/newly_arrived_event_holder.h"
#include "core/hle/service/cmif_serialization.h" #include "core/hle/service/cmif_serialization.h"
namespace Service::BCAT { namespace Service::News {
INewlyArrivedEventHolder::INewlyArrivedEventHolder(Core::System& system_) INewlyArrivedEventHolder::INewlyArrivedEventHolder(Core::System& system_)
: ServiceFramework{system_, "INewlyArrivedEventHolder"}, service_context{ : ServiceFramework{system_, "INewlyArrivedEventHolder"}, service_context{
@ -20,7 +20,9 @@ INewlyArrivedEventHolder::INewlyArrivedEventHolder(Core::System& system_)
arrived_event = service_context.CreateEvent("INewlyArrivedEventHolder::ArrivedEvent"); arrived_event = service_context.CreateEvent("INewlyArrivedEventHolder::ArrivedEvent");
} }
INewlyArrivedEventHolder::~INewlyArrivedEventHolder() = default; INewlyArrivedEventHolder::~INewlyArrivedEventHolder() {
service_context.CloseEvent(arrived_event);
}
Result INewlyArrivedEventHolder::Get(OutCopyHandle<Kernel::KReadableEvent> out_event) { Result INewlyArrivedEventHolder::Get(OutCopyHandle<Kernel::KReadableEvent> out_event) {
LOG_INFO(Service_BCAT, "called"); LOG_INFO(Service_BCAT, "called");
@ -29,4 +31,4 @@ Result INewlyArrivedEventHolder::Get(OutCopyHandle<Kernel::KReadableEvent> out_e
R_SUCCEED(); R_SUCCEED();
} }
} // namespace Service::BCAT } // namespace Service::News

View File

@ -16,7 +16,7 @@ class KEvent;
class KReadableEvent; class KReadableEvent;
} // namespace Kernel } // namespace Kernel
namespace Service::BCAT { namespace Service::News {
class INewlyArrivedEventHolder final : public ServiceFramework<INewlyArrivedEventHolder> { class INewlyArrivedEventHolder final : public ServiceFramework<INewlyArrivedEventHolder> {
public: public:
@ -30,4 +30,4 @@ private:
KernelHelpers::ServiceContext service_context; KernelHelpers::ServiceContext service_context;
}; };
} // namespace Service::BCAT } // namespace Service::News

View File

@ -3,7 +3,7 @@
#include "core/hle/service/bcat/news/news_data_service.h" #include "core/hle/service/bcat/news/news_data_service.h"
namespace Service::BCAT { namespace Service::News {
INewsDataService::INewsDataService(Core::System& system_) INewsDataService::INewsDataService(Core::System& system_)
: ServiceFramework{system_, "INewsDataService"} { : ServiceFramework{system_, "INewsDataService"} {
@ -22,4 +22,4 @@ INewsDataService::INewsDataService(Core::System& system_)
INewsDataService::~INewsDataService() = default; INewsDataService::~INewsDataService() = default;
} // namespace Service::BCAT } // namespace Service::News

View File

@ -9,7 +9,7 @@ namespace Core {
class System; class System;
} }
namespace Service::BCAT { namespace Service::News {
class INewsDataService final : public ServiceFramework<INewsDataService> { class INewsDataService final : public ServiceFramework<INewsDataService> {
public: public:
@ -17,4 +17,4 @@ public:
~INewsDataService() override; ~INewsDataService() override;
}; };
} // namespace Service::BCAT } // namespace Service::News

View File

@ -4,7 +4,7 @@
#include "core/hle/service/bcat/news/news_database_service.h" #include "core/hle/service/bcat/news/news_database_service.h"
#include "core/hle/service/cmif_serialization.h" #include "core/hle/service/cmif_serialization.h"
namespace Service::BCAT { namespace Service::News {
INewsDatabaseService::INewsDatabaseService(Core::System& system_) INewsDatabaseService::INewsDatabaseService(Core::System& system_)
: ServiceFramework{system_, "INewsDatabaseService"} { : ServiceFramework{system_, "INewsDatabaseService"} {
@ -25,11 +25,11 @@ INewsDatabaseService::INewsDatabaseService(Core::System& system_)
INewsDatabaseService::~INewsDatabaseService() = default; INewsDatabaseService::~INewsDatabaseService() = default;
Result INewsDatabaseService::Count(Out<u32> out_count, Result INewsDatabaseService::Count(Out<s32> out_count,
InBuffer<BufferAttr_HipcPointer> buffer_data) { InBuffer<BufferAttr_HipcPointer> buffer_data) {
LOG_WARNING(Service_BCAT, "(STUBBED) called, buffer_size={}", buffer_data.size()); LOG_WARNING(Service_BCAT, "(STUBBED) called, buffer_size={}", buffer_data.size());
*out_count = 0; *out_count = 0;
R_SUCCEED(); R_SUCCEED();
} }
} // namespace Service::BCAT } // namespace Service::News

View File

@ -10,7 +10,7 @@ namespace Core {
class System; class System;
} }
namespace Service::BCAT { namespace Service::News {
class INewsDatabaseService final : public ServiceFramework<INewsDatabaseService> { class INewsDatabaseService final : public ServiceFramework<INewsDatabaseService> {
public: public:
@ -18,7 +18,7 @@ public:
~INewsDatabaseService() override; ~INewsDatabaseService() override;
private: private:
Result Count(Out<u32> out_count, InBuffer<BufferAttr_HipcPointer> buffer_data); Result Count(Out<s32> out_count, InBuffer<BufferAttr_HipcPointer> buffer_data);
}; };
} // namespace Service::BCAT } // namespace Service::News

View File

@ -4,7 +4,7 @@
#include "core/hle/service/bcat/news/news_service.h" #include "core/hle/service/bcat/news/news_service.h"
#include "core/hle/service/cmif_serialization.h" #include "core/hle/service/cmif_serialization.h"
namespace Service::BCAT { namespace Service::News {
INewsService::INewsService(Core::System& system_) : ServiceFramework{system_, "INewsService"} { INewsService::INewsService(Core::System& system_) : ServiceFramework{system_, "INewsService"} {
// clang-format off // clang-format off
@ -43,4 +43,4 @@ Result INewsService::GetSubscriptionStatus(Out<u32> out_status,
R_SUCCEED(); R_SUCCEED();
} }
} // namespace Service::BCAT } // namespace Service::News

View File

@ -10,7 +10,7 @@ namespace Core {
class System; class System;
} }
namespace Service::BCAT { namespace Service::News {
class INewsService final : public ServiceFramework<INewsService> { class INewsService final : public ServiceFramework<INewsService> {
public: public:
@ -21,4 +21,4 @@ private:
Result GetSubscriptionStatus(Out<u32> out_status, InBuffer<BufferAttr_HipcPointer> buffer_data); Result GetSubscriptionStatus(Out<u32> out_status, InBuffer<BufferAttr_HipcPointer> buffer_data);
}; };
} // namespace Service::BCAT } // namespace Service::News

View File

@ -4,7 +4,7 @@
#include "core/hle/service/bcat/news/overwrite_event_holder.h" #include "core/hle/service/bcat/news/overwrite_event_holder.h"
#include "core/hle/service/cmif_serialization.h" #include "core/hle/service/cmif_serialization.h"
namespace Service::BCAT { namespace Service::News {
IOverwriteEventHolder::IOverwriteEventHolder(Core::System& system_) IOverwriteEventHolder::IOverwriteEventHolder(Core::System& system_)
: ServiceFramework{system_, "IOverwriteEventHolder"}, service_context{system_, : ServiceFramework{system_, "IOverwriteEventHolder"}, service_context{system_,
@ -19,7 +19,9 @@ IOverwriteEventHolder::IOverwriteEventHolder(Core::System& system_)
overwrite_event = service_context.CreateEvent("IOverwriteEventHolder::OverwriteEvent"); overwrite_event = service_context.CreateEvent("IOverwriteEventHolder::OverwriteEvent");
} }
IOverwriteEventHolder::~IOverwriteEventHolder() = default; IOverwriteEventHolder::~IOverwriteEventHolder() {
service_context.CloseEvent(overwrite_event);
}
Result IOverwriteEventHolder::Get(OutCopyHandle<Kernel::KReadableEvent> out_event) { Result IOverwriteEventHolder::Get(OutCopyHandle<Kernel::KReadableEvent> out_event) {
LOG_INFO(Service_BCAT, "called"); LOG_INFO(Service_BCAT, "called");
@ -28,4 +30,4 @@ Result IOverwriteEventHolder::Get(OutCopyHandle<Kernel::KReadableEvent> out_even
R_SUCCEED(); R_SUCCEED();
} }
} // namespace Service::BCAT } // namespace Service::News

View File

@ -16,7 +16,7 @@ class KEvent;
class KReadableEvent; class KReadableEvent;
} // namespace Kernel } // namespace Kernel
namespace Service::BCAT { namespace Service::News {
class IOverwriteEventHolder final : public ServiceFramework<IOverwriteEventHolder> { class IOverwriteEventHolder final : public ServiceFramework<IOverwriteEventHolder> {
public: public:
@ -30,4 +30,4 @@ private:
KernelHelpers::ServiceContext service_context; KernelHelpers::ServiceContext service_context;
}; };
} // namespace Service::BCAT } // namespace Service::News

View File

@ -4,60 +4,61 @@
#include "core/hle/service/bcat/news/newly_arrived_event_holder.h" #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_data_service.h"
#include "core/hle/service/bcat/news/news_database_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/news_service.h"
#include "core/hle/service/bcat/news/overwrite_event_holder.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" #include "core/hle/service/cmif_serialization.h"
namespace Service::BCAT { namespace Service::News {
NewsInterface::NewsInterface(Core::System& system_, u32 permissions_, const char* name_) IServiceCreator::IServiceCreator(Core::System& system_, u32 permissions_, const char* name_)
: ServiceFramework{system_, name_}, permissions{permissions_} { : ServiceFramework{system_, name_}, permissions{permissions_} {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, C<&NewsInterface::CreateNewsService>, "CreateNewsService"}, {0, C<&IServiceCreator::CreateNewsService>, "CreateNewsService"},
{1, C<&NewsInterface::CreateNewlyArrivedEventHolder>, "CreateNewlyArrivedEventHolder"}, {1, C<&IServiceCreator::CreateNewlyArrivedEventHolder>, "CreateNewlyArrivedEventHolder"},
{2, C<&NewsInterface::CreateNewsDataService>, "CreateNewsDataService"}, {2, C<&IServiceCreator::CreateNewsDataService>, "CreateNewsDataService"},
{3, C<&NewsInterface::CreateNewsDatabaseService>, "CreateNewsDatabaseService"}, {3, C<&IServiceCreator::CreateNewsDatabaseService>, "CreateNewsDatabaseService"},
{4, C<&NewsInterface::CreateOverwriteEventHolder>, "CreateOverwriteEventHolder"}, {4, C<&IServiceCreator::CreateOverwriteEventHolder>, "CreateOverwriteEventHolder"},
}; };
// clang-format on // clang-format on
RegisterHandlers(functions); RegisterHandlers(functions);
} }
NewsInterface::~NewsInterface() = default; IServiceCreator::~IServiceCreator() = default;
Result NewsInterface::CreateNewsService(OutInterface<INewsService> out_interface) { Result IServiceCreator::CreateNewsService(OutInterface<INewsService> out_interface) {
LOG_INFO(Service_BCAT, "called"); LOG_INFO(Service_BCAT, "called");
*out_interface = std::make_shared<INewsService>(system); *out_interface = std::make_shared<INewsService>(system);
R_SUCCEED(); R_SUCCEED();
} }
Result NewsInterface::CreateNewlyArrivedEventHolder( Result IServiceCreator::CreateNewlyArrivedEventHolder(
OutInterface<INewlyArrivedEventHolder> out_interface) { OutInterface<INewlyArrivedEventHolder> out_interface) {
LOG_INFO(Service_BCAT, "called"); LOG_INFO(Service_BCAT, "called");
*out_interface = std::make_shared<INewlyArrivedEventHolder>(system); *out_interface = std::make_shared<INewlyArrivedEventHolder>(system);
R_SUCCEED(); R_SUCCEED();
} }
Result NewsInterface::CreateNewsDataService(OutInterface<INewsDataService> out_interface) { Result IServiceCreator::CreateNewsDataService(OutInterface<INewsDataService> out_interface) {
LOG_INFO(Service_BCAT, "called"); LOG_INFO(Service_BCAT, "called");
*out_interface = std::make_shared<INewsDataService>(system); *out_interface = std::make_shared<INewsDataService>(system);
R_SUCCEED(); R_SUCCEED();
} }
Result NewsInterface::CreateNewsDatabaseService(OutInterface<INewsDatabaseService> out_interface) { Result IServiceCreator::CreateNewsDatabaseService(
OutInterface<INewsDatabaseService> out_interface) {
LOG_INFO(Service_BCAT, "called"); LOG_INFO(Service_BCAT, "called");
*out_interface = std::make_shared<INewsDatabaseService>(system); *out_interface = std::make_shared<INewsDatabaseService>(system);
R_SUCCEED(); R_SUCCEED();
} }
Result NewsInterface::CreateOverwriteEventHolder( Result IServiceCreator::CreateOverwriteEventHolder(
OutInterface<IOverwriteEventHolder> out_interface) { OutInterface<IOverwriteEventHolder> out_interface) {
LOG_INFO(Service_BCAT, "called"); LOG_INFO(Service_BCAT, "called");
*out_interface = std::make_shared<IOverwriteEventHolder>(system); *out_interface = std::make_shared<IOverwriteEventHolder>(system);
R_SUCCEED(); R_SUCCEED();
} }
} // namespace Service::BCAT } // namespace Service::News

View File

@ -10,17 +10,17 @@ namespace Core {
class System; class System;
} }
namespace Service::BCAT { namespace Service::News {
class INewsService; class INewsService;
class INewlyArrivedEventHolder; class INewlyArrivedEventHolder;
class INewsDataService; class INewsDataService;
class INewsDatabaseService; class INewsDatabaseService;
class IOverwriteEventHolder; class IOverwriteEventHolder;
class NewsInterface final : public ServiceFramework<NewsInterface> { class IServiceCreator final : public ServiceFramework<IServiceCreator> {
public: public:
explicit NewsInterface(Core::System& system_, u32 permissions_, const char* name_); explicit IServiceCreator(Core::System& system_, u32 permissions_, const char* name_);
~NewsInterface() override; ~IServiceCreator() override;
private: private:
Result CreateNewsService(OutInterface<INewsService> out_interface); Result CreateNewsService(OutInterface<INewsService> out_interface);
@ -32,4 +32,4 @@ private:
u32 permissions; u32 permissions;
}; };
} // namespace Service::BCAT } // namespace Service::News

View File

@ -1,9 +1,9 @@
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // 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/bcat_service.h"
#include "core/hle/service/bcat/delivery_cache_storage_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/cmif_serialization.h"
#include "core/hle/service/filesystem/filesystem.h" #include "core/hle/service/filesystem/filesystem.h"
@ -14,13 +14,13 @@ std::unique_ptr<BcatBackend> CreateBackendFromSettings([[maybe_unused]] Core::Sy
return std::make_unique<NullBcatBackend>(std::move(getter)); return std::make_unique<NullBcatBackend>(std::move(getter));
} }
BcatInterface::BcatInterface(Core::System& system_, const char* name_) IServiceCreator::IServiceCreator(Core::System& system_, const char* name_)
: ServiceFramework{system_, name_}, fsc{system.GetFileSystemController()} { : ServiceFramework{system_, name_}, fsc{system.GetFileSystemController()} {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, C<&BcatInterface::CreateBcatService>, "CreateBcatService"}, {0, D<&IServiceCreator::CreateBcatService>, "CreateBcatService"},
{1, C<&BcatInterface::CreateDeliveryCacheStorageService>, "CreateDeliveryCacheStorageService"}, {1, D<&IServiceCreator::CreateDeliveryCacheStorageService>, "CreateDeliveryCacheStorageService"},
{2, C<&BcatInterface::CreateDeliveryCacheStorageServiceWithApplicationId>, "CreateDeliveryCacheStorageServiceWithApplicationId"}, {2, D<&IServiceCreator::CreateDeliveryCacheStorageServiceWithApplicationId>, "CreateDeliveryCacheStorageServiceWithApplicationId"},
{3, nullptr, "CreateDeliveryCacheProgressService"}, {3, nullptr, "CreateDeliveryCacheProgressService"},
{4, nullptr, "CreateDeliveryCacheProgressServiceWithApplicationId"}, {4, nullptr, "CreateDeliveryCacheProgressServiceWithApplicationId"},
}; };
@ -32,17 +32,18 @@ BcatInterface::BcatInterface(Core::System& system_, const char* name_)
CreateBackendFromSettings(system_, [this](u64 tid) { return fsc.GetBCATDirectory(tid); }); CreateBackendFromSettings(system_, [this](u64 tid) { return fsc.GetBCATDirectory(tid); });
} }
BcatInterface::~BcatInterface() = default; IServiceCreator::~IServiceCreator() = default;
Result BcatInterface::CreateBcatService(OutInterface<IBcatService> out_interface) { Result IServiceCreator::CreateBcatService(ClientProcessId process_id,
LOG_INFO(Service_BCAT, "called"); OutInterface<IBcatService> out_interface) {
LOG_INFO(Service_BCAT, "called, process_id={}", process_id.pid);
*out_interface = std::make_shared<IBcatService>(system, *backend); *out_interface = std::make_shared<IBcatService>(system, *backend);
R_SUCCEED(); R_SUCCEED();
} }
Result BcatInterface::CreateDeliveryCacheStorageService( Result IServiceCreator::CreateDeliveryCacheStorageService(
OutInterface<IDeliveryCacheStorageService> out_interface) { ClientProcessId process_id, OutInterface<IDeliveryCacheStorageService> out_interface) {
LOG_INFO(Service_BCAT, "called"); LOG_INFO(Service_BCAT, "called, process_id={}", process_id.pid);
const auto title_id = system.GetApplicationProcessProgramID(); const auto title_id = system.GetApplicationProcessProgramID();
*out_interface = *out_interface =
@ -50,11 +51,11 @@ Result BcatInterface::CreateDeliveryCacheStorageService(
R_SUCCEED(); R_SUCCEED();
} }
Result BcatInterface::CreateDeliveryCacheStorageServiceWithApplicationId( Result IServiceCreator::CreateDeliveryCacheStorageServiceWithApplicationId(
u64 title_id, OutInterface<IDeliveryCacheStorageService> out_interface) { u64 application_id, OutInterface<IDeliveryCacheStorageService> out_interface) {
LOG_DEBUG(Service_BCAT, "called, title_id={:016X}", title_id); LOG_DEBUG(Service_BCAT, "called, application_id={:016X}", application_id);
*out_interface = *out_interface = std::make_shared<IDeliveryCacheStorageService>(
std::make_shared<IDeliveryCacheStorageService>(system, fsc.GetBCATDirectory(title_id)); system, fsc.GetBCATDirectory(application_id));
R_SUCCEED(); R_SUCCEED();
} }

View File

@ -19,19 +19,19 @@ class BcatBackend;
class IBcatService; class IBcatService;
class IDeliveryCacheStorageService; class IDeliveryCacheStorageService;
class BcatInterface final : public ServiceFramework<BcatInterface> { class IServiceCreator final : public ServiceFramework<IServiceCreator> {
public: public:
explicit BcatInterface(Core::System& system_, const char* name_); explicit IServiceCreator(Core::System& system_, const char* name_);
~BcatInterface() override; ~IServiceCreator() override;
private: private:
Result CreateBcatService(OutInterface<IBcatService> out_interface); Result CreateBcatService(ClientProcessId process_id, OutInterface<IBcatService> out_interface);
Result CreateDeliveryCacheStorageService( Result CreateDeliveryCacheStorageService(
OutInterface<IDeliveryCacheStorageService> out_interface); ClientProcessId process_id, OutInterface<IDeliveryCacheStorageService> out_interface);
Result CreateDeliveryCacheStorageServiceWithApplicationId( Result CreateDeliveryCacheStorageServiceWithApplicationId(
u64 title_id, OutInterface<IDeliveryCacheStorageService> out_interface); u64 application_id, OutInterface<IDeliveryCacheStorageService> out_interface);
std::unique_ptr<BcatBackend> backend; std::unique_ptr<BcatBackend> backend;
Service::FileSystem::FileSystemController& fsc; Service::FileSystem::FileSystemController& fsc;

View File

@ -15,7 +15,7 @@
#include "core/hle/service/aoc/aoc_u.h" #include "core/hle/service/aoc/aoc_u.h"
#include "core/hle/service/apm/apm.h" #include "core/hle/service/apm/apm.h"
#include "core/hle/service/audio/audio.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/bpc/bpc.h"
#include "core/hle/service/btdrv/btdrv.h" #include "core/hle/service/btdrv/btdrv.h"
#include "core/hle/service/btm/btm.h" #include "core/hle/service/btm/btm.h"