uridownloader: Provide some more details about errors if downloading fails
authorSebastian Dröge <sebastian@centricular.com>
Tue, 11 Feb 2014 13:13:30 +0000 (14:13 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 11 Feb 2014 13:13:30 +0000 (14:13 +0100)
gst-libs/gst/uridownloader/gsturidownloader.c
gst-libs/gst/uridownloader/gsturidownloader.h

index afd4c3e..0df8a75 100644 (file)
@@ -41,6 +41,8 @@ struct _GstUriDownloaderPrivate
   GstFragment *download;
   GMutex download_lock;         /* used to restrict to one download only */
 
+  GError *err;
+
   GCond cond;
   gboolean cancelled;
 };
@@ -198,7 +200,12 @@ gst_uri_downloader_bus_handler (GstBus * bus,
         "Received error: %s from %s, the download will be cancelled",
         GST_OBJECT_NAME (message->src), err->message);
     GST_DEBUG ("Debugging info: %s\n", (dbg_info) ? dbg_info : "none");
-    g_error_free (err);
+
+    if (!downloader->priv->err)
+      downloader->priv->err = err;
+    else
+      g_error_free (err);
+
     g_free (dbg_info);
 
     /* remove the sync handler to avoid duplicated messages */
@@ -332,9 +339,10 @@ gst_uri_downloader_set_uri (GstUriDownloader * downloader, const gchar * uri)
 }
 
 GstFragment *
-gst_uri_downloader_fetch_uri (GstUriDownloader * downloader, const gchar * uri)
+gst_uri_downloader_fetch_uri (GstUriDownloader * downloader, const gchar * uri,
+    GError ** err)
 {
-  return gst_uri_downloader_fetch_uri_with_range (downloader, uri, 0, -1);
+  return gst_uri_downloader_fetch_uri_with_range (downloader, uri, 0, -1, err);
 }
 
 /**
@@ -348,7 +356,7 @@ gst_uri_downloader_fetch_uri (GstUriDownloader * downloader, const gchar * uri)
  */
 GstFragment *
 gst_uri_downloader_fetch_uri_with_range (GstUriDownloader * downloader,
-    const gchar * uri, gint64 range_start, gint64 range_end)
+    const gchar * uri, gint64 range_start, gint64 range_end, GError ** err)
 {
   GstStateChangeReturn ret;
   GstFragment *download = NULL;
@@ -356,6 +364,7 @@ gst_uri_downloader_fetch_uri_with_range (GstUriDownloader * downloader,
   GST_DEBUG_OBJECT (downloader, "Fetching URI %s", uri);
 
   g_mutex_lock (&downloader->priv->download_lock);
+  downloader->priv->err = NULL;
 
   GST_OBJECT_LOCK (downloader);
   if (downloader->priv->cancelled) {
@@ -463,6 +472,15 @@ quit:
       GST_OBJECT_UNLOCK (downloader);
     }
 
+    if (download == NULL) {
+      if (!downloader->priv->err) {
+        g_set_error (err, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_OPEN_READ,
+            "Failed to download '%s'", uri);
+      } else {
+        g_propagate_error (err, downloader->priv->err);
+      }
+    }
+
     g_mutex_unlock (&downloader->priv->download_lock);
     return download;
   }
index c5837c3..9303f0c 100644 (file)
@@ -56,8 +56,8 @@ struct _GstUriDownloaderClass
 GType gst_uri_downloader_get_type (void);
 
 GstUriDownloader * gst_uri_downloader_new (void);
-GstFragment * gst_uri_downloader_fetch_uri (GstUriDownloader * downloader, const gchar * uri);
-GstFragment * gst_uri_downloader_fetch_uri_with_range (GstUriDownloader * downloader, const gchar * uri, gint64 range_start, gint64 range_end);
+GstFragment * gst_uri_downloader_fetch_uri (GstUriDownloader * downloader, const gchar * uri, GError ** err);
+GstFragment * gst_uri_downloader_fetch_uri_with_range (GstUriDownloader * downloader, const gchar * uri, gint64 range_start, gint64 range_end, GError ** err);
 void gst_uri_downloader_reset (GstUriDownloader *downloader);
 void gst_uri_downloader_cancel (GstUriDownloader *downloader);
 void gst_uri_downloader_free (GstUriDownloader *downloader);