From eccd9d26adc9eb13bed129595ad9253e4566ff5c Mon Sep 17 00:00:00 2001 From: Nedko Arnaudov Date: Sat, 3 Sep 2011 03:13:41 +0300 Subject: [PATCH] [some] jack session D-Bus proxies --- dbus_constants.h | 3 + proxies/jack_proxy.c | 140 +++++++++++++++++++++++++++++++++++++++++++ proxies/jack_proxy.h | 17 +++++- 3 files changed, 159 insertions(+), 1 deletion(-) diff --git a/dbus_constants.h b/dbus_constants.h index 2781d5c1..120ff2ab 100644 --- a/dbus_constants.h +++ b/dbus_constants.h @@ -32,6 +32,7 @@ #define JACKDBUS_IFACE_CONTROL "org.jackaudio.JackControl" #define JACKDBUS_IFACE_CONFIGURE "org.jackaudio.Configure" #define JACKDBUS_IFACE_PATCHBAY "org.jackaudio.JackPatchbay" +#define JACKDBUS_IFACE_SESSMGR "org.jackaudio.SessionManager" #define SERVICE_NAME DBUS_NAME_BASE #define CONTROL_OBJECT_PATH DBUS_BASE_PATH "/Control" @@ -66,6 +67,8 @@ #define JACKDBUS_PORT_TYPE_AUDIO 0 #define JACKDBUS_PORT_TYPE_MIDI 1 +#define JACKDBUS_SESSION_NOTIFY_TYPE_SAVE 1 /* JackSessionSave */ + #define GRAPH_DICT_OBJECT_TYPE_GRAPH 0 #define GRAPH_DICT_OBJECT_TYPE_CLIENT 1 #define GRAPH_DICT_OBJECT_TYPE_PORT 2 diff --git a/proxies/jack_proxy.c b/proxies/jack_proxy.c index 48d92595..01fdd821 100644 --- a/proxies/jack_proxy.c +++ b/proxies/jack_proxy.c @@ -629,6 +629,146 @@ bool jack_reset_all_params(void) return jack_proxy_read_conf_container(address, NULL, reset_callback); } +struct jack_proxy_session_save_one_reply_cookie +{ + void * context; + void (* callback)(void * context, const char * commandline); +}; + +#define cookie_ptr ((struct jack_proxy_session_save_one_reply_cookie *)void_cookie) + +static void jack_proxy_session_save_one_handle_reply(void * context, void * void_cookie, DBusMessage * reply_ptr) +{ + const char * reply_signature; + DBusMessageIter top_iter; + DBusMessageIter array_iter; + DBusMessageIter struct_iter; + const char * uuid; + const char * client_name; + const char * commandline; + uint32_t flags; + + if (reply_ptr == NULL) + { + cookie_ptr->callback(cookie_ptr->context, NULL); + return; + } + + reply_signature = dbus_message_get_signature(reply_ptr); + + if (strcmp(reply_signature, "a(sssu)") != 0) + { + log_error(JACKDBUS_IFACE_SESSMGR ".Notify() reply signature mismatch. '%s'", reply_signature); + return; + } + + dbus_message_iter_init(reply_ptr, &top_iter); + + commandline = NULL; + + for (dbus_message_iter_recurse(&top_iter, &array_iter); + dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_INVALID; + dbus_message_iter_next(&array_iter)) + { + if (commandline != NULL) + { + log_error(JACKDBUS_IFACE_SESSMGR ".Notify() save returned more than one command"); + return; + } + + dbus_message_iter_recurse(&array_iter, &struct_iter); + + dbus_message_iter_get_basic(&struct_iter, &uuid); + dbus_message_iter_next(&struct_iter); + + dbus_message_iter_get_basic(&struct_iter, &client_name); + dbus_message_iter_next(&struct_iter); + + dbus_message_iter_get_basic(&struct_iter, &commandline); + dbus_message_iter_next(&struct_iter); + + ASSERT(commandline != NULL); + + dbus_message_iter_get_basic(&struct_iter, &flags); + dbus_message_iter_next(&struct_iter); + + dbus_message_iter_next(&struct_iter); + } + + if (commandline == NULL) + { + log_error(JACKDBUS_IFACE_SESSMGR ".Notify() save returned no commands"); + return; + } + + cookie_ptr->callback(cookie_ptr->context, commandline); +} + +#undef cookie_ptr + +bool +jack_proxy_session_save_one( + bool queue, + const char * target, + const char * path, + void * callback_context, + void (* completion_callback)( + void * context, + const char * commandline)) +{ + bool ret; + dbus_bool_t dbus_bool; + dbus_uint32_t type; + DBusMessage * request_ptr; + struct jack_proxy_session_save_one_reply_cookie cookie; + + ret = false; + + dbus_bool = queue; + type = JACKDBUS_SESSION_NOTIFY_TYPE_SAVE; + + request_ptr = cdbus_new_method_call_message( + JACKDBUS_SERVICE_NAME, + JACKDBUS_OBJECT_PATH, + JACKDBUS_IFACE_SESSMGR, + "Notify", + "bsus", + &dbus_bool, + &target, + &type, + &path, + NULL); + if (request_ptr == NULL) + { + return false; + } + + cookie.context = callback_context; + cookie.callback = completion_callback; + + ret = cdbus_call_async(request_ptr, callback_context, &cookie, sizeof(cookie), jack_proxy_session_save_one_handle_reply); + + dbus_message_unref(request_ptr); + + return ret; +} + +bool +jack_proxy_session_has_callback( + const char * client, + bool * has_callback_ptr) +{ + dbus_bool_t has_callback; + + if (!dbus_call(0, JACKDBUS_SERVICE_NAME, JACKDBUS_OBJECT_PATH, JACKDBUS_IFACE_SESSMGR, "HasSessionCallback", "s", &client, "b", &has_callback)) + { + return false; + } + + *has_callback_ptr = has_callback; + return true; +} + bool jack_proxy_exit(void) { if (!dbus_call(0, JACKDBUS_SERVICE_NAME, JACKDBUS_OBJECT_PATH, JACKDBUS_IFACE_CONTROL, "Exit", "", "")) diff --git a/proxies/jack_proxy.h b/proxies/jack_proxy.h index 8946cd75..6a8bc8a9 100644 --- a/proxies/jack_proxy.h +++ b/proxies/jack_proxy.h @@ -2,7 +2,7 @@ /* * LADI Session Handler (ladish) * - * Copyright (C) 2009,2010 Nedko Arnaudov + * Copyright (C) 2009,2010,2011 Nedko Arnaudov * ************************************************************************** * This file contains interface to the helper functionality for accessing @@ -135,6 +135,21 @@ jack_proxy_reset_parameter_value( bool jack_reset_all_params(void); +bool +jack_proxy_session_save_one( + bool queue, + const char * target, + const char * path, + void * callback_context, + void (* completion_callback)( + void * context, + const char * commandline)); + +bool +jack_proxy_session_has_callback( + const char * client, + bool * has_callback_ptr); + bool jack_proxy_exit(void); #endif /* #ifndef JACK_PROXY_H__88702EEC_4B82_407F_A664_AD70C1E14D02__INCLUDED */