diff options
author | John Horan <knasher@gmail.com> | 2015-04-19 15:29:27 +0100 |
---|---|---|
committer | David Henningsson <david.henningsson@canonical.com> | 2015-10-19 11:02:44 +0200 |
commit | f8cd444de0c6dc46cbb7d3d5a0f50b398a60c3bb (patch) | |
tree | dd37a99e6fbb8aeb2126b550f50558e80e12d924 | |
parent | 2261567758bb0b07315f87dd6c19a79fb697a26b (diff) |
make availability of ports visible over dbus
-rw-r--r-- | src/modules/dbus/iface-device-port.c | 65 |
1 files changed, 63 insertions, 2 deletions
diff --git a/src/modules/dbus/iface-device-port.c b/src/modules/dbus/iface-device-port.c index 1b267566a..4892443e2 100644 --- a/src/modules/dbus/iface-device-port.c +++ b/src/modules/dbus/iface-device-port.c @@ -34,6 +34,7 @@ static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userd static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata); static void handle_get_description(DBusConnection *conn, DBusMessage *msg, void *userdata); static void handle_get_priority(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_available(DBusConnection *conn, DBusMessage *msg, void *userdata); static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata); @@ -41,6 +42,9 @@ struct pa_dbusiface_device_port { uint32_t index; pa_device_port *port; char *path; + + pa_hook_slot *available_changed_slot; + pa_dbus_protocol *dbus_protocol; }; @@ -49,6 +53,7 @@ enum property_handler_index { PROPERTY_HANDLER_NAME, PROPERTY_HANDLER_DESCRIPTION, PROPERTY_HANDLER_PRIORITY, + PROPERTY_HANDLER_AVAILABLE, PROPERTY_HANDLER_MAX }; @@ -57,6 +62,18 @@ static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = { [PROPERTY_HANDLER_NAME] = { .property_name = "Name", .type = "s", .get_cb = handle_get_name, .set_cb = NULL }, [PROPERTY_HANDLER_DESCRIPTION] = { .property_name = "Description", .type = "s", .get_cb = handle_get_description, .set_cb = NULL }, [PROPERTY_HANDLER_PRIORITY] = { .property_name = "Priority", .type = "u", .get_cb = handle_get_priority, .set_cb = NULL }, + [PROPERTY_HANDLER_AVAILABLE] = { .property_name = "Available", .type = "u", .get_cb = handle_get_available, .set_cb = NULL } +}; + +enum signal_index { + SIGNAL_AVAILABLE_CHANGED, + SIGNAL_MAX +}; + +static pa_dbus_arg_info available_changed_args[] = { { "available", "u", NULL } }; + +static pa_dbus_signal_info signals[SIGNAL_MAX] = { + [SIGNAL_AVAILABLE_CHANGED] = { .name = "AvailableChanged", .arguments = available_changed_args, .n_arguments = 1 } }; static pa_dbus_interface_info port_interface_info = { @@ -66,8 +83,8 @@ static pa_dbus_interface_info port_interface_info = { .property_handlers = property_handlers, .n_property_handlers = PROPERTY_HANDLER_MAX, .get_all_properties_cb = handle_get_all, - .signals = NULL, - .n_signals = 0 + .signals = signals, + .n_signals = SIGNAL_MAX }; static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) { @@ -113,6 +130,20 @@ static void handle_get_priority(DBusConnection *conn, DBusMessage *msg, void *us pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &priority); } +static void handle_get_available(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device_port *p = userdata; + dbus_uint32_t available = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(p); + + available = p->port->available; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &available); +} + + static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) { pa_dbusiface_device_port *p = userdata; DBusMessage *reply = NULL; @@ -135,6 +166,7 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &p->port->name); pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DESCRIPTION].property_name, DBUS_TYPE_STRING, &p->port->description); pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PRIORITY].property_name, DBUS_TYPE_UINT32, &priority); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_AVAILABLE].property_name, DBUS_TYPE_UINT32, &p->port->available); pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter)); @@ -142,6 +174,32 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat dbus_message_unref(reply); } +static pa_hook_result_t available_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_device_port *p = slot_data; + pa_device_port *port = call_data; + DBusMessage *signal_msg; + uint32_t available; + + pa_assert(p); + pa_assert(port); + + if(p->port != port) + return PA_HOOK_OK; + + available = port->available; + + pa_assert_se(signal_msg = dbus_message_new_signal(p->path, + PA_DBUSIFACE_DEVICE_PORT_INTERFACE, + signals[SIGNAL_AVAILABLE_CHANGED].name)); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_UINT32, &available, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(p->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + + pa_dbusiface_device_port *pa_dbusiface_device_port_new( pa_dbusiface_device *device, pa_core *core, @@ -158,6 +216,8 @@ pa_dbusiface_device_port *pa_dbusiface_device_port_new( p->port = port; p->path = pa_sprintf_malloc("%s/%s%u", pa_dbusiface_device_get_path(device), OBJECT_NAME, idx); p->dbus_protocol = pa_dbus_protocol_get(core); + p->available_changed_slot = pa_hook_connect(&port->core->hooks[PA_CORE_HOOK_PORT_AVAILABLE_CHANGED], + PA_HOOK_NORMAL, available_changed_cb, p); pa_assert_se(pa_dbus_protocol_add_interface(p->dbus_protocol, p->path, &port_interface_info, p) >= 0); @@ -169,6 +229,7 @@ void pa_dbusiface_device_port_free(pa_dbusiface_device_port *p) { pa_assert_se(pa_dbus_protocol_remove_interface(p->dbus_protocol, p->path, port_interface_info.name) >= 0); + pa_hook_slot_free(p->available_changed_slot); pa_dbus_protocol_unref(p->dbus_protocol); pa_xfree(p->path); |