[gthumb: 12/15] [burn_disc] converted the burn procedure to a task



commit 85c2f641155ca7e591653480fc44d4eed9bf8f99
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Sun Feb 28 21:12:12 2010 +0100

    [burn_disc] converted the burn procedure to a task

 extensions/burn_disc/Makefile.am     |    2 +
 extensions/burn_disc/actions.c       |  377 +-------------------------
 extensions/burn_disc/gth-burn-task.c |  484 ++++++++++++++++++++++++++++++++++
 extensions/burn_disc/gth-burn-task.h |   55 ++++
 4 files changed, 552 insertions(+), 366 deletions(-)
---
diff --git a/extensions/burn_disc/Makefile.am b/extensions/burn_disc/Makefile.am
index d3468f7..82fd1e9 100644
--- a/extensions/burn_disc/Makefile.am
+++ b/extensions/burn_disc/Makefile.am
@@ -10,6 +10,8 @@ libburn_disc_la_SOURCES = 		\
 	actions.h			\
 	callbacks.c			\
 	callbacks.h			\
+	gth-burn-task.c			\
+	gth-burn-task.h			\
 	main.c
 
 libburn_disc_la_CFLAGS = $(GTHUMB_CFLAGS) $(LIBBRASERO_CFLAGS) -I$(top_srcdir) -I$(top_builddir)/gthumb 
diff --git a/extensions/burn_disc/actions.c b/extensions/burn_disc/actions.c
index d8dba2d..f5edf00 100644
--- a/extensions/burn_disc/actions.c
+++ b/extensions/burn_disc/actions.c
@@ -22,384 +22,29 @@
 
 
 #include <config.h>
-#include <brasero/brasero-burn-dialog.h>
-#include <brasero/brasero-burn-lib.h>
-#include <brasero/brasero-burn-options.h>
-#include <brasero/brasero-media.h>
-#include <brasero/brasero-session.h>
-#include <brasero/brasero-session-cfg.h>
-#include <brasero/brasero-track-data-cfg.h>
 #include <glib/gi18n.h>
 #include <gthumb.h>
-
-
-typedef struct {
-	GthBrowser    *browser;
-	GFile         *location;
-	GList         *files;
-	GtkWidget     *dialog;
-	GtkBuilder    *builder;
-	GthTest       *test;
-	GthFileSource *file_source;
-	char          *base_directory;
-	char          *current_directory;
-	GHashTable    *content;
-	GHashTable *parents;
-	BraseroSessionCfg   *session;
-	BraseroTrackDataCfg *track;
-} BurnData;
-
-
-static void
-free_file_list_from_content (gpointer key,
-			     gpointer value,
-			     gpointer user_data)
-{
-	_g_object_list_unref (value);
-}
-
-
-static void
-burn_data_free (BurnData *data)
-{
-	g_hash_table_foreach (data->content, free_file_list_from_content, NULL);
-	g_hash_table_unref (data->content);
-	g_hash_table_unref (data->parents);
-	g_free (data->current_directory);
-	_g_object_unref (data->file_source);
-	_g_object_unref (data->test);
-	_g_object_unref (data->builder);
-	_g_object_list_unref (data->files);
-	g_free (data->base_directory);
-	g_object_unref (data->location);
-	g_object_unref (data->browser);
-	g_free (data);
-}
-
-
-static void
-add_file_to_track (BurnData   *data,
-		   const char *parent_uri,
-		   const char *relative_subfolder,
-		   GFile      *file)
-{
-	char        *relative_parent;
-	GtkTreePath *tree_path;
-	char        *uri;
-
-	relative_parent = g_build_path ("/", parent_uri + strlen (data->base_directory), relative_subfolder, NULL);
-	if (relative_parent != NULL) {
-		char **subfolders;
-		int    i;
-		char  *subfolder;
-
-		/* add all the subfolders to the track data */
-
-		subfolder = NULL;
-		subfolders = g_strsplit (relative_parent, "/", -1);
-		for (i = 0; subfolders[i] != NULL; i++) {
-			char *subfolder_parent;
-
-			subfolder_parent = subfolder;
-			if (subfolder_parent != NULL)
-				subfolder = g_strconcat (subfolder_parent, "/", subfolders[i], NULL);
-			else
-				subfolder = g_strdup (subfolders[i]);
-
-			if ((strcmp (subfolder, "") != 0) && g_hash_table_lookup (data->parents, subfolder) == NULL) {
-				GtkTreePath *subfolder_parent_tpath;
-				GtkTreePath *subfolder_tpath;
-
-				if (subfolder_parent != NULL)
-					subfolder_parent_tpath = g_hash_table_lookup (data->parents, subfolder_parent);
-				else
-					subfolder_parent_tpath = NULL;
-				subfolder_tpath = brasero_track_data_cfg_add_empty_directory (data->track, _g_uri_get_basename (subfolder), subfolder_parent_tpath);
-				g_hash_table_insert (data->parents, g_strdup (subfolder), subfolder_tpath);
-			}
-
-			g_free (subfolder_parent);
-		}
-
-		g_free (subfolder);
-		g_strfreev (subfolders);
-	}
-
-	tree_path = NULL;
-	if (relative_parent != NULL)
-		tree_path = g_hash_table_lookup (data->parents, relative_parent);
-	uri = g_file_get_uri (file);
-	brasero_track_data_cfg_add (data->track, uri, tree_path);
-
-	g_free (uri);
-	g_free (relative_parent);
-}
-
-
-static void
-add_content_list (gpointer key,
-		  gpointer value,
-		  gpointer user_data)
-{
-	BurnData *data = user_data;
-	char     *parent_uri = key;
-	GList    *files = value;
-	GList    *scan;
-
-	for (scan = files; scan; scan = scan->next)
-		add_file_to_track (data, parent_uri, NULL, (GFile *) scan->data);
-
-	for (scan = files; scan; scan = scan->next) {
-		GFile *file = scan->data;
-		GFile *file_parent;
-		GList *file_sidecars = NULL;
-		GList *scan_sidecars;
-
-		file_parent = g_file_get_parent (file);
-		gth_hook_invoke ("add-sidecars", file, &file_sidecars);
-		for (scan_sidecars = file_sidecars; scan_sidecars; scan_sidecars = scan_sidecars->next) {
-			GFile *sidecar = scan_sidecars->data;
-			char  *relative_path;
-			char  *subfolder_path;
-
-			if (! g_file_query_exists (sidecar, NULL))
-				continue;
-
-			relative_path = g_file_get_relative_path (file_parent, sidecar);
-			subfolder_path = _g_uri_get_parent (relative_path);
-			if (g_strcmp0 (subfolder_path, "") == 0) {
-				g_free (subfolder_path);
-				subfolder_path = NULL;
-			}
-			add_file_to_track (data, parent_uri, subfolder_path, sidecar);
-		}
-
-		_g_object_list_unref (file_sidecars);
-		g_object_unref (file_parent);
-	}
-}
-
-
-static void
-label_entry_changed_cb (GtkEntry           *entry,
-			BraseroBurnSession *session)
-{
-	brasero_burn_session_set_label (session, gtk_entry_get_text (entry));
-}
-
-
-static void
-burn_content_to_disc (BurnData *data)
-{
-	static gboolean  initialized = FALSE;
-	GtkWidget       *dialog;
-	GtkBuilder      *builder;
-	GtkWidget       *options;
-	GtkResponseType  result;
-
-	if (! initialized) {
-		brasero_media_library_start ();
-		brasero_burn_library_start (NULL, NULL);
-		initialized = TRUE;
-	}
-
-	data->session = brasero_session_cfg_new ();
-	data->track = brasero_track_data_cfg_new ();
-	brasero_burn_session_add_track (BRASERO_BURN_SESSION (data->session),
-					BRASERO_TRACK (data->track),
-					NULL);
-	g_object_unref (data->track);
-
-	g_hash_table_foreach (data->content, add_content_list, data);
-
-	dialog = brasero_burn_options_new (data->session);
-	gtk_window_set_icon_name (GTK_WINDOW (dialog), gtk_window_get_icon_name (GTK_WINDOW (data->browser)));
-	gtk_window_set_title (GTK_WINDOW (dialog), _("Write to Disc"));
-	gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (data->browser));
-
-	builder = _gtk_builder_new_from_file ("burn-disc-options.ui", "burn_disc");
-	options = _gtk_builder_get_widget (builder, "options");
-	gtk_entry_set_text (GTK_ENTRY (_gtk_builder_get_widget (builder, "label_entry")),
-			    g_file_info_get_display_name (gth_browser_get_location_data (data->browser)->info));
-	g_signal_connect (_gtk_builder_get_widget (builder, "label_entry"),
-			  "changed",
-			  G_CALLBACK (label_entry_changed_cb),
-			  data->session);
-	gtk_widget_show (options);
-	brasero_burn_options_add_options (BRASERO_BURN_OPTIONS (dialog), options);
-
-	result = gtk_dialog_run (GTK_DIALOG (dialog));
-	gtk_widget_destroy (dialog);
-
-	if (result == GTK_RESPONSE_OK) {
-		dialog = brasero_burn_dialog_new ();
-		gtk_window_set_icon_name (GTK_WINDOW (dialog), gtk_window_get_icon_name (GTK_WINDOW (data->browser)));
-		gtk_window_set_title (GTK_WINDOW (dialog), _("Write to Disc"));
-		brasero_session_cfg_disable (data->session);
-		gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (data->browser));
-		gtk_window_present (GTK_WINDOW (dialog));
-		brasero_burn_dialog_run (BRASERO_BURN_DIALOG (dialog),
-					 BRASERO_BURN_SESSION (data->session));
-
-		gtk_widget_destroy (dialog);
-	}
-
-	g_object_unref (data->session);
-}
-
-
-static void
-done_func (GObject  *object,
-	   GError   *error,
-	   gpointer  user_data)
-{
-	BurnData *data = user_data;
-
-	if (error != NULL) {
-		_gtk_error_dialog_from_gerror_show (GTK_WINDOW (data->browser), _("Could not get the file list"), &error);
-		burn_data_free (data);
-		return;
-	}
-
-	burn_content_to_disc (data);
-	burn_data_free (data);
-}
-
-
-static void
-for_each_file_func (GFile     *file,
-		    GFileInfo *info,
-		    gpointer   user_data)
-{
-	BurnData    *data = user_data;
-	GthFileData *file_data;
-
-	if (g_file_info_get_file_type (info) != G_FILE_TYPE_REGULAR)
-		return;
-
-	file_data = gth_file_data_new (file, info);
-	if (gth_test_match (data->test, file_data)) {
-		GList *list;
-
-		list = g_hash_table_lookup (data->content, data->current_directory);
-		list = g_list_prepend (list, g_file_dup (file));
-		g_hash_table_insert (data->content, g_strdup (data->current_directory), list);
-	}
-
-	g_object_unref (file_data);
-}
-
-
-static DirOp
-start_dir_func (GFile      *directory,
-		GFileInfo  *info,
-		GError    **error,
-		gpointer    user_data)
-{
-	BurnData *data = user_data;
-	GFile    *parent;
-	char     *escaped;
-	GFile    *destination;
-	char     *uri;
-
-	g_free (data->current_directory);
-
-	parent = g_file_get_parent (directory);
-	escaped = _g_replace (g_file_info_get_display_name (info), "/", "-");
-	destination = g_file_get_child_for_display_name (parent, escaped, NULL);
-	uri = g_file_get_uri (destination);
-	data->current_directory = g_uri_unescape_string (uri, NULL);
-	g_hash_table_insert (data->content, g_strdup (data->current_directory), NULL);
-
-	g_free (uri);
-	g_object_unref (destination);
-	g_free (escaped);
-	g_object_unref (parent);
-
-	return DIR_OP_CONTINUE;
-}
-
-
-static void
-source_dialog_response_cb (GtkDialog *dialog,
-			   int        response,
-			   BurnData  *data)
-{
-	gtk_widget_hide (data->dialog);
-
-	if (response == GTK_RESPONSE_OK) {
-		if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (_gtk_builder_get_widget (data->builder, "selection_radiobutton")))) {
-			g_hash_table_replace (data->content, g_file_get_uri (data->location), g_list_reverse (data->files));
-			data->files = NULL;
-			burn_content_to_disc (data);
-			burn_data_free (data);
-		}
-		else {
-			gboolean recursive;
-
-			_g_object_list_unref (data->files);
-			data->files = NULL;
-
-			recursive = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (_gtk_builder_get_widget (data->builder, "folder_recursive_radiobutton")));
-			data->test = gth_main_get_general_filter ();
-			data->file_source = gth_main_get_file_source (data->location);
-			gth_file_source_for_each_child (data->file_source,
-							data->location,
-							recursive,
-							eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
-							start_dir_func,
-							for_each_file_func,
-							done_func,
-							data);
-		}
-	}
-	else
-		burn_data_free (data);
-
-	gtk_widget_destroy (data->dialog);
-}
+#include "gth-burn-task.h"
 
 
 void
 gth_browser_activate_action_burn_disc (GtkAction  *action,
 				       GthBrowser *browser)
 {
-	GList    *items;
-	GList    *file_list;
-	BurnData *data;
+	GList   *items;
+	GList   *file_list;
+	GList   *files;
+	GthTask *task;
 
 	items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
-	if ((items != NULL) && (items->next != NULL))
-		file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
-	else
-		file_list = gth_file_store_get_visibles (GTH_FILE_STORE (gth_browser_get_file_store (browser)));
-
-	data = g_new0 (BurnData, 1);
-	data->browser = g_object_ref (browser);
-	data->location = g_file_dup (gth_browser_get_location (browser));
-	data->base_directory = g_file_get_uri (data->location);
-	data->files = gth_file_data_list_to_file_list (file_list);
-	data->content = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
-	data->parents = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) gtk_tree_path_free);
-	data->builder = _gtk_builder_new_from_file ("burn-source-selector.ui", "burn_disc");
-	data->dialog = gtk_dialog_new_with_buttons (_("Write to Disc"),
-						    GTK_WINDOW (browser),
-						    GTK_DIALOG_NO_SEPARATOR,
-						    GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-						    GTK_STOCK_OK, GTK_RESPONSE_OK,
-						    NULL);
-	gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (data->dialog))), _gtk_builder_get_widget (data->builder, "source_selector"));
-	if (items == NULL)
-		gtk_widget_set_sensitive (_gtk_builder_get_widget (data->builder, "selection_radiobutton"), FALSE);
-	else if ((items != NULL) && (items->next != NULL))
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (_gtk_builder_get_widget (data->builder, "selection_radiobutton")), TRUE);
+	file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+	files = gth_file_data_list_to_file_list (file_list);
 
-	g_signal_connect (data->dialog,
-			  "response",
-			  G_CALLBACK (source_dialog_response_cb),
-			  data);
-	gtk_widget_show_all (data->dialog);
+	task = gth_burn_task_new (browser, files);
+	gth_browser_exec_task (browser, task, FALSE);
 
+	g_object_unref (task);
+	_g_object_list_unref (files);
 	_g_object_list_unref (file_list);
 	_gtk_tree_path_list_free (items);
 }
diff --git a/extensions/burn_disc/gth-burn-task.c b/extensions/burn_disc/gth-burn-task.c
new file mode 100644
index 0000000..54fde47
--- /dev/null
+++ b/extensions/burn_disc/gth-burn-task.c
@@ -0,0 +1,484 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <brasero/brasero-burn-dialog.h>
+#include <brasero/brasero-burn-lib.h>
+#include <brasero/brasero-burn-options.h>
+#include <brasero/brasero-media.h>
+#include <brasero/brasero-session.h>
+#include <brasero/brasero-session-cfg.h>
+#include <brasero/brasero-track-data-cfg.h>
+#include <gthumb.h>
+#include "gth-burn-task.h"
+
+
+struct _GthBurnTaskPrivate
+{
+	GthBrowser          *browser;
+	GFile               *location;
+	GList               *selected_files;
+	GtkWidget           *dialog;
+	GtkBuilder          *builder;
+	GthTest             *test;
+	GthFileSource       *file_source;
+	char                *base_directory;
+	char                *current_directory;
+	GHashTable          *content;
+	GHashTable          *parents;
+	BraseroSessionCfg   *session;
+	BraseroTrackDataCfg *track;
+};
+
+
+static gpointer parent_class = NULL;
+
+
+static void
+free_file_list_from_content (gpointer key,
+			     gpointer value,
+			     gpointer user_data)
+{
+	_g_object_list_unref (value);
+}
+
+
+static void
+gth_task_finalize (GObject *object)
+{
+	GthBurnTask *task;
+
+	task = GTH_BURN_TASK (object);
+
+	if (task->priv != NULL) {
+		g_hash_table_foreach (task->priv->content, free_file_list_from_content, NULL);
+		g_hash_table_unref (task->priv->content);
+		g_hash_table_unref (task->priv->parents);
+		g_free (task->priv->current_directory);
+		_g_object_unref (task->priv->file_source);
+		_g_object_unref (task->priv->test);
+		_g_object_unref (task->priv->builder);
+		_g_object_list_unref (task->priv->selected_files);
+		g_free (task->priv->base_directory);
+		g_object_unref (task->priv->location);
+		g_object_unref (task->priv->browser);
+
+		g_free (task->priv);
+		task->priv = NULL;
+	}
+
+	G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+
+
+static void
+add_file_to_track (GthBurnTask *task,
+		   const char  *parent_uri,
+		   const char  *relative_subfolder,
+		   GFile       *file)
+{
+	char        *relative_parent;
+	GtkTreePath *tree_path;
+	char        *uri;
+
+	relative_parent = g_build_path ("/", parent_uri + strlen (task->priv->base_directory), relative_subfolder, NULL);
+	if (relative_parent != NULL) {
+		char **subfolders;
+		int    i;
+		char  *subfolder;
+
+		/* add all the subfolders to the track data */
+
+		subfolder = NULL;
+		subfolders = g_strsplit (relative_parent, "/", -1);
+		for (i = 0; subfolders[i] != NULL; i++) {
+			char *subfolder_parent;
+
+			subfolder_parent = subfolder;
+			if (subfolder_parent != NULL)
+				subfolder = g_strconcat (subfolder_parent, "/", subfolders[i], NULL);
+			else
+				subfolder = g_strdup (subfolders[i]);
+
+			if ((strcmp (subfolder, "") != 0) && g_hash_table_lookup (task->priv->parents, subfolder) == NULL) {
+				GtkTreePath *subfolder_parent_tpath;
+				GtkTreePath *subfolder_tpath;
+
+				if (subfolder_parent != NULL)
+					subfolder_parent_tpath = g_hash_table_lookup (task->priv->parents, subfolder_parent);
+				else
+					subfolder_parent_tpath = NULL;
+				subfolder_tpath = brasero_track_data_cfg_add_empty_directory (task->priv->track, _g_uri_get_basename (subfolder), subfolder_parent_tpath);
+				g_hash_table_insert (task->priv->parents, g_strdup (subfolder), subfolder_tpath);
+			}
+
+			g_free (subfolder_parent);
+		}
+
+		g_free (subfolder);
+		g_strfreev (subfolders);
+	}
+
+	tree_path = NULL;
+	if (relative_parent != NULL)
+		tree_path = g_hash_table_lookup (task->priv->parents, relative_parent);
+	uri = g_file_get_uri (file);
+	brasero_track_data_cfg_add (task->priv->track, uri, tree_path);
+
+	g_free (uri);
+	g_free (relative_parent);
+}
+
+
+static void
+add_content_list (gpointer key,
+		  gpointer value,
+		  gpointer user_data)
+{
+	GthBurnTask *task = user_data;
+	char        *parent_uri = key;
+	GList       *files = value;
+	GList       *scan;
+
+	for (scan = files; scan; scan = scan->next)
+		add_file_to_track (task, parent_uri, NULL, (GFile *) scan->data);
+
+	for (scan = files; scan; scan = scan->next) {
+		GFile *file = scan->data;
+		GFile *file_parent;
+		GList *file_sidecars = NULL;
+		GList *scan_sidecars;
+
+		file_parent = g_file_get_parent (file);
+		gth_hook_invoke ("add-sidecars", file, &file_sidecars);
+		for (scan_sidecars = file_sidecars; scan_sidecars; scan_sidecars = scan_sidecars->next) {
+			GFile *sidecar = scan_sidecars->data;
+			char  *relative_path;
+			char  *subfolder_path;
+
+			if (! g_file_query_exists (sidecar, NULL))
+				continue;
+
+			relative_path = g_file_get_relative_path (file_parent, sidecar);
+			subfolder_path = _g_uri_get_parent (relative_path);
+			if (g_strcmp0 (subfolder_path, "") == 0) {
+				g_free (subfolder_path);
+				subfolder_path = NULL;
+			}
+			add_file_to_track (task, parent_uri, subfolder_path, sidecar);
+		}
+
+		_g_object_list_unref (file_sidecars);
+		g_object_unref (file_parent);
+	}
+}
+
+
+static void
+label_entry_changed_cb (GtkEntry           *entry,
+			BraseroBurnSession *session)
+{
+	brasero_burn_session_set_label (session, gtk_entry_get_text (entry));
+}
+
+
+static void
+burn_content_to_disc (GthBurnTask *task)
+{
+	static gboolean  initialized = FALSE;
+	GtkWidget       *dialog;
+	GtkBuilder      *builder;
+	GtkWidget       *options;
+	GtkResponseType  result;
+
+	if (! initialized) {
+		brasero_media_library_start ();
+		brasero_burn_library_start (NULL, NULL);
+		initialized = TRUE;
+	}
+
+	gth_task_dialog (GTH_TASK (task), TRUE);
+
+	task->priv->session = brasero_session_cfg_new ();
+	task->priv->track = brasero_track_data_cfg_new ();
+	brasero_burn_session_add_track (BRASERO_BURN_SESSION (task->priv->session),
+					BRASERO_TRACK (task->priv->track),
+					NULL);
+	g_object_unref (task->priv->track);
+
+	g_hash_table_foreach (task->priv->content, add_content_list, task);
+
+	dialog = brasero_burn_options_new (task->priv->session);
+	gtk_window_set_icon_name (GTK_WINDOW (dialog), gtk_window_get_icon_name (GTK_WINDOW (task->priv->browser)));
+	gtk_window_set_title (GTK_WINDOW (dialog), _("Write to Disc"));
+	gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (task->priv->browser));
+
+	builder = _gtk_builder_new_from_file ("burn-disc-options.ui", "burn_disc");
+	options = _gtk_builder_get_widget (builder, "options");
+	gtk_entry_set_text (GTK_ENTRY (_gtk_builder_get_widget (builder, "label_entry")),
+			    g_file_info_get_display_name (gth_browser_get_location_data (task->priv->browser)->info));
+	g_signal_connect (_gtk_builder_get_widget (builder, "label_entry"),
+			  "changed",
+			  G_CALLBACK (label_entry_changed_cb),
+			  task->priv->session);
+	gtk_widget_show (options);
+	brasero_burn_options_add_options (BRASERO_BURN_OPTIONS (dialog), options);
+
+	result = gtk_dialog_run (GTK_DIALOG (dialog));
+	gtk_widget_destroy (dialog);
+
+	if (result == GTK_RESPONSE_OK) {
+		dialog = brasero_burn_dialog_new ();
+		gtk_window_set_icon_name (GTK_WINDOW (dialog), gtk_window_get_icon_name (GTK_WINDOW (task->priv->browser)));
+		gtk_window_set_title (GTK_WINDOW (dialog), _("Write to Disc"));
+		brasero_session_cfg_disable (task->priv->session);
+		gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (task->priv->browser));
+		gtk_window_present (GTK_WINDOW (dialog));
+		brasero_burn_dialog_run (BRASERO_BURN_DIALOG (dialog),
+					 BRASERO_BURN_SESSION (task->priv->session));
+
+		gtk_widget_destroy (dialog);
+	}
+
+	g_object_unref (task->priv->session);
+	gth_task_completed (GTH_TASK (task), NULL);
+}
+
+
+static void
+done_func (GObject  *object,
+	   GError   *error,
+	   gpointer  user_data)
+{
+	GthBurnTask *task = user_data;
+
+	if (error != NULL) {
+		gth_task_completed (GTH_TASK (task), error);
+		return;
+	}
+
+	burn_content_to_disc (task);
+}
+
+
+static void
+for_each_file_func (GFile     *file,
+		    GFileInfo *info,
+		    gpointer   user_data)
+{
+	GthBurnTask *task = user_data;
+	GthFileData *file_data;
+
+	if (g_file_info_get_file_type (info) != G_FILE_TYPE_REGULAR)
+		return;
+
+	file_data = gth_file_data_new (file, info);
+	if (gth_test_match (task->priv->test, file_data)) {
+		GList *list;
+
+		list = g_hash_table_lookup (task->priv->content, task->priv->current_directory);
+		list = g_list_prepend (list, g_file_dup (file));
+		g_hash_table_insert (task->priv->content, g_strdup (task->priv->current_directory), list);
+	}
+
+	g_object_unref (file_data);
+}
+
+
+static DirOp
+start_dir_func (GFile      *directory,
+		GFileInfo  *info,
+		GError    **error,
+		gpointer    user_data)
+{
+	GthBurnTask *task = user_data;
+	GFile       *parent;
+	char        *escaped;
+	GFile       *destination;
+	char        *uri;
+
+	g_free (task->priv->current_directory);
+
+	parent = g_file_get_parent (directory);
+	escaped = _g_replace (g_file_info_get_display_name (info), "/", "-");
+	destination = g_file_get_child_for_display_name (parent, escaped, NULL);
+	uri = g_file_get_uri (destination);
+	task->priv->current_directory = g_uri_unescape_string (uri, NULL);
+	g_hash_table_insert (task->priv->content, g_strdup (task->priv->current_directory), NULL);
+
+	g_free (uri);
+	g_object_unref (destination);
+	g_free (escaped);
+	g_object_unref (parent);
+
+	return DIR_OP_CONTINUE;
+}
+
+
+static void
+source_dialog_response_cb (GtkDialog   *dialog,
+			   int          response,
+			   GthBurnTask *task)
+{
+	gtk_widget_hide (task->priv->dialog);
+	gth_task_dialog (GTH_TASK (task), FALSE);
+
+	if (response == GTK_RESPONSE_OK) {
+		if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (_gtk_builder_get_widget (task->priv->builder, "selection_radiobutton")))) {
+			g_hash_table_replace (task->priv->content, g_file_get_uri (task->priv->location), g_list_reverse (task->priv->selected_files));
+			task->priv->selected_files = NULL;
+			burn_content_to_disc (task);
+		}
+		else {
+			gboolean recursive;
+
+			_g_object_list_unref (task->priv->selected_files);
+			task->priv->selected_files = NULL;
+
+			recursive = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (_gtk_builder_get_widget (task->priv->builder, "folder_recursive_radiobutton")));
+			task->priv->test = gth_main_get_general_filter ();
+			task->priv->file_source = gth_main_get_file_source (task->priv->location);
+			gth_file_source_for_each_child (task->priv->file_source,
+							task->priv->location,
+							recursive,
+							eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
+							start_dir_func,
+							for_each_file_func,
+							done_func,
+							task);
+		}
+	}
+	else
+		gth_task_completed (GTH_TASK (task), NULL);
+
+	gtk_widget_destroy (task->priv->dialog);
+}
+
+
+static void
+gth_burn_task_exec (GthTask *base)
+{
+	GthBurnTask *task = (GthBurnTask *) base;
+
+	gth_task_dialog (GTH_TASK (task), TRUE);
+
+	task->priv->builder = _gtk_builder_new_from_file ("burn-source-selector.ui", "burn_disc");
+	task->priv->dialog = gtk_dialog_new_with_buttons (_("Write to Disc"),
+							  GTK_WINDOW (task->priv->browser),
+							  GTK_DIALOG_NO_SEPARATOR,
+							  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+							  GTK_STOCK_OK, GTK_RESPONSE_OK,
+							  NULL);
+	gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (task->priv->dialog))), _gtk_builder_get_widget (task->priv->builder, "source_selector"));
+	if (task->priv->selected_files == NULL)
+		gtk_widget_set_sensitive (_gtk_builder_get_widget (task->priv->builder, "selection_radiobutton"), FALSE);
+	else if ((task->priv->selected_files != NULL) && (task->priv->selected_files->next != NULL))
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (_gtk_builder_get_widget (task->priv->builder, "selection_radiobutton")), TRUE);
+
+	g_signal_connect (task->priv->dialog,
+			  "response",
+			  G_CALLBACK (source_dialog_response_cb),
+			  task);
+	gtk_widget_show_all (task->priv->dialog);
+}
+
+
+static void
+gth_burn_task_cancelled (GthTask *task)
+{
+	/* FIXME */
+}
+
+
+static void
+gth_burn_task_class_init (GthBurnTaskClass *class)
+{
+	GObjectClass *object_class;
+	GthTaskClass *task_class;
+
+	parent_class = g_type_class_peek_parent (class);
+
+	object_class = (GObjectClass*) class;
+	object_class->finalize = gth_task_finalize;
+
+	task_class = (GthTaskClass*) class;
+	task_class->exec = gth_burn_task_exec;
+	task_class->cancelled = gth_burn_task_cancelled;
+}
+
+
+static void
+gth_burn_task_init (GthBurnTask *task)
+{
+	task->priv = g_new0 (GthBurnTaskPrivate, 1);
+	task->priv->content = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+	task->priv->parents = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) gtk_tree_path_free);
+	task->priv->builder = NULL;
+}
+
+
+GType
+gth_burn_task_get_type (void)
+{
+	static GType type = 0;
+
+	if (! type) {
+		GTypeInfo type_info = {
+			sizeof (GthBurnTaskClass),
+			NULL,
+			NULL,
+			(GClassInitFunc) gth_burn_task_class_init,
+			NULL,
+			NULL,
+			sizeof (GthBurnTask),
+			0,
+			(GInstanceInitFunc) gth_burn_task_init
+		};
+
+		type = g_type_register_static (GTH_TYPE_TASK,
+					       "GthBurnTask",
+					       &type_info,
+					       0);
+	}
+
+	return type;
+}
+
+
+GthTask *
+gth_burn_task_new (GthBrowser *browser,
+                   GList      *selected_files)
+{
+	GthBurnTask *task;
+
+	task = (GthBurnTask *) g_object_new (GTH_TYPE_BURN_TASK, NULL);
+
+	task->priv->browser = g_object_ref (browser);
+	task->priv->location = g_file_dup (gth_browser_get_location (browser));
+	task->priv->base_directory = g_file_get_uri (task->priv->location);
+	task->priv->selected_files = _g_object_list_ref (selected_files);
+
+	return (GthTask*) task;
+}
diff --git a/extensions/burn_disc/gth-burn-task.h b/extensions/burn_disc/gth-burn-task.h
new file mode 100644
index 0000000..8c57bd1
--- /dev/null
+++ b/extensions/burn_disc/gth-burn-task.h
@@ -0,0 +1,55 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef GTH_BURN_TASK_H
+#define GTH_BURN_TASK_H
+
+#include <glib-object.h>
+#include <gthumb.h>
+
+#define GTH_TYPE_BURN_TASK         (gth_burn_task_get_type ())
+#define GTH_BURN_TASK(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), GTH_TYPE_BURN_TASK, GthBurnTask))
+#define GTH_BURN_TASK_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST ((k), GTH_TYPE_BURN_TASK, GthBurnTaskClass))
+#define GTH_IS_BURN_TASK(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), GTH_TYPE_BURN_TASK))
+#define GTH_IS_BURN_TASK_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), GTH_TYPE_BURN_TASK))
+#define GTH_BURN_TASK_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GTH_TYPE_BURN_TASK, GthBurnTaskClass))
+
+typedef struct _GthBurnTask         GthBurnTask;
+typedef struct _GthBurnTaskPrivate  GthBurnTaskPrivate;
+typedef struct _GthBurnTaskClass    GthBurnTaskClass;
+
+struct _GthBurnTask
+{
+	GthTask __parent;
+	GthBurnTaskPrivate *priv;
+};
+
+struct _GthBurnTaskClass
+{
+	GthTaskClass __parent_class;
+};
+
+GType       gth_burn_task_get_type   (void) G_GNUC_CONST;
+GthTask *   gth_burn_task_new        (GthBrowser *browser,
+		                      GList      *selected_files);
+
+#endif /* GTH_BURN_TASK_H */



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