David Zeuthen wrote:
Hi,
Using CamelCase names such as gFileRoot, mountName and so on is probably
not the best idea. Suggest to follow the coding standards.
It would also be useful to display the drives and volumes much like the
side bar in Nautilus current does (see the Nautilus source code for
details), e.g. sorta like this
Drive0
Volume0
Mount0
Volume1
Mount1
Volume2
Drive1
Volume_without_drive10
Volume_without_drive11
Mount11
Mount_without_volume20
Mount_without_volume21
Here is a patch which also lists drives and volumes. Additionally it
tries to fix the crash in gmounttracker.c, caused by an empty DBus reply
when gvfsd is not running.
Cheers,
Norbert
Index: common/gmounttracker.c
===================================================================
--- common/gmounttracker.c (revision 1085)
+++ common/gmounttracker.c (working copy)
@@ -386,18 +386,25 @@
dbus_pending_call_unref (pending);
b = dbus_message_iter_init (reply, &iter);
- dbus_message_iter_recurse (&iter, &array_iter);
-
- do
+ if (b && dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_ARRAY)
{
- info = g_mount_info_from_dbus (&array_iter);
- if (info)
- {
- g_mount_tracker_add_mount (tracker, info);
- g_mount_info_unref (info);
- }
+ dbus_message_iter_recurse (&iter, &array_iter);
+
+ do
+ {
+ info = g_mount_info_from_dbus (&array_iter);
+ if (info)
+ {
+ g_mount_tracker_add_mount (tracker, info);
+ g_mount_info_unref (info);
+ }
+ }
+ while (dbus_message_iter_next (&array_iter));
}
- while (dbus_message_iter_next (&array_iter));
+ else
+ {
+ /* list_mounts_reply problem - gvfsd not running? */
+ }
dbus_message_unref (reply);
}
Index: programs/gvfs-mount.c
===================================================================
--- programs/gvfs-mount.c (revision 1085)
+++ programs/gvfs-mount.c (working copy)
@@ -35,11 +35,13 @@
static gboolean mount_mountable = FALSE;
static gboolean mount_unmount = FALSE;
+static gboolean mount_list = FALSE;
static GOptionEntry entries[] =
{
{ "mountable", 'm', 0, G_OPTION_ARG_NONE, &mount_mountable, "Mount as mountable", NULL },
- { "unmount", 'u', 0, G_OPTION_ARG_NONE, &mount_unmount, "Unmount", NULL},
+ { "unmount", 'u', 0, G_OPTION_ARG_NONE, &mount_unmount, "Unmount", NULL},
+ { "list", 'l', 0, G_OPTION_ARG_NONE, &mount_list, "List", NULL},
{ NULL }
};
@@ -212,6 +214,129 @@
outstanding_mounts++;
}
+// =============== list mounts ==================
+
+static GMainLoop *main_loop;
+
+const char indentstr[] = " ";
+
+#define get_indent_str(x) indentstr + (sizeof(indentstr)-x-1)
+
+static gboolean iterate_gmain_timeout_function(gpointer data)
+{
+ g_main_loop_quit (main_loop);
+ return FALSE;
+}
+
+static void iterate_gmain()
+{
+ g_timeout_add(500, iterate_gmain_timeout_function, NULL);
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (main_loop);
+ g_main_loop_unref(main_loop);
+}
+
+static void list_mounts(GVolumeMonitor* volume_monitor, int indent, GDrive * forDrive, GVolume * forVolume)
+{
+ GList* mount_list = g_volume_monitor_get_mounts(volume_monitor);
+
+ GList* mount_list_el = mount_list;
+ int c=0;
+ for(;mount_list_el != NULL; mount_list_el = g_list_next(mount_list_el), c++)
+ {
+ GMount * mount = (GMount *) mount_list_el->data;
+
+ if (forDrive && g_mount_get_drive(mount)!=forDrive)
+ continue;
+ if (forVolume && g_mount_get_volume(mount)!=forVolume)
+ continue;
+ if (!forDrive && !forVolume && (g_mount_get_volume(mount) || g_mount_get_drive(mount)))
+ continue;
+
+ char * mount_uuid = g_mount_get_uuid(mount);
+ char * mount_name = g_mount_get_name(mount);
+ GFile * file_root = g_mount_get_root(mount);
+
+ char * points_to_uri = g_file_get_uri(file_root);
+
+ printf("%sMount(%d) : %s -> %s\n", get_indent_str(indent), c, mount_name, points_to_uri);
+
+ g_object_unref(file_root);
+ g_free(mount_uuid);
+ g_free(mount_name);
+ g_free(points_to_uri);
+ }
+}
+
+
+static void list_volumes(GVolumeMonitor* volume_monitor, int indent, GDrive * forDrive)
+{
+
+ GList* volume_list = g_volume_monitor_get_volumes(volume_monitor);
+ GList* volume_list_el = volume_list;
+
+ int c=0;
+ for(;volume_list_el!=NULL;volume_list_el = g_list_next(volume_list_el), c++)
+ {
+ GVolume * volume = (GVolume *) volume_list_el->data;
+
+ if (forDrive && g_volume_get_drive(volume)!=forDrive)
+ continue;
+ if (!forDrive && g_volume_get_drive(volume))
+ continue;
+
+ char * volume_name = g_volume_get_name(volume);
+
+ printf("%sVolume(%d) : %s\n", get_indent_str(indent), c, volume_name);
+ g_free(volume_name);
+
+ list_mounts(volume_monitor, indent+2, NULL, volume);
+
+ }
+}
+
+
+static void list_drives(GVolumeMonitor* volume_monitor, int indent)
+{
+ GList* drive_list = g_volume_monitor_get_connected_drives(volume_monitor);
+
+ GList* drive_list_el = drive_list;
+
+ int c=0;
+ while(drive_list_el)
+ {
+ GDrive * drive = (GDrive *) drive_list_el->data;
+
+ char * drive_name = g_drive_get_name(drive);
+
+ printf("%sDrive(%d) : %s\n", get_indent_str(indent), c, drive_name);
+ g_free(drive_name);
+
+ list_mounts(volume_monitor, indent+2, drive, NULL);
+ list_volumes(volume_monitor, indent+2, drive);
+
+ drive_list_el = g_list_next(drive_list_el);
+ c++;
+ }
+}
+
+
+
+static void list_monitor_items()
+{
+ GVolumeMonitor* volume_monitor = g_volume_monitor_get();
+
+ // populate gvfs network mounts
+ iterate_gmain();
+
+ list_drives(volume_monitor, 0);
+ list_volumes(volume_monitor, 0, NULL);
+ list_mounts(volume_monitor, 0, NULL, NULL);
+
+}
+
+
int
main (int argc, char *argv[])
{
@@ -229,6 +354,9 @@
g_option_context_parse (context, &argc, &argv, &error);
g_option_context_free (context);
+ if (mount_list)
+ list_monitor_items();
+ else
if (argc > 1)
{
int i;
_______________________________________________
gnome-vfs-list mailing list
gnome-vfs-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gnome-vfs-list