*
* D-Bus helper library
*
- * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org>
+ * Copyright (C) 2004-2011 Marcel Holtmann <marcel@holtmann.org>
*
*
* This program is free software; you can redistribute it and/or modify
#include <glib.h>
#include <dbus/dbus.h>
-#ifdef NEED_DBUS_WATCH_GET_UNIX_FD
-#define dbus_watch_get_unix_fd dbus_watch_get_fd
-#endif
-
#include "gdbus.h"
#define DISPATCH_TIMEOUT 0
{
struct watch_info *info = data;
unsigned int flags = 0;
+ DBusDispatchStatus status;
dbus_connection_ref(info->conn);
dbus_watch_handle(info->watch, flags);
+ status = dbus_connection_get_dispatch_status(info->conn);
+ queue_dispatch(info->conn, status);
+
dbus_connection_unref(info->conn);
return TRUE;
static void remove_timeout(DBusTimeout *timeout, void *data)
{
- if (dbus_timeout_get_enabled(timeout))
- return;
-
/* will trigger timeout_handler_free() */
dbus_timeout_set_data(timeout, NULL, NULL);
}
NULL, NULL);
}
+static gboolean setup_bus(DBusConnection *conn, const char *name,
+ DBusError *error)
+{
+ gboolean result;
+ DBusDispatchStatus status;
+
+ if (name != NULL) {
+ result = g_dbus_request_name(conn, name, error);
+
+ if (error != NULL) {
+ if (dbus_error_is_set(error) == TRUE)
+ return FALSE;
+ }
+
+ if (result == FALSE)
+ return FALSE;
+ }
+
+ setup_dbus_with_main_loop(conn);
+
+ status = dbus_connection_get_dispatch_status(conn);
+ queue_dispatch(conn, status);
+
+ return TRUE;
+}
+
DBusConnection *g_dbus_setup_bus(DBusBusType type, const char *name,
DBusError *error)
{
DBusConnection *conn;
- DBusDispatchStatus status;
- gboolean result;
conn = dbus_bus_get(type, error);
if (conn == NULL)
return NULL;
- if (name != NULL) {
- result = g_dbus_request_name(conn, name, error);
+ if (setup_bus(conn, name, error) == FALSE) {
+ dbus_connection_unref(conn);
+ return NULL;
+ }
- if (error != NULL) {
- if (dbus_error_is_set(error) == TRUE)
- result = FALSE;
- }
+ return conn;
+}
+
+DBusConnection *g_dbus_setup_private(DBusBusType type, const char *name,
+ DBusError *error)
+{
+ DBusConnection *conn;
+
+ conn = dbus_bus_get_private(type, error);
- if (result == FALSE) {
- dbus_connection_unref(conn);
+ if (error != NULL) {
+ if (dbus_error_is_set(error) == TRUE)
return NULL;
- }
}
- setup_dbus_with_main_loop(conn);
+ if (conn == NULL)
+ return NULL;
- status = dbus_connection_get_dispatch_status(conn);
- queue_dispatch(conn, status);
+ if (setup_bus(conn, name, error) == FALSE) {
+ dbus_connection_unref(conn);
+ return NULL;
+ }
return conn;
}
return FALSE;
}
- if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
+ if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
+ if (error != NULL)
+ dbus_set_error(error, name, "Name already in use");
+
return FALSE;
+ }
return TRUE;
}