summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2008-05-08 19:12:44 +0000
committerMarcel Holtmann <marcel@holtmann.org>2008-05-08 19:12:44 +0000
commit33191e6275ab82aa4161cdf75b45597e4d1568ec (patch)
treed20e3027a12c57aee6ef221ff8cc347f4e2f9989 /common
parent6bf91edf6cdb840c0f40572f1a20d381fd2cdc5e (diff)
Move D-Bus mainloop integration into libgdbus
Diffstat (limited to 'common')
-rw-r--r--common/dbus.c385
-rw-r--r--common/dbus.h11
2 files changed, 0 insertions, 396 deletions
diff --git a/common/dbus.c b/common/dbus.c
index beb97a07..4ea56c9f 100644
--- a/common/dbus.c
+++ b/common/dbus.c
@@ -48,35 +48,9 @@
#include "dbus.h"
#include "logging.h"
-#define DISPATCH_TIMEOUT 0
-
static guint listener_id = 0;
static GSList *name_listeners = NULL;
-#ifndef HAVE_DBUS_GLIB
-typedef struct {
- uint32_t id;
- DBusTimeout *timeout;
-} timeout_handler_t;
-
-struct watch_info {
- guint watch_id;
- GIOChannel *io;
- DBusConnection *conn;
-};
-
-struct server_info {
- guint watch_id;
- GIOChannel *io;
- DBusServer *server;
-};
-#endif
-
-struct disconnect_data {
- void (*disconnect_cb)(void *);
- void *user_data;
-};
-
struct name_callback {
name_cb_t func;
void *user_data;
@@ -415,362 +389,3 @@ int name_listener_indicate_disconnect(DBusConnection *connection)
return 0;
}
-
-static DBusHandlerResult disconnect_filter(DBusConnection *conn,
- DBusMessage *msg, void *data)
-{
- struct disconnect_data *dc_data = data;
-
- if (dbus_message_is_signal(msg,
- DBUS_INTERFACE_LOCAL, "Disconnected") == TRUE) {
- error("Got disconnected from the system message bus");
- dbus_connection_unref(conn);
- dc_data->disconnect_cb(dc_data->user_data);
- }
-
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-#ifndef HAVE_DBUS_GLIB
-static dbus_int32_t server_slot = -1;
-
-static gboolean server_func(GIOChannel *chan, GIOCondition cond, gpointer data)
-{
- DBusWatch *watch = data;
- int flags = 0;
-
- if (cond & G_IO_IN) flags |= DBUS_WATCH_READABLE;
- if (cond & G_IO_OUT) flags |= DBUS_WATCH_WRITABLE;
- if (cond & G_IO_HUP) flags |= DBUS_WATCH_HANGUP;
- if (cond & G_IO_ERR) flags |= DBUS_WATCH_ERROR;
-
- dbus_watch_handle(watch, flags);
-
- return TRUE;
-}
-
-static dbus_bool_t add_server(DBusWatch *watch, void *data)
-{
- GIOCondition cond = G_IO_HUP | G_IO_ERR;
- DBusServer *server = data;
- struct server_info *info;
- int fd, flags;
-
- if (!dbus_watch_get_enabled(watch))
- return TRUE;
-
- info = g_new(struct server_info, 1);
-
- fd = dbus_watch_get_unix_fd(watch);
- info->io = g_io_channel_unix_new(fd);
- info->server = dbus_server_ref(server);
-
- dbus_watch_set_data(watch, info, NULL);
-
- flags = dbus_watch_get_flags(watch);
-
- if (flags & DBUS_WATCH_READABLE) cond |= G_IO_IN;
- if (flags & DBUS_WATCH_WRITABLE) cond |= G_IO_OUT;
-
- info->watch_id = g_io_add_watch(info->io, cond, server_func, watch);
-
- return TRUE;
-}
-
-static void remove_server(DBusWatch *watch, void *data)
-{
- struct server_info *info = dbus_watch_get_data(watch);
-
- dbus_watch_set_data(watch, NULL, NULL);
-
- if (info) {
- g_source_remove(info->watch_id);
- g_io_channel_unref(info->io);
- dbus_server_unref(info->server);
- g_free(info);
- }
-}
-
-static void server_toggled(DBusWatch *watch, void *data)
-{
- /* Because we just exit on OOM, enable/disable is
- * no different from add/remove */
- if (dbus_watch_get_enabled(watch))
- add_server(watch, data);
- else
- remove_server(watch, data);
-}
-
-static gboolean message_dispatch_cb(void *data)
-{
- DBusConnection *connection = data;
-
- dbus_connection_ref(connection);
-
- /* Dispatch messages */
- while (dbus_connection_dispatch(connection) == DBUS_DISPATCH_DATA_REMAINS);
-
- dbus_connection_unref(connection);
-
- return FALSE;
-}
-
-static gboolean watch_func(GIOChannel *chan, GIOCondition cond, gpointer data)
-{
- DBusWatch *watch = data;
- struct watch_info *info = dbus_watch_get_data(watch);
- int flags = 0;
-
- if (cond & G_IO_IN) flags |= DBUS_WATCH_READABLE;
- if (cond & G_IO_OUT) flags |= DBUS_WATCH_WRITABLE;
- if (cond & G_IO_HUP) flags |= DBUS_WATCH_HANGUP;
- if (cond & G_IO_ERR) flags |= DBUS_WATCH_ERROR;
-
- dbus_watch_handle(watch, flags);
-
- if (dbus_connection_get_dispatch_status(info->conn) == DBUS_DISPATCH_DATA_REMAINS)
- g_timeout_add(DISPATCH_TIMEOUT, message_dispatch_cb, info->conn);
-
- return TRUE;
-}
-
-static dbus_bool_t add_watch(DBusWatch *watch, void *data)
-{
- GIOCondition cond = G_IO_HUP | G_IO_ERR;
- DBusConnection *conn = data;
- struct watch_info *info;
- int fd, flags;
-
- if (!dbus_watch_get_enabled(watch))
- return TRUE;
-
- info = g_new(struct watch_info, 1);
-
- fd = dbus_watch_get_unix_fd(watch);
- info->io = g_io_channel_unix_new(fd);
- info->conn = dbus_connection_ref(conn);
-
- dbus_watch_set_data(watch, info, NULL);
-
- flags = dbus_watch_get_flags(watch);
-
- if (flags & DBUS_WATCH_READABLE) cond |= G_IO_IN;
- if (flags & DBUS_WATCH_WRITABLE) cond |= G_IO_OUT;
-
- info->watch_id = g_io_add_watch(info->io, cond, watch_func, watch);
-
- return TRUE;
-}
-
-static void remove_watch(DBusWatch *watch, void *data)
-{
- struct watch_info *info = dbus_watch_get_data(watch);
-
- dbus_watch_set_data(watch, NULL, NULL);
-
- if (info) {
- g_source_remove(info->watch_id);
- g_io_channel_unref(info->io);
- dbus_connection_unref(info->conn);
- g_free(info);
- }
-}
-
-static void watch_toggled(DBusWatch *watch, void *data)
-{
- /* Because we just exit on OOM, enable/disable is
- * no different from add/remove */
- if (dbus_watch_get_enabled(watch))
- add_watch(watch, data);
- else
- remove_watch(watch, data);
-}
-
-static gboolean timeout_handler_dispatch(gpointer data)
-{
- timeout_handler_t *handler = data;
-
- /* if not enabled should not be polled by the main loop */
- if (dbus_timeout_get_enabled(handler->timeout) != TRUE)
- return FALSE;
-
- dbus_timeout_handle(handler->timeout);
-
- return FALSE;
-}
-
-static void timeout_handler_free(void *data)
-{
- timeout_handler_t *handler = data;
- if (!handler)
- return;
-
- g_source_remove(handler->id);
- g_free(handler);
-}
-
-static dbus_bool_t add_timeout(DBusTimeout *timeout, void *data)
-{
- timeout_handler_t *handler;
-
- if (!dbus_timeout_get_enabled(timeout))
- return TRUE;
-
- handler = g_new0(timeout_handler_t, 1);
-
- handler->timeout = timeout;
- handler->id = g_timeout_add(dbus_timeout_get_interval(timeout),
- timeout_handler_dispatch, handler);
-
- dbus_timeout_set_data(timeout, handler, timeout_handler_free);
-
- return TRUE;
-}
-
-static void remove_timeout(DBusTimeout *timeout, void *data)
-{
-}
-
-static void timeout_toggled(DBusTimeout *timeout, void *data)
-{
- if (dbus_timeout_get_enabled(timeout))
- add_timeout(timeout, data);
- else
- remove_timeout(timeout, data);
-}
-
-static void dispatch_status_cb(DBusConnection *conn,
- DBusDispatchStatus new_status, void *data)
-{
- if (!dbus_connection_get_is_connected(conn))
- return;
-
- if (new_status == DBUS_DISPATCH_DATA_REMAINS)
- g_timeout_add(DISPATCH_TIMEOUT, message_dispatch_cb, data);
-}
-#endif
-
-void setup_dbus_server_with_main_loop(DBusServer *server)
-{
-#ifdef HAVE_DBUS_GLIB
- debug("Using D-Bus GLib server setup");
-
- dbus_server_setup_with_g_main(server, NULL);
-#else
- dbus_server_allocate_data_slot(&server_slot);
- if (server_slot < 0)
- return;
-
- dbus_server_set_data(server, server_slot, server, NULL);
-
- dbus_server_set_watch_functions(server, add_server, remove_server,
- server_toggled, server, NULL);
-
- dbus_server_set_timeout_functions(server, add_timeout, remove_timeout,
- timeout_toggled, server, NULL);
-#endif
-}
-
-void setup_dbus_with_main_loop(DBusConnection *conn)
-{
-#ifdef HAVE_DBUS_GLIB
- debug("Using D-Bus GLib connection setup");
-
- dbus_connection_setup_with_g_main(conn, NULL);
-#else
- dbus_connection_set_watch_functions(conn, add_watch, remove_watch,
- watch_toggled, conn, NULL);
-
- dbus_connection_set_timeout_functions(conn, add_timeout, remove_timeout,
- timeout_toggled, conn, NULL);
-
- dbus_connection_set_dispatch_status_function(conn, dispatch_status_cb,
- conn, NULL);
-#endif
-}
-
-DBusConnection *init_dbus(const char *name,
- void (*disconnect_cb)(void *), void *user_data)
-{
- struct disconnect_data *dc_data;
- DBusConnection *conn;
- DBusError err;
-
- dbus_error_init(&err);
-
- conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
-
- if (dbus_error_is_set(&err)) {
- error("Can't connect to system message bus: %s", err.message);
- dbus_error_free(&err);
- return NULL;
- }
-
- setup_dbus_with_main_loop(conn);
-
- if (name) {
- dbus_error_init(&err);
-
- if (dbus_bus_request_name(conn, name, 0, &err) !=
- DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER ) {
- error("Could not become the primary owner of %s", name);
- dbus_connection_unref(conn);
- return NULL;
- }
-
- if (dbus_error_is_set(&err)) {
- error("Can't get bus name %s: %s", name, err.message);
- dbus_error_free(&err);
- dbus_connection_unref(conn);
- return NULL;
- }
- }
-
- if (!disconnect_cb)
- return conn;
-
- dc_data = g_new(struct disconnect_data, 1);
-
- dc_data->disconnect_cb = disconnect_cb;
- dc_data->user_data = user_data;
-
- dbus_connection_set_exit_on_disconnect(conn, FALSE);
-
- if (!dbus_connection_add_filter(conn, disconnect_filter,
- dc_data, g_free)) {
- error("Can't add D-Bus disconnect filter");
- g_free(dc_data);
- dbus_connection_unref(conn);
- return NULL;
- }
-
- return conn;
-}
-
-DBusConnection *init_dbus_direct(const char *address)
-{
- DBusConnection *conn;
- DBusError err;
-
- dbus_error_init(&err);
-
- conn = dbus_connection_open(address, &err);
-
- if (dbus_error_is_set(&err)) {
- error("Can't connect to message server: %s", err.message);
- dbus_error_free(&err);
- return NULL;
- }
-
- setup_dbus_with_main_loop(conn);
-
- dbus_connection_set_exit_on_disconnect(conn, FALSE);
-
- return conn;
-}
-
-DBusConnection *dbus_bus_system_setup_with_main_loop(const char *name,
- void (*disconnect_cb)(void *), void *user_data)
-{
- return init_dbus(name, disconnect_cb, user_data);
-}
diff --git a/common/dbus.h b/common/dbus.h
index 94244eb6..5976a479 100644
--- a/common/dbus.h
+++ b/common/dbus.h
@@ -27,17 +27,6 @@
#include <dbus/dbus.h>
#include <glib.h>
-void setup_dbus_server_with_main_loop(DBusServer *server);
-void setup_dbus_with_main_loop(DBusConnection *conn);
-
-DBusConnection *init_dbus(const char *name,
- void (*disconnect_cb)(void *), void *user_data);
-
-DBusConnection *init_dbus_direct(const char *address);
-
-DBusConnection *dbus_bus_system_setup_with_main_loop(const char *name,
- void (*disconnect_cb)(void *), void *user_data);
-
typedef void (*name_cb_t)(const char *name, void *user_data);
guint name_listener_add(DBusConnection *connection, const char *name,