[3/3] message-handler: Send signal on handler events

Submitted by Georg Chini on April 9, 2018, 6:27 p.m.

Details

Message ID 20180409182747.18519-4-georg@chini.tk
State New
Headers show
Series "core: Add signal sending/receiving" ( rev: 1 ) in PulseAudio

Not browsing as part of any series.

Commit Message

Georg Chini April 9, 2018, 6:27 p.m.
---
 src/pulsecore/message-handler.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

Patch hide | download patch | download mbox

diff --git a/src/pulsecore/message-handler.c b/src/pulsecore/message-handler.c
index 75310667..a983e136 100644
--- a/src/pulsecore/message-handler.c
+++ b/src/pulsecore/message-handler.c
@@ -23,6 +23,7 @@ 
 #include <stdio.h>
 
 #include <pulse/xmalloc.h>
+#include <pulse/message-params.h>
 
 #include <pulsecore/core.h>
 #include <pulsecore/core-util.h>
@@ -64,6 +65,7 @@  static bool object_path_is_valid(const char *test_string) {
 /* Register message handler for the specified object. object_path must be a unique name starting with "/". */
 void pa_message_handler_register(pa_core *c, const char *object_path, const char *description, pa_message_handler_cb_t cb, void *userdata) {
     struct pa_message_handler *handler;
+    char *sig_param;
 
     pa_assert(c);
     pa_assert(object_path);
@@ -80,11 +82,17 @@  void pa_message_handler_register(pa_core *c, const char *object_path, const char
     handler->description = pa_xstrdup(description);
 
     pa_assert_se(pa_hashmap_put(c->message_handlers, handler->object_path, handler) == 0);
+
+    /* Notify clients that a handler was added. */
+    sig_param = pa_sprintf_malloc("{%s}", object_path);
+    pa_signal_post(c, "message-api", 1, "handler-added", sig_param);
+    pa_xfree(sig_param);
 }
 
 /* Unregister a message handler */
 void pa_message_handler_unregister(pa_core *c, const char *object_path) {
     struct pa_message_handler *handler;
+    char *sig_param;
 
     pa_assert(c);
     pa_assert(object_path);
@@ -94,6 +102,11 @@  void pa_message_handler_unregister(pa_core *c, const char *object_path) {
     pa_xfree(handler->object_path);
     pa_xfree(handler->description);
     pa_xfree(handler);
+
+    /* Notify clients that a handler was removed. */
+    sig_param = pa_sprintf_malloc("{%s}", object_path);
+    pa_signal_post(c, "message-api", 1, "handler-removed", sig_param);
+    pa_xfree(sig_param);
 }
 
 /* Send a message to an object identified by object_path */
@@ -134,6 +147,8 @@  int pa_message_handler_send_message(pa_core *c, const char *object_path, const c
 /* Set handler description */
 int pa_message_handler_set_description(pa_core *c, const char *object_path, const char *description) {
     struct pa_message_handler *handler;
+    char *sig_param;
+    pa_message_param *param;
 
     pa_assert(c);
     pa_assert(object_path);
@@ -141,9 +156,19 @@  int pa_message_handler_set_description(pa_core *c, const char *object_path, cons
     if (!(handler = pa_hashmap_get(c->message_handlers, object_path)))
         return -PA_ERR_NOENTITY;
 
+    param = pa_message_param_new();
+    pa_message_param_write_string(param, object_path, false);
+    pa_message_param_write_string(param, handler->description, true);
+    pa_message_param_write_string(param, description, true);
+    sig_param = pa_message_param_to_string(param);
+
     pa_xfree(handler->description);
     handler->description = pa_xstrdup(description);
 
+    /* Notify clients that a handler description changed. */
+    pa_signal_post(c, "message-api", 1, "handler-changed", sig_param);
+    pa_xfree(sig_param);
+
     return PA_OK;
 }