diff options
author | Søren Sandmann Pedersen <sandmann@daimi.au.dk> | 2009-04-16 21:19:39 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <sandmann@daimi.au.dk> | 2009-04-16 21:19:39 -0400 |
commit | 1348b89584376d6797a0f95b982872f1f31da078 (patch) | |
tree | 887c7779be4b603953d92050bdf28088b5f66d49 | |
parent | 195e7621fd34c0648b3d85cc84e9a6e0f51c96c4 (diff) |
Simplify decoding regular messages
-rw-r--r-- | dbus.c | 118 |
1 files changed, 32 insertions, 86 deletions
@@ -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 |