Explorar el Código

service: bcat: Address review issues

Narr the Reg hace 2 años
padre
commit
816d03f7d9
Se han modificado 29 ficheros con 153 adiciones y 144 borrados
  1. 4 4
      src/core/CMakeLists.txt
  2. 1 0
      src/core/file_sys/errors.h
  3. 15 15
      src/core/hle/service/bcat/bcat.cpp
  4. 0 5
      src/core/hle/service/bcat/bcat_result.h
  5. 16 15
      src/core/hle/service/bcat/bcat_service.cpp
  6. 3 3
      src/core/hle/service/bcat/bcat_service.h
  7. 8 2
      src/core/hle/service/bcat/bcat_types.h
  8. 11 12
      src/core/hle/service/bcat/delivery_cache_directory_service.cpp
  9. 3 3
      src/core/hle/service/bcat/delivery_cache_directory_service.h
  10. 6 5
      src/core/hle/service/bcat/delivery_cache_file_service.cpp
  11. 1 1
      src/core/hle/service/bcat/delivery_cache_file_service.h
  12. 2 2
      src/core/hle/service/bcat/delivery_cache_progress_service.cpp
  13. 8 8
      src/core/hle/service/bcat/delivery_cache_storage_service.cpp
  14. 2 2
      src/core/hle/service/bcat/delivery_cache_storage_service.h
  15. 5 3
      src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp
  16. 2 2
      src/core/hle/service/bcat/news/newly_arrived_event_holder.h
  17. 2 2
      src/core/hle/service/bcat/news/news_data_service.cpp
  18. 2 2
      src/core/hle/service/bcat/news/news_data_service.h
  19. 3 3
      src/core/hle/service/bcat/news/news_database_service.cpp
  20. 3 3
      src/core/hle/service/bcat/news/news_database_service.h
  21. 2 2
      src/core/hle/service/bcat/news/news_service.cpp
  22. 2 2
      src/core/hle/service/bcat/news/news_service.h
  23. 5 3
      src/core/hle/service/bcat/news/overwrite_event_holder.cpp
  24. 2 2
      src/core/hle/service/bcat/news/overwrite_event_holder.h
  25. 16 15
      src/core/hle/service/bcat/news/service_creator.cpp
  26. 5 5
      src/core/hle/service/bcat/news/service_creator.h
  27. 17 16
      src/core/hle/service/bcat/service_creator.cpp
  28. 6 6
      src/core/hle/service/bcat/service_creator.h
  29. 1 1
      src/core/hle/service/service.cpp

+ 4 - 4
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

+ 1 - 0
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

+ 15 - 15
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<ServerManager>(system);
 
     server_manager->RegisterNamedService("bcat:a",
-                                         std::make_shared<BcatInterface>(system, "bcat:a"));
+                                         std::make_shared<IServiceCreator>(system, "bcat:a"));
     server_manager->RegisterNamedService("bcat:m",
-                                         std::make_shared<BcatInterface>(system, "bcat:m"));
+                                         std::make_shared<IServiceCreator>(system, "bcat:m"));
     server_manager->RegisterNamedService("bcat:u",
-                                         std::make_shared<BcatInterface>(system, "bcat:u"));
+                                         std::make_shared<IServiceCreator>(system, "bcat:u"));
     server_manager->RegisterNamedService("bcat:s",
-                                         std::make_shared<BcatInterface>(system, "bcat:s"));
+                                         std::make_shared<IServiceCreator>(system, "bcat:s"));
 
     server_manager->RegisterNamedService(
-        "news:a", std::make_shared<NewsInterface>(system, 0xffffffff, "news:a"));
-    server_manager->RegisterNamedService("news:p",
-                                         std::make_shared<NewsInterface>(system, 0x1, "news:p"));
-    server_manager->RegisterNamedService("news:c",
-                                         std::make_shared<NewsInterface>(system, 0x2, "news:c"));
-    server_manager->RegisterNamedService("news:v",
-                                         std::make_shared<NewsInterface>(system, 0x4, "news:v"));
-    server_manager->RegisterNamedService("news:m",
-                                         std::make_shared<NewsInterface>(system, 0xd, "news:m"));
+        "news:a", std::make_shared<News::IServiceCreator>(system, 0xffffffff, "news:a"));
+    server_manager->RegisterNamedService(
+        "news:p", std::make_shared<News::IServiceCreator>(system, 0x1, "news:p"));
+    server_manager->RegisterNamedService(
+        "news:c", std::make_shared<News::IServiceCreator>(system, 0x2, "news:c"));
+    server_manager->RegisterNamedService(
+        "news:v", std::make_shared<News::IServiceCreator>(system, 0x4, "news:v"));
+    server_manager->RegisterNamedService(
+        "news:m", std::make_shared<News::IServiceCreator>(system, 0xd, "news:m"));
 
     ServerManager::RunServer(std::move(server_manager));
 }

+ 0 - 5
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

+ 16 - 15
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<IDeliveryCacheProgressService> out_interface) {
+    const DirectoryName& name_raw, OutInterface<IDeliveryCacheProgressService> 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<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));
 
-    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();
 }
 

+ 3 - 3
src/core/hle/service/bcat/bcat_service.h

@@ -26,13 +26,13 @@ private:
     Result RequestSyncDeliveryCache(OutInterface<IDeliveryCacheProgressService> out_interface);
 
     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 ClearDeliveryCacheStorage(u64 title_id);
+    Result ClearDeliveryCacheStorage(u64 application_id);
 
 private:
     ProgressServiceBackend& GetProgressBackend(SyncType type);

+ 8 - 2
src/core/hle/service/bcat/bcat_types.h

@@ -3,9 +3,13 @@
 
 #pragma once
 
+#include <array>
+#include <functional>
+
 #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>,
+              "DeliveryCacheProgressImpl type must be trivially copyable.");
 
 } // namespace Service::BCAT

+ 11 - 12
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<u32> out_buffer_size,
-    OutArray<DeliveryCacheDirectoryEntry, BufferAttr_HipcMapAlias> out_buffer) {
+    Out<s32> out_count, OutArray<DeliveryCacheDirectoryEntry, BufferAttr_HipcMapAlias> 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<u32>(std::min(files.size(), out_buffer.size()));
-    std::transform(files.begin(), files.begin() + *out_buffer_size, out_buffer.begin(),
+    *out_count = static_cast<s32>(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<u32> out_count) {
+Result IDeliveryCacheDirectoryService::GetCount(Out<s32> out_count) {
     LOG_DEBUG(Service_BCAT, "called");
 
     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();
 }
 

+ 3 - 3
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<u32> out_buffer_size,
+    Result Open(const DirectoryName& dir_name_raw);
+    Result Read(Out<s32> out_count,
                 OutArray<DeliveryCacheDirectoryEntry, BufferAttr_HipcMapAlias> out_buffer);
-    Result GetCount(Out<u32> out_count);
+    Result GetCount(Out<s32> out_count);
 
     FileSys::VirtualDir root;
     FileSys::VirtualDir current_dir;

+ 6 - 5
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 =

+ 1 - 1
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<u64> out_buffer_size, u64 offset,
                 OutBuffer<BufferAttr_HipcMapAlias> out_buffer);
     Result GetSize(Out<u64> out_size);

+ 2 - 2
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
 

+ 8 - 8
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<u32> out_directories_size,
+    Out<s32> out_directory_count,
     OutArray<DirectoryName, BufferAttr_HipcMapAlias> out_directories) {
     LOG_DEBUG(Service_BCAT, "called, size={:016X}", out_directories.size());
 
-    *out_directories_size =
-        static_cast<u32>(std::min(out_directories.size(), entries.size() - next_read_index));
+    *out_directory_count =
+        static_cast<s32>(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();
 }
 

+ 2 - 2
src/core/hle/service/bcat/delivery_cache_storage_service.h

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

+ 5 - 3
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<Kernel::KReadableEvent> out_event) {
     LOG_INFO(Service_BCAT, "called");
@@ -29,4 +31,4 @@ Result INewlyArrivedEventHolder::Get(OutCopyHandle<Kernel::KReadableEvent> out_e
     R_SUCCEED();
 }
 
-} // namespace Service::BCAT
+} // namespace Service::News

+ 2 - 2
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<INewlyArrivedEventHolder> {
 public:
@@ -30,4 +30,4 @@ private:
     KernelHelpers::ServiceContext service_context;
 };
 
-} // namespace Service::BCAT
+} // namespace Service::News

+ 2 - 2
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

+ 2 - 2
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<INewsDataService> {
 public:
@@ -17,4 +17,4 @@ public:
     ~INewsDataService() override;
 };
 
-} // namespace Service::BCAT
+} // namespace Service::News

+ 3 - 3
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<u32> out_count,
+Result INewsDatabaseService::Count(Out<s32> out_count,
                                    InBuffer<BufferAttr_HipcPointer> buffer_data) {
     LOG_WARNING(Service_BCAT, "(STUBBED) called, buffer_size={}", buffer_data.size());
     *out_count = 0;
     R_SUCCEED();
 }
 
-} // namespace Service::BCAT
+} // namespace Service::News

+ 3 - 3
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<INewsDatabaseService> {
 public:
@@ -18,7 +18,7 @@ public:
     ~INewsDatabaseService() override;
 
 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

+ 2 - 2
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<u32> out_status,
     R_SUCCEED();
 }
 
-} // namespace Service::BCAT
+} // namespace Service::News

+ 2 - 2
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<INewsService> {
 public:
@@ -21,4 +21,4 @@ private:
     Result GetSubscriptionStatus(Out<u32> out_status, InBuffer<BufferAttr_HipcPointer> buffer_data);
 };
 
-} // namespace Service::BCAT
+} // namespace Service::News

+ 5 - 3
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<Kernel::KReadableEvent> out_event) {
     LOG_INFO(Service_BCAT, "called");
@@ -28,4 +30,4 @@ Result IOverwriteEventHolder::Get(OutCopyHandle<Kernel::KReadableEvent> out_even
     R_SUCCEED();
 }
 
-} // namespace Service::BCAT
+} // namespace Service::News

+ 2 - 2
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<IOverwriteEventHolder> {
 public:
@@ -30,4 +30,4 @@ private:
     KernelHelpers::ServiceContext service_context;
 };
 
-} // namespace Service::BCAT
+} // namespace Service::News

+ 16 - 15
src/core/hle/service/bcat/news/news_interface.cpp → src/core/hle/service/bcat/news/service_creator.cpp

@@ -4,60 +4,61 @@
 #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/bcat/news/service_creator.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_} {
     // 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"},
+        {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);
 }
 
-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");
     *out_interface = std::make_shared<INewsService>(system);
     R_SUCCEED();
 }
 
-Result NewsInterface::CreateNewlyArrivedEventHolder(
+Result IServiceCreator::CreateNewlyArrivedEventHolder(
     OutInterface<INewlyArrivedEventHolder> out_interface) {
     LOG_INFO(Service_BCAT, "called");
     *out_interface = std::make_shared<INewlyArrivedEventHolder>(system);
     R_SUCCEED();
 }
 
-Result NewsInterface::CreateNewsDataService(OutInterface<INewsDataService> out_interface) {
+Result IServiceCreator::CreateNewsDataService(OutInterface<INewsDataService> out_interface) {
     LOG_INFO(Service_BCAT, "called");
     *out_interface = std::make_shared<INewsDataService>(system);
     R_SUCCEED();
 }
 
-Result NewsInterface::CreateNewsDatabaseService(OutInterface<INewsDatabaseService> out_interface) {
+Result IServiceCreator::CreateNewsDatabaseService(
+    OutInterface<INewsDatabaseService> out_interface) {
     LOG_INFO(Service_BCAT, "called");
     *out_interface = std::make_shared<INewsDatabaseService>(system);
     R_SUCCEED();
 }
 
-Result NewsInterface::CreateOverwriteEventHolder(
+Result IServiceCreator::CreateOverwriteEventHolder(
     OutInterface<IOverwriteEventHolder> out_interface) {
     LOG_INFO(Service_BCAT, "called");
     *out_interface = std::make_shared<IOverwriteEventHolder>(system);
     R_SUCCEED();
 }
 
-} // namespace Service::BCAT
+} // namespace Service::News

+ 5 - 5
src/core/hle/service/bcat/news/news_interface.h → src/core/hle/service/bcat/news/service_creator.h

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

+ 17 - 16
src/core/hle/service/bcat/bcat_interface.cpp → src/core/hle/service/bcat/service_creator.cpp

@@ -1,9 +1,9 @@
 // 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/bcat/service_creator.h"
 #include "core/hle/service/cmif_serialization.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));
 }
 
-BcatInterface::BcatInterface(Core::System& system_, const char* name_)
+IServiceCreator::IServiceCreator(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"},
+        {0, D<&IServiceCreator::CreateBcatService>, "CreateBcatService"},
+        {1, D<&IServiceCreator::CreateDeliveryCacheStorageService>, "CreateDeliveryCacheStorageService"},
+        {2, D<&IServiceCreator::CreateDeliveryCacheStorageServiceWithApplicationId>, "CreateDeliveryCacheStorageServiceWithApplicationId"},
         {3, nullptr, "CreateDeliveryCacheProgressService"},
         {4, nullptr, "CreateDeliveryCacheProgressServiceWithApplicationId"},
     };
@@ -32,17 +32,18 @@ BcatInterface::BcatInterface(Core::System& system_, const char* name_)
         CreateBackendFromSettings(system_, [this](u64 tid) { return fsc.GetBCATDirectory(tid); });
 }
 
-BcatInterface::~BcatInterface() = default;
+IServiceCreator::~IServiceCreator() = default;
 
-Result BcatInterface::CreateBcatService(OutInterface<IBcatService> out_interface) {
-    LOG_INFO(Service_BCAT, "called");
+Result IServiceCreator::CreateBcatService(ClientProcessId process_id,
+                                          OutInterface<IBcatService> out_interface) {
+    LOG_INFO(Service_BCAT, "called, process_id={}", process_id.pid);
     *out_interface = std::make_shared<IBcatService>(system, *backend);
     R_SUCCEED();
 }
 
-Result BcatInterface::CreateDeliveryCacheStorageService(
-    OutInterface<IDeliveryCacheStorageService> out_interface) {
-    LOG_INFO(Service_BCAT, "called");
+Result IServiceCreator::CreateDeliveryCacheStorageService(
+    ClientProcessId process_id, OutInterface<IDeliveryCacheStorageService> out_interface) {
+    LOG_INFO(Service_BCAT, "called, process_id={}", process_id.pid);
 
     const auto title_id = system.GetApplicationProcessProgramID();
     *out_interface =
@@ -50,11 +51,11 @@ Result BcatInterface::CreateDeliveryCacheStorageService(
     R_SUCCEED();
 }
 
-Result BcatInterface::CreateDeliveryCacheStorageServiceWithApplicationId(
-    u64 title_id, OutInterface<IDeliveryCacheStorageService> out_interface) {
-    LOG_DEBUG(Service_BCAT, "called, title_id={:016X}", title_id);
-    *out_interface =
-        std::make_shared<IDeliveryCacheStorageService>(system, fsc.GetBCATDirectory(title_id));
+Result IServiceCreator::CreateDeliveryCacheStorageServiceWithApplicationId(
+    u64 application_id, OutInterface<IDeliveryCacheStorageService> out_interface) {
+    LOG_DEBUG(Service_BCAT, "called, application_id={:016X}", application_id);
+    *out_interface = std::make_shared<IDeliveryCacheStorageService>(
+        system, fsc.GetBCATDirectory(application_id));
     R_SUCCEED();
 }
 

+ 6 - 6
src/core/hle/service/bcat/bcat_interface.h → src/core/hle/service/bcat/service_creator.h

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

+ 1 - 1
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"