summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <sandmann@daimi.au.dk>2009-04-16 21:19:39 -0400
committerSøren Sandmann Pedersen <sandmann@daimi.au.dk>2009-04-16 21:19:39 -0400
commit1348b89584376d6797a0f95b982872f1f31da078 (patch)
tree887c7779be4b603953d92050bdf28088b5f66d49
parent195e7621fd34c0648b3d85cc84e9a6e0f51c96c4 (diff)
Simplify decoding regular messages
-rw-r--r--dbus.c118
1 files changed, 32 insertions, 86 deletions
diff --git a/dbus.c b/dbus.c
index bdca8d5..5bc3eda 100644
--- a/dbus.c
+++ b/dbus.c
@@ -393,77 +393,6 @@ introspect (nul_dbus_object_t *object)
return idle_free (g_string_free (xml, FALSE));
}
-static gboolean
-decode_message (DBusMessage *message,
- int n_parameters,
- nul_dbus_parameter_t **parameters,
- nul_arg_t *args)
-{
- gboolean has_args;
- 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
- */
-
- 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:
- if (dbus_type != DBUS_TYPE_UINT32)
- {
- error = "Received wrong type, should be UINT32";
- goto fail;
- }
- dbus_message_iter_get_basic (&iter, &(args[i].v_uint32));
- break;
-
- case INT32:
- if (dbus_type != DBUS_TYPE_INT32)
- {
- error = "Received wrong type, should be INT32";
- goto fail;
- }
- dbus_message_iter_get_basic (&iter, &(args[i].v_int32));
- break;
-
- case STRING:
- if (dbus_type != DBUS_TYPE_STRING)
- {
- error = "Received wrong type, should be STRING";
- goto fail;
- }
- 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;
-}
static gboolean
decode_arg (nul_arg_t **args,
@@ -613,42 +542,54 @@ invoke (DBusConnection *connection,
nul_dbus_member_t *member,
DBusMessage *message)
{
- nul_arg_t *args = idle_free (
- g_new0 (nul_arg_t, nul_ptr_array_len (member->parameters) + 1));
+ nul_arg_t *args = nul_array_new (sizeof (nul_arg_t));
DBusMessage *error_reply;
- nul_arg_t result;
+ nul_dbus_parameter_t **inputs;
+ DBusHandlerResult result;
+ nul_arg_t rv;
+ nul_arg_t arg;
+ char *err;
int i;
if (!member->function)
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
/* 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])))
+
+ arg.v_pointer = object->data;
+
+ args = nul_array_append (args, &arg);
+
+ inputs = (nul_dbus_parameter_t **)member->parameters;
+
+ if (!ddecode_message (&args, message, member->n_inputs, inputs, &err))
{
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;
+ result = DBUS_HANDLER_RESULT_HANDLED;
+ goto out;
}
for (i = member->n_inputs; member->parameters[i] != NULL; ++i)
{
nul_dbus_parameter_t *parameter = member->parameters[i];
-
+ nul_ptr_t *pa;
+
g_assert (parameter->out);
- args[i + 1].v_pointer = &(args[i + 1]);
+ args = nul_array_append (args, &arg);
+
+ pa = &(args[nul_array_len (args) - 1].v_pointer);
+
+ *pa = pa;
}
- result = nul_fun_def_invoke (member->fun_def, (nul_function_t)member->function, args);
+ rv = nul_fun_def_invoke (member->fun_def, (nul_function_t)member->function, args);
- if (result.v_int32)
+ if (rv.v_int32)
{
DBusMessage *reply = dbus_message_new_method_return (message);
@@ -659,13 +600,18 @@ invoke (DBusConnection *connection,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
- return DBUS_HANDLER_RESULT_HANDLED;
+
+ result = DBUS_HANDLER_RESULT_HANDLED;
}
else
{
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
+out:
+ nul_array_free (args);
+
+ return result;
}
static DBusHandlerResult