diff --git a/src/servers/media/NotificationProcessor.cpp b/src/servers/media/NotificationProcessor.cpp index 01967de052..35a3d53595 100644 --- a/src/servers/media/NotificationProcessor.cpp +++ b/src/servers/media/NotificationProcessor.cpp @@ -1,13 +1,29 @@ #include +#include #include +#include +#include +#include +#include "NotificationManager.h" #include "NotificationProcessor.h" +#include "ServerInterface.h" +#include "DataExchange.h" #include "Queue.h" #define NOTIFICATION_THREAD_PRIORITY 19 +struct RegisteredHandler +{ + BMessenger messenger; + media_node_id nodeid; + int32 mask; + team_id team; +}; + NotificationProcessor::NotificationProcessor() : fNotificationQueue(new Queue), - fNotificationThreadId(-1) + fNotificationThreadId(-1), + fLocker(new BLocker) { fNotificationThreadId = spawn_thread(NotificationProcessor::worker_thread, "notification broadcast", NOTIFICATION_THREAD_PRIORITY, this); resume_thread(fNotificationThreadId); @@ -20,23 +36,53 @@ NotificationProcessor::~NotificationProcessor() fNotificationQueue->Terminate(); wait_for_thread(fNotificationThreadId, &dummy); delete fNotificationQueue; + delete fLocker; +} + +void +NotificationProcessor::EnqueueMessage(BMessage *msg) +{ + // queue a copy of the message to be processed later + fNotificationQueue->AddItem(new BMessage(*msg)); } void NotificationProcessor::RequestNotifications(BMessage *msg) { + BMessenger messenger; + const media_node *node; + ssize_t nodesize; + team_id team; + int32 mask; + + msg->FindMessenger(NOTIFICATION_PARAM_MESSENGER, &messenger); + msg->FindInt32(NOTIFICATION_PARAM_TEAM, &team); + msg->FindInt32(NOTIFICATION_PARAM_MASK, &mask); + msg->FindData("node", B_RAW_TYPE, reinterpret_cast(&node), &nodesize); + ASSERT(nodesize == sizeof(node)); + } void NotificationProcessor::CancelNotifications(BMessage *msg) { + BMessenger messenger; + const media_node *node; + ssize_t nodesize; + team_id team; + int32 mask; + + msg->FindMessenger(NOTIFICATION_PARAM_MESSENGER, &messenger); + msg->FindInt32(NOTIFICATION_PARAM_TEAM, &team); + msg->FindInt32(NOTIFICATION_PARAM_MASK, &mask); + msg->FindData("node", B_RAW_TYPE, reinterpret_cast(&node), &nodesize); + ASSERT(nodesize == sizeof(node)); + } void NotificationProcessor::SendNotifications(BMessage *msg) { - // queue a copy of the message to be processed later - fNotificationQueue->AddItem(new BMessage(*msg)); } void @@ -54,7 +100,19 @@ NotificationProcessor::WorkerThread() { BMessage *msg; while (NULL != (msg = static_cast(fNotificationQueue->RemoveItem()))) { - BroadcastMessages(msg); + switch (msg->what) { + case MEDIA_SERVER_REQUEST_NOTIFICATIONS: + RequestNotifications(msg); + break; + case MEDIA_SERVER_CANCEL_NOTIFICATIONS: + CancelNotifications(msg); + break; + case MEDIA_SERVER_SEND_NOTIFICATIONS: + SendNotifications(msg); + break; + default: + debugger("bad notification message\n"); + } delete msg; } } diff --git a/src/servers/media/NotificationProcessor.h b/src/servers/media/NotificationProcessor.h index 61e4786367..1df7a2988a 100644 --- a/src/servers/media/NotificationProcessor.h +++ b/src/servers/media/NotificationProcessor.h @@ -6,14 +6,16 @@ class NotificationProcessor public: NotificationProcessor(); ~NotificationProcessor(); - - void RequestNotifications(BMessage *msg); - void CancelNotifications(BMessage *msg); - void SendNotifications(BMessage *msg); + void EnqueueMessage(BMessage *msg); + void CleanupTeam(team_id team); private: + void RequestNotifications(BMessage *msg); + void CancelNotifications(BMessage *msg); + void SendNotifications(BMessage *msg); + void BroadcastMessages(BMessage *msg); void WorkerThread(); static int32 worker_thread(void *arg); @@ -21,4 +23,5 @@ private: private: Queue * fNotificationQueue; thread_id fNotificationThreadId; + BLocker * fLocker; };