aboutsummaryrefslogtreecommitdiffstats
path: root/modules/network-manager/evolution-network-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/network-manager/evolution-network-manager.c')
-rw-r--r--modules/network-manager/evolution-network-manager.c132
1 files changed, 60 insertions, 72 deletions
diff --git a/modules/network-manager/evolution-network-manager.c b/modules/network-manager/evolution-network-manager.c
index 7dc110f411..d63eed22cf 100644
--- a/modules/network-manager/evolution-network-manager.c
+++ b/modules/network-manager/evolution-network-manager.c
@@ -16,9 +16,7 @@
*
*/
-#include <dbus/dbus.h>
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
+#include <gio/gio.h>
#include <NetworkManager/NetworkManager.h>
#include <shell/e-shell.h>
@@ -36,7 +34,7 @@ typedef struct _ENetworkManagerClass ENetworkManagerClass;
struct _ENetworkManager {
EExtension parent;
- DBusConnection *connection;
+ GDBusConnection *connection;
};
struct _ENetworkManagerClass {
@@ -63,45 +61,38 @@ network_manager_get_shell (ENetworkManager *extension)
return E_SHELL (extensible);
}
-static DBusHandlerResult
-network_manager_monitor (DBusConnection *connection G_GNUC_UNUSED,
- DBusMessage *message,
- gpointer user_data)
+static void
+nm_connection_closed_cb (GDBusConnection *pconnection, gboolean remote_peer_vanished, GError *error, gpointer user_data)
{
ENetworkManager *extension = user_data;
- EShell *shell;
- const gchar *path;
- guint32 state;
- DBusError error = DBUS_ERROR_INIT;
-
- shell = network_manager_get_shell (extension);
-
- path = dbus_message_get_path (message);
-
- if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected") &&
- g_strcmp0 (path, DBUS_PATH_LOCAL) == 0) {
- dbus_connection_unref (extension->connection);
- extension->connection = NULL;
- g_timeout_add_seconds (
- 3, (GSourceFunc) network_manager_connect, extension);
+ g_object_unref (extension->connection);
+ extension->connection = NULL;
- return DBUS_HANDLER_RESULT_HANDLED;
- }
+ g_timeout_add_seconds (
+ 3, (GSourceFunc) network_manager_connect, extension);
+}
- if (!dbus_message_is_signal (message, NM_DBUS_INTERFACE, "StateChanged"))
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+static void
+network_manager_signal_cb (GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
+{
+ ENetworkManager *extension = user_data;
+ EShell *shell;
+ guint32 state;
- dbus_message_get_args (
- message, &error,
- DBUS_TYPE_UINT32, &state,
- DBUS_TYPE_INVALID);
+ shell = network_manager_get_shell (extension);
- if (dbus_error_is_set (&error)) {
- g_warning ("%s", error.message);
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- }
+ if (g_strcmp0 (interface_name, NM_DBUS_INTERFACE) != 0
+ || g_strcmp0 (signal_name, "StateChanged") != 0)
+ return;
+ g_variant_get (parameters, "(u)", &state);
switch (state) {
case NM_STATE_CONNECTED:
e_shell_set_network_available (shell, TRUE);
@@ -113,35 +104,35 @@ network_manager_monitor (DBusConnection *connection G_GNUC_UNUSED,
default:
break;
}
-
- return DBUS_HANDLER_RESULT_HANDLED;
}
static void
network_manager_check_initial_state (ENetworkManager *extension)
{
EShell *shell;
- DBusMessage *message = NULL;
- DBusMessage *response = NULL;
+ GDBusMessage *message = NULL;
+ GDBusMessage *response = NULL;
guint32 state = -1;
- DBusError error = DBUS_ERROR_INIT;
+ GError *error = NULL;
shell = network_manager_get_shell (extension);
- message = dbus_message_new_method_call (
+ message = g_dbus_message_new_method_call (
NM_DBUS_SERVICE, NM_DBUS_PATH, NM_DBUS_INTERFACE, "state");
/* XXX Assuming this should be safe to call synchronously. */
- response = dbus_connection_send_with_reply_and_block (
- extension->connection, message, 100, &error);
+ response = g_dbus_connection_send_message_with_reply_sync (
+ extension->connection, message, 100, NULL, NULL, &error);
if (response != NULL) {
- dbus_message_get_args (
- response, &error, DBUS_TYPE_UINT32,
- &state, DBUS_TYPE_INVALID);
+ GVariant *body = g_dbus_message_get_body (response);
+
+ g_variant_get (body, "(u)", &state);
} else {
- g_warning ("%s", error.message);
- dbus_error_free (&error);
+ g_warning ("%s: %s", G_STRFUNC, error ? error->message : "Unknown error");
+ if (error)
+ g_error_free (error);
+ g_object_unref (message);
return;
}
@@ -150,14 +141,14 @@ network_manager_check_initial_state (ENetworkManager *extension)
if (state == NM_STATE_ASLEEP || state == NM_STATE_DISCONNECTED)
e_shell_set_network_available (shell, FALSE);
- dbus_message_unref (message);
- dbus_message_unref (response);
+ g_object_unref (message);
+ g_object_unref (response);
}
static gboolean
network_manager_connect (ENetworkManager *extension)
{
- DBusError error = DBUS_ERROR_INIT;
+ GError *error = NULL;
/* This is a timeout callback, so the return value denotes
* whether to reschedule, not whether we're successful. */
@@ -165,40 +156,37 @@ network_manager_connect (ENetworkManager *extension)
if (extension->connection != NULL)
return FALSE;
- extension->connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
+ extension->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
if (extension->connection == NULL) {
- g_warning ("%s", error.message);
- dbus_error_free (&error);
+ g_warning ("%s: %s", G_STRFUNC, error ? error->message : "Unknown error");
+ g_error_free (error);
+
return TRUE;
}
- dbus_connection_setup_with_g_main (extension->connection, NULL);
- dbus_connection_set_exit_on_disconnect (extension->connection, FALSE);
+ g_dbus_connection_set_exit_on_close (extension->connection, FALSE);
- if (!dbus_connection_add_filter (
+ if (!g_dbus_connection_signal_subscribe (
extension->connection,
- network_manager_monitor, extension, NULL))
+ NM_DBUS_SERVICE,
+ NM_DBUS_INTERFACE,
+ NULL,
+ NM_DBUS_PATH,
+ NULL,
+ network_manager_signal_cb,
+ extension,
+ NULL)) {
+ g_warning ("%s: Failed to subscribe for a signal", G_STRFUNC);
goto fail;
+ }
+ g_signal_connect (extension->connection, "closed", G_CALLBACK (nm_connection_closed_cb), extension);
network_manager_check_initial_state (extension);
- dbus_bus_add_match (
- extension->connection,
- "type='signal',"
- "interface='" NM_DBUS_INTERFACE "',"
- "sender='" NM_DBUS_SERVICE "',"
- "path='" NM_DBUS_PATH "'",
- &error);
- if (dbus_error_is_set (&error)) {
- g_warning ("%s", error.message);
- dbus_error_free (&error);
- goto fail;
- }
-
return FALSE;
fail:
- dbus_connection_unref (extension->connection);
+ g_object_unref (extension->connection);
extension->connection = NULL;
return TRUE;