summaryrefslogtreecommitdiff
path: root/dbus.c
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@dhcp-100-2-40.bos.redhat.com>2009-04-02 21:51:36 -0400
committerSøren Sandmann Pedersen <ssp@dhcp-100-2-40.bos.redhat.com>2009-04-02 21:51:36 -0400
commite102e8189f8abe9262bca75995cc85d0090b51d4 (patch)
tree0097cc89639e381f0276a7437fffb304be53fce1 /dbus.c
parent9990c750357e70f287400a4bea26997cf632874f (diff)
TODO
Diffstat (limited to 'dbus.c')
-rw-r--r--dbus.c232
1 files changed, 124 insertions, 108 deletions
diff --git a/dbus.c b/dbus.c
index 741a838..76c2ca2 100644
--- a/dbus.c
+++ b/dbus.c
@@ -61,7 +61,7 @@ struct nul_dbus_member_t
void ** parameters;
int n_inputs;
int n_outputs;
-
+
nul_fun_def_t * fun_def;
nul_fun_def_t * reply_fun;
};
@@ -98,7 +98,7 @@ process_watch (DBusWatch *watch, int flags)
while ((msg = dbus_connection_borrow_message (connection)))
{
dbus_connection_return_message (connection, msg);
-
+
dbus_connection_dispatch (connection);
}
}
@@ -127,7 +127,7 @@ on_read (gpointer data)
for (list = data; list != NULL; list = list->next)
{
DBusWatch *watch = list->data;
-
+
if (dbus_watch_get_enabled (watch) &&
(dbus_watch_get_flags (watch) & DBUS_WATCH_READABLE))
{
@@ -144,7 +144,7 @@ on_write (gpointer data)
for (list = data; list != NULL; list = list->next)
{
DBusWatch *watch = list->data;
-
+
if (dbus_watch_get_enabled (watch) &&
(dbus_watch_get_flags (watch) & DBUS_WATCH_WRITABLE))
{
@@ -167,7 +167,7 @@ update_fd (int fd)
for (list = watches; list != NULL; list = list->next)
{
DBusWatch *watch = list->data;
-
+
if (dbus_watch_get_enabled (watch))
{
enabled = TRUE;
@@ -179,12 +179,12 @@ update_fd (int fd)
{
nul_fd_set_error_callback (fd, on_hangup);
nul_fd_set_hangup_callback (fd, on_error);
-
+
if (flags & DBUS_WATCH_READABLE)
nul_fd_set_read_callback (fd, on_read);
else
nul_fd_set_read_callback (fd, NULL);
-
+
if (flags & DBUS_WATCH_WRITABLE)
nul_fd_set_write_callback (fd, on_write);
else
@@ -213,9 +213,9 @@ add_watch (DBusWatch *watch, void *data)
if (nul_fd_is_watched (fd))
{
GList *watches = nul_fd_get_data (fd);
-
+
watches = g_list_prepend (watches, watch);
-
+
nul_fd_set_data (fd, watches);
}
else
@@ -271,10 +271,10 @@ add_timeout (DBusTimeout *timeout, void *data)
if (dbus_timeout_get_enabled (timeout))
{
int id;
-
+
id = g_timeout_add (dbus_timeout_get_interval (timeout),
on_timeout, timeout);
-
+
dbus_timeout_set_data (timeout, GINT_TO_POINTER (id), NULL);
}
@@ -289,7 +289,7 @@ remove_timeout (DBusTimeout *timeout, void *data)
if (id)
{
g_source_remove (id);
-
+
dbus_timeout_set_data (timeout, GINT_TO_POINTER (0), NULL);
}
}
@@ -316,12 +316,12 @@ static gboolean
do_free (gpointer data)
{
void **p;
-
+
for (p = free_us; *p; ++p)
g_free (*p);
-
+
nul_parr_free (free_us);
-
+
free_us = nul_parr_new ();
idle_handler = 0;
@@ -365,15 +365,15 @@ introspect (nul_dbus_object_t *object)
void **p;
g_string_append_printf (xml, "<node>\n");
-
+
for (p = object->interfaces; *p; ++p)
{
nul_dbus_interface_t *interface = *p;
void **q;
-
+
g_string_append_printf (
xml, " <interface name=\"%s\">\n", interface->name);
-
+
for (q = interface->members; *q; ++q)
{
nul_dbus_member_t *member = *q;
@@ -381,11 +381,11 @@ introspect (nul_dbus_object_t *object)
g_string_append_printf (
xml, " <method name=\"%s\">\n", member->name);
-
+
for (r = member->parameters; *r; ++r)
{
nul_dbus_parameter_t *parameter = *r;
-
+
g_string_append_printf (
xml,
" <arg name=\"%s\" direction=\"%s\" type=\"%s\"/>\n",
@@ -393,11 +393,11 @@ introspect (nul_dbus_object_t *object)
parameter->out? "out" : "in",
make_signature (parameter->type));
}
-
+
g_string_append_printf (
xml, " </method>\n");
}
-
+
g_string_append_printf (xml, " </interface>\n");
}
@@ -416,9 +416,9 @@ decode_message (DBusMessage *message,
int i;
DBusMessageIter iter;
const char *error;
-
+
has_args = dbus_message_iter_init (message, &iter);
-
+
/* FIXME: this function should make sure args are initialized to NULL values
* when it fails
*/
@@ -426,15 +426,15 @@ decode_message (DBusMessage *message,
for (i = 0; i < n_parameters; ++i)
{
int dbus_type;
-
+
if (!has_args)
{
error = "Received too few arguments method\n";
goto fail;
}
-
+
dbus_type = dbus_message_iter_get_arg_type (&iter);
-
+
switch (parameters[i]->type->type)
{
case UINT32:
@@ -445,7 +445,7 @@ decode_message (DBusMessage *message,
}
dbus_message_iter_get_basic (&iter, &(args[i].v_uint32));
break;
-
+
case INT32:
if (dbus_type != DBUS_TYPE_INT32)
{
@@ -454,7 +454,7 @@ decode_message (DBusMessage *message,
}
dbus_message_iter_get_basic (&iter, &(args[i].v_int32));
break;
-
+
case STRING:
if (dbus_type != DBUS_TYPE_STRING)
{
@@ -464,15 +464,15 @@ decode_message (DBusMessage *message,
dbus_message_iter_get_basic (&iter, &(args[i].v_pointer));
break;
}
-
+
if (dbus_type == DBUS_TYPE_INVALID)
has_args = FALSE;
-
+
dbus_message_iter_next (&iter);
}
-
+
return TRUE;
-
+
fail:
g_print ("ERROR: %s\n", error);
return FALSE;
@@ -492,23 +492,23 @@ encode_message (DBusMessage *message,
for (i = 0; i < n_parameters; ++i)
{
nul_dbus_parameter_t *parameter = parameters[i];
-
+
switch (parameter->type->type)
{
case UINT32:
dbus_message_iter_append_basic (
&iter, DBUS_TYPE_UINT32, &(args[i].v_uint32));
break;
-
+
case INT32:
dbus_message_iter_append_basic (
&iter, DBUS_TYPE_INT32, &(args[i].v_int32));
break;
-
+
case STRING:
dbus_message_iter_append_basic (
&iter, DBUS_TYPE_STRING, &(args[i].v_pointer));
-
+
/* FIXME: it feels wrong that we are freeing data
* passed in by the user. Maybe we should just make the
* user idle_free it.
@@ -521,7 +521,7 @@ encode_message (DBusMessage *message,
}
}
}
-
+
static DBusHandlerResult
invoke (DBusConnection *connection,
nul_dbus_object_t *object,
@@ -535,22 +535,22 @@ invoke (DBusConnection *connection,
/* Add the data pointer */
args[0].v_pointer = object->data;
-
+
if (!decode_message (message, member->n_inputs, (nul_dbus_parameter_t **)member->parameters, &(args[1])))
{
error_reply = dbus_message_new_error (message, DBUS_ERROR_FAILED, "FIXME: generate a real error");
-
+
dbus_connection_send (connection, error_reply, NULL);
-
+
return DBUS_HANDLER_RESULT_HANDLED;
}
for (i = member->n_inputs; member->parameters[i] != NULL; ++i)
{
nul_dbus_parameter_t *parameter = member->parameters[i];
-
+
g_assert (parameter->out);
-
+
args[i + 1].v_pointer = &(args[i + 1]);
}
@@ -559,12 +559,12 @@ invoke (DBusConnection *connection,
if (result.v_int32)
{
DBusMessage *reply = dbus_message_new_method_return (message);
-
+
encode_message (reply,
member->n_outputs,
(nul_dbus_parameter_t **)&(member->parameters[member->n_inputs]),
&(args[member->n_inputs + 1]));
-
+
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
return DBUS_HANDLER_RESULT_HANDLED;
@@ -595,13 +595,13 @@ message_function (DBusConnection *connection,
{
DBusMessage *reply = dbus_message_new_method_return (message);
const char *xml = introspect (object);
-
+
dbus_message_append_args (reply,
DBUS_TYPE_STRING, &xml,
DBUS_TYPE_INVALID);
-
+
dbus_connection_send (connection, reply, NULL);
-
+
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -609,15 +609,15 @@ message_function (DBusConnection *connection,
for (i = object->interfaces; *i; ++i)
{
nul_dbus_interface_t *interface = *i;
-
+
if (strcmp (msg_interface, interface->name) == 0)
{
void **q;
-
+
for (q = interface->members; *q; ++q)
{
nul_dbus_member_t *member = *q;
-
+
if (strcmp (member->name, msg_member) == 0)
return invoke (connection, object, member, message);
}
@@ -645,12 +645,12 @@ make_ptr_array (gpointer first, va_list parameters)
if (first)
{
array = nul_parr_append (array, first);
-
+
v = va_arg (parameters, gpointer);
while (v)
{
array = nul_parr_append (array, v);
-
+
v = va_arg (parameters, gpointer);
}
}
@@ -666,14 +666,14 @@ ensure_connection (DBusConnection **connection,
if (!*connection)
{
*connection = dbus_bus_get (type, err);
-
+
if (*connection)
{
dbus_connection_set_watch_functions (
*connection,
add_watch, remove_watch, toggle_watch,
*connection, NULL);
-
+
dbus_connection_set_timeout_functions (
*connection,
add_timeout, remove_timeout, toggle_timeout,
@@ -725,8 +725,8 @@ make_service (const char *name,
nul_dbus_service_t *
nul_dbus_session_service (const char *name,
- nul_dbus_object_t *object1,
- ...)
+ nul_dbus_object_t *object1,
+ ...)
{
va_list args;
nul_dbus_service_t *service;
@@ -772,17 +772,17 @@ nul_dbus_service_start (nul_dbus_service_t *service)
case DBUS_REQUEST_NAME_REPLY_IN_QUEUE:
g_assert_not_reached();
break;
-
+
case DBUS_REQUEST_NAME_REPLY_EXISTS:
g_print ("Couldn't get name\n");
return FALSE;
break;
-
+
case DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER:
g_print ("We own this already (?)\n");
return FALSE;
break;
-
+
case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER:
break;
}
@@ -791,7 +791,7 @@ nul_dbus_service_start (nul_dbus_service_t *service)
for (i = 0; service->objects[i] != NULL; ++i)
{
nul_dbus_object_t *object = service->objects[i];
-
+
dbus_connection_register_object_path (
service->connection, object->name, &vtable, object);
}
@@ -808,11 +808,11 @@ nul_dbus_service_stop (nul_dbus_service_t *service)
if (!service->running)
return;
-
+
for (i = service->objects; *i != NULL; ++i)
{
nul_dbus_object_t *object = *i;
-
+
dbus_connection_unregister_object_path (service->connection, object->name);
}
@@ -823,9 +823,9 @@ nul_dbus_service_stop (nul_dbus_service_t *service)
nul_dbus_object_t *
nul_dbus_object (const char *name,
- gpointer data,
- nul_dbus_interface_t *interface1,
- ...)
+ gpointer data,
+ nul_dbus_interface_t *interface1,
+ ...)
{
nul_dbus_object_t *object = g_new0 (nul_dbus_object_t, 1);
va_list args;
@@ -859,8 +859,8 @@ nul_dbus_object (const char *name,
nul_dbus_interface_t *
nul_dbus_interface (const char *name,
- nul_dbus_member_t *member1,
- ...)
+ nul_dbus_member_t *member1,
+ ...)
{
nul_dbus_interface_t *interface = g_new0 (nul_dbus_interface_t, 1);
va_list parameters;
@@ -875,7 +875,7 @@ nul_dbus_interface (const char *name,
for (p = interface->members; *p; ++p)
{
nul_dbus_member_t *member = *p;
-
+
member->interface = interface;
}
@@ -904,7 +904,7 @@ invoke_type_from_nul_dbus_type (nul_dbus_type_t *t)
case STRING:
return NUL_TYPE_POINTER;
}
-
+
g_warning ("Unknown type %d\n", t->type);
return -1;
}
@@ -917,12 +917,12 @@ make_fun_def (nul_dbus_member_t *member)
types = idle_free (g_new0 (nul_type_t, nul_parr_len (member->parameters) + 1));
types[0] = NUL_TYPE_POINTER; /* For object->data */
-
+
g_print ("length: %d\n", nul_parr_len (member->parameters));
for (i = 1; i < nul_parr_len (member->parameters); ++i)
{
nul_dbus_parameter_t *par = member->parameters[i - 1];
-
+
if (par->out)
types[i] = NUL_TYPE_POINTER;
else
@@ -942,30 +942,30 @@ make_reply_fun (nul_dbus_member_t *member)
int n;
types = idle_free (g_new0 (nul_type_t, nul_parr_len (member->parameters) + 2));
-
+
n = 0;
for (p = member->parameters; *p; ++p)
{
nul_dbus_parameter_t *par = *p;
-
+
g_assert (*p != NULL);
g_assert (par != NULL);
if (par->out)
types[n++] = invoke_type_from_nul_dbus_type (par->type);
}
-
+
types[n++] = NUL_TYPE_POINTER; /* data */
types[n++] = NUL_TYPE_POINTER; /* const GError *err */
-
+
return nul_fun_def_new (NUL_TYPE_VOID, n, types);
}
nul_dbus_member_t *
nul_dbus_method (const char *name,
- nul_dbus_function_t function,
- nul_dbus_parameter_t *parameter1,
- ...)
+ nul_dbus_function_t function,
+ nul_dbus_parameter_t *parameter1,
+ ...)
{
nul_dbus_member_t *member = g_new0 (nul_dbus_member_t, 1);
va_list parameters;
@@ -977,13 +977,13 @@ nul_dbus_method (const char *name,
va_start (parameters, parameter1);
member->parameters = make_ptr_array ((nul_dbus_type_t *)parameter1, parameters);
va_end (parameters);
-
+
member->n_inputs = 0;
member->n_outputs = 0;
for (p = member->parameters; *p; ++p)
{
nul_dbus_parameter_t *par = *p;
-
+
g_assert (*p != NULL);
g_assert (par != NULL);
@@ -994,7 +994,7 @@ nul_dbus_method (const char *name,
else
{
member->n_inputs++;
-
+
if (member->n_outputs)
{
g_critical ("All output parameters must be specified after the input parameters");
@@ -1025,14 +1025,14 @@ make_parameter (const char *name,
nul_dbus_parameter_t *
nul_dbus_parameter_in (const char *name,
- const nul_dbus_type_t *type)
+ const nul_dbus_type_t *type)
{
return make_parameter (name, type, FALSE);
}
nul_dbus_parameter_t *
nul_dbus_parameter_out (const char *name,
- const nul_dbus_type_t *type)
+ const nul_dbus_type_t *type)
{
return make_parameter (name, type, TRUE);
}
@@ -1083,9 +1083,9 @@ on_reply (DBusPendingCall *pending,
if (!info->callback)
return;
-
+
reply = dbus_pending_call_steal_reply (pending);
-
+
if (!reply)
{
/* FIXME: can this happen? If it can, we should
@@ -1093,7 +1093,7 @@ on_reply (DBusPendingCall *pending,
*/
return;
}
-
+
args[n_outputs].v_pointer = NULL; /* GError */
if (!decode_message (reply,
n_outputs,
@@ -1103,9 +1103,9 @@ on_reply (DBusPendingCall *pending,
/* FIXME: generate an error into args[n_outputs + 1] */
args[n_outputs].v_pointer = "ERR";
}
-
+
args[n_outputs + 1].v_pointer = info->data;
-
+
nul_fun_def_invoke (info->method->reply_fun, (nul_function_t)info->callback, args);
}
@@ -1121,7 +1121,7 @@ decode_method_desc (const char *method_desc,
char **method)
{
char *m;
-
+
g_return_val_if_fail (method_desc != NULL, FALSE);
g_return_val_if_fail (strchr (method_desc, '/') != NULL, FALSE);
g_return_val_if_fail (strchr (method_desc, '.') != NULL, FALSE);
@@ -1146,7 +1146,7 @@ find_object (nul_dbus_service_t *service, const char *name)
for (p = service->objects; *p != NULL; ++p)
{
nul_dbus_object_t *object = *p;
-
+
if (strcmp (object->name, name) == 0)
return object;
}
@@ -1162,7 +1162,7 @@ find_interface (nul_dbus_object_t *object, const char *name)
for (p = object->interfaces; *p; ++p)
{
nul_dbus_interface_t *interface = *p;
-
+
if (strcmp (interface->name, name) == 0)
return interface;
}
@@ -1178,7 +1178,7 @@ find_member (nul_dbus_interface_t *interface, const char *name)
for (p = interface->members; *p; ++p)
{
nul_dbus_member_t *member = *p;
-
+
if (strcmp (member->name, name) == 0)
return member;
}
@@ -1188,10 +1188,10 @@ find_member (nul_dbus_interface_t *interface, const char *name)
void
nul_dbus_invoke (nul_dbus_service_t *service,
- const char *method_desc,
- nul_dbus_function_t callback,
- gpointer data,
- ...)
+ const char *method_desc,
+ nul_dbus_function_t callback,
+ gpointer data,
+ ...)
{
char *object_str, *interface_str, *method_str;
nul_dbus_object_t *object;
@@ -1204,7 +1204,7 @@ nul_dbus_invoke (nul_dbus_service_t *service,
InvokeInfo *info;
DBusPendingCall *pending;
void **p;
-
+
g_return_if_fail (service != NULL);
if (!decode_method_desc (method_desc, &object_str, &interface_str, &method_str))
@@ -1231,27 +1231,27 @@ nul_dbus_invoke (nul_dbus_service_t *service,
int32_t i32;
uint32_t u32;
const char *s;
-
+
if (parameter->out)
continue;
-
+
switch (parameter->type->type)
{
case INT32:
i32 = va_arg (args, int32_t);
-
+
dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &i32);
break;
-
+
case UINT32:
u32 = va_arg (args, uint32_t);
-
+
dbus_message_iter_append_basic (&iter, DBUS_TYPE_UINT32, &u32);
break;
-
+
case STRING:
s = va_arg (args, const char *);
-
+
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &s);
break;
}
@@ -1265,7 +1265,7 @@ nul_dbus_invoke (nul_dbus_service_t *service,
if (!pending)
{
/* FIXME: generate an error and call the callback */
-
+
/* Or alternatively, we should deal with getting disconnected,
* though it's not clear what we should do with that
*/
@@ -1273,13 +1273,29 @@ nul_dbus_invoke (nul_dbus_service_t *service,
else
{
info = g_new0 (InvokeInfo, 1);
-
+
info->callback = callback;
info->data = data;
info->method = method;
-
+
dbus_pending_call_set_notify (pending, on_reply, info, g_free);
}
dbus_message_unref (message);
}
+
+void
+nul_dbus_service_set_callbacks (nul_dbus_service_t *service,
+ const char *name,
+ nul_dbus_function_t function,
+ gpointer data,
+ ...)
+{
+#if 0
+ va_start (parameters, parameter1);
+ member->parameters = make_ptr_array ((nul_dbus_type_t *)parameter1, parameters);
+ va_end (parameters);
+#endif
+
+
+}