|
|
|
@ -48,6 +48,62 @@ static std::vector<u64> AccumulateAOCTitleIDs(Core::System& system) { |
|
|
|
return add_on_content; |
|
|
|
} |
|
|
|
|
|
|
|
class IPurchaseEventManager final : public ServiceFramework<IPurchaseEventManager> { |
|
|
|
public: |
|
|
|
explicit IPurchaseEventManager(Core::System& system_) |
|
|
|
: ServiceFramework{system_, "IPurchaseEventManager"} { |
|
|
|
// clang-format off
|
|
|
|
static const FunctionInfo functions[] = { |
|
|
|
{0, &IPurchaseEventManager::SetDefaultDeliveryTarget, "SetDefaultDeliveryTarget"}, |
|
|
|
{1, &IPurchaseEventManager::SetDeliveryTarget, "SetDeliveryTarget"}, |
|
|
|
{2, &IPurchaseEventManager::GetPurchasedEventReadableHandle, "GetPurchasedEventReadableHandle"}, |
|
|
|
{3, nullptr, "PopPurchasedProductInfo"}, |
|
|
|
{4, nullptr, "PopPurchasedProductInfoWithUid"}, |
|
|
|
}; |
|
|
|
// clang-format on
|
|
|
|
|
|
|
|
RegisterHandlers(functions); |
|
|
|
|
|
|
|
purchased_event = Kernel::WritableEvent::CreateEventPair( |
|
|
|
system.Kernel(), "IPurchaseEventManager:PurchasedEvent"); |
|
|
|
} |
|
|
|
|
|
|
|
private: |
|
|
|
void SetDefaultDeliveryTarget(Kernel::HLERequestContext& ctx) { |
|
|
|
IPC::RequestParser rp{ctx}; |
|
|
|
|
|
|
|
const auto unknown_1 = rp.Pop<u64>(); |
|
|
|
[[maybe_unused]] const auto unknown_2 = ctx.ReadBuffer(); |
|
|
|
|
|
|
|
LOG_WARNING(Service_AOC, "(STUBBED) called, unknown_1={}", unknown_1); |
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2}; |
|
|
|
rb.Push(RESULT_SUCCESS); |
|
|
|
} |
|
|
|
|
|
|
|
void SetDeliveryTarget(Kernel::HLERequestContext& ctx) { |
|
|
|
IPC::RequestParser rp{ctx}; |
|
|
|
|
|
|
|
const auto unknown_1 = rp.Pop<u64>(); |
|
|
|
[[maybe_unused]] const auto unknown_2 = ctx.ReadBuffer(); |
|
|
|
|
|
|
|
LOG_WARNING(Service_AOC, "(STUBBED) called, unknown_1={}", unknown_1); |
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2}; |
|
|
|
rb.Push(RESULT_SUCCESS); |
|
|
|
} |
|
|
|
|
|
|
|
void GetPurchasedEventReadableHandle(Kernel::HLERequestContext& ctx) { |
|
|
|
LOG_WARNING(Service_AOC, "called"); |
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2, 1}; |
|
|
|
rb.Push(RESULT_SUCCESS); |
|
|
|
rb.PushCopyObjects(purchased_event.readable); |
|
|
|
} |
|
|
|
|
|
|
|
Kernel::EventPair purchased_event; |
|
|
|
}; |
|
|
|
|
|
|
|
AOC_U::AOC_U(Core::System& system_) |
|
|
|
: ServiceFramework{system_, "aoc:u"}, add_on_content{AccumulateAOCTitleIDs(system)} { |
|
|
|
// clang-format off
|
|
|
|
@ -62,8 +118,8 @@ AOC_U::AOC_U(Core::System& system_) |
|
|
|
{7, &AOC_U::PrepareAddOnContent, "PrepareAddOnContent"}, |
|
|
|
{8, &AOC_U::GetAddOnContentListChangedEvent, "GetAddOnContentListChangedEvent"}, |
|
|
|
{9, nullptr, "GetAddOnContentLostErrorCode"}, |
|
|
|
{100, nullptr, "CreateEcPurchasedEventManager"}, |
|
|
|
{101, nullptr, "CreatePermanentEcPurchasedEventManager"}, |
|
|
|
{100, &AOC_U::CreateEcPurchasedEventManager, "CreateEcPurchasedEventManager"}, |
|
|
|
{101, &AOC_U::CreatePermanentEcPurchasedEventManager, "CreatePermanentEcPurchasedEventManager"}, |
|
|
|
}; |
|
|
|
// clang-format on
|
|
|
|
|
|
|
|
@ -201,6 +257,22 @@ void AOC_U::GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx) { |
|
|
|
rb.PushCopyObjects(aoc_change_event.readable); |
|
|
|
} |
|
|
|
|
|
|
|
void AOC_U::CreateEcPurchasedEventManager(Kernel::HLERequestContext& ctx) { |
|
|
|
LOG_WARNING(Service_AOC, "(STUBBED) called"); |
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
|
|
|
rb.Push(RESULT_SUCCESS); |
|
|
|
rb.PushIpcInterface<IPurchaseEventManager>(system); |
|
|
|
} |
|
|
|
|
|
|
|
void AOC_U::CreatePermanentEcPurchasedEventManager(Kernel::HLERequestContext& ctx) { |
|
|
|
LOG_WARNING(Service_AOC, "(STUBBED) called"); |
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
|
|
|
rb.Push(RESULT_SUCCESS); |
|
|
|
rb.PushIpcInterface<IPurchaseEventManager>(system); |
|
|
|
} |
|
|
|
|
|
|
|
void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) { |
|
|
|
std::make_shared<AOC_U>(system)->InstallAsService(service_manager); |
|
|
|
} |
|
|
|
|