[gnac/devel] Refactoring and fix on _error_cb
- From: David Joaquim <djoaquim src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnac/devel] Refactoring and fix on _error_cb
- Date: Mon, 18 Jan 2010 18:55:25 +0000 (UTC)
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]