diff --git a/include/services/service_manager.hpp b/include/services/service_manager.hpp index c777408c..ba25a671 100644 --- a/include/services/service_manager.hpp +++ b/include/services/service_manager.hpp @@ -89,6 +89,7 @@ class ServiceManager { // "srv:" commands void enableNotification(u32 messagePointer); void getServiceHandle(u32 messagePointer); + void publishToSubscriber(u32 messagePointer); void receiveNotification(u32 messagePointer); void registerClient(u32 messagePointer); void subscribe(u32 messagePointer); diff --git a/src/core/services/service_manager.cpp b/src/core/services/service_manager.cpp index ccbbdee8..7d6a61df 100644 --- a/src/core/services/service_manager.cpp +++ b/src/core/services/service_manager.cpp @@ -82,7 +82,8 @@ void ServiceManager::handleSyncRequest(u32 messagePointer) { case Commands::GetServiceHandle: getServiceHandle(messagePointer); break; case Commands::Subscribe: subscribe(messagePointer); break; case Commands::Unsubscribe: unsubscribe(messagePointer); break; - default: Helpers::panic("Unknown \"srv:\" command: %08X", header); + case Commands::PublishToSubscriber: publishToSubscriber(messagePointer); break; + default: Helpers::panic("Unknown \"srv:\" command: %08X", header); break; } } @@ -173,8 +174,8 @@ void ServiceManager::enableNotification(u32 messagePointer) { } mem.write32(messagePointer, IPC::responseHeader(0x2, 1, 2)); - mem.write32(messagePointer + 4, Result::Success); // Result code - mem.write32(messagePointer + 8, 0); // Translation descriptor + mem.write32(messagePointer + 4, Result::Success); // Result code + mem.write32(messagePointer + 8, 0); // Translation descriptor // Handle to semaphore signaled on process notification mem.write32(messagePointer + 12, notificationSemaphore.value()); } @@ -183,8 +184,8 @@ void ServiceManager::receiveNotification(u32 messagePointer) { log("srv::ReceiveNotification() (STUBBED)\n"); mem.write32(messagePointer, IPC::responseHeader(0xB, 2, 0)); - mem.write32(messagePointer + 4, Result::Success); // Result code - mem.write32(messagePointer + 8, 0); // Notification ID + mem.write32(messagePointer + 4, Result::Success); // Result code + mem.write32(messagePointer + 8, 0); // Notification ID } void ServiceManager::subscribe(u32 messagePointer) { @@ -203,6 +204,14 @@ void ServiceManager::unsubscribe(u32 messagePointer) { mem.write32(messagePointer + 4, Result::Success); } +void ServiceManager::publishToSubscriber(u32 messagePointer) { + u32 id = mem.read32(messagePointer + 4); + log("srv::PublishToSubscriber (Notification ID = %d) (stubbed)\n", id); + + mem.write32(messagePointer, IPC::responseHeader(0xC, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); +} + void ServiceManager::sendCommandToService(u32 messagePointer, Handle handle) { switch (handle) { // Breaking alphabetical order a bit to place the ones I think are most common at the top