[some] jack session D-Bus proxies

This commit is contained in:
Nedko Arnaudov 2011-09-03 03:13:41 +03:00
parent 0e4270e1bc
commit eccd9d26ad
3 changed files with 159 additions and 1 deletions

View File

@ -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

View File

@ -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", "", ""))

View File

@ -2,7 +2,7 @@
/*
* LADI Session Handler (ladish)
*
* Copyright (C) 2009,2010 Nedko Arnaudov <nedko@arnaudov.name>
* Copyright (C) 2009,2010,2011 Nedko Arnaudov <nedko@arnaudov.name>
*
**************************************************************************
* 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 */