diff options
author | Søren Sandmann Pedersen <ssp@dhcp-100-2-40.bos.redhat.com> | 2009-04-02 21:51:36 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@dhcp-100-2-40.bos.redhat.com> | 2009-04-02 21:51:36 -0400 |
commit | e102e8189f8abe9262bca75995cc85d0090b51d4 (patch) | |
tree | 0097cc89639e381f0276a7437fffb304be53fce1 /dbus.c | |
parent | 9990c750357e70f287400a4bea26997cf632874f (diff) |
TODO
Diffstat (limited to 'dbus.c')
-rw-r--r-- | dbus.c | 232 |
1 files changed, 124 insertions, 108 deletions
@@ -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 + + +} |