summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <sandmann@daimi.au.dk>2009-04-25 19:26:41 -0400
committerSøren Sandmann Pedersen <sandmann@daimi.au.dk>2009-08-29 11:07:52 -0400
commit2a01fbf4188f5027ae39bf81ce59c04c10c72f60 (patch)
treef9e667d439b0908f8a764c3a718faf412a3944a9
parentf61470d0bf5a9473e6faf54b7241126cc217c426 (diff)
First step towards moving messages into dbus-int.c
-rw-r--r--dbus-int.c55
-rw-r--r--dbus.c11
-rw-r--r--libnul-private.h56
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 <dbus/dbus.h>
#include <string.h>
#include "libnul-private.h"
+
typedef struct object_info_t object_info_t;
struct object_info_t
{
@@ -25,6 +26,60 @@ struct connection_t
};
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)
{
dbus_watch_handle (watch, 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);