From 2a01fbf4188f5027ae39bf81ce59c04c10c72f60 Mon Sep 17 00:00:00 2001 From: Søren Sandmann Pedersen Date: Sat, 25 Apr 2009 19:26:41 -0400 Subject: First step towards moving messages into dbus-int.c --- dbus-int.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ dbus.c | 11 ++--------- libnul-private.h | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 110 insertions(+), 12 deletions(-) diff --git a/dbus-int.c b/dbus-int.c index d8f3bb1..251d91d 100644 --- a/dbus-int.c +++ b/dbus-int.c @@ -6,6 +6,7 @@ #include #include #include "libnul-private.h" + typedef struct object_info_t object_info_t; struct object_info_t { @@ -24,6 +25,60 @@ struct connection_t char ** names; }; +static void +decode_arg (DBusMessageIter *iter, + primitive_t *primitive, + value_t *value) +{ + int dbus_type = dbus_message_iter_get_arg_type (iter); + + switch (dbus_type) + { + case DBUS_TYPE_UINT32: + *primitive = UINT32; + + dbus_message_iter_get_basic (iter, &value->u32); + break; + + case DBUS_TYPE_INT32: + *primitive = INT32; + + dbus_message_iter_get_basic (iter, &value->i32); + break; + + case DBUS_TYPE_STRING: + *primitive = STRING; + + dbus_message_iter_get_basic (iter, &value->s); + value->s = g_strdup (value->s); + break; + } +} + +static message_t * +decode_message (DBusMessage *dmsg, char **err) +{ + DBusMessageIter iter; + message_t *message; + + message = g_new0 (message_t, 1); + message->arguments = nul_array_new (typed_value_t); + + if (dbus_message_iter_init (dmsg, &iter)) + { + do + { + typed_value_t value; + + decode_arg (&iter, &value.type, &value.value); + + message->arguments = nul_array_append (message->arguments, value); + } while (dbus_message_iter_next (&iter)); + } + + return message; +} + static void process_watch (DBusWatch *watch, int flags) { diff --git a/dbus.c b/dbus.c index 6910120..3fd9652 100644 --- a/dbus.c +++ b/dbus.c @@ -70,20 +70,13 @@ struct nul_dbus_member_t struct nul_dbus_parameter_t { char * name; - nul_dbus_type_t * type; + nul_dbus_type_t * type; gboolean out; }; -typedef enum -{ - INT32, - UINT32, - STRING -} Primitive; - struct nul_dbus_type_t { - Primitive type; + primitive_t type; }; typedef void (* nul_free_func_t) (nul_ptr_t p); diff --git a/libnul-private.h b/libnul-private.h index a055b03..7925d8c 100644 --- a/libnul-private.h +++ b/libnul-private.h @@ -1,11 +1,46 @@ #include "libnul.h" -typedef struct connection_t connection_t; -typedef struct message_t message_t; +typedef struct connection_t connection_t; +typedef struct message_t message_t; +typedef struct typed_value_t typed_value_t; +typedef union value_t value_t; + typedef gboolean (* message_func_t) (connection_t *connection, DBusMessage *message, nul_ptr_t data); +typedef enum +{ + INT32, + UINT32, + STRING +} primitive_t; + +union value_t +{ + int32_t i32; + uint32_t u32; + double d; + char *s; +}; + +struct typed_value_t +{ + primitive_t type; + + value_t value; +}; + +struct message_t +{ + char *service; + char *path; + char *interface; + char *member; + + typed_value_t *arguments; +}; + connection_t *connection_new_session (void); connection_t *connection_new_system (void); void connection_register_object (connection_t *connection, @@ -23,4 +58,19 @@ gboolean connection_send_with_reply (connection_t *connection, message_func_t func, gpointer data); void connection_release_name (connection_t *connection, - const char * name); + const char *name); + +message_t *message_new_error (const message_t *in_reply_to, + const char **message); +message_t *message_new_return (const message_t *in_reply_to); +message_t *message_new_method_call (const char *service_name, + const char *object_name, + const char *interface_name, + const char *method_name); +void message_append_string (message_t *message, + const char *string); +void message_append_int32 (message_t *message, + int value); +void message_append_uint32 (message_t *message, + uint32_t value); +void message_free (message_t *mesage); -- cgit v1.2.3