diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/bcat/module.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/core/hle/service/bcat/module.cpp b/src/core/hle/service/bcat/module.cpp index fd742fde2..2d8341359 100644 --- a/src/core/hle/service/bcat/module.cpp +++ b/src/core/hle/service/bcat/module.cpp | |||
| @@ -40,6 +40,64 @@ void Module::Interface::CreateBcatService(Kernel::HLERequestContext& ctx) { | |||
| 40 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | 40 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
| 41 | rb.Push(RESULT_SUCCESS); | 41 | rb.Push(RESULT_SUCCESS); |
| 42 | rb.PushIpcInterface<IBcatService>(*backend); | 42 | rb.PushIpcInterface<IBcatService>(*backend); |
| 43 | class IDeliveryCacheStorageService final : public ServiceFramework<IDeliveryCacheStorageService> { | ||
| 44 | public: | ||
| 45 | IDeliveryCacheStorageService(FileSys::VirtualDir root_) | ||
| 46 | : ServiceFramework{"IDeliveryCacheStorageService"}, root(std::move(root_)) { | ||
| 47 | // clang-format off | ||
| 48 | static const FunctionInfo functions[] = { | ||
| 49 | {0, &IDeliveryCacheStorageService::CreateFileService, "CreateFileService"}, | ||
| 50 | {1, &IDeliveryCacheStorageService::CreateDirectoryService, "CreateDirectoryService"}, | ||
| 51 | {10, &IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory, "EnumerateDeliveryCacheDirectory"}, | ||
| 52 | }; | ||
| 53 | // clang-format on | ||
| 54 | |||
| 55 | RegisterHandlers(functions); | ||
| 56 | |||
| 57 | for (const auto& subdir : root->GetSubdirectories()) { | ||
| 58 | DirectoryName name{}; | ||
| 59 | std::memcpy(name.data(), subdir->GetName().data(), | ||
| 60 | std::min(sizeof(DirectoryName) - 1, subdir->GetName().size())); | ||
| 61 | entries.push_back(name); | ||
| 62 | } | ||
| 63 | } | ||
| 64 | |||
| 65 | private: | ||
| 66 | void CreateFileService(Kernel::HLERequestContext& ctx) { | ||
| 67 | LOG_DEBUG(Service_BCAT, "called"); | ||
| 68 | |||
| 69 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||
| 70 | rb.Push(RESULT_SUCCESS); | ||
| 71 | rb.PushIpcInterface<IDeliveryCacheFileService>(root); | ||
| 72 | } | ||
| 73 | |||
| 74 | void CreateDirectoryService(Kernel::HLERequestContext& ctx) { | ||
| 75 | LOG_DEBUG(Service_BCAT, "called"); | ||
| 76 | |||
| 77 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||
| 78 | rb.Push(RESULT_SUCCESS); | ||
| 79 | rb.PushIpcInterface<IDeliveryCacheDirectoryService>(root); | ||
| 80 | } | ||
| 81 | |||
| 82 | void EnumerateDeliveryCacheDirectory(Kernel::HLERequestContext& ctx) { | ||
| 83 | auto size = ctx.GetWriteBufferSize() / sizeof(DirectoryName); | ||
| 84 | |||
| 85 | LOG_DEBUG(Service_BCAT, "called, size={:016X}", size); | ||
| 86 | |||
| 87 | size = std::min(size, entries.size() - next_read_index); | ||
| 88 | ctx.WriteBuffer(entries.data() + next_read_index, size * sizeof(DirectoryName)); | ||
| 89 | next_read_index += size; | ||
| 90 | |||
| 91 | IPC::ResponseBuilder rb{ctx, 3}; | ||
| 92 | rb.Push(RESULT_SUCCESS); | ||
| 93 | rb.Push<u32>(size); | ||
| 94 | } | ||
| 95 | |||
| 96 | FileSys::VirtualDir root; | ||
| 97 | std::vector<DirectoryName> entries; | ||
| 98 | u64 next_read_index = 0; | ||
| 99 | }; | ||
| 100 | |||
| 43 | void Module::Interface::CreateDeliveryCacheStorageService(Kernel::HLERequestContext& ctx) { | 101 | void Module::Interface::CreateDeliveryCacheStorageService(Kernel::HLERequestContext& ctx) { |
| 44 | LOG_DEBUG(Service_BCAT, "called"); | 102 | LOG_DEBUG(Service_BCAT, "called"); |
| 45 | 103 | ||