[maemo-commits] [maemo-commits] r17999 - in projects/haf/trunk/glib: . gio

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Thu Apr 2 15:29:34 EEST 2009
Author: mitch
Date: 2009-04-02 15:29:32 +0300 (Thu, 02 Apr 2009)
New Revision: 17999

Modified:
   projects/haf/trunk/glib/ChangeLog
   projects/haf/trunk/glib/gio/gunixmount.c
Log:
2009-04-02  Michael Natterer  <mitch at landeo.com>

	Bug NB#107184 ?\226?\128?\147 Gio/GVfs don't emit GVolumeMonitor::mount-pre-unmount

	Applied patch from Carlos Garnacho:

	* gio/gunixmount.c (eject_unmount_cb) (eject_unmount_do_cb)
	(eject_unmount_do): Emit ::mount-pre-unmount and wait 500msec before
	actually trying to unmount.



Modified: projects/haf/trunk/glib/ChangeLog
===================================================================
--- projects/haf/trunk/glib/ChangeLog	2009-04-02 11:58:44 UTC (rev 17998)
+++ projects/haf/trunk/glib/ChangeLog	2009-04-02 12:29:32 UTC (rev 17999)
@@ -1,3 +1,13 @@
+2009-04-02  Michael Natterer  <mitch at landeo.com>
+
+	Bug NB#107184 – Gio/GVfs don't emit GVolumeMonitor::mount-pre-unmount
+
+	Applied patch from Carlos Garnacho:
+
+	* gio/gunixmount.c (eject_unmount_cb) (eject_unmount_do_cb)
+	(eject_unmount_do): Emit ::mount-pre-unmount and wait 500msec before
+	actually trying to unmount.
+
 2009-04-01 16:30:07  Tim Janik  <timj at lanedo.com>
 
 	* configure.in: use generic ARM platform tests to determine

Modified: projects/haf/trunk/glib/gio/gunixmount.c
===================================================================
--- projects/haf/trunk/glib/gio/gunixmount.c	2009-04-02 11:58:44 UTC (rev 17998)
+++ projects/haf/trunk/glib/gio/gunixmount.c	2009-04-02 12:29:32 UTC (rev 17999)
@@ -242,6 +242,7 @@
   GIOChannel *error_channel;
   guint error_channel_source_id;
   GString *error_string;
+  gchar **argv;
 } UnmountEjectOp;
 
 static void 
@@ -276,6 +277,7 @@
   g_source_remove (data->error_channel_source_id);
   g_io_channel_unref (data->error_channel);
   g_string_free (data->error_string, TRUE);
+  g_strfreev (data->argv);
   close (data->error_fd);
   g_spawn_close_pid (pid);
   g_free (data);
@@ -316,27 +318,15 @@
   return TRUE;
 }
 
-static void
-eject_unmount_do (GMount              *mount,
-                  GCancellable        *cancellable,
-                  GAsyncReadyCallback  callback,
-                  gpointer             user_data,
-                  char               **argv)
+static gboolean
+eject_unmount_do_cb (gpointer user_data)
 {
-  GUnixMount *unix_mount = G_UNIX_MOUNT (mount);
-  UnmountEjectOp *data;
+  UnmountEjectOp *data = (UnmountEjectOp *) user_data;
   GPid child_pid;
-  GError *error;
-  
-  data = g_new0 (UnmountEjectOp, 1);
-  data->unix_mount = unix_mount;
-  data->callback = callback;
-  data->user_data = user_data;
-  data->cancellable = cancellable;
-  
-  error = NULL;
+  GError *error = NULL;
+
   if (!g_spawn_async_with_pipes (NULL,         /* working dir */
-                                 argv,
+                                 data->argv,
                                  NULL,         /* envp */
                                  G_SPAWN_DO_NOT_REAP_CHILD|G_SPAWN_SEARCH_PATH,
                                  NULL,         /* child_setup */
@@ -376,12 +366,38 @@
     if (data->error_channel != NULL)
       g_io_channel_unref (data->error_channel);
 
+    g_strfreev (data->argv);
     g_error_free (error);
     g_free (data);
   }
+
+  return FALSE;
 }
 
 static void
+eject_unmount_do (GMount              *mount,
+                  GCancellable        *cancellable,
+                  GAsyncReadyCallback  callback,
+                  gpointer             user_data,
+                  char               **argv)
+{
+  GUnixMount *unix_mount = G_UNIX_MOUNT (mount);
+  UnmountEjectOp *data;
+
+  data = g_new0 (UnmountEjectOp, 1);
+  data->unix_mount = unix_mount;
+  data->callback = callback;
+  data->user_data = user_data;
+  data->cancellable = cancellable;
+  data->argv = g_strdupv (argv);
+
+  if (unix_mount->volume_monitor != NULL)
+    g_signal_emit_by_name (unix_mount->volume_monitor, "mount-pre-unmount", mount);
+
+  g_timeout_add (500, (GSourceFunc) eject_unmount_do_cb, data);
+}
+
+static void
 g_unix_mount_unmount (GMount             *mount,
                       GMountUnmountFlags flags,
                       GCancellable        *cancellable,


More information about the maemo-commits mailing list