summaryrefslogtreecommitdiff
path: root/monitor/proxy/gproxyvolumemonitor.c
diff options
context:
space:
mode:
Diffstat (limited to 'monitor/proxy/gproxyvolumemonitor.c')
-rw-r--r--monitor/proxy/gproxyvolumemonitor.c1219
1 files changed, 701 insertions, 518 deletions
diff --git a/monitor/proxy/gproxyvolumemonitor.c b/monitor/proxy/gproxyvolumemonitor.c
index 2bf74ba4..ed823ed4 100644
--- a/monitor/proxy/gproxyvolumemonitor.c
+++ b/monitor/proxy/gproxyvolumemonitor.c
@@ -35,30 +35,30 @@
#include <glib.h>
#include <glib/gi18n-lib.h>
#include <gio/gio.h>
-#include <gvfsdbusutils.h>
#include "gproxyvolumemonitor.h"
#include "gproxymount.h"
#include "gproxyvolume.h"
#include "gproxydrive.h"
#include "gproxymountoperation.h"
+#include "gvfsvolumemonitordbus.h"
G_LOCK_DEFINE_STATIC(proxy_vm);
-static DBusConnection *the_session_bus = NULL;
-static gboolean the_session_bus_is_integrated = FALSE;
+static GDBusConnection *the_session_bus = NULL;
static GHashTable *the_volume_monitors = NULL;
struct _GProxyVolumeMonitor {
GNativeVolumeMonitor parent;
- DBusConnection *session_bus;
+
+ guint name_owner_id;
+ GVfsRemoteVolumeMonitor *proxy;
GHashTable *drives;
GHashTable *volumes;
GHashTable *mounts;
- /* The unique D-Bus name of the remote monitor or NULL if disconnected */
- gchar *unique_name;
+ gulong name_watcher_id;
};
G_DEFINE_DYNAMIC_TYPE_EXTENDED (GProxyVolumeMonitor,
@@ -67,9 +67,9 @@ G_DEFINE_DYNAMIC_TYPE_EXTENDED (GProxyVolumeMonitor,
G_TYPE_FLAG_ABSTRACT,
{})
-static void seed_monitor (GProxyVolumeMonitor *monitor);
+static gboolean g_proxy_volume_monitor_setup_session_bus_connection (void);
-static DBusHandlerResult filter_function (DBusConnection *connection, DBusMessage *message, void *user_data);
+static void seed_monitor (GProxyVolumeMonitor *monitor);
static void signal_emit_in_idle (gpointer object, const char *signal_name, gpointer other_object);
@@ -99,25 +99,6 @@ static is_supported_func is_supported_funcs[] = {
NULL
};
-static char *
-get_match_rule_for_signals (GProxyVolumeMonitor *monitor)
-{
- return g_strdup_printf ("type='signal',"
- "interface='org.gtk.Private.RemoteVolumeMonitor',"
- "sender='%s',",
- g_proxy_volume_monitor_get_dbus_name (monitor));
-}
-
-static char *
-get_match_rule_for_name_owner_changed (GProxyVolumeMonitor *monitor)
-{
- return g_strdup_printf ("type='signal',"
- "interface='org.freedesktop.DBus',"
- "member='NameOwnerChanged',"
- "arg0='%s'",
- g_proxy_volume_monitor_get_dbus_name (monitor));
-}
-
static void
g_proxy_volume_monitor_finalize (GObject *object)
{
@@ -365,6 +346,569 @@ get_mount_for_mount_path (const char *mount_path,
return mount;
}
+static void
+drive_changed (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ GVariant *Drive,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+ GProxyDrive *d;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ d = g_hash_table_lookup (monitor->drives, Id);
+ if (d != NULL)
+ {
+ g_proxy_drive_update (d, Drive);
+ signal_emit_in_idle (d, "changed", NULL);
+ signal_emit_in_idle (monitor, "drive-changed", d);
+ }
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+drive_connected (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ GVariant *Drive,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+ GProxyDrive *d;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ d = g_hash_table_lookup (monitor->drives, Id);
+ if (d == NULL)
+ {
+ d = g_proxy_drive_new (monitor);
+ g_proxy_drive_update (d, Drive);
+ g_hash_table_insert (monitor->drives, g_strdup (g_proxy_drive_get_id (d)), d);
+ signal_emit_in_idle (monitor, "drive-connected", d);
+ }
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+drive_disconnected (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ GVariant *Drive,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+ GProxyDrive *d;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ d = g_hash_table_lookup (monitor->drives, Id);
+ if (d != NULL)
+ {
+ g_object_ref (d);
+ g_hash_table_remove (monitor->drives, Id);
+ signal_emit_in_idle (d, "disconnected", NULL);
+ signal_emit_in_idle (monitor, "drive-disconnected", d);
+ g_object_unref (d);
+ }
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+drive_eject_button (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ GVariant *Drive,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+ GProxyDrive *d;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ d = g_hash_table_lookup (monitor->drives, Id);
+ if (d != NULL)
+ {
+ signal_emit_in_idle (d, "eject-button", NULL);
+ signal_emit_in_idle (monitor, "drive-eject-button", d);
+ }
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+drive_stop_button (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ GVariant *Drive,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+ GProxyDrive *d;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ d = g_hash_table_lookup (monitor->drives, Id);
+ if (d != NULL)
+ {
+ signal_emit_in_idle (d, "stop-button", NULL);
+ signal_emit_in_idle (monitor, "drive-stop-button", d);
+ }
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+mount_added (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ GVariant *Mount,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+ GProxyMount *m;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ m = g_hash_table_lookup (monitor->mounts, Id);
+ if (m == NULL)
+ {
+ m = g_proxy_mount_new (monitor);
+ g_proxy_mount_update (m, Mount);
+ g_hash_table_insert (monitor->mounts, g_strdup (g_proxy_mount_get_id (m)), m);
+ signal_emit_in_idle (monitor, "mount-added", m);
+ }
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+mount_changed (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ GVariant *Mount,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+ GProxyMount *m;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ m = g_hash_table_lookup (monitor->mounts, Id);
+ if (m != NULL)
+ {
+ g_proxy_mount_update (m, Mount);
+ signal_emit_in_idle (m, "changed", NULL);
+ signal_emit_in_idle (monitor, "mount-changed", m);
+ }
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+mount_pre_unmount (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ GVariant *Mount,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+ GProxyMount *m;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ m = g_hash_table_lookup (monitor->mounts, Id);
+ if (m != NULL)
+ {
+ signal_emit_in_idle (m, "pre-unmount", NULL);
+ signal_emit_in_idle (monitor, "mount-pre-unmount", m);
+ }
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+mount_removed (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ GVariant *Mount,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+ GProxyMount *m;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ m = g_hash_table_lookup (monitor->mounts, Id);
+ if (m != NULL)
+ {
+ g_object_ref (m);
+ g_hash_table_remove (monitor->mounts, Id);
+ signal_emit_in_idle (m, "unmounted", NULL);
+ signal_emit_in_idle (monitor, "mount-removed", m);
+ g_object_unref (m);
+ }
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+mount_op_aborted (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ g_proxy_mount_operation_handle_aborted (Id);
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+mount_op_ask_password (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ const gchar *MessageToShow,
+ const gchar *DefaultUser,
+ const gchar *DefaultDomain,
+ guint Flags,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ g_proxy_mount_operation_handle_ask_password (Id,
+ MessageToShow,
+ DefaultUser,
+ DefaultDomain,
+ Flags);
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+mount_op_ask_question (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ const gchar *MessageToShow,
+ const gchar *const *Choices,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ g_proxy_mount_operation_handle_ask_question (Id,
+ MessageToShow,
+ Choices);
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+mount_op_show_processes (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ const gchar *MessageToShow,
+ GVariant *Pid,
+ const gchar *const *Choices,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ g_proxy_mount_operation_handle_show_processes (Id,
+ MessageToShow,
+ Pid,
+ Choices);
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+volume_added (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ GVariant *Volume,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+ GProxyVolume *v;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ v = g_hash_table_lookup (monitor->volumes, Id);
+ if (v == NULL)
+ {
+ v = g_proxy_volume_new (monitor);
+ g_proxy_volume_update (v, Volume);
+ g_hash_table_insert (monitor->volumes, g_strdup (g_proxy_volume_get_id (v)), v);
+ signal_emit_in_idle (monitor, "volume-added", v);
+ }
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+volume_changed (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ GVariant *Volume,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+ GProxyVolume *v;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ v = g_hash_table_lookup (monitor->volumes, Id);
+ if (v != NULL)
+ {
+ GProxyShadowMount *shadow_mount;
+
+ g_proxy_volume_update (v, Volume);
+ signal_emit_in_idle (v, "changed", NULL);
+ signal_emit_in_idle (monitor, "volume-changed", v);
+
+ shadow_mount = g_proxy_volume_get_shadow_mount (v);
+ if (shadow_mount != NULL)
+ {
+ signal_emit_in_idle (shadow_mount, "changed", NULL);
+ signal_emit_in_idle (monitor, "mount-changed", shadow_mount);
+ g_object_unref (shadow_mount);
+ }
+ }
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+volume_removed (GVfsRemoteVolumeMonitor *object,
+ const gchar *TheDBusName,
+ const gchar *Id,
+ GVariant *Volume,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+ GProxyVolume *v;
+
+ G_LOCK (proxy_vm);
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ if (strcmp (TheDBusName, klass->dbus_name) != 0)
+ goto not_for_us;
+
+ v = g_hash_table_lookup (monitor->volumes, Id);
+ if (v != NULL)
+ {
+ g_object_ref (v);
+ g_hash_table_remove (monitor->volumes, Id);
+ signal_emit_in_idle (v, "removed", NULL);
+ signal_emit_in_idle (monitor, "volume-removed", v);
+ dispose_in_idle (v);
+ g_object_unref (v);
+ }
+
+ not_for_us:
+ G_UNLOCK (proxy_vm);
+}
+
+static void
+on_name_owner_appeared (GDBusConnection *connection,
+ const gchar *name,
+ const gchar *name_owner,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+ GHashTableIter hash_iter;
+ GProxyDrive *drive;
+ GProxyVolume *volume;
+ GProxyMount *mount;
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ g_warning ("New owner %s for volume monitor %s connected to the bus; seeding drives/volumes/mounts",
+ name_owner,
+ klass->dbus_name);
+
+ seed_monitor (monitor);
+
+ /* emit signals for all the drives/volumes/mounts "added" */
+ g_hash_table_iter_init (&hash_iter, monitor->drives);
+ while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &drive))
+ signal_emit_in_idle (monitor, "drive-connected", drive);
+
+ g_hash_table_iter_init (&hash_iter, monitor->volumes);
+ while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &volume))
+ signal_emit_in_idle (monitor, "volume-added", volume);
+
+ g_hash_table_iter_init (&hash_iter, monitor->mounts);
+ while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &mount))
+ signal_emit_in_idle (monitor, "mount-added", mount);
+}
+
+static void
+on_name_owner_vanished (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
+ GProxyVolumeMonitorClass *klass;
+ GHashTableIter hash_iter;
+ GProxyDrive *drive;
+ GProxyVolume *volume;
+ GProxyMount *mount;
+
+ klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
+
+ g_warning ("Owner of %s of volume monitor %s disconnected from the bus; removing drives/volumes/mounts",
+ name,
+ klass->dbus_name);
+
+ g_hash_table_iter_init (&hash_iter, monitor->mounts);
+ while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &mount))
+ {
+ signal_emit_in_idle (mount, "unmounted", NULL);
+ signal_emit_in_idle (monitor, "mount-removed", mount);
+ }
+ g_hash_table_remove_all (monitor->mounts);
+
+ g_hash_table_iter_init (&hash_iter, monitor->volumes);
+ while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &volume))
+ {
+ signal_emit_in_idle (volume, "removed", NULL);
+ signal_emit_in_idle (monitor, "volume-removed", volume);
+ }
+ g_hash_table_remove_all (monitor->volumes);
+
+ g_hash_table_iter_init (&hash_iter, monitor->drives);
+ while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &drive))
+ {
+ signal_emit_in_idle (drive, "disconnected", NULL);
+ signal_emit_in_idle (monitor, "drive-disconnected", drive);
+ }
+ g_hash_table_remove_all (monitor->drives);
+
+ /* TODO: maybe try to relaunch the monitor? */
+}
+
static GObject *
g_proxy_volume_monitor_constructor (GType type,
guint n_construct_properties,
@@ -374,8 +918,8 @@ g_proxy_volume_monitor_constructor (GType type,
GProxyVolumeMonitor *monitor;
GProxyVolumeMonitorClass *klass;
GObjectClass *parent_class;
- DBusError dbus_error;
- char *match_rule;
+ GError *error;
+ const char *dbus_name;
G_LOCK (proxy_vm);
@@ -387,6 +931,8 @@ g_proxy_volume_monitor_constructor (GType type,
goto out;
}
+ dbus_name = klass->dbus_name;
+
/* Invoke parent constructor. */
klass = G_PROXY_VOLUME_MONITOR_CLASS (g_type_class_peek (G_TYPE_PROXY_VOLUME_MONITOR));
parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
@@ -396,37 +942,52 @@ g_proxy_volume_monitor_constructor (GType type,
monitor = G_PROXY_VOLUME_MONITOR (object);
- dbus_error_init (&dbus_error);
- monitor->session_bus = dbus_connection_ref (the_session_bus);
+ error = NULL;
+ monitor->proxy = gvfs_remote_volume_monitor_proxy_new_sync (the_session_bus,
+ G_DBUS_PROXY_FLAGS_NONE,
+ dbus_name,
+ "/org/gtk/Private/RemoteVolumeMonitor",
+ NULL,
+ &error);
+ if (monitor->proxy == NULL)
+ {
+ g_printerr ("Error creating proxy: %s (%s, %d)\n",
+ error->message, g_quark_to_string (error->domain), error->code);
+ g_error_free (error);
+ goto out;
+ }
+
+ /* listen to volume monitor signals */
+ g_signal_connect (monitor->proxy, "drive-changed", G_CALLBACK (drive_changed), monitor);
+ g_signal_connect (monitor->proxy, "drive-connected", G_CALLBACK (drive_connected), monitor);
+ g_signal_connect (monitor->proxy, "drive-disconnected", G_CALLBACK (drive_disconnected), monitor);
+ g_signal_connect (monitor->proxy, "drive-eject-button", G_CALLBACK (drive_eject_button), monitor);
+ g_signal_connect (monitor->proxy, "drive-stop-button", G_CALLBACK (drive_stop_button), monitor);
+ g_signal_connect (monitor->proxy, "mount-added", G_CALLBACK (mount_added), monitor);
+ g_signal_connect (monitor->proxy, "mount-changed", G_CALLBACK (mount_changed), monitor);
+ g_signal_connect (monitor->proxy, "mount-op-aborted", G_CALLBACK (mount_op_aborted), monitor);
+ g_signal_connect (monitor->proxy, "mount-op-ask-password", G_CALLBACK (mount_op_ask_password), monitor);
+ g_signal_connect (monitor->proxy, "mount-op-ask-question", G_CALLBACK (mount_op_ask_question), monitor);
+ g_signal_connect (monitor->proxy, "mount-op-show-processes", G_CALLBACK (mount_op_show_processes), monitor);
+ g_signal_connect (monitor->proxy, "mount-pre-unmount", G_CALLBACK (mount_pre_unmount), monitor);
+ g_signal_connect (monitor->proxy, "mount-removed", G_CALLBACK (mount_removed), monitor);
+ g_signal_connect (monitor->proxy, "volume-added", G_CALLBACK (volume_added), monitor);
+ g_signal_connect (monitor->proxy, "volume-changed", G_CALLBACK (volume_changed), monitor);
+ g_signal_connect (monitor->proxy, "volume-removed", G_CALLBACK (volume_removed), monitor);
+
monitor->drives = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
monitor->volumes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
monitor->mounts = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
- dbus_connection_add_filter (monitor->session_bus, filter_function, monitor, NULL);
-
- /* listen to volume monitor signals */
- match_rule = get_match_rule_for_signals (monitor);
- dbus_bus_add_match (monitor->session_bus,
- match_rule,
- &dbus_error);
- if (dbus_error_is_set (&dbus_error)) {
- g_warning ("cannot add match rule '%s': %s: %s", match_rule, dbus_error.name, dbus_error.message);
- dbus_error_free (&dbus_error);
- }
- g_free (match_rule);
-
/* listen to when the owner of the service appears/disappears */
- match_rule = get_match_rule_for_name_owner_changed (monitor);
- dbus_bus_add_match (monitor->session_bus,
- match_rule,
- &dbus_error);
- if (dbus_error_is_set (&dbus_error)) {
- g_warning ("cannot add match rule '%s': %s: %s", match_rule, dbus_error.name, dbus_error.message);
- dbus_error_free (&dbus_error);
- }
- g_free (match_rule);
-
- seed_monitor (monitor);
+ /* this will automatically call on_name_owner_appeared() when the daemon is ready and seed drives/volumes/mounts */
+ monitor->name_watcher_id = g_bus_watch_name_on_connection (the_session_bus,
+ dbus_name,
+ G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
+ on_name_owner_appeared,
+ on_name_owner_vanished,
+ monitor,
+ NULL);
g_hash_table_insert (the_volume_monitors, (gpointer) type, object);
@@ -491,336 +1052,10 @@ dispose_in_idle (gpointer object)
g_idle_add ((GSourceFunc) dispose_in_idle_do, g_object_ref (object));
}
-
-
-static DBusHandlerResult
-filter_function (DBusConnection *connection, DBusMessage *message, void *user_data)
-{
- GProxyVolumeMonitor *monitor = G_PROXY_VOLUME_MONITOR (user_data);
- DBusMessageIter iter;
- const char *id;
- const char *the_dbus_name;
- const char *member;
- GProxyDrive *drive;
- GProxyVolume *volume;
- GProxyMount *mount;
- GProxyVolumeMonitorClass *klass;
-
- G_LOCK (proxy_vm);
-
- klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (monitor));
-
- member = dbus_message_get_member (message);
-
- if (dbus_message_is_signal (message, "org.freedesktop.DBus", "NameOwnerChanged"))
- {
- GHashTableIter hash_iter;
- GProxyMount *mount;
- GProxyVolume *volume;
- GProxyDrive *drive;
- const gchar *name;
- const gchar *old_owner;
- const gchar *new_owner;
-
- dbus_message_iter_init (message, &iter);
- dbus_message_iter_get_basic (&iter, &name);
- dbus_message_iter_next (&iter);
- dbus_message_iter_get_basic (&iter, &old_owner);
- dbus_message_iter_next (&iter);
- dbus_message_iter_get_basic (&iter, &new_owner);
- dbus_message_iter_next (&iter);
-
- if (strcmp (name, klass->dbus_name) != 0)
- goto not_for_us;
-
- if (monitor->unique_name != NULL && g_strcmp0 (new_owner, monitor->unique_name) != 0)
- {
- g_warning ("Owner %s of volume monitor %s disconnected from the bus; removing drives/volumes/mounts",
- monitor->unique_name,
- klass->dbus_name);
-
- g_hash_table_iter_init (&hash_iter, monitor->mounts);
- while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &mount))
- {
- signal_emit_in_idle (mount, "unmounted", NULL);
- signal_emit_in_idle (monitor, "mount-removed", mount);
- }
- g_hash_table_remove_all (monitor->mounts);
-
- g_hash_table_iter_init (&hash_iter, monitor->volumes);
- while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &volume))
- {
- signal_emit_in_idle (volume, "removed", NULL);
- signal_emit_in_idle (monitor, "volume-removed", volume);
- }
- g_hash_table_remove_all (monitor->volumes);
-
- g_hash_table_iter_init (&hash_iter, monitor->drives);
- while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &drive))
- {
- signal_emit_in_idle (drive, "disconnected", NULL);
- signal_emit_in_idle (monitor, "drive-disconnected", drive);
- }
- g_hash_table_remove_all (monitor->drives);
-
- g_free (monitor->unique_name);
- monitor->unique_name = NULL;
-
- /* TODO: maybe try to relaunch the monitor? */
-
- }
-
- if (strlen (new_owner) > 0 && monitor->unique_name == NULL)
- {
- g_warning ("New owner %s for volume monitor %s connected to the bus; seeding drives/volumes/mounts",
- new_owner,
- klass->dbus_name);
-
- seed_monitor (monitor);
-
- /* emit signals for all the drives/volumes/mounts "added" */
- g_hash_table_iter_init (&hash_iter, monitor->drives);
- while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &drive))
- signal_emit_in_idle (monitor, "drive-connected", drive);
-
- g_hash_table_iter_init (&hash_iter, monitor->volumes);
- while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &volume))
- signal_emit_in_idle (monitor, "volume-added", volume);
-
- g_hash_table_iter_init (&hash_iter, monitor->mounts);
- while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &mount))
- signal_emit_in_idle (monitor, "mount-added", mount);
- }
-
- }
- else if (dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "DriveChanged") ||
- dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "DriveConnected") ||
- dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "DriveDisconnected") ||
- dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "DriveEjectButton") ||
- dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "DriveStopButton"))
- {
-
- dbus_message_iter_init (message, &iter);
- dbus_message_iter_get_basic (&iter, &the_dbus_name);
- dbus_message_iter_next (&iter);
- dbus_message_iter_get_basic (&iter, &id);
- dbus_message_iter_next (&iter);
-
- if (strcmp (the_dbus_name, klass->dbus_name) != 0)
- goto not_for_us;
-
- if (strcmp (member, "DriveChanged") == 0)
- {
- drive = g_hash_table_lookup (monitor->drives, id);
- if (drive != NULL)
- {
- g_proxy_drive_update (drive, &iter);
- signal_emit_in_idle (drive, "changed", NULL);
- signal_emit_in_idle (monitor, "drive-changed", drive);
- }
- }
- else if (strcmp (member, "DriveConnected") == 0)
- {
- drive = g_hash_table_lookup (monitor->drives, id);
- if (drive == NULL)
- {
- drive = g_proxy_drive_new (monitor);
- g_proxy_drive_update (drive, &iter);
- g_hash_table_insert (monitor->drives, g_strdup (g_proxy_drive_get_id (drive)), drive);
- signal_emit_in_idle (monitor, "drive-connected", drive);
- }
- }
- else if (strcmp (member, "DriveDisconnected") == 0)
- {
- drive = g_hash_table_lookup (monitor->drives, id);
- if (drive != NULL)
- {
- g_object_ref (drive);
- g_hash_table_remove (monitor->drives, id);
- signal_emit_in_idle (drive, "disconnected", NULL);
- signal_emit_in_idle (monitor, "drive-disconnected", drive);
- g_object_unref (drive);
- }
- }
- else if (strcmp (member, "DriveEjectButton") == 0)
- {
- drive = g_hash_table_lookup (monitor->drives, id);
- if (drive != NULL)
- {
- signal_emit_in_idle (drive, "eject-button", NULL);
- signal_emit_in_idle (monitor, "drive-eject-button", drive);
- }
- }
- else if (strcmp (member, "DriveStopButton") == 0)
- {
- drive = g_hash_table_lookup (monitor->drives, id);
- if (drive != NULL)
- {
- signal_emit_in_idle (drive, "stop-button", NULL);
- signal_emit_in_idle (monitor, "drive-stop-button", drive);
- }
- }
-
- }
- else if (dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "VolumeChanged") ||
- dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "VolumeAdded") ||
- dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "VolumeRemoved"))
- {
- dbus_message_iter_init (message, &iter);
- dbus_message_iter_get_basic (&iter, &the_dbus_name);
- dbus_message_iter_next (&iter);
- dbus_message_iter_get_basic (&iter, &id);
- dbus_message_iter_next (&iter);
-
- if (strcmp (the_dbus_name, klass->dbus_name) != 0)
- goto not_for_us;
-
- if (strcmp (member, "VolumeChanged") == 0)
- {
- volume = g_hash_table_lookup (monitor->volumes, id);
- if (volume != NULL)
- {
- GProxyShadowMount *shadow_mount;
-
- g_proxy_volume_update (volume, &iter);
- signal_emit_in_idle (volume, "changed", NULL);
- signal_emit_in_idle (monitor, "volume-changed", volume);
-
- shadow_mount = g_proxy_volume_get_shadow_mount (volume);
- if (shadow_mount != NULL)
- {
- signal_emit_in_idle (shadow_mount, "changed", NULL);
- signal_emit_in_idle (monitor, "mount-changed", shadow_mount);
- g_object_unref (shadow_mount);
- }
- }
- }
- else if (strcmp (member, "VolumeAdded") == 0)
- {
- volume = g_hash_table_lookup (monitor->volumes, id);
- if (volume == NULL)
- {
- volume = g_proxy_volume_new (monitor);
- g_proxy_volume_update (volume, &iter);
- g_hash_table_insert (monitor->volumes, g_strdup (g_proxy_volume_get_id (volume)), volume);
- signal_emit_in_idle (monitor, "volume-added", volume);
- }
- }
- else if (strcmp (member, "VolumeRemoved") == 0)
- {
- volume = g_hash_table_lookup (monitor->volumes, id);
- if (volume != NULL)
- {
- g_object_ref (volume);
- g_hash_table_remove (monitor->volumes, id);
- signal_emit_in_idle (volume, "removed", NULL);
- signal_emit_in_idle (monitor, "volume-removed", volume);
- dispose_in_idle (volume);
- g_object_unref (volume);
- }
- }
-
- }
- else if (dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "MountChanged") ||
- dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "MountAdded") ||
- dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "MountPreUnmount") ||
- dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "MountRemoved"))
- {
-
- dbus_message_iter_init (message, &iter);
- dbus_message_iter_get_basic (&iter, &the_dbus_name);
- dbus_message_iter_next (&iter);
- dbus_message_iter_get_basic (&iter, &id);
- dbus_message_iter_next (&iter);
-
- if (strcmp (the_dbus_name, klass->dbus_name) != 0)
- goto not_for_us;
-
- if (strcmp (member, "MountChanged") == 0)
- {
- mount = g_hash_table_lookup (monitor->mounts, id);
- if (mount != NULL)
- {
- g_proxy_mount_update (mount, &iter);
- signal_emit_in_idle (mount, "changed", NULL);
- signal_emit_in_idle (monitor, "mount-changed", mount);
- }
- }
- else if (strcmp (member, "MountAdded") == 0)
- {
- mount = g_hash_table_lookup (monitor->mounts, id);
- if (mount == NULL)
- {
- mount = g_proxy_mount_new (monitor);
- g_proxy_mount_update (mount, &iter);
- g_hash_table_insert (monitor->mounts, g_strdup (g_proxy_mount_get_id (mount)), mount);
- signal_emit_in_idle (monitor, "mount-added", mount);
- }
- }
- else if (strcmp (member, "MountPreUnmount") == 0)
- {
- mount = g_hash_table_lookup (monitor->mounts, id);
- if (mount != NULL)
- {
- signal_emit_in_idle (mount, "pre-unmount", NULL);
- signal_emit_in_idle (monitor, "mount-pre-unmount", mount);
- }
- }
- else if (strcmp (member, "MountRemoved") == 0)
- {
- mount = g_hash_table_lookup (monitor->mounts, id);
- if (mount != NULL)
- {
- g_object_ref (mount);
- g_hash_table_remove (monitor->mounts, id);
- signal_emit_in_idle (mount, "unmounted", NULL);
- signal_emit_in_idle (monitor, "mount-removed", mount);
- g_object_unref (mount);
- }
- }
- }
- else if (dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "MountOpAskPassword") ||
- dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "MountOpAskQuestion") ||
- dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "MountOpShowProcesses") ||
- dbus_message_is_signal (message, "org.gtk.Private.RemoteVolumeMonitor", "MountOpAborted"))
- {
- dbus_message_iter_init (message, &iter);
- dbus_message_iter_get_basic (&iter, &the_dbus_name);
- dbus_message_iter_next (&iter);
- dbus_message_iter_get_basic (&iter, &id);
- dbus_message_iter_next (&iter);
-
- if (strcmp (the_dbus_name, klass->dbus_name) != 0)
- goto not_for_us;
-
- if (strcmp (member, "MountOpAskPassword") == 0)
- {
- g_proxy_mount_operation_handle_ask_password (id, &iter);
- }
- else if (strcmp (member, "MountOpAskQuestion") == 0)
- {
- g_proxy_mount_operation_handle_ask_question (id, &iter);
- }
- else if (strcmp (member, "MountOpShowProcesses") == 0)
- {
- g_proxy_mount_operation_handle_show_processes (id, &iter);
- }
- else if (strcmp (member, "MountOpAborted") == 0)
- {
- g_proxy_mount_operation_handle_aborted (id, &iter);
- }
- }
-
- not_for_us:
- G_UNLOCK (proxy_vm);
-
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
static void
g_proxy_volume_monitor_init (GProxyVolumeMonitor *monitor)
{
- g_proxy_volume_monitor_setup_session_bus_connection (TRUE);
+ g_proxy_volume_monitor_setup_session_bus_connection ();
}
static void
@@ -855,6 +1090,7 @@ static void
g_proxy_volume_monitor_class_intern_init_pre (GProxyVolumeMonitorClass *klass, gconstpointer class_data)
{
ProxyClassData *data = (ProxyClassData *) class_data;
+
klass->dbus_name = g_strdup (data->dbus_name);
klass->is_native = data->is_native;
klass->is_supported_nr = data->is_supported_nr;
@@ -864,56 +1100,45 @@ g_proxy_volume_monitor_class_intern_init_pre (GProxyVolumeMonitorClass *klass, g
static gboolean
is_remote_monitor_supported (const char *dbus_name)
{
- DBusMessage *message;
- DBusMessage *reply;
- DBusError dbus_error;
- dbus_bool_t is_supported;
+ gboolean is_supported;
+ GVfsRemoteVolumeMonitor *proxy;
+ GError *error;
- message = NULL;
- reply = NULL;
is_supported = FALSE;
+ error = NULL;
- message = dbus_message_new_method_call (dbus_name,
- "/org/gtk/Private/RemoteVolumeMonitor",
- "org.gtk.Private.RemoteVolumeMonitor",
- "IsSupported");
- if (message == NULL)
- {
- g_warning ("Cannot allocate memory for DBusMessage");
- goto fail;
- }
- dbus_error_init (&dbus_error);
- reply = dbus_connection_send_with_reply_and_block (the_session_bus,
- message,
- -1,
- &dbus_error);
- if (dbus_error_is_set (&dbus_error))
+ proxy = gvfs_remote_volume_monitor_proxy_new_sync (the_session_bus,
+ G_DBUS_PROXY_FLAGS_NONE,
+ dbus_name,
+ "/org/gtk/Private/RemoteVolumeMonitor",
+ NULL,
+ &error);
+ if (proxy == NULL)
{
- g_warning ("invoking IsSupported() failed for remote volume monitor with dbus name %s: %s: %s",
- dbus_name,
- dbus_error.name,
- dbus_error.message);
- dbus_error_free (&dbus_error);
- goto fail;
+ g_printerr ("Error creating proxy: %s (%s, %d)\n",
+ error->message, g_quark_to_string (error->domain), error->code);
+ g_error_free (error);
+ goto out;
}
- if (!dbus_message_get_args (reply, &dbus_error,
- DBUS_TYPE_BOOLEAN, &is_supported,
- DBUS_TYPE_INVALID))
+ error = NULL;
+ if (!gvfs_remote_volume_monitor_call_is_supported_sync (proxy,
+ &is_supported,
+ NULL,
+ &error))
{
- g_warning ("Error parsing args in reply for IsSupported(): %s: %s", dbus_error.name, dbus_error.message);
- dbus_error_free (&dbus_error);
- goto fail;
+ g_printerr ("invoking IsSupported() failed for remote volume monitor with dbus name %s:: %s (%s, %d)\n",
+ dbus_name, error->message, g_quark_to_string (error->domain), error->code);
+ g_error_free (error);
+ goto out;
}
-
+
if (!is_supported)
g_warning ("remote volume monitor with dbus name %s is not supported", dbus_name);
- fail:
- if (message != NULL)
- dbus_message_unref (message);
- if (reply != NULL)
- dbus_message_unref (reply);
+ out:
+ if (proxy != NULL)
+ g_object_unref (proxy);
return is_supported;
}
@@ -923,7 +1148,7 @@ is_supported (GProxyVolumeMonitorClass *klass)
gboolean res;
G_LOCK (proxy_vm);
- res = g_proxy_volume_monitor_setup_session_bus_connection (FALSE);
+ res = g_proxy_volume_monitor_setup_session_bus_connection ();
G_UNLOCK (proxy_vm);
if (res)
@@ -961,86 +1186,70 @@ g_proxy_volume_monitor_class_init (GProxyVolumeMonitorClass *klass)
static void
seed_monitor (GProxyVolumeMonitor *monitor)
{
- DBusMessage *message;
- DBusMessage *reply;
- DBusError dbus_error;
- DBusMessageIter iter_reply;
- DBusMessageIter iter_array;
-
- message = dbus_message_new_method_call (g_proxy_volume_monitor_get_dbus_name (monitor),
- "/org/gtk/Private/RemoteVolumeMonitor",
- "org.gtk.Private.RemoteVolumeMonitor",
- "List");
- if (message == NULL)
- {
- g_warning ("Cannot allocate memory for DBusMessage");
- goto fail;
- }
- dbus_error_init (&dbus_error);
- reply = dbus_connection_send_with_reply_and_block (monitor->session_bus,
- message,
- -1,
- &dbus_error);
- dbus_message_unref (message);
- if (dbus_error_is_set (&dbus_error))
+ GVariant *Drives;
+ GVariant *Volumes;
+ GVariant *Mounts;
+ GVariantIter iter;
+ GVariant *child;
+ GError *error;
+
+ error = NULL;
+ if (!gvfs_remote_volume_monitor_call_list_sync (monitor->proxy,
+ &Drives,
+ &Volumes,
+ &Mounts,
+ NULL,
+ &error))
{
- g_warning ("invoking List() failed for type %s: %s: %s",
+ g_warning ("invoking List() failed for type %s: %s (%s, %d)",
G_OBJECT_TYPE_NAME (monitor),
- dbus_error.name,
- dbus_error.message);
- dbus_error_free (&dbus_error);
+ error->message, g_quark_to_string (error->domain), error->code);
+ g_error_free (error);
goto fail;
}
- dbus_message_iter_init (reply, &iter_reply);
-
- /* TODO: verify signature */
-
/* drives */
- dbus_message_iter_recurse (&iter_reply, &iter_array);
- while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+ g_variant_iter_init (&iter, Drives);
+ while ((child = g_variant_iter_next_value (&iter)))
{
GProxyDrive *drive;
const char *id;
drive = g_proxy_drive_new (monitor);
- g_proxy_drive_update (drive, &iter_array);
+ g_proxy_drive_update (drive, child);
id = g_proxy_drive_get_id (drive);
g_hash_table_insert (monitor->drives, g_strdup (id), drive);
- dbus_message_iter_next (&iter_array);
+ g_variant_unref (child);
}
- dbus_message_iter_next (&iter_reply);
/* volumes */
- dbus_message_iter_recurse (&iter_reply, &iter_array);
- while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+ g_variant_iter_init (&iter, Volumes);
+ while ((child = g_variant_iter_next_value (&iter)))
{
GProxyVolume *volume;
const char *id;
volume = g_proxy_volume_new (monitor);
- g_proxy_volume_update (volume, &iter_array);
+ g_proxy_volume_update (volume, child);
id = g_proxy_volume_get_id (volume);
g_hash_table_insert (monitor->volumes, g_strdup (id), volume);
- dbus_message_iter_next (&iter_array);
+ g_variant_unref (child);
}
- dbus_message_iter_next (&iter_reply);
/* mounts */
- dbus_message_iter_recurse (&iter_reply, &iter_array);
- while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+ g_variant_iter_init (&iter, Mounts);
+ while ((child = g_variant_iter_next_value (&iter)))
{
GProxyMount *mount;
const char *id;
mount = g_proxy_mount_new (monitor);
- g_proxy_mount_update (mount, &iter_array);
+ g_proxy_mount_update (mount, child);
id = g_proxy_mount_get_id (mount);
g_hash_table_insert (monitor->mounts, g_strdup (id), mount);
- dbus_message_iter_next (&iter_array);
+ g_variant_unref (child);
}
- dbus_message_iter_next (&iter_reply);
- monitor->unique_name = g_strdup (dbus_message_get_sender (reply));
-
- dbus_message_unref (reply);
+ g_variant_unref (Drives);
+ g_variant_unref (Volumes);
+ g_variant_unref (Mounts);
fail:
;
@@ -1093,47 +1302,27 @@ g_proxy_volume_monitor_get_mount_for_id (GProxyVolumeMonitor *volume_monitor,
GHashTable *
-_get_identifiers (DBusMessageIter *iter)
+_get_identifiers (GVariantIter *iter)
{
GHashTable *hash_table;
- DBusMessageIter iter_array;
+ char *key;
+ char *value;
hash_table = g_hash_table_new_full (g_str_hash,
g_str_equal,
g_free,
g_free);
- dbus_message_iter_recurse (iter, &iter_array);
- while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
- {
- DBusMessageIter iter_dict_entry;
- const char *key;
- const char *value;
-
- dbus_message_iter_recurse (&iter_array, &iter_dict_entry);
- dbus_message_iter_get_basic (&iter_dict_entry, &key);
- dbus_message_iter_next (&iter_dict_entry);
- dbus_message_iter_get_basic (&iter_dict_entry, &value);
-
- g_hash_table_insert (hash_table, g_strdup (key), g_strdup (value));
-
- dbus_message_iter_next (&iter_array);
- }
-
+ while (g_variant_iter_next (iter, "{ss}", &key, &value))
+ g_hash_table_insert (hash_table, key, value);
+
return hash_table;
}
-DBusConnection *
-g_proxy_volume_monitor_get_dbus_connection (GProxyVolumeMonitor *volume_monitor)
-{
- return dbus_connection_ref (volume_monitor->session_bus);
-}
-
-const char *
-g_proxy_volume_monitor_get_dbus_name (GProxyVolumeMonitor *volume_monitor)
+GVfsRemoteVolumeMonitor *
+g_proxy_volume_monitor_get_dbus_proxy (GProxyVolumeMonitor *volume_monitor)
{
- GProxyVolumeMonitorClass *klass = G_PROXY_VOLUME_MONITOR_CLASS (G_OBJECT_GET_CLASS (volume_monitor));
- return klass->dbus_name;
+ return g_object_ref (volume_monitor->proxy);
}
static void
@@ -1171,11 +1360,11 @@ register_volume_monitor (GTypeModule *type_module,
}
/* Call with proxy_vm lock held */
-gboolean
-g_proxy_volume_monitor_setup_session_bus_connection (gboolean need_integration)
+static gboolean
+g_proxy_volume_monitor_setup_session_bus_connection (void)
{
gboolean ret;
- DBusError dbus_error;
+ GError *error;
ret = FALSE;
@@ -1189,25 +1378,21 @@ g_proxy_volume_monitor_setup_session_bus_connection (gboolean need_integration)
if (g_getenv ("DBUS_SESSION_BUS_ADDRESS") == NULL)
goto out;
- dbus_error_init (&dbus_error);
- the_session_bus = dbus_bus_get_private (DBUS_BUS_SESSION, &dbus_error);
- if (dbus_error_is_set (&dbus_error))
+ error = NULL;
+ the_session_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
+ if (error != NULL)
{
- g_warning ("cannot connect to the session bus: %s: %s", dbus_error.name, dbus_error.message);
- dbus_error_free (&dbus_error);
+ g_printerr ("cannot connect to the session bus: %s (%s, %d)\n",
+ error->message, g_quark_to_string (error->domain), error->code);
+ g_error_free (error);
goto out;
}
+ g_object_set (the_session_bus, "exit-on-close", FALSE, NULL);
the_volume_monitors = g_hash_table_new (g_direct_hash, g_direct_equal);
has_bus_already:
-
- if (need_integration && !the_session_bus_is_integrated)
- {
- _g_dbus_connection_integrate_with_main (the_session_bus);
- the_session_bus_is_integrated = TRUE;
- }
-
+
ret = TRUE;
out:
@@ -1220,10 +1405,8 @@ g_proxy_volume_monitor_teardown_session_bus_connection (void)
G_LOCK (proxy_vm);
if (the_session_bus != NULL)
{
- if (the_session_bus_is_integrated)
- _g_dbus_connection_remove_from_main (the_session_bus);
- the_session_bus_is_integrated = FALSE;
- dbus_connection_close (the_session_bus);
+ g_dbus_connection_close_sync (the_session_bus, NULL, NULL);
+ g_object_unref (the_session_bus);
the_session_bus = NULL;
g_hash_table_unref (the_volume_monitors);