ext/gio/: Improve debugging a bit.
authorSebastian Dröge <slomo@circular-chaos.org>
Fri, 15 Feb 2008 11:58:06 +0000 (11:58 +0000)
committerSebastian Dröge <slomo@circular-chaos.org>
Fri, 15 Feb 2008 11:58:06 +0000 (11:58 +0000)
Original commit message from CVS:
* ext/gio/gstgiobasesink.c: (close_stream_cb):
* ext/gio/gstgiobasesrc.c: (close_stream_cb):
Improve debugging a bit.
* ext/gio/gstgiosink.c: (mount_cb), (gst_gio_sink_start):
* ext/gio/gstgiosink.h:
* ext/gio/gstgiosrc.c: (mount_cb), (gst_gio_src_start):
* ext/gio/gstgiosrc.h:
Try to mount the enclosing volume of a GFile if it isn't mounted
yet. This requires us to wait for an async operation to finish, done
with an nested GMainLoop. Authentication is not supported yet, will
come later.

ChangeLog
ext/gio/gstgiobasesink.c
ext/gio/gstgiobasesrc.c
ext/gio/gstgiosink.c
ext/gio/gstgiosink.h
ext/gio/gstgiosrc.c
ext/gio/gstgiosrc.h

index 399c4f4dc59d91edfd6d6b9a2e683731da548b77..df2eb2b5fea22dbaaafd95a1a7744a260f7d2c43 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2008-02-15  Sebastian Dröge  <slomo@circular-chaos.org>
+
+       * ext/gio/gstgiobasesink.c: (close_stream_cb):
+       * ext/gio/gstgiobasesrc.c: (close_stream_cb):
+       Improve debugging a bit.
+
+       * ext/gio/gstgiosink.c: (mount_cb), (gst_gio_sink_start):
+       * ext/gio/gstgiosink.h:
+       * ext/gio/gstgiosrc.c: (mount_cb), (gst_gio_src_start):
+       * ext/gio/gstgiosrc.h:
+       Try to mount the enclosing volume of a GFile if it isn't mounted
+       yet. This requires us to wait for an async operation to finish, done
+       with an nested GMainLoop. Authentication is not supported yet, will
+       come later.
+
 2008-02-14  Wim Taymans  <wim.taymans@collabora.co.uk>
 
        * gst/playback/gstplaybin2.c: (gst_play_bin_class_init),
index f692fa139c4186b666378775ce1534a9ba44b1a5..9657ac3900e762301c55e4e4085ea6ecec9cb480 100644 (file)
@@ -139,13 +139,16 @@ close_stream_cb (GObject * object, GAsyncResult * res, gpointer user_data)
 
   if (!success
       && !gst_gio_error (sink, "g_output_stream_close_async", &err, NULL)) {
-    GST_ELEMENT_ERROR (sink, RESOURCE, CLOSE, (NULL),
+    GST_ELEMENT_WARNING (sink, RESOURCE, CLOSE, (NULL),
         ("g_output_stream_close_async failed: %s", err->message));
     g_clear_error (&err);
+  } else if (!success) {
+    GST_ELEMENT_WARNING (sink, RESOURCE, CLOSE, (NULL),
+        ("g_output_stream_close_async failed"));
+  } else {
+    GST_DEBUG_OBJECT (sink, "g_output_stream_close_async succeeded");
   }
 
-  GST_DEBUG_OBJECT (sink, "closed stream");
-
   g_object_unref (sink);
 }
 
index ec9f2fbc5091f122272918d8a28945ac60a13b1c..77ace23244d102840373823b62339f99db9175aa 100644 (file)
@@ -139,13 +139,16 @@ close_stream_cb (GObject * object, GAsyncResult * res, gpointer user_data)
 
   if (!success
       && !gst_gio_error (src, "g_input_stream_close_async", &err, NULL)) {
-    GST_ELEMENT_ERROR (src, RESOURCE, CLOSE, (NULL),
+    GST_ELEMENT_WARNING (src, RESOURCE, CLOSE, (NULL),
         ("g_input_stream_close_async failed: %s", err->message));
     g_clear_error (&err);
+  } else if (!success) {
+    GST_ELEMENT_WARNING (src, RESOURCE, CLOSE, (NULL),
+        ("g_input_stream_close_async failed"));
+  } else {
+    GST_DEBUG_OBJECT (src, "g_input_stream_close_async succeeded");
   }
 
-  GST_DEBUG_OBJECT (src, "closed stream");
-
   g_object_unref (src);
 }
 
index 894c795d09b7c9b080c0ae4ae5f2b0cdef7892a8..96f653a0f15699281dd4f0107a691b9b8be15927 100644 (file)
@@ -183,6 +183,34 @@ gst_gio_sink_get_property (GObject * object, guint prop_id,
   }
 }
 
+static void
+mount_cb (GObject * source, GAsyncResult * res, gpointer user_data)
+{
+  gboolean success;
+  GError *err = NULL;
+  GstGioSink *sink = GST_GIO_SINK (user_data);
+
+  success = g_file_mount_enclosing_volume_finish (G_FILE (source), res, &err);
+
+  if (!success
+      && !gst_gio_error (sink, "g_file_mount_enclosing_volume", &err, NULL)) {
+    GST_ELEMENT_WARNING (sink, RESOURCE, CLOSE, (NULL),
+        ("g_file_mount_enclosing_volume failed: %s", err->message));
+    g_clear_error (&err);
+  } else if (!success) {
+    GST_ELEMENT_WARNING (sink, RESOURCE, CLOSE, (NULL),
+        ("g_file_mount_enclosing_volume failed"));
+  } else {
+    GST_DEBUG ("g_file_mount_enclosing_volume failed succeeded");
+  }
+
+  sink->mount_successful = success;
+
+  g_main_loop_quit (sink->loop);
+
+  g_object_unref (sink);
+}
+
 static gboolean
 gst_gio_sink_start (GstBaseSink * base_sink)
 {
@@ -209,6 +237,40 @@ gst_gio_sink_start (GstBaseSink * base_sink)
 
   stream =
       G_OUTPUT_STREAM (g_file_create (file, G_FILE_CREATE_NONE, cancel, &err));
+
+  if (stream == NULL && !gst_gio_error (sink, "g_file_read", &err, NULL) &&
+      GST_GIO_ERROR_MATCHES (err, NOT_MOUNTED)) {
+
+    GST_DEBUG ("Trying to mount enclosing volume for %s\n", sink->location);
+    g_clear_error (&err);
+    err = NULL;
+
+    sink->loop = g_main_loop_new (NULL, TRUE);
+    if (!sink->loop) {
+      GST_ELEMENT_ERROR (sink, LIBRARY, INIT,
+          (NULL), ("Failed to start GMainLoop"));
+    } else {
+      sink->mount_successful = FALSE;
+      /* TODO: authentication: a GMountOperation property that apps can set
+       * and properties for user/password/etc that can be used more easily
+       */
+      g_file_mount_enclosing_volume (file, G_MOUNT_MOUNT_NONE, NULL, cancel,
+          mount_cb, g_object_ref (sink));
+      g_main_loop_run (sink->loop);
+
+      g_main_loop_unref (sink->loop);
+      sink->loop = NULL;
+
+      if (!sink->mount_successful) {
+        GST_DEBUG ("Mounting the enclosing volume failed for some reason");
+      } else {
+        stream =
+            G_OUTPUT_STREAM (g_file_create (file, G_FILE_CREATE_NONE, cancel,
+                &err));
+      }
+    }
+  }
+
   success = (stream != NULL);
 
   g_object_unref (file);
index cae0d5ff5eadfef1e55f0be7979b5a94f6bd4b67..fc2478a200c02becdc3411ba3116236d8dcb6745 100644 (file)
@@ -54,6 +54,9 @@ struct _GstGioSink
 
   /*< private >*/
   gchar *location;
+
+  GMainLoop *loop;
+  gboolean mount_successful;
 };
 
 struct _GstGioSinkClass 
index cfa4da99ebf85539894059e5d1e4a2c391db1ee2..f00bd36d556be46f6d47849327ace570ad2bad55 100644 (file)
@@ -178,6 +178,34 @@ gst_gio_src_get_property (GObject * object, guint prop_id,
   }
 }
 
+static void
+mount_cb (GObject * source, GAsyncResult * res, gpointer user_data)
+{
+  gboolean success;
+  GError *err = NULL;
+  GstGioSrc *src = GST_GIO_SRC (user_data);
+
+  success = g_file_mount_enclosing_volume_finish (G_FILE (source), res, &err);
+
+  if (!success
+      && !gst_gio_error (src, "g_file_mount_enclosing_volume", &err, NULL)) {
+    GST_ELEMENT_ERROR (src, RESOURCE, CLOSE, (NULL),
+        ("g_file_mount_enclosing_volume failed: %s", err->message));
+    g_clear_error (&err);
+  } else if (!success) {
+    GST_ELEMENT_WARNING (src, RESOURCE, CLOSE, (NULL),
+        ("g_file_mount_enclosing_volume failed"));
+  } else {
+    GST_DEBUG ("g_file_mount_enclosing_volume failed succeeded");
+  }
+
+  src->mount_successful = success;
+
+  g_main_loop_quit (src->loop);
+
+  g_object_unref (src);
+}
+
 static gboolean
 gst_gio_src_start (GstBaseSrc * base_src)
 {
@@ -202,23 +230,56 @@ gst_gio_src_start (GstBaseSrc * base_src)
 
   stream = G_INPUT_STREAM (g_file_read (file, cancel, &err));
 
+  if (stream == NULL && !gst_gio_error (src, "g_file_read", &err, NULL) &&
+      GST_GIO_ERROR_MATCHES (err, NOT_MOUNTED)) {
+
+
+    GST_DEBUG ("Trying to mount enclosing volume for %s\n", src->location);
+    g_clear_error (&err);
+    err = NULL;
+
+    src->loop = g_main_loop_new (NULL, TRUE);
+    if (!src->loop) {
+      GST_ELEMENT_ERROR (src, LIBRARY, INIT,
+          (NULL), ("Failed to start GMainLoop"));
+    } else {
+      src->mount_successful = FALSE;
+      /* TODO: authentication: a GMountOperation property that apps can set
+       * and properties for user/password/etc that can be used more easily
+       */
+      g_file_mount_enclosing_volume (file, G_MOUNT_MOUNT_NONE, NULL, cancel,
+          mount_cb, g_object_ref (src));
+      g_main_loop_run (src->loop);
+
+      g_main_loop_unref (src->loop);
+      src->loop = NULL;
+
+      if (!src->mount_successful) {
+        GST_ERROR ("Mounting the enclosing volume failed for some reason");
+      } else {
+        stream = G_INPUT_STREAM (g_file_read (file, cancel, &err));
+      }
+    }
+  }
+
+  src->mount_successful = FALSE;
+
   g_object_unref (file);
 
   if (stream == NULL && !gst_gio_error (src, "g_file_read", &err, NULL)) {
 
-    if (GST_GIO_ERROR_MATCHES (err, NOT_FOUND))
+    if (GST_GIO_ERROR_MATCHES (err, NOT_FOUND)) {
       GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL),
           ("Could not open location %s for reading: %s",
               src->location, err->message));
-    else
+    } else {
       GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL),
           ("Could not open location %s for reading: %s",
               src->location, err->message));
+    }
 
     g_clear_error (&err);
-
     return FALSE;
-
   } else if (stream == NULL) {
     return FALSE;
   }
index 79918ae8331411fd716e22924588c1bf7dfbf109..92d2b25cb4e443e325f9822694e7c236698f8d6b 100644 (file)
@@ -54,6 +54,9 @@ struct _GstGioSrc
   
   /*< private >*/
   gchar *location;
+
+  GMainLoop *loop;
+  gboolean mount_successful;
 };
 
 struct _GstGioSrcClass