[gnac/devel] Refactoring and fix on _error_cb



commit 1b6cdd7463a416f57d859d37d6e7ae869aafcfee
Author: David Joaquim <djoaquim src gnome org>
Date:   Mon Jan 18 19:53:21 2010 +0100

    Refactoring and fix on _error_cb

 configure.ac                |    9 +-
 libgnac/libgnac-converter.c |  247 +++++++++++++++++++++++++++++--------------
 libgnac/libgnac-converter.h |    1 -
 libgnac/libgnac-gst.c       |    9 ++
 libgnac/libgnac-output.c    |    2 +
 src/gnac-ui.c               |    2 +
 6 files changed, 186 insertions(+), 84 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index b2e9a84..c906df7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -106,9 +106,12 @@ fi
 
 # debug support
 AC_ARG_ENABLE([debug], [],
-  [ if test "$enableval" = "yes"; then
-      AM_CFLAGS="$AM_CFLAGS -ggdb -O0"
-    fi
+[ if test "$enableval" = "yes"; then
+    CFLAGS="-g -ggdb -O0"
+  else
+    CFLAGS="-O2"
+  fi
+  AC_SUBST([CFLAGS])
   ])
 
 dnl We require Scroll Keeper 0.3.5 or above for the help
diff --git a/libgnac/libgnac-converter.c b/libgnac/libgnac-converter.c
index ac71591..f78996b 100644
--- a/libgnac/libgnac-converter.c
+++ b/libgnac/libgnac-converter.c
@@ -603,10 +603,11 @@ libgnac_converter_restart_current(LibgnacConverter *self)
 
   priv = LIBGNAC_CONVERTER_GET_PRIVATE(self);
 
-  libgnac_info("Restarting pipeline");
+  libgnac_info("Restarting current pipeline");
 
   if (priv->current) 
   {
+      /* Run the pipeline again */
       libgnac_converter_item_run(priv->current, &err);
       if (err) {
         g_clear_error(&err);
@@ -876,6 +877,7 @@ libgnac_converter_item_build(LibgnacConverterItem  *item,
   }
 
   libgnac_gst_build_pipeline(item, has_video, &err);
+  g_return_if_fail(item->destination);
   if (err) {
     libgnac_warning("Unable to build pipeline");
     libgnac_gst_clean_pipeline(item);
@@ -883,7 +885,6 @@ libgnac_converter_item_build(LibgnacConverterItem  *item,
   }
 }
 
-
 void
 libgnac_converter_item_run(LibgnacConverterItem  *item, 
                            GError               **error)
@@ -892,6 +893,7 @@ libgnac_converter_item_run(LibgnacConverterItem  *item,
   g_return_if_fail(error == NULL || *error == NULL);
 
   /* Build pipeline if doesn't exist */
+
   if (!item->pipeline) {
     libgnac_converter_item_build(item, &err);
     if(err)
@@ -901,6 +903,7 @@ libgnac_converter_item_run(LibgnacConverterItem  *item,
     }
   }
 
+
   libgnac_converter_item_initialize_event_source(item);
   
   libgnac_gst_run(item, &err);
@@ -1017,6 +1020,140 @@ libgnac_converter_eos_cb(GstBus     *bus,
   }
 }
 
+static gboolean
+libgnac_converter_error_sink(LibgnacConverterItem *item, 
+                             GstMessage *message, 
+                             gchar      *uri, 
+                             GError     *error)
+{
+
+  g_return_val_if_fail(item, FALSE);
+  g_return_val_if_fail(item->destination, FALSE);
+  g_return_val_if_fail(error, FALSE);
+
+  /* Create missing directory */
+  GError *err = NULL;
+  GFile *folder;
+  gboolean folder_creation;
+
+  libgnac_debug("Resource not found");
+
+  // TODO libgnac_utils
+  /* Get parent folder name */
+  folder = g_file_get_parent(item->destination);
+  folder_creation = g_file_make_directory_with_parents(folder, NULL, &err);
+  g_object_unref(folder);
+
+  /* New folder create relaunch pipeline */
+  if (folder_creation && !err) {
+
+    libgnac_debug("Folder successfully created");
+    return TRUE;
+  }
+
+  if (err) {
+  /* If folder existed but something went wrong */
+    if (!g_error_matches(error,
+                G_IO_ERROR,
+                G_IO_ERROR_EXISTS)) {
+
+      libgnac_debug("Unable to create directory");
+      g_signal_emit(item->converter, signals[ERROR], 0, uri, 
+                    _("Unable to create destination directory"), NULL);
+      g_clear_error(&err);
+      return FALSE;
+    }
+    g_clear_error(&err);
+  }
+
+  /* The destination file already exists */
+  if (g_file_test(g_file_get_path(item->destination), G_FILE_TEST_EXISTS))
+  {
+    libgnac_debug("Destination file already exists");
+
+    gboolean overwrite = FALSE;
+
+    /* TODO; do not interrupt user's workflow
+     * Provide some notification => GtkInfoBar
+    g_signal_emit(item->converter, signals[OVERWRITE], 0, 
+                    item->destination, &overwrite);
+    */
+
+    if (overwrite)
+    {
+      GError *err = NULL;
+
+      libgnac_debug("Overwrite file");
+      // TODO libgnac_utils
+      g_file_delete(item->destination, NULL, &err);
+      if (err) {
+        libgnac_warning("Unable to overwrite file %s: %s", uri, err->message);
+        g_clear_error(&err);
+      }
+      else
+      {
+        return TRUE;
+      }
+    }
+  /* Just send error signal */
+    else 
+    {
+      // TODO transform to WARNING signal
+      gchar  *msg;
+      GError *err = NULL;
+
+      libgnac_debug("Do not owerwrite file");
+      msg = g_strdup_printf(_("Destination file %s already exists"), uri);
+      g_set_error_literal(&err, LIBGNAC_ERROR, 
+          LIBGNAC_ERROR_FILE_EXISTS, msg);
+      g_signal_emit(item->converter, signals[ERROR], 0, uri, msg, err);
+      g_clear_error(&err);
+      g_free(msg);
+    }
+  } 
+  /* Access error */
+  else
+  {
+    libgnac_debug("Other error happend");
+    g_signal_emit(item->converter, signals[ERROR], 0, uri, 
+                      _("Unable to access destination file"), error);
+  }
+
+  return FALSE;
+}
+
+static gboolean
+libgnac_converter_error_src(LibgnacConverterItem *item, 
+                            GstMessage *message, 
+                            gchar      *uri, 
+                            GError     *error)
+{
+  g_signal_emit(item->converter, signals[ERROR], 0, uri, 
+                  _("Unable to read source file"), error);
+
+  return FALSE;
+}
+
+static gboolean
+libgnac_converter_error_other(LibgnacConverterItem *item, 
+                               GstMessage *message, 
+                               gchar      *uri, 
+                               GError     *error)
+{
+  GError *err = NULL;
+
+  // TODO libgnac_utils
+  g_file_delete(item->destination, NULL, &err);
+  if (err) {
+    libgnac_warning("Unable to remove partial file %s: %s", uri, err->message);
+    g_clear_error(&err);
+  }
+  g_signal_emit(item->converter, signals[ERROR], 0, uri, 
+                  _("An error occured during conversion"), error);
+ 
+  return FALSE;
+}
+
 
 void
 libgnac_converter_error_cb(GstBus      *bus, 
@@ -1027,100 +1164,51 @@ libgnac_converter_error_cb(GstBus      *bus,
   GstObject *src = NULL;
   LibgnacConverterItem *item = NULL;
   gchar *uri;
+  gchar *out_uri;
   gchar *name;
+  gboolean restart = FALSE;
 
   item = (LibgnacConverterItem*)data;
   libgnac_converter_item_clear_event_source(item);
 
+  uri = g_file_get_uri(item->source);
+  out_uri = g_file_get_uri(item->destination);
   src = GST_MESSAGE_SRC(message);
-  name = gst_object_get_name(src);
+  name = GST_MESSAGE_SRC_NAME(message);
+  gst_message_parse_error(message, &error, NULL);
 
-  uri = g_file_get_uri(item->source);
+  libgnac_warning("An error is detected:\n\tFile: %s\n\tOut file %s\n\tBin name: %s\n\tError message: %s", 
+                  uri, out_uri, name, error->message);
 
-  gst_message_parse_error(message, &error, NULL);
 
   if (g_str_has_prefix(name, "giosink"))
   {
-    if (g_error_matches(error, 
-            GST_RESOURCE_ERROR, 
-            GST_RESOURCE_ERROR_NOT_FOUND)) 
-    {
-      /* Create missing directory */
-      GError *err = NULL;
-      GFile *folder;
-
-      folder = g_file_get_parent(item->destination);
-      g_file_make_directory_with_parents(folder, NULL, &err);
-      g_object_unref(folder);
-      if (err) {
-        g_signal_emit(item->converter, signals[ERROR], 0, uri, 
-                        _("Unable to create destination directory"), NULL);
-        g_clear_error(&err);
-      } else if (libgnac_converter_restart_current(item->converter)) return;
-
-    } else if (g_error_matches(error,
-                  GST_RESOURCE_ERROR,
-                  GST_RESOURCE_ERROR_OPEN_READ))
-    {
-      if (g_file_test(g_file_get_path(item->destination), G_FILE_TEST_EXISTS))
-      {
-        gboolean overwrite = FALSE;
-        g_signal_emit(item->converter, signals[OVERWRITE], 0, 
-                        item->destination, &overwrite);
-        if (overwrite)
-        {
-          GError *err = NULL;
-          g_file_delete(item->destination, NULL, &err);
-          if (err) {
-            libgnac_warning("Unable to overwrite file %s: %s", uri, err->message);
-            g_clear_error(&err);
-          }
-          if (!err && libgnac_converter_restart_current(item->converter)) 
-          {
-            g_clear_error(&error);
-            g_free(name);
-            g_free(uri);
-            return;
-          }
-        }
-        else 
-        {
-          gchar  *msg;
-          GError *err = NULL;
-          msg = g_strdup_printf(_("Destination file %s already exists"), uri);
-          g_set_error_literal(&err, LIBGNAC_ERROR, 
-              LIBGNAC_ERROR_FILE_EXISTS, msg);
-          g_signal_emit(item->converter, signals[ERROR], 0, uri, msg, err);
-          g_clear_error(&err);
-          g_free(msg);
-        }
-      } 
-      else
-      {
-        g_signal_emit(item->converter, signals[ERROR], 0, uri, 
-                          _("Unable to access destination file"), error);
-      }
-    }
+    libgnac_debug("Sink error");
+    restart = libgnac_converter_error_sink(item, message, uri, error);
   } else if (g_str_has_prefix(name, "giosrc")) {
-    g_signal_emit(item->converter, signals[ERROR], 0, uri, 
-                    _("Unable to read source file"), error);
+    libgnac_debug("Source error");
+    restart = libgnac_converter_error_src(item, message, uri, error);
   } else {
-    GError *err = NULL;
-    g_file_delete(item->destination, NULL, &err);
-    if (err) {
-      libgnac_warning("Unable to remove partial file %s: %s", uri, err->message);
-      g_clear_error(&err);
-    }
-    g_signal_emit(item->converter, signals[ERROR], 0, uri, 
-                    _("An error occured during conversion"), error);
+    libgnac_debug("Other error");
+    restart = libgnac_converter_error_other(item, message, uri, error);
   }
 
-  libgnac_warning("Conversion failed:\n\tFile: %s\n\tBin name: %s\n\tError message: %s", 
-                  uri, name, error->message);
-
   g_clear_error(&error);
-  g_free(name);
   g_free(uri);
+  g_free(out_uri);
+
+  /* 
+   * We cannot remove partial file here, in some case the error is 
+   * access error and we do not want and cannot remove the file
+   */
+
+  // TODO restart current if needed
+  if (restart) {
+    if (libgnac_converter_restart_current(item->converter)) {
+      /* The restart was ok, do not send any signal and do not start next*/
+      return;
+    }
+  }
 
   if (!libgnac_converter_start_next(item->converter))
   {
@@ -1128,7 +1216,6 @@ libgnac_converter_error_cb(GstBus      *bus,
     g_signal_emit(item->converter, signals[COMPLETION], 0);
   }     
 
-  //libgnac_converter_restart_current(item->converter);
 }
 
 
diff --git a/libgnac/libgnac-converter.h b/libgnac/libgnac-converter.h
index e8c3e78..189927b 100644
--- a/libgnac/libgnac-converter.h
+++ b/libgnac/libgnac-converter.h
@@ -142,7 +142,6 @@ libgnac_converter_item_new(LibgnacConverter *self,
 void
 libgnac_converter_item_build(LibgnacConverterItem  *item,
                              GError               **error);
-
 void
 libgnac_converter_item_run(LibgnacConverterItem  *item,
                            GError               **error);
diff --git a/libgnac/libgnac-gst.c b/libgnac/libgnac-gst.c
index d2beb7e..197cbae 100644
--- a/libgnac/libgnac-gst.c
+++ b/libgnac/libgnac-gst.c
@@ -334,6 +334,7 @@ libgnac_gst_build_pipeline(LibgnacConverterItem  *item,
   }
 
   /* output */
+  // TODO remove this from here
   libgnac_output_build_output(item, &encoder_error);
   if (encoder_error) {
     libgnac_warning("Output creation failed");
@@ -515,6 +516,14 @@ libgnac_gst_clean_pipeline(LibgnacConverterItem *item)
     g_object_unref(GST_OBJECT(item->pipeline));
     item->pipeline = NULL;
   }
+
+  if (item->bus) {
+    item->bus = NULL;
+  }
+
+  if (item->audio_encoder) {
+    item->audio_encoder = NULL;
+  }
 }
 
 
diff --git a/libgnac/libgnac-output.c b/libgnac/libgnac-output.c
index 8e5a4b1..05cfc30 100644
--- a/libgnac/libgnac-output.c
+++ b/libgnac/libgnac-output.c
@@ -402,6 +402,8 @@ libgnac_output_build_output(LibgnacConverterItem  *item,
 
   g_return_if_fail(!error || !*error);
 
+  if (item->destination) return;
+
   g_object_get(item->converter, "extension", &extension, NULL);
   g_object_get(item->converter, "strip-special", &strip_special, NULL);
   g_object_get(item->converter, "folder-hierarchy", &folder_hierarchy, NULL); 
diff --git a/src/gnac-ui.c b/src/gnac-ui.c
index 310111d..ffd5144 100644
--- a/src/gnac-ui.c
+++ b/src/gnac-ui.c
@@ -507,11 +507,13 @@ gnac_ui_trayicon_tooltip_update(const gchar *tooltip)
   gchar *tmp = NULL;
   GdkDisplay *display;
   
+  /* TODO check this
   tmp = tooltip_path;
   tooltip_path = g_strdup(tooltip);
   display = gdk_display_get_default();
   if (display) gtk_tooltip_trigger_tooltip_query(display);
   g_free(tmp);
+  */
 }
 
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]