service: bcat: Implement news service for Qlaunch

This commit is contained in:
german77
2023-08-05 14:07:06 -06:00
committed by Narr the Reg
parent 8bd10473d6
commit d97de43996

View File

@ -147,7 +147,7 @@ public:
{30202, nullptr, "BlockDeliveryTask"},
{30203, nullptr, "UnblockDeliveryTask"},
{30210, nullptr, "SetDeliveryTaskTimer"},
{30300, nullptr, "RegisterSystemApplicationDeliveryTasks"},
{30300, &IBcatService::RegisterSystemApplicationDeliveryTasks, "RegisterSystemApplicationDeliveryTasks"},
{90100, nullptr, "EnumerateBackgroundDeliveryTask"},
{90101, nullptr, "Unknown90101"},
{90200, nullptr, "GetDeliveryList"},
@ -234,6 +234,13 @@ private:
rb.Push(ResultSuccess);
}
void RegisterSystemApplicationDeliveryTasks(HLERequestContext& ctx) {
LOG_INFO(Service_BCAT, "called");
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
void ClearDeliveryCacheStorage(HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
const auto title_id = rp.PopRaw<u64>();
@ -584,6 +591,187 @@ Module::Interface::Interface(Core::System& system_, std::shared_ptr<Module> modu
Module::Interface::~Interface() = default;
class INewsService final : public ServiceFramework<INewsService> {
public:
explicit INewsService(Core::System& system_) : ServiceFramework{system_, "INewsService"} {
// clang-format off
static const FunctionInfo functions[] = {
{10100, nullptr, "PostLocalNews"},
{20100, nullptr, "SetPassphrase"},
{30100, &INewsService::GetSubscriptionStatus, "GetSubscriptionStatus"},
{30101, nullptr, "GetTopicList"},
{30110, nullptr, "Unknown30110"},
{30200, nullptr, "IsSystemUpdateRequired"},
{30201, nullptr, "Unknown30201"},
{30210, nullptr, "Unknown30210"},
{30300, nullptr, "RequestImmediateReception"},
{30400, nullptr, "DecodeArchiveFile"},
{30500, nullptr, "Unknown30500"},
{30900, nullptr, "Unknown30900"},
{30901, nullptr, "Unknown30901"},
{30902, nullptr, "Unknown30902"},
{40100, nullptr, "SetSubscriptionStatus"},
{40101, nullptr, "RequestAutoSubscription"},
{40200, nullptr, "ClearStorage"},
{40201, nullptr, "ClearSubscriptionStatusAll"},
{90100, nullptr, "GetNewsDatabaseDump"},
};
// clang-format on
RegisterHandlers(functions);
}
private:
void GetSubscriptionStatus(HLERequestContext& ctx) {
const auto buffer_data = ctx.ReadBuffer();
LOG_WARNING(Service_BCAT, "(STUBBED) called, buffer_size={}", buffer_data.size());
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
rb.Push(0);
}
};
class INewsDatabaseService final : public ServiceFramework<INewsDatabaseService> {
public:
explicit INewsDatabaseService(Core::System& system_)
: ServiceFramework{system_, "INewsDatabaseService"} {
// clang-format off
static const FunctionInfo functions[] = {
{0, nullptr, "GetListV1"},
{1, &INewsDatabaseService::Count, "Count"},
{2, nullptr, "CountWithKey"},
{3, nullptr, "UpdateIntegerValue"},
{4, nullptr, "UpdateIntegerValueWithAddition"},
{5, nullptr, "UpdateStringValue"},
{1000, nullptr, "GetList"},
};
// clang-format on
RegisterHandlers(functions);
}
private:
void Count(HLERequestContext& ctx) {
const auto buffer_data = ctx.ReadBuffer();
LOG_WARNING(Service_BCAT, "(STUBBED) called, buffer_size={}", buffer_data.size());
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
rb.Push(0);
}
};
class INewlyArrivedEventHolder final : public ServiceFramework<INewlyArrivedEventHolder> {
public:
explicit INewlyArrivedEventHolder(Core::System& system_)
: ServiceFramework{system_, "INewlyArrivedEventHolder"}, service_context{
system_,
"INewlyArrivedEventHolder"} {
// clang-format off
static const FunctionInfo functions[] = {
{0, &INewlyArrivedEventHolder::Get, "Get"},
};
// clang-format on
RegisterHandlers(functions);
arrived_event = service_context.CreateEvent("INewlyArrivedEventHolder::ArrivedEvent");
}
private:
void Get(HLERequestContext& ctx) {
LOG_INFO(Service_BCAT, "called");
IPC::ResponseBuilder rb{ctx, 2, 1};
rb.Push(ResultSuccess);
rb.PushCopyObjects(arrived_event->GetReadableEvent());
}
Kernel::KEvent* arrived_event;
KernelHelpers::ServiceContext service_context;
};
class IOverwriteEventHolder final : public ServiceFramework<IOverwriteEventHolder> {
public:
explicit IOverwriteEventHolder(Core::System& system_)
: ServiceFramework{system_, "IOverwriteEventHolder"}, service_context{
system_,
"IOverwriteEventHolder"} {
// clang-format off
static const FunctionInfo functions[] = {
{0, &IOverwriteEventHolder::Get, "Get"},
};
// clang-format on
RegisterHandlers(functions);
overwrite_event = service_context.CreateEvent("IOverwriteEventHolder::OverwriteEvent");
}
private:
void Get(HLERequestContext& ctx) {
LOG_INFO(Service_BCAT, "called");
IPC::ResponseBuilder rb{ctx, 2, 1};
rb.Push(ResultSuccess);
rb.PushCopyObjects(overwrite_event->GetReadableEvent());
}
Kernel::KEvent* overwrite_event;
KernelHelpers::ServiceContext service_context;
};
class News final : public ServiceFramework<News> {
public:
explicit News(Core::System& system_) : ServiceFramework{system_, "news:p"} {
// clang-format off
static const FunctionInfo functions[] = {
{0, &News::CreateNewsService, "CreateNewsService"},
{1, &News::CreateNewlyArrivedEventHolder, "CreateNewlyArrivedEventHolder"},
{2, nullptr, "CreateNewsDataService"},
{3, &News::CreateNewsDatabaseService, "CreateNewsDatabaseService"},
{4, &News::CreateOverwriteEventHolder, "CreateOverwriteEventHolder"},
};
// clang-format on
RegisterHandlers(functions);
}
private:
void CreateNewsService(HLERequestContext& ctx) {
LOG_INFO(Service_BCAT, "called");
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess);
rb.PushIpcInterface<INewsService>(system);
}
void CreateNewlyArrivedEventHolder(HLERequestContext& ctx) {
LOG_INFO(Service_BCAT, "called");
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess);
rb.PushIpcInterface<INewlyArrivedEventHolder>(system);
}
void CreateNewsDatabaseService(HLERequestContext& ctx) {
LOG_INFO(Service_BCAT, "called");
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess);
rb.PushIpcInterface<INewsDatabaseService>(system);
}
void CreateOverwriteEventHolder(HLERequestContext& ctx) {
LOG_INFO(Service_BCAT, "called");
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess);
rb.PushIpcInterface<IOverwriteEventHolder>(system);
}
};
void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system);
auto module = std::make_shared<Module>();
@ -600,6 +788,9 @@ void LoopProcess(Core::System& system) {
server_manager->RegisterNamedService(
"bcat:s",
std::make_shared<BCAT>(system, module, system.GetFileSystemController(), "bcat:s"));
server_manager->RegisterNamedService("news:p", std::make_shared<News>(system));
ServerManager::RunServer(std::move(server_manager));
}