brasero r1297 - in trunk: . src



Author: philippr
Date: Sat Sep 20 13:43:33 2008
New Revision: 1297
URL: http://svn.gnome.org/viewvc/brasero?rev=1297&view=rev

Log:
	Some cleanups to get ready for further changes
	Probably fix some minor bugs with image paths handling

	* src/Makefile.am:
	* src/brasero-dest-selection.c
	(brasero_dest_selection_drive_properties),
	(brasero_dest_selection_image_format_changed_cb),
	(brasero_dest_selection_image_properties),
	(brasero_dest_selection_update_image_output),
	(brasero_dest_selection_valid_session),
	(brasero_dest_selection_drive_changed),
	(brasero_dest_selection_init), (brasero_dest_selection_finalize),
	(brasero_dest_selection_set_property),
	(brasero_dest_selection_class_init):
	* src/brasero-disc-copy-dialog.c
	(brasero_disc_copy_dialog_valid_media_cb),
	(brasero_disc_copy_dialog_init):
	* src/brasero-disc-option-dialog.c
	(brasero_disc_option_dialog_init):
	* src/brasero-drive-info.c (brasero_drive_info_set_image_path),
	(brasero_drive_info_set_same_src_dest),
	(brasero_drive_info_set_medium):
	* src/brasero-image-option-dialog.c
	(brasero_image_option_dialog_valid_media_cb),
	(brasero_image_option_dialog_init):
	* src/brasero-project.c (brasero_project_set_cover_specifics):
	* src/brasero-session-cfg.c
	(brasero_session_cfg_save_drive_properties),
	(brasero_session_cfg_add_drive_properties_flags),
	(brasero_session_cfg_set_drive_properties),
	(brasero_session_cfg_check_drive_settings),
	(brasero_session_cfg_update), (brasero_session_cfg_input_changed),
	(brasero_session_cfg_output_changed), (brasero_session_cfg_check),
	(brasero_session_cfg_caps_changed), (brasero_session_cfg_init),
	(brasero_session_cfg_finalize), (brasero_session_cfg_class_init),
	(brasero_session_cfg_new):
	* src/brasero-session-cfg.h:
	* src/brasero-src-selection.c
	(brasero_src_selection_drive_changed):
	* src/burn-caps.c (brasero_burn_caps_get_default_output_format):
	* src/burn-caps.h:
	* src/burn-image-format.c (brasero_image_format_get_default_path),
	(brasero_image_format_fix_path_extension):
	* src/burn-image-format.h:
	* src/burn-session.c (brasero_burn_session_get_output),
	(brasero_burn_session_set_image_output_full),
	(brasero_burn_session_class_init):
	* src/burn-session.h:

Added:
   trunk/src/brasero-session-cfg.c
   trunk/src/brasero-session-cfg.h
Modified:
   trunk/ChangeLog
   trunk/src/Makefile.am
   trunk/src/brasero-dest-selection.c
   trunk/src/brasero-disc-copy-dialog.c
   trunk/src/brasero-disc-option-dialog.c
   trunk/src/brasero-drive-info.c
   trunk/src/brasero-image-option-dialog.c
   trunk/src/brasero-project.c
   trunk/src/brasero-src-selection.c
   trunk/src/burn-caps.c
   trunk/src/burn-caps.h
   trunk/src/burn-image-format.c
   trunk/src/burn-image-format.h
   trunk/src/burn-session.c
   trunk/src/burn-session.h

Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am	(original)
+++ trunk/src/Makefile.am	Sat Sep 20 13:43:33 2008
@@ -272,7 +272,9 @@
 	brasero-app.c		\
 	brasero-app.h           \
 	brasero-src-info.c           \
-	brasero-src-info.h
+	brasero-src-info.h           \
+	brasero-session-cfg.h           \
+	brasero-session-cfg.c
 
 if BUILD_INOTIFY
 brasero_SOURCES += brasero-file-monitor.c brasero-file-monitor.h

Modified: trunk/src/brasero-dest-selection.c
==============================================================================
--- trunk/src/brasero-dest-selection.c	(original)
+++ trunk/src/brasero-dest-selection.c	Sat Sep 20 13:43:33 2008
@@ -70,10 +70,6 @@
 	GtkWidget *copies_box;
 	GtkWidget *copies_spin;
 
-	guint caps_sig;
-	guint input_sig;
-	guint output_sig;
-
 	guint default_format:1;
 	guint default_path:1;
 	guint default_ext:1;
@@ -90,96 +86,9 @@
 
 G_DEFINE_TYPE (BraseroDestSelection, brasero_dest_selection, BRASERO_TYPE_DRIVE_SELECTION);
 
-enum {
-	VALID_MEDIA_SIGNAL,
-	LAST_SIGNAL
-};
-static guint brasero_dest_selection_signals [LAST_SIGNAL] = { 0 };
-
 #define BRASERO_DEST_SAVED_FLAGS	(BRASERO_DRIVE_PROPERTIES_FLAGS|BRASERO_BURN_FLAG_MULTI)
 
 static void
-brasero_dest_selection_save_drive_properties (BraseroDestSelection *self)
-{
-	BraseroDestSelectionPrivate *priv;
-	BraseroBurnFlag flags;
-	GConfClient *client;
-	const gchar *path;
-	guint64 rate;
-	gchar *key;
-
-	priv = BRASERO_DEST_SELECTION_PRIVATE (self);
-
-	client = gconf_client_get_default ();
-
-	rate = brasero_burn_session_get_rate (priv->session);
-	key = brasero_burn_session_get_config_key (priv->session, "speed");
-	if (!key) {
-		g_object_unref (client);
-		return;
-	}
-
-	gconf_client_set_int (client, key, rate / 1024, NULL);
-	g_free (key);
-
-	key = brasero_burn_session_get_config_key (priv->session, "flags");
-	if (!key) {
-		g_object_unref (client);
-		return;
-	}
-
-	flags = gconf_client_get_int (client, key, NULL);
-	flags &= ~BRASERO_DRIVE_PROPERTIES_FLAGS;
-	flags |= (brasero_burn_session_get_flags (priv->session) & BRASERO_DEST_SAVED_FLAGS);
-	gconf_client_set_int (client, key, flags, NULL);
-	g_free (key);
-
-	/* temporary directory */
-	path = brasero_burn_session_get_tmpdir (priv->session);
-	key = g_strdup_printf ("%s/tmpdir", BRASERO_DRIVE_PROPERTIES_KEY);
-	gconf_client_set_string (client, key, path, NULL);
-	g_free (key);
-
-	g_object_unref (client);
-}
-
-static gboolean
-brasero_dest_selection_check_same_src_dest (BraseroDestSelection *self)
-{
-	BraseroDestSelectionPrivate *priv;
-	BraseroMedium *medium;
-	BraseroDrive *drive;
-	BraseroMedia media;
-
-	priv = BRASERO_DEST_SELECTION_PRIVATE (self);
-
-	/* if we have the same source and destination as drives then we don't 
-	 * grey out the properties button as otherwise it would always remain
-	 * so. Instead of that we grey it only if there is no medium or if the
-	 * medium is blank. */
-	if (!brasero_burn_session_same_src_dest_drive (priv->session))
-		return FALSE;
-
-	/* grey out button only if the source (and therefore dest drive)
-	 * hasn't got any medium inside */
-	drive = brasero_burn_session_get_src_drive (priv->session);
-	if (!drive)
-		return FALSE;
-
-	medium = brasero_drive_get_medium (drive);
-	media = brasero_medium_get_status (medium);;
-
-	if (media == BRASERO_MEDIUM_NONE)
-		return FALSE;
-
-	if (media & BRASERO_MEDIUM_BLANK
-	|| (media & (BRASERO_MEDIUM_HAS_AUDIO|BRASERO_MEDIUM_HAS_DATA)) == 0)
-		return FALSE;
-
-	return TRUE;
-}
-
-static void
 brasero_dest_selection_drive_properties (BraseroDestSelection *self)
 {
 	BraseroDestSelectionPrivate *priv;
@@ -244,8 +153,6 @@
 	path = brasero_drive_properties_get_tmpdir (BRASERO_DRIVE_PROPERTIES (priv->drive_prop));
 	brasero_burn_session_set_tmpdir (priv->session, path);
 
-	brasero_dest_selection_save_drive_properties (self);
-
 	gtk_widget_destroy (priv->drive_prop);
 	priv->drive_prop = NULL;
 }
@@ -327,181 +234,6 @@
 	}
 }
 
-static void
-brasero_dest_selection_get_default_output_format (BraseroDestSelection *self,
-						  BraseroTrackType *output)
-{
-	BraseroTrackType source;
-	BraseroBurnResult result;
-	BraseroDestSelectionPrivate *priv;
-
-	priv = BRASERO_DEST_SELECTION_PRIVATE (self);
-
-	brasero_burn_session_get_input_type (priv->session, &source);
-	if (source.type == BRASERO_TRACK_TYPE_NONE) {
-		output->type = BRASERO_TRACK_TYPE_NONE;
-		return;
-	}
-
-	output->type = BRASERO_TRACK_TYPE_IMAGE;
-	output->subtype.img_format = BRASERO_IMAGE_FORMAT_NONE;
-
-	if (source.type == BRASERO_TRACK_TYPE_IMAGE) {
-		output->subtype.img_format = source.subtype.img_format;
-		return;
-	}
-
-	if (source.type == BRASERO_TRACK_TYPE_AUDIO) {
-		/* If that's AUDIO only without VIDEO then return */
-		if (!(source.subtype.audio_format & (BRASERO_VIDEO_FORMAT_UNDEFINED|BRASERO_VIDEO_FORMAT_VCD|BRASERO_VIDEO_FORMAT_VIDEO_DVD)))
-			return;
-
-		/* Otherwise try all possible image types */
-		output->subtype.img_format = BRASERO_IMAGE_FORMAT_CDRDAO;
-		for (; output->subtype.img_format != BRASERO_IMAGE_FORMAT_NONE;
-		       output->subtype.img_format >>= 1) {
-		
-			result = brasero_burn_caps_is_output_supported (priv->caps,
-									priv->session,
-									output);
-			if (result == BRASERO_BURN_OK)
-				return;
-		}
-		return;
-	}
-
-	if (source.type == BRASERO_TRACK_TYPE_DATA
-	||  source.subtype.media & (BRASERO_MEDIUM_DVD|BRASERO_MEDIUM_DVD_DL)) {
-		output->subtype.img_format = BRASERO_IMAGE_FORMAT_BIN;
-		result = brasero_burn_caps_is_output_supported (priv->caps,
-								priv->session,
-								output);
-		if (result != BRASERO_BURN_OK)
-			output->subtype.img_format = BRASERO_IMAGE_FORMAT_NONE;
-
-		return;
-	}
-
-	/* for the input which are CDs there are lots of possible formats */
-	output->subtype.img_format = BRASERO_IMAGE_FORMAT_CDRDAO;
-	for (; output->subtype.img_format != BRASERO_IMAGE_FORMAT_NONE;
-	       output->subtype.img_format >>= 1) {
-	
-		result = brasero_burn_caps_is_output_supported (priv->caps,
-								priv->session,
-								output);
-		if (result == BRASERO_BURN_OK)
-			return;
-	}
-
-	return;
-}
-
-static gchar *
-brasero_dest_selection_get_default_output_path (BraseroDestSelection *self,
-						BraseroImageFormat format)
-{
-	const gchar *suffixes [] = {".iso",
-				    ".toc",
-				    ".cue",
-				    ".toc",
-				    NULL };
-	BraseroDestSelectionPrivate *priv;
-	const gchar *suffix = NULL;
-	gchar *path;
-	gint i = 0;
-
-	priv = BRASERO_DEST_SELECTION_PRIVATE (self);
-
-	if (format & BRASERO_IMAGE_FORMAT_BIN)
-		suffix = suffixes [0];
-	else if (format & BRASERO_IMAGE_FORMAT_CLONE)
-		suffix = suffixes [1];
-	else if (format & BRASERO_IMAGE_FORMAT_CUE)
-		suffix = suffixes [2];
-	else if (format & BRASERO_IMAGE_FORMAT_CDRDAO)
-		suffix = suffixes [3];
-
-	path = g_strdup_printf ("%s/brasero%s",
-				g_get_home_dir (),
-				suffix);
-
-	while (g_file_test (path, G_FILE_TEST_EXISTS)) {
-		g_free (path);
-
-		path = g_strdup_printf ("%s/brasero-%i%s",
-					g_get_home_dir (),
-					i,
-					suffix);
-		i ++;
-	}
-
-	return path;
-}
-
-static gchar *
-brasero_dest_selection_fix_image_extension (BraseroImageFormat format,
-					    gboolean check_existence,
-					    gchar *path)
-{
-	gchar *dot;
-	guint i = 0;
-	gchar *retval = NULL;
-	const gchar *suffix = NULL;;
-	const gchar *suffixes [] = {".iso",
-				    ".toc",
-				    ".cue",
-				    ".toc",
-				    NULL };
-
-	/* search the last dot to check extension */
-	dot = g_utf8_strrchr (path, -1, '.');
-	if (dot && strlen (dot) < 5 && strlen (dot) > 1) {
-		if (format & BRASERO_IMAGE_FORMAT_BIN
-		&&  strcmp (suffixes [0], dot))
-			*dot = '\0';
-		else if (format & BRASERO_IMAGE_FORMAT_CLONE
-		     &&  strcmp (suffixes [1], dot))
-			*dot = '\0';
-		else if (format & BRASERO_IMAGE_FORMAT_CUE
-		     &&  strcmp (suffixes [2], dot))
-			*dot = '\0';
-		else if (format & BRASERO_IMAGE_FORMAT_CDRDAO
-		     &&  strcmp (suffixes [3], dot))
-			*dot = '\0';
-		else
-			return path;
-	}
-
-	/* determine the proper suffix */
-	if (format & BRASERO_IMAGE_FORMAT_BIN)
-		suffix = suffixes [0];
-	else if (format & BRASERO_IMAGE_FORMAT_CLONE)
-		suffix = suffixes [1];
-	else if (format & BRASERO_IMAGE_FORMAT_CUE)
-		suffix = suffixes [2];
-	else if (format & BRASERO_IMAGE_FORMAT_CDRDAO)
-		suffix = suffixes [3];
-	else
-		return path;
-
-	/* make sure the file doesn't exist */
-	retval = g_strdup_printf ("%s%s", path, suffix);
-	if (!check_existence) {
-		g_free (path);
-		return retval;
-	}
-
-	while (g_file_test (retval, G_FILE_TEST_EXISTS)) {
-		g_free (retval);
-		retval = g_strdup_printf ("%s-%i%s", path, i, suffix);
-		i ++;
-	}
-
-	g_free (path);
-	return retval;
-}
-
 static guint
 brasero_dest_selection_get_possible_output_formats (BraseroDestSelection *self,
 						    BraseroImageFormat *formats)
@@ -551,22 +283,25 @@
 
 	format = brasero_image_properties_get_format (dialog);
 
-	if (format == BRASERO_IMAGE_FORMAT_ANY || format == BRASERO_IMAGE_FORMAT_NONE) {
-		BraseroTrackType output;
-
-		brasero_dest_selection_get_default_output_format (self, &output);
-		format = output.subtype.img_format;
-	}
+	if (format == BRASERO_IMAGE_FORMAT_ANY || format == BRASERO_IMAGE_FORMAT_NONE)
+		format = brasero_burn_caps_get_default_output_format (priv->caps, priv->session);
 
 	if (priv->default_path && !brasero_image_properties_is_path_edited (dialog)) {
 		/* not changed: get a new default path */
 		g_free (image_path);
-		image_path = brasero_dest_selection_get_default_output_path (self, format);
+		image_path = brasero_image_format_get_default_path (format);
+	}
+	else if (image_path) {
+		gchar *tmp;
+
+		tmp = image_path;
+		image_path = brasero_image_format_fix_path_extension (format, FALSE, image_path);
+		g_free (tmp);
+	}
+	else {
+		priv->default_path = TRUE;
+		image_path = brasero_image_format_get_default_path (format);
 	}
-	else if (image_path)
-		image_path = brasero_dest_selection_fix_image_extension (format, FALSE, image_path);
-	else
-		image_path = brasero_dest_selection_get_default_output_path (self, format);
 
 	brasero_image_properties_set_path (dialog, image_path);
 }
@@ -644,7 +379,6 @@
 	BraseroDestSelectionPrivate *priv;
 	BraseroImageFormat formats;
 	BraseroImageFormat format;
-	BraseroTrackType output;
 	gulong format_changed;
 	gchar *original_path;
 	GtkWindow *toplevel;
@@ -698,8 +432,7 @@
 
 	/* see if we are to choose the format ourselves */
 	if (format == BRASERO_IMAGE_FORMAT_ANY || format == BRASERO_IMAGE_FORMAT_NONE) {
-		brasero_dest_selection_get_default_output_format (self, &output);
-		format = output.subtype.img_format;
+		format = brasero_burn_caps_get_default_output_format (priv->caps, priv->session);
 		priv->default_format = TRUE;
 	}
 	else
@@ -713,17 +446,24 @@
 		/* check the extension */
 		image_path = brasero_image_properties_get_path (BRASERO_IMAGE_PROPERTIES (priv->drive_prop));
 
+		/* there is one special case: CLONE image tocs _must_ have a
+		 * correct suffix ".toc" so don't ask, fix it */
 		if (!brasero_dest_selection_image_check_extension (self, format, image_path)) {
-			if (brasero_dest_selection_image_extension_ask (self)) {
+			if (format == BRASERO_IMAGE_FORMAT_CLONE
+			||  brasero_dest_selection_image_extension_ask (self)) {
+				gchar *tmp;
+
 				priv->default_ext = TRUE;
-				image_path = brasero_dest_selection_fix_image_extension (format, TRUE, image_path);
+				tmp = image_path;
+				image_path = brasero_image_format_fix_path_extension (format, TRUE, image_path);
+				g_free (tmp);
 			}
 			else
 				priv->default_ext = FALSE;
 		}
 	}
 	else
-		image_path = brasero_dest_selection_get_default_output_path (self, format);
+		image_path = brasero_image_format_get_default_path (format);
 
 	gtk_widget_destroy (priv->drive_prop);
 	priv->drive_prop = NULL;
@@ -755,389 +495,85 @@
 }
 
 static void
-brasero_dest_selection_add_drive_properties_flags (BraseroDestSelection *self,
-						   BraseroBurnFlag flags,
-						   BraseroBurnFlag *supported_retval,
-						   BraseroBurnFlag *compulsory_retval)
+brasero_dest_selection_update_image_output (BraseroDestSelection *self,
+					    gboolean is_valid)
 {
-	BraseroBurnFlag flag;
 	BraseroDestSelectionPrivate *priv;
-	BraseroBurnFlag supported = BRASERO_BURN_FLAG_NONE;
-	BraseroBurnFlag compulsory = BRASERO_BURN_FLAG_NONE;
+	BraseroImageFormat valid_format;
+	BraseroImageFormat format;
+	gchar *path = NULL;
 
 	priv = BRASERO_DEST_SELECTION_PRIVATE (self);
 
-	/* add flags then wipe out flags from session to check them one by one */
-	flags |= brasero_burn_session_get_flags (priv->session);
-	brasero_burn_session_remove_flag (priv->session, flags);
-
-	brasero_burn_caps_get_flags (priv->caps,
-				     priv->session,
-				     &supported,
-				     &compulsory);
-
-	for (flag = 1; flag < BRASERO_BURN_FLAG_LAST; flag <<= 1) {
-		/* see if this flag was originally set */
-		if (!(flags & flag))
-			continue;
-
-		/* Don't set write modes now in this case */
-		if (brasero_burn_session_same_src_dest_drive (priv->session)
-		&& (flag & (BRASERO_BURN_FLAG_DAO|BRASERO_BURN_FLAG_RAW)))
-			continue;
-
-		if (compulsory
-		&& (compulsory & brasero_burn_session_get_flags (priv->session)) != compulsory) {
-			brasero_burn_session_add_flag (priv->session, compulsory);
-			supported = BRASERO_BURN_FLAG_NONE;
-			compulsory = BRASERO_BURN_FLAG_NONE;
-			brasero_burn_caps_get_flags (priv->caps,
-						     priv->session,
-						     &supported,
-						     &compulsory);
-		}
-
-		if (supported & flag) {
-			brasero_burn_session_add_flag (priv->session, flag);
-			supported = BRASERO_BURN_FLAG_NONE;
-			compulsory = BRASERO_BURN_FLAG_NONE;
-			brasero_burn_caps_get_flags (priv->caps,
-						     priv->session,
-						     &supported,
-						     &compulsory);
-		}
-	}
+	/* Get session current state */
+	format = brasero_burn_session_get_output_format (priv->session);
+	valid_format = format;
 
-	/* Always set this flag whenever possible */
-	if (supported & BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE) {
-		brasero_burn_session_add_flag (priv->session,
-					       BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE|
-					       BRASERO_BURN_FLAG_FAST_BLANK);
-	}
-
-	/* When copying with same drive don't set write mode, it'll be set later */
-	if (!brasero_burn_session_same_src_dest_drive (priv->session)) {
-		/* use DAO whenever it's possible */
-		if (supported & BRASERO_BURN_FLAG_DAO) {
-			brasero_burn_session_add_flag (priv->session, BRASERO_BURN_FLAG_DAO);
-			brasero_burn_caps_get_flags (priv->caps,
-						     priv->session,
-						     &supported,
-						     &compulsory);
+	/* Check current set format if it's invalid */
+	if (format != BRASERO_IMAGE_FORMAT_NONE) {
+		/* The user set a format. There is nothing to do about it except
+		 * checking if the format is still available. If not, then set
+		 * default and remove the current one */
+		if (!is_valid) {
+			priv->default_format = TRUE;
+			valid_format = brasero_burn_caps_get_default_output_format (priv->caps, priv->session);
+		}
+		else if (priv->default_format) {
+			/* since input, or caps changed, check if there isn't a
+			 * better format available. */
+			valid_format = brasero_burn_caps_get_default_output_format (priv->caps, priv->session);
 		}
 	}
-
-	if (supported_retval)
-		*supported_retval = supported;
-	if (compulsory_retval)
-		*compulsory_retval = compulsory;
-}
-
-static void
-brasero_dest_selection_set_drive_properties (BraseroDestSelection *self)
-{
-	BraseroDestSelectionPrivate *priv;
-	BraseroBurnResult is_valid;
-	BraseroTrackType source;
-	BraseroBurnFlag flags;
-	BraseroMedium *medium;
-	BraseroDrive *drive;
-	GConfClient *client;
-	GConfValue *value;
-	guint64 rate;
-	gchar *path;
-	gchar *key;
-
-	priv = BRASERO_DEST_SELECTION_PRIVATE (self);
-
-	brasero_burn_session_get_input_type (priv->session, &source);
-	if (source.type == BRASERO_TRACK_TYPE_NONE) {
-		g_signal_emit (self,
-			       brasero_dest_selection_signals [VALID_MEDIA_SIGNAL],
-			       0,
-			       FALSE);
-		gtk_widget_set_sensitive (priv->button, FALSE);
-		gtk_widget_set_sensitive (priv->copies_box, FALSE);
-		return;
-	}
-
-	if (brasero_burn_session_is_dest_file (priv->session)) {
-		BraseroBurnResult result;
-
-		result = brasero_burn_caps_is_session_supported (priv->caps, priv->session);
-		g_signal_emit (self,
-			       brasero_dest_selection_signals [VALID_MEDIA_SIGNAL],
-			       0,
-			       (result == BRASERO_BURN_OK));
-
-		gtk_widget_set_sensitive (priv->button, (result == BRASERO_BURN_OK));
-		return;
+	else {
+		/* This is always invalid; find one */
+		priv->default_format = TRUE;
+		valid_format = brasero_burn_caps_get_default_output_format (priv->caps, priv->session);
 	}
 
-	drive = brasero_burn_session_get_burner (priv->session);
-	if (!drive) {
-		g_signal_emit (self,
-			       brasero_dest_selection_signals [VALID_MEDIA_SIGNAL],
-			       0,
-			       FALSE);
-		gtk_widget_set_sensitive (priv->button, FALSE);
-		gtk_widget_set_sensitive (priv->copies_box, FALSE);
-		return;
-	}
+	/* see if we have a workable format */
+	if (valid_format == BRASERO_IMAGE_FORMAT_NONE) {
+		if (priv->drive_prop) {
+			gtk_widget_destroy (priv->drive_prop);
+			priv->drive_prop = NULL;
+		}
 
-	medium = brasero_drive_get_medium (drive);
-	if (!medium || brasero_medium_get_status (medium) == BRASERO_MEDIUM_NONE) {
-		g_signal_emit (self,
-			       brasero_dest_selection_signals [VALID_MEDIA_SIGNAL],
-			       0,
-			       FALSE);
-		gtk_widget_set_sensitive (priv->button, FALSE);
-		gtk_widget_set_sensitive (priv->copies_box, FALSE);
 		return;
 	}
 
-	/* update/set the rate */
-	client = gconf_client_get_default ();
+	path = brasero_dest_selection_get_output_path (self);
 
-	key = brasero_burn_session_get_config_key (priv->session, "speed");
-	if (!key) {
-		g_object_unref (client);
+	/* Now check, fix the output path, _provided__the__format__changed_ */
+	if (valid_format == format) {
+		brasero_drive_info_set_image_path (BRASERO_DRIVE_INFO (priv->info), path);
+		g_free (path);
 		return;
 	}
 
-	value = gconf_client_get_without_default (client, key, NULL);
-	g_free (key);
-
-	if (!value)
-		rate = brasero_medium_get_max_write_speed (medium);
-	else {
-		rate = gconf_value_get_int (value) * 1024;
-		gconf_value_free (value);
+	if (!path) {
+		priv->default_path = TRUE;
+		priv->default_ext = TRUE;
+		path = brasero_image_format_get_default_path (valid_format);
 	}
+	else if (priv->default_ext
+	     &&  brasero_dest_selection_image_check_extension (self, format, path)) {
+		gchar *tmp;
 
-	brasero_burn_session_set_rate (priv->session, rate);
+		priv->default_ext = TRUE;
 
-	/* do the same with the flags.
-	 * NOTE: every time we add a flag we have to re-ask for supported flags.
-	 * Indeed two flags could be mutually exclusive and then adding both at
-	 * the same would make the session unusable (MULTI and BLANK_BEFORE_WRITE) */
-	key = brasero_burn_session_get_config_key (priv->session, "flags");
-	if (!key) {
-		g_object_unref (client);
-		return;
+		tmp = path;
+		path = brasero_image_format_fix_path_extension (format, TRUE, path);
+		g_free (tmp);
 	}
 
-	value = gconf_client_get_without_default (client, key, NULL);
-	g_free (key);
-
-	if (brasero_dest_selection_check_same_src_dest (self)) {
-		BraseroBurnFlag supported = BRASERO_BURN_FLAG_NONE;
-		BraseroBurnFlag compulsory = BRASERO_BURN_FLAG_NONE;
-
-		/* Special case */
-
-		/* wipe out previous flags */
-		brasero_burn_session_remove_flag (priv->session,
-						  BRASERO_DRIVE_PROPERTIES_FLAGS);
-
-		/* set new ones */
-		if (value) {
-			flags = gconf_value_get_int (value) & BRASERO_DEST_SAVED_FLAGS;
-			gconf_value_free (value);
-		}
-		else
-			flags = BRASERO_BURN_FLAG_EJECT|
-				BRASERO_BURN_FLAG_BURNPROOF;
-
-		brasero_dest_selection_add_drive_properties_flags (self,
-								   flags|
-								   BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE|
-								   BRASERO_BURN_FLAG_FAST_BLANK,
-								   &supported,
-								   &compulsory);
-
-		/* NOTE: of course NO_TMP is not possible; DAO and BLANK_BEFORE
-		 * could be yet. The problem here is that we cannot test all
-		 * this since we don't know yet what the disc type is going to 
-		 * be. So we set DAO and BLANK_BEFORE_WRITE just in case.
-		 * Hopefully burn.c will be able to handle that later. */
-	}
-	else if (!value) {
-		BraseroBurnFlag supported = BRASERO_BURN_FLAG_NONE;
-		BraseroBurnFlag compulsory = BRASERO_BURN_FLAG_NONE;
-
-		flags = BRASERO_BURN_FLAG_EJECT|
-			BRASERO_BURN_FLAG_BURNPROOF;
-
-		if (source.type == BRASERO_TRACK_TYPE_DATA
-		||  source.type == BRASERO_TRACK_TYPE_DISC
-		||  source.type == BRASERO_TRACK_TYPE_IMAGE)
-			flags |= BRASERO_BURN_FLAG_NO_TMP_FILES;
-
-		brasero_dest_selection_add_drive_properties_flags (self,
-								   flags,
-								   &supported,
-								   &compulsory);
-	}
-	else {
-		BraseroBurnFlag supported = BRASERO_BURN_FLAG_NONE;
-		BraseroBurnFlag compulsory = BRASERO_BURN_FLAG_NONE;
-
-		/* set the saved flags (make sure they are supported) */
-		flags = gconf_value_get_int (value) & BRASERO_DEST_SAVED_FLAGS;
-		gconf_value_free (value);
-
-		brasero_dest_selection_add_drive_properties_flags (self,
-								   flags,
-								   &supported,
-								   &compulsory);
-	}
-
-	/* Now that we updated the session flags see if everything works */
-	is_valid = brasero_burn_caps_is_session_supported (priv->caps, priv->session);
-	g_signal_emit (self,
-		       brasero_dest_selection_signals [VALID_MEDIA_SIGNAL],
-		       0,
-		       (is_valid == BRASERO_BURN_OK));
-
-	gtk_widget_set_sensitive (priv->copies_box, (is_valid == BRASERO_BURN_OK));
-	gtk_widget_set_sensitive (priv->button, (is_valid == BRASERO_BURN_OK));
-
-	key = g_strdup_printf ("%s/tmpdir", BRASERO_DRIVE_PROPERTIES_KEY);
-	path = gconf_client_get_string (client, key, NULL);
-	brasero_burn_session_set_tmpdir (priv->session, path);
-	g_free (path);
-	g_free (key);
-
-	g_object_unref (client);
-}
-
-static void
-brasero_dest_selection_set_image_properties (BraseroDestSelection *self)
-{
-	BraseroDestSelectionPrivate *priv;
-	BraseroBurnResult result;
-	BraseroTrackType output;
-	gchar *path;
-
-	priv = BRASERO_DEST_SELECTION_PRIVATE (self);
-	priv->default_format = TRUE;
-	priv->default_path = TRUE;
-
-	/* apparently nothing has been set yet so give a default location */
-	brasero_dest_selection_get_default_output_format (self, &output);
-
-	if (output.type == BRASERO_TRACK_TYPE_NONE
-	||  output.subtype.img_format == BRASERO_IMAGE_FORMAT_NONE) {
-		/* That means that we've got a problem */
-		/* FIXME: we need to display a message nevertheless */
-		brasero_burn_session_set_image_output_full (priv->session,
-							    BRASERO_IMAGE_FORMAT_NONE,
-							    NULL,
-							    NULL);
-		g_signal_emit (self,
-			       brasero_dest_selection_signals [VALID_MEDIA_SIGNAL],
-			       0,
-			       FALSE);
-
-		gtk_widget_set_sensitive (priv->button, FALSE);
-		return;
-	}
+	/* Do it now !!! before a possible nested "is-valid" signal is fired */
+	brasero_drive_info_set_image_path (BRASERO_DRIVE_INFO (priv->info), path);
 
-	path = brasero_dest_selection_get_default_output_path (self, output.subtype.img_format);
-	g_signal_emit (self,
-		       brasero_dest_selection_signals [VALID_MEDIA_SIGNAL],
-		       0,
-		       TRUE);
-	gtk_widget_set_sensitive (priv->button, TRUE);
+	/* we always need to do this */
 	brasero_dest_selection_set_output_path (self,
-						output.subtype.img_format,
+						valid_format,
 						path);
-	brasero_drive_info_set_image_path (BRASERO_DRIVE_INFO (priv->info), path);
-	g_free (path);
-
-	brasero_burn_session_remove_flag (priv->session,
-					  BRASERO_BURN_FLAG_DUMMY|
-					  BRASERO_BURN_FLAG_NO_TMP_FILES);
-
-	result = brasero_burn_caps_is_session_supported (priv->caps, priv->session);
-	g_signal_emit (self,
-		       brasero_dest_selection_signals [VALID_MEDIA_SIGNAL],
-		       0,
-		       (result == BRASERO_BURN_OK));
-	gtk_widget_set_sensitive (priv->button, (result == BRASERO_BURN_OK));
-}
-
-static void
-brasero_dest_selection_check_image_settings (BraseroDestSelection *self)
-{
-	BraseroDestSelectionPrivate *priv;
-	BraseroBurnResult result;
-
-	priv = BRASERO_DEST_SELECTION_PRIVATE (self);
-
-	if (brasero_burn_session_get_output (priv->session, NULL, NULL, NULL) == BRASERO_BURN_OK) {
-		gchar *path;
-		BraseroTrackType output;
-		BraseroImageFormat format;
-
-		/* we already have an output check its validity */
-		output.type = BRASERO_TRACK_TYPE_IMAGE;
-
-		if (!priv->default_format) {
-			/* The user set a format */
-			output.subtype.img_format = brasero_burn_session_get_output_format (priv->session);
-
-			/* check that the format is still supported. If not then find a good default */
-			result = brasero_burn_caps_is_output_supported (priv->caps,
-									priv->session,
-									&output);
-			if (result != BRASERO_BURN_OK) {
-				priv->default_format = TRUE;
-				brasero_dest_selection_get_default_output_format (self, &output);
-			}
-		}
-		else /* retrieve a possible better default format */
-			brasero_dest_selection_get_default_output_format (self, &output);
-
-		format = output.subtype.img_format;
-		g_signal_emit (self,
-			       brasero_dest_selection_signals [VALID_MEDIA_SIGNAL],
-			       0,
-			       (format != BRASERO_IMAGE_FORMAT_NONE));
-
-		if (priv->button)
-			gtk_widget_set_sensitive (priv->button, (format != BRASERO_IMAGE_FORMAT_NONE));
-
-		if (format == BRASERO_IMAGE_FORMAT_NONE) {
-			/* FIXME: we've got a problem and it's not possible,
-			 * display a message to say so */
-			if (priv->drive_prop) {
-				gtk_widget_destroy (priv->drive_prop);
-				priv->drive_prop = NULL;
-			}
-
-			return;
-		}
-
-		if (!priv->default_path) {
-			/* check that the extension is ok if not update it */
-			path = brasero_dest_selection_get_output_path (self);
-			if (priv->default_ext
-			&&  brasero_dest_selection_image_check_extension (self, format, path))
-				path = brasero_dest_selection_fix_image_extension (format, TRUE, path);
-		}
-		else
-			path = brasero_dest_selection_get_default_output_path (self, format);
 
-		brasero_dest_selection_set_output_path (self,
-							format,
-							path);
-		brasero_drive_info_set_image_path (BRASERO_DRIVE_INFO (priv->info), path);
-		g_free (path);
-	}
-	else
-		brasero_dest_selection_set_image_properties (self);
+	g_free (path);
 
 	if (priv->drive_prop) {
 		BraseroImageFormat formats;
@@ -1149,126 +585,12 @@
 						      num > 1 ? formats:BRASERO_IMAGE_FORMAT_NONE,
 						      BRASERO_IMAGE_FORMAT_ANY);
 	}
-
-	brasero_burn_session_remove_flag (priv->session, BRASERO_BURN_FLAG_DUMMY);
-
-	result = brasero_burn_caps_is_session_supported (priv->caps, priv->session);
-	g_signal_emit (self,
-		       brasero_dest_selection_signals [VALID_MEDIA_SIGNAL],
-		       0,
-		       (result == BRASERO_BURN_OK));
-	gtk_widget_set_sensitive (priv->button, (result == BRASERO_BURN_OK));
-}
-
-static void
-brasero_dest_selection_check_drive_settings (BraseroDestSelection *self)
-{
-	BraseroBurnFlag compulsory = BRASERO_BURN_FLAG_NONE;
-	BraseroBurnFlag supported = BRASERO_BURN_FLAG_NONE;
-	BraseroDestSelectionPrivate *priv;
-	BraseroBurnResult result;
-	BraseroBurnFlag flags;
-
-	priv = BRASERO_DEST_SELECTION_PRIVATE (self);
-
-	/* Update the flags and save them */
-	if (brasero_dest_selection_check_same_src_dest (self)) {
-		/* These are always set in any case and there is no way to check
-		 * the current flags */
-		brasero_dest_selection_add_drive_properties_flags (self,
-								   BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE|
-								   BRASERO_BURN_FLAG_FAST_BLANK,
-								   &supported,
-								   &compulsory);
-	}
-	else {
-		/* Try to properly update the flags for the current drive */
-		flags = brasero_burn_session_get_flags (priv->session);
-
-		/* check each flag before re-adding it */
-		brasero_dest_selection_add_drive_properties_flags (self,
-								   flags,
-								   &supported,
-								   &compulsory);
-	}
-
-	/* NOTE: we save even if result != BRASERO_BURN_OK. That way if a flag
-	 * is no longer supported after the removal of a plugin then the 
-	 * properties are reset and the user can access them again */
-
-	/* save potential changes for the new profile */
-	brasero_dest_selection_save_drive_properties (self);
-
-	if (priv->drive_prop) {
-		/* the dialog may need to be updated */
-		brasero_drive_properties_set_flags (BRASERO_DRIVE_PROPERTIES (priv->drive_prop),
-						    flags,
-						    supported,
-						    compulsory);
-	}
-
-	/* Once we've updated the flags, send a signal to tell whether we
-	 * support this disc or not. Update everything. */
-	result = brasero_burn_caps_is_session_supported (priv->caps, priv->session);
-	g_signal_emit (self,
-		       brasero_dest_selection_signals [VALID_MEDIA_SIGNAL],
-		       0,
-		       (result == BRASERO_BURN_OK));
-
-	if (priv->button)
-		gtk_widget_set_sensitive (priv->button, (result == BRASERO_BURN_OK));
-
-	gtk_widget_set_sensitive (priv->copies_box, (result == BRASERO_BURN_OK));
-}
-
-static void
-brasero_dest_selection_source_changed (BraseroBurnSession *session,
-				       BraseroDestSelection *self)
-{
-	BraseroDestSelectionPrivate *priv;
-
-	priv = BRASERO_DEST_SELECTION_PRIVATE (self);
-
-	brasero_drive_info_set_same_src_dest (BRASERO_DRIVE_INFO (priv->info),
-					      brasero_burn_session_same_src_dest_drive (priv->session));
-
-	if (brasero_burn_session_is_dest_file (priv->session)) {
-		/* check that if a path was set there may be none if there was
-		 * no disc inserted when the dialog was created. */
-		if (brasero_burn_session_get_output (priv->session, NULL, NULL, NULL) != BRASERO_BURN_OK)
-			brasero_dest_selection_set_image_properties (self);
-		else
-			brasero_dest_selection_check_image_settings (self);
-
-		return;
-	}
-
-	brasero_dest_selection_set_drive_properties (self);
-}
-
-static void
-brasero_dest_selection_caps_changed (BraseroPluginManager *manager,
-				     BraseroDestSelection *self)
-{
-	BraseroDestSelectionPrivate *priv;
-
-	/* In this case we are still in the same context (same src, dest) so we
-	 * check that all current flags and such are still valid */
-
-	priv = BRASERO_DEST_SELECTION_PRIVATE (self);
-
-	/* The caps of the library / the source have changed so we must check:
-	 * if it's an image that the output type is still possible
-	 * if it's a drive that all flags are still supported and that the media is too */
-	if (brasero_burn_session_is_dest_file (priv->session))
-		brasero_dest_selection_check_image_settings (self);
-	else
-		brasero_dest_selection_check_drive_settings (self);
 }
 
 static void
-brasero_dest_selection_output_changed (BraseroBurnSession *session,
-				       BraseroDestSelection *self)
+brasero_dest_selection_valid_session (BraseroBurnSession *session,
+				      gboolean is_valid,
+				      BraseroDestSelection *self)
 {
 	BraseroDestSelectionPrivate *priv;
 	BraseroDrive *burner;
@@ -1292,29 +614,32 @@
 		g_object_unref (drive);
 
 	if (!burner) {
-		brasero_dest_selection_set_drive_properties (self);
+		gtk_widget_set_sensitive (priv->button, is_valid);
 		return;
 	}
 
+	/* do it now !!! */
+	gtk_widget_set_sensitive (priv->button, is_valid);
+
 	if (!brasero_drive_is_fake (burner)) {
 		gint numcopies;
 
-		brasero_dest_selection_set_drive_properties (self);
-
 		numcopies = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (priv->copies_spin));
 		brasero_burn_session_set_num_copies (priv->session, numcopies);
+		gtk_widget_set_sensitive (priv->copies_box, is_valid);
 		gtk_widget_show (priv->copies_box);
+
+		brasero_drive_info_set_medium (BRASERO_DRIVE_INFO (priv->info),
+					       brasero_drive_get_medium (drive));
+ 		brasero_drive_info_set_same_src_dest (BRASERO_DRIVE_INFO (priv->info),
+						      brasero_burn_session_same_src_dest_drive (priv->session));
 	}
 	else {
 		gtk_widget_hide (priv->copies_box);
 		brasero_burn_session_set_num_copies (priv->session, 1);
 
-		/* Make sure there is an output path/type in case that's an image;
-		 * if not, set default ones */
-		if (brasero_burn_session_get_output (priv->session, NULL, NULL, NULL) != BRASERO_BURN_OK)
-			brasero_dest_selection_set_image_properties (self);
-		else
-			brasero_dest_selection_check_image_settings (self);
+		/* need to update the format and perhaps the path */
+		brasero_dest_selection_update_image_output (self, is_valid);
 	}
 }
 
@@ -1326,17 +651,8 @@
 
 	priv = BRASERO_DEST_SELECTION_PRIVATE (selection);
 
-	brasero_drive_info_set_medium (BRASERO_DRIVE_INFO (priv->info),
- 				       brasero_drive_get_medium (drive));
- 
- 
-	if (!priv->session)
-		return;
-
-	brasero_burn_session_set_burner (priv->session, drive);
-
-	if (brasero_burn_session_same_src_dest_drive (priv->session))
- 		brasero_drive_info_set_same_src_dest (BRASERO_DRIVE_INFO (priv->info), TRUE);
+	if (priv->session)
+		brasero_burn_session_set_burner (priv->session, drive);	
 }
 
 static void
@@ -1355,7 +671,6 @@
 brasero_dest_selection_init (BraseroDestSelection *object)
 {
 	BraseroDestSelectionPrivate *priv;
-	BraseroPluginManager *manager;
 	GtkWidget *label;
 
 	priv = BRASERO_DEST_SELECTION_PRIVATE (object);
@@ -1369,11 +684,6 @@
 			    0);
 
 	priv->caps = brasero_burn_caps_get_default ();
-	manager = brasero_plugin_manager_get_default ();
-	priv->caps_sig = g_signal_connect (manager,
-					   "caps-changed",
-					   G_CALLBACK (brasero_dest_selection_caps_changed),
-					   object);
 
 	priv->button = gtk_button_new_from_stock (GTK_STOCK_PROPERTIES);
 	gtk_widget_show (priv->button);
@@ -1424,24 +734,6 @@
 
 	priv = BRASERO_DEST_SELECTION_PRIVATE (object);
 
-	if (priv->output_sig) {
-		g_signal_handler_disconnect (priv->session, priv->output_sig);
-		priv->output_sig = 0;
-	}
-
-	if (priv->input_sig) {
-		g_signal_handler_disconnect (priv->session, priv->input_sig);
-		priv->input_sig = 0;
-	}
-
-	if (priv->caps_sig) {
-		BraseroPluginManager *manager;
-
-		manager = brasero_plugin_manager_get_default ();
-		g_signal_handler_disconnect (manager, priv->caps_sig);
-		priv->caps_sig = 0;
-	}
-
 	if (priv->caps) {
 		g_object_unref (priv->caps);
 		priv->caps = NULL;
@@ -1478,6 +770,10 @@
 		 * it's only set at construct time */
 		priv->session = session;
 		g_object_ref (session);
+		g_signal_connect (session,
+				  "is-valid",
+				  G_CALLBACK (brasero_dest_selection_valid_session),
+				  object);
 
 		drive = brasero_drive_selection_get_drive (BRASERO_DRIVE_SELECTION (object));
 		brasero_burn_session_set_burner (session, drive);
@@ -1485,25 +781,6 @@
 		if (drive)
 			g_object_unref (drive);
 
- 		brasero_drive_info_set_same_src_dest (BRASERO_DRIVE_INFO (priv->info),
-						      brasero_burn_session_same_src_dest_drive (priv->session));
-
-		/* NOTE: there is no need for the following as we don't know the
-		 * track type yet. Better wait for the track to be set */
-		/* if (brasero_burn_session_is_dest_file (session))
-			brasero_dest_selection_set_image_properties (BRASERO_DEST_SELECTION (object));
-		else
-			brasero_dest_selection_set_drive_properties (BRASERO_DEST_SELECTION (object));
-		*/
-
-		priv->input_sig = g_signal_connect (session,
-						    "input-changed",
-						    G_CALLBACK (brasero_dest_selection_source_changed),
-						    object);
-		priv->output_sig = g_signal_connect (session,
-						     "output-changed",
-						     G_CALLBACK (brasero_dest_selection_output_changed),
-						     object);
 		break;
 
 	default:
@@ -1547,15 +824,6 @@
 
 	select_class->drive_changed = brasero_dest_selection_drive_changed;
 
-	brasero_dest_selection_signals [VALID_MEDIA_SIGNAL] =
-	    g_signal_new ("valid_media",
-			  G_TYPE_FROM_CLASS (klass),
-			  G_SIGNAL_RUN_LAST|G_SIGNAL_NO_RECURSE,
-			  0,
-			  NULL, NULL,
-			  g_cclosure_marshal_VOID__BOOLEAN,
-			  G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
-
 	g_object_class_install_property (object_class,
 					 PROP_SESSION,
 					 g_param_spec_object ("session",

Modified: trunk/src/brasero-disc-copy-dialog.c
==============================================================================
--- trunk/src/brasero-disc-copy-dialog.c	(original)
+++ trunk/src/brasero-disc-copy-dialog.c	Sat Sep 20 13:43:33 2008
@@ -49,6 +49,7 @@
 #include "burn-medium.h"
 #include "brasero-utils.h"
 #include "burn-drive.h"
+#include "brasero-session-cfg.h"
 #include "brasero-disc-copy-dialog.h"
 #include "brasero-dest-selection.h"
 #include "brasero-src-selection.h"
@@ -100,7 +101,7 @@
 }
 
 static void
-brasero_disc_copy_dialog_valid_media_cb (BraseroDestSelection *selection,
+brasero_disc_copy_dialog_valid_media_cb (BraseroBurnSession *session,
 					 gboolean valid,
 					 BraseroDiscCopyDialog *self)
 {
@@ -110,10 +111,8 @@
 static void
 brasero_disc_copy_dialog_init (BraseroDiscCopyDialog *obj)
 {
-	gboolean valid;
 	gchar *title_str;
 	GtkWidget *button;
-	BraseroDrive *drive, *src_drive;
 	BraseroDiscCopyDialogPrivate *priv;
 
 	priv = BRASERO_DISC_COPY_DIALOG_PRIVATE (obj);
@@ -130,14 +129,19 @@
 	priv->button = brasero_utils_make_button (_("_Copy"),
 						  NULL,
 						  "media-optical-burn",
-						    GTK_ICON_SIZE_BUTTON);
+						  GTK_ICON_SIZE_BUTTON);
 	gtk_widget_show (priv->button);
 	gtk_dialog_add_action_widget (GTK_DIALOG (obj),
 				      priv->button,
 				      GTK_RESPONSE_OK);
 
 	/* create a session and add some default sane flags */
-	priv->session = brasero_burn_session_new ();
+	priv->session = BRASERO_BURN_SESSION (brasero_session_cfg_new ());
+	g_signal_connect (priv->session,
+			  "is_valid",
+			  G_CALLBACK (brasero_disc_copy_dialog_valid_media_cb),
+			  obj);
+
 	brasero_burn_session_add_flag (priv->session,
 				       BRASERO_BURN_FLAG_EJECT|
 				       BRASERO_BURN_FLAG_NOGRACE|
@@ -160,10 +164,6 @@
 
 	/* destination drive */
 	priv->selection = brasero_dest_selection_new (priv->session);
-	g_signal_connect (priv->selection,
-			  "valid-media",
-			  G_CALLBACK (brasero_disc_copy_dialog_valid_media_cb),
-			  obj);
 
 	title_str = g_strdup_printf ("<b>%s</b>", _("Select a disc to write to"));
 	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (obj)->vbox),
@@ -185,50 +185,6 @@
 	brasero_drive_selection_set_type_shown (BRASERO_DRIVE_SELECTION (priv->selection),
 						BRASERO_MEDIA_TYPE_ANY_IN_BURNER|
 						BRASERO_MEDIA_TYPE_FILE);
-
-	drive = brasero_drive_selection_get_drive (BRASERO_DRIVE_SELECTION (priv->selection));
-	brasero_burn_session_set_burner (priv->session, drive);
-
-	src_drive = brasero_drive_selection_get_drive (BRASERO_DRIVE_SELECTION (priv->source));
-
-	if (brasero_burn_session_same_src_dest_drive (priv->session)) {
-		BraseroTrackType source;
-
-		memset (&source, 0, sizeof (BraseroTrackType));
-		brasero_burn_session_get_input_type (priv->session, &source);
-
-		if (source.subtype.media == BRASERO_MEDIUM_NONE
-		|| (source.subtype.media & (BRASERO_MEDIUM_HAS_AUDIO|BRASERO_MEDIUM_HAS_DATA)) == 0)
-			valid = FALSE;
-		else {
-			BraseroBurnResult result;
-			BraseroBurnCaps *caps;
-
-			caps = brasero_burn_caps_get_default ();
-			result = brasero_burn_caps_is_session_supported (caps, priv->session);
-			g_object_unref (caps);
-
-			valid = (result == BRASERO_BURN_OK);
-		}
-	}
-	else {
-		BraseroBurnCaps *caps;
-
-		caps = brasero_burn_caps_get_default ();
-		if (brasero_burn_caps_is_session_supported (caps, priv->session) != BRASERO_BURN_OK)
-			valid = FALSE;
-		else
-			valid = TRUE;
-		g_object_unref (caps);
-	}
-
-	if (src_drive)
-		g_object_unref (src_drive);
-
-	if (drive)
-		g_object_unref (drive);
-
-	brasero_disc_copy_dialog_set_burn_button_state (obj, valid);
 }
 
 static void

Modified: trunk/src/brasero-disc-option-dialog.c
==============================================================================
--- trunk/src/brasero-disc-option-dialog.c	(original)
+++ trunk/src/brasero-disc-option-dialog.c	Sat Sep 20 13:43:33 2008
@@ -41,8 +41,8 @@
 
 #include <gconf/gconf-client.h>
 
-#include "brasero-utils.h"
 #include "burn-basics.h"
+#include "burn-drive.h"
 #include "burn-medium.h"
 #include "burn-volume-obj.h"
 #include "burn-session.h"
@@ -50,8 +50,9 @@
 #include "burn-plugin-manager.h"
 #include "brasero-disc-option-dialog.h"
 #include "brasero-dest-selection.h"
-#include "burn-drive.h"
+#include "brasero-session-cfg.h"
 #include "brasero-disc.h"
+#include "brasero-utils.h"
 
 G_DEFINE_TYPE (BraseroDiscOptionDialog, brasero_disc_option_dialog, GTK_TYPE_DIALOG);
 
@@ -1354,7 +1355,11 @@
 					   G_CALLBACK (brasero_disc_option_dialog_caps_changed),
 					   obj);
 
-	priv->session = brasero_burn_session_new ();
+	priv->session = BRASERO_BURN_SESSION (brasero_session_cfg_new ());
+	g_signal_connect (priv->session,
+			  "is-valid",
+			  G_CALLBACK (brasero_disc_option_dialog_valid_media_cb),
+			  obj);
 	brasero_burn_session_add_flag (priv->session,
 				       BRASERO_BURN_FLAG_EJECT|
 				       BRASERO_BURN_FLAG_NOGRACE|
@@ -1364,10 +1369,6 @@
 
 	/* first box */
 	priv->selection = brasero_dest_selection_new (priv->session);
-	g_signal_connect (priv->selection,
-			  "valid-media",
-			  G_CALLBACK (brasero_disc_option_dialog_valid_media_cb),
-			  obj);
 
 	string = g_strdup_printf ("<b>%s</b>", _("Select a disc to write to"));
 	options = brasero_utils_pack_properties (string,

Modified: trunk/src/brasero-drive-info.c
==============================================================================
--- trunk/src/brasero-drive-info.c	(original)
+++ trunk/src/brasero-drive-info.c	Sat Sep 20 13:43:33 2008
@@ -218,10 +218,19 @@
 
 	priv = BRASERO_DRIVE_INFO_PRIVATE (self);
 
+	gtk_widget_show (priv->image);
+	gtk_widget_show (priv->image_path);
+	gtk_widget_hide (priv->warning);
+	gtk_widget_hide (priv->table);
+
 	info = g_strdup_printf (_("The image will be saved to\n%s"), path ? path:"");
 	gtk_label_set_markup (GTK_LABEL (priv->image_path), info);
 	g_free (info);
 
+	gtk_image_set_from_icon_name (GTK_IMAGE (priv->image),
+				      "iso-image-new",
+				      GTK_ICON_SIZE_DIALOG);
+
 	/* NOTE: we could extend this by checking if the image actually exists and if so
 	 * retrieving some information about it like size .... */
 }
@@ -233,7 +242,6 @@
 	BraseroDriveInfoPrivate *priv;
 
 	priv = BRASERO_DRIVE_INFO_PRIVATE (self);
-
 	if (value) {
 		/* This is to handle a special case when copying a media using
 		 * same drive as source and destination */
@@ -263,7 +271,6 @@
 
 	if (medium && (brasero_medium_get_status (medium) & BRASERO_MEDIUM_FILE)) {
 		gtk_widget_show (priv->image_path);
-		gtk_widget_hide (priv->warning);
 		gtk_widget_hide (priv->table);
 
 		gtk_image_set_from_icon_name (GTK_IMAGE (priv->image),
@@ -274,7 +281,6 @@
 
 	brasero_drive_info_update_info (self, medium);
 	gtk_widget_show (priv->table);
-	gtk_widget_hide (priv->warning);
 	gtk_widget_hide (priv->image_path);
 }
 

Modified: trunk/src/brasero-image-option-dialog.c
==============================================================================
--- trunk/src/brasero-image-option-dialog.c	(original)
+++ trunk/src/brasero-image-option-dialog.c	Sat Sep 20 13:43:33 2008
@@ -44,6 +44,7 @@
 #include "brasero-utils.h"
 #include "burn-basics.h"
 #include "burn-plugin-manager.h"
+#include "brasero-session-cfg.h"
 #include "brasero-image-option-dialog.h"
 #include "brasero-image-type-chooser.h"
 #include "brasero-dest-selection.h"
@@ -477,7 +478,7 @@
 }
 
 static void
-brasero_image_option_dialog_valid_media_cb (BraseroDestSelection *selection,
+brasero_image_option_dialog_valid_media_cb (BraseroBurnSession *session,
 					    gboolean valid,
 					    BraseroImageOptionDialog *self)
 {
@@ -542,7 +543,12 @@
 
 	priv->caps = brasero_burn_caps_get_default ();
 
-	priv->session = brasero_burn_session_new ();
+	priv->session = BRASERO_BURN_SESSION (brasero_session_cfg_new ());
+	g_signal_connect (priv->session,
+			  "is-valid",
+			  G_CALLBACK (brasero_image_option_dialog_valid_media_cb),
+			  obj);
+	
 	brasero_burn_session_add_flag (priv->session,
 				       BRASERO_BURN_FLAG_EJECT|
 				       BRASERO_BURN_FLAG_NOGRACE|
@@ -553,10 +559,6 @@
 
 	/* first box */
 	priv->selection = brasero_dest_selection_new (priv->session);
-	g_signal_connect (priv->selection,
-			  "valid-media",
-			  G_CALLBACK (brasero_image_option_dialog_valid_media_cb),
-			  obj);
 
 	string = g_strdup_printf ("<b>%s</b>", _("Select a disc to write to"));
 	options = brasero_utils_pack_properties (string,

Modified: trunk/src/brasero-project.c
==============================================================================
--- trunk/src/brasero-project.c	(original)
+++ trunk/src/brasero-project.c	Sat Sep 20 13:43:33 2008
@@ -67,6 +67,7 @@
 #endif
 
 #include "brasero-project.h"
+#include "brasero-session-cfg.h"
 #include "brasero-jacket-edit.h"
 #include "brasero-project-size.h"
 #include "brasero-project-type-chooser.h"
@@ -844,7 +845,7 @@
 	if (!BRASERO_IS_AUDIO_DISC (self->priv->current))
 		return;
 
-	session = brasero_burn_session_new ();
+	session = BRASERO_BURN_SESSION (brasero_session_cfg_new ());
 	brasero_disc_set_session_param (BRASERO_DISC (self->priv->current), session);
 	brasero_disc_set_session_contents (BRASERO_DISC (self->priv->current), session);
 	brasero_jacket_edit_set_audio_tracks (BRASERO_JACKET_EDIT (cover),

Added: trunk/src/brasero-session-cfg.c
==============================================================================
--- (empty file)
+++ trunk/src/brasero-session-cfg.c	Sat Sep 20 13:43:33 2008
@@ -0,0 +1,511 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * brasero
+ * Copyright (C) Philippe Rouquier 2008 <bonfire-app wanadoo fr>
+ * 
+ * brasero 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 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * brasero 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <string.h>
+
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n-lib.h>
+
+#include <gconf/gconf-client.h>
+
+#include "burn-basics.h"
+#include "burn-plugin-manager.h"
+#include "burn-session.h"
+#include "burn-caps.h"
+#include "burn-plugin-manager.h"
+#include "burn-image-format.h"
+
+#include "brasero-session-cfg.h"
+
+typedef struct _BraseroSessionCfgPrivate BraseroSessionCfgPrivate;
+struct _BraseroSessionCfgPrivate
+{
+	BraseroBurnCaps *caps;
+
+	BraseroBurnFlag supported;
+	BraseroBurnFlag compulsory;
+
+	gchar *output;
+
+	glong caps_sig;
+
+	guint configuring:1;
+};
+
+#define BRASERO_SESSION_CFG_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_SESSION_CFG, BraseroSessionCfgPrivate))
+
+enum
+{
+	IS_VALID_SIGNAL,
+	LAST_SIGNAL
+};
+
+
+static guint session_cfg_signals [LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (BraseroSessionCfg, brasero_session_cfg, BRASERO_TYPE_BURN_SESSION);
+
+#define BRASERO_DEST_SAVED_FLAGS	(BRASERO_DRIVE_PROPERTIES_FLAGS|BRASERO_BURN_FLAG_MULTI)
+
+static void
+brasero_session_cfg_save_drive_properties (BraseroSessionCfg *self)
+{
+	BraseroSessionCfgPrivate *priv;
+	BraseroBurnFlag flags;
+	GConfClient *client;
+	const gchar *path;
+	guint64 rate;
+	gchar *key;
+
+	priv = BRASERO_SESSION_CFG_PRIVATE (self);
+
+	client = gconf_client_get_default ();
+
+	rate = brasero_burn_session_get_rate (BRASERO_BURN_SESSION (self));
+	key = brasero_burn_session_get_config_key (BRASERO_BURN_SESSION (self), "speed");
+	if (!key) {
+		g_object_unref (client);
+		return;
+	}
+
+	gconf_client_set_int (client, key, rate / 1024, NULL);
+	g_free (key);
+
+	key = brasero_burn_session_get_config_key (BRASERO_BURN_SESSION (self), "flags");
+	if (!key) {
+		g_object_unref (client);
+		return;
+	}
+
+	flags = gconf_client_get_int (client, key, NULL);
+	flags &= ~BRASERO_DRIVE_PROPERTIES_FLAGS;
+	flags |= (brasero_burn_session_get_flags (BRASERO_BURN_SESSION (self)) & BRASERO_DEST_SAVED_FLAGS);
+	gconf_client_set_int (client, key, flags, NULL);
+	g_free (key);
+
+	/* temporary directory */
+	path = brasero_burn_session_get_tmpdir (BRASERO_BURN_SESSION (self));
+	key = g_strdup_printf ("%s/tmpdir", BRASERO_DRIVE_PROPERTIES_KEY);
+	gconf_client_set_string (client, key, path, NULL);
+	g_free (key);
+
+	g_object_unref (client);
+}
+
+static void
+brasero_session_cfg_add_drive_properties_flags (BraseroSessionCfg *self,
+						BraseroBurnFlag flags)
+{
+	BraseroBurnFlag flag;
+	BraseroBurnResult result;
+	BraseroSessionCfgPrivate *priv;
+
+	priv = BRASERO_SESSION_CFG_PRIVATE (self);
+
+	priv->supported = BRASERO_BURN_FLAG_NONE;
+	priv->compulsory = BRASERO_BURN_FLAG_NONE;
+
+	/* add flags then wipe out flags from session to check them one by one */
+	flags |= brasero_burn_session_get_flags (BRASERO_BURN_SESSION (self));
+	brasero_burn_session_remove_flag (BRASERO_BURN_SESSION (self), flags);
+
+	result = brasero_burn_caps_get_flags (priv->caps,
+					      BRASERO_BURN_SESSION (self),
+					      &priv->supported,
+					      &priv->compulsory);
+	if (result != BRASERO_BURN_OK) {
+		brasero_burn_session_set_flags (BRASERO_BURN_SESSION (self), flags);
+		return;
+	}
+
+	for (flag = 1; flag < BRASERO_BURN_FLAG_LAST; flag <<= 1) {
+		/* see if this flag was originally set */
+		if (!(flags & flag))
+			continue;
+
+		/* Don't set write modes now in this case */
+		if (brasero_burn_session_same_src_dest_drive (BRASERO_BURN_SESSION (self))
+		&& (flag & (BRASERO_BURN_FLAG_DAO|BRASERO_BURN_FLAG_RAW)))
+			continue;
+
+		if (priv->compulsory
+		&& (priv->compulsory & brasero_burn_session_get_flags (BRASERO_BURN_SESSION (self))) != priv->compulsory) {
+			brasero_burn_session_add_flag (BRASERO_BURN_SESSION (self), priv->compulsory);
+
+			priv->supported = BRASERO_BURN_FLAG_NONE;
+			priv->compulsory = BRASERO_BURN_FLAG_NONE;
+			brasero_burn_caps_get_flags (priv->caps,
+						     BRASERO_BURN_SESSION (self),
+						     &priv->supported,
+						     &priv->compulsory);
+		}
+
+		if (priv->supported & flag) {
+			brasero_burn_session_add_flag (BRASERO_BURN_SESSION (self), flag);
+
+			priv->supported = BRASERO_BURN_FLAG_NONE;
+			priv->compulsory = BRASERO_BURN_FLAG_NONE;
+			brasero_burn_caps_get_flags (priv->caps,
+						     BRASERO_BURN_SESSION (self),
+						     &priv->supported,
+						     &priv->compulsory);
+		}
+	}
+
+	/* Always set this flag whenever possible */
+	if (priv->supported & BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE) {
+		brasero_burn_session_add_flag (BRASERO_BURN_SESSION (self),
+					       BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE|
+					       BRASERO_BURN_FLAG_FAST_BLANK);
+
+		priv->supported = BRASERO_BURN_FLAG_NONE;
+		priv->compulsory = BRASERO_BURN_FLAG_NONE;
+		brasero_burn_caps_get_flags (priv->caps,
+					     BRASERO_BURN_SESSION (self),
+					     &priv->supported,
+					     &priv->compulsory);
+	}
+
+	/* When copying with same drive don't set write mode, it'll be set later */
+	if (!brasero_burn_session_same_src_dest_drive (BRASERO_BURN_SESSION (self))) {
+		/* use DAO whenever it's possible */
+		if (priv->supported & BRASERO_BURN_FLAG_DAO) {
+			brasero_burn_session_add_flag (BRASERO_BURN_SESSION (self), BRASERO_BURN_FLAG_DAO);
+
+			priv->supported = BRASERO_BURN_FLAG_NONE;
+			priv->compulsory = BRASERO_BURN_FLAG_NONE;
+			brasero_burn_caps_get_flags (priv->caps,
+						     BRASERO_BURN_SESSION (self),
+						     &priv->supported,
+						     &priv->compulsory);
+		}
+	}
+}
+
+static void
+brasero_session_cfg_set_drive_properties (BraseroSessionCfg *self)
+{
+	BraseroSessionCfgPrivate *priv;
+	BraseroTrackType source;
+	BraseroBurnFlag flags;
+	BraseroMedium *medium;
+	BraseroDrive *drive;
+	GConfClient *client;
+	GConfValue *value;
+	guint64 rate;
+	gchar *path;
+	gchar *key;
+
+	priv = BRASERO_SESSION_CFG_PRIVATE (self);
+
+	brasero_burn_session_get_input_type (BRASERO_BURN_SESSION (self), &source);
+	if (source.type == BRASERO_TRACK_TYPE_NONE)
+		return;
+
+	drive = brasero_burn_session_get_burner (BRASERO_BURN_SESSION (self));
+	if (!drive)
+		return;
+
+	medium = brasero_drive_get_medium (drive);
+	if (!medium || brasero_medium_get_status (medium) == BRASERO_MEDIUM_NONE)
+		return;
+
+	/* Update/set the rate */
+	client = gconf_client_get_default ();
+
+	key = brasero_burn_session_get_config_key (BRASERO_BURN_SESSION (self), "speed");
+	value = gconf_client_get_without_default (client, key, NULL);
+	g_free (key);
+
+	if (value) {
+		rate = gconf_value_get_int (value) * 1024;
+		gconf_value_free (value);
+	}
+	else
+		rate = brasero_medium_get_max_write_speed (medium);
+
+	brasero_burn_session_set_rate (BRASERO_BURN_SESSION (self), rate);
+
+	/* Set temporary directory
+	 * NOTE: BraseroBurnSession can cope with NULL path */
+	key = g_strdup_printf ("%s/tmpdir", BRASERO_DRIVE_PROPERTIES_KEY);
+	path = gconf_client_get_string (client, key, NULL);
+	g_free (key);
+
+	brasero_burn_session_set_tmpdir (BRASERO_BURN_SESSION (self), path);
+	g_free (path);
+
+	/* Do the same with the flags.
+	 * NOTE: we only save/load PROPERTIES_FLAGS */
+	key = brasero_burn_session_get_config_key (BRASERO_BURN_SESSION (self), "flags");
+	if (!key) {
+		g_object_unref (client);
+		return;
+	}
+
+	value = gconf_client_get_without_default (client, key, NULL);
+	g_free (key);
+
+	g_object_unref (client);
+
+	if (brasero_burn_session_same_src_dest_drive (BRASERO_BURN_SESSION (self))) {
+		/* Special case */
+		if (value) {
+			flags = gconf_value_get_int (value) & BRASERO_DEST_SAVED_FLAGS;
+			gconf_value_free (value);
+		}
+		else
+			flags = BRASERO_BURN_FLAG_EJECT|
+				BRASERO_BURN_FLAG_BURNPROOF;
+
+		flags |= BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE|
+			 BRASERO_BURN_FLAG_FAST_BLANK;
+	}
+	else if (!value) {
+		/* Set sound defaults */
+		flags = BRASERO_BURN_FLAG_EJECT|
+			BRASERO_BURN_FLAG_BURNPROOF;
+
+		if (source.type == BRASERO_TRACK_TYPE_DATA
+		||  source.type == BRASERO_TRACK_TYPE_DISC
+		||  source.type == BRASERO_TRACK_TYPE_IMAGE)
+			flags |= BRASERO_BURN_FLAG_NO_TMP_FILES;
+	}
+	else {
+		/* set the saved flags */
+		flags = gconf_value_get_int (value) & BRASERO_DEST_SAVED_FLAGS;
+		gconf_value_free (value);
+	}
+
+	brasero_session_cfg_add_drive_properties_flags (self, flags);
+}
+
+static void
+brasero_session_cfg_check_drive_settings (BraseroSessionCfg *self)
+{
+	BraseroSessionCfgPrivate *priv;
+	BraseroBurnFlag flags;
+
+	priv = BRASERO_SESSION_CFG_PRIVATE (self);
+
+	/* Try to properly update the flags for the current drive */
+	flags = brasero_burn_session_get_flags (BRASERO_BURN_SESSION (self));
+	if (brasero_burn_session_same_src_dest_drive (BRASERO_BURN_SESSION (self)))
+		flags |= BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE|
+			 BRASERO_BURN_FLAG_FAST_BLANK;
+
+	/* check each flag before re-adding it */
+	brasero_session_cfg_add_drive_properties_flags (self, flags);
+
+	/* NOTE: always save. That way if a flag is no longer supported after
+	 * the removal of a plugin then the properties are reset and the user
+	 * can access them again */
+	brasero_session_cfg_save_drive_properties (self);
+}
+
+static void
+brasero_session_cfg_update (BraseroSessionCfg *self)
+{
+	BraseroSessionCfgPrivate *priv;
+	BraseroBurnResult result;
+	BraseroDrive *burner;
+
+	priv = BRASERO_SESSION_CFG_PRIVATE (self);
+
+	if (priv->configuring)
+		return;
+
+	priv->configuring = TRUE;
+
+	burner = brasero_burn_session_get_burner (BRASERO_BURN_SESSION (self));
+	if (!burner) {
+		priv->configuring = FALSE;
+		g_signal_emit (self,
+			       session_cfg_signals [IS_VALID_SIGNAL],
+			       0,
+			       FALSE);
+		return;
+	}
+
+	if (brasero_drive_is_fake (burner))
+		/* Remove some impossible flags */
+		brasero_burn_session_remove_flag (BRASERO_BURN_SESSION (self),
+						  BRASERO_BURN_FLAG_DUMMY|
+						  BRASERO_BURN_FLAG_NO_TMP_FILES);
+	else
+		brasero_session_cfg_set_drive_properties (self);
+
+	priv->configuring = FALSE;
+	result = brasero_burn_caps_is_session_supported (priv->caps, BRASERO_BURN_SESSION (self));
+	g_signal_emit (self,
+		       session_cfg_signals [IS_VALID_SIGNAL],
+		       0,
+		       (result == BRASERO_BURN_OK));
+}
+
+static void
+brasero_session_cfg_input_changed (BraseroBurnSession *session)
+{
+	/* when that happens it's mostly because a medium source changed, or
+	 * a new image was set. 
+	 * - reload saved flags
+	 * - check if all flags are thereafter supported
+	 * - check available formats for path
+	 * - set one path
+	 */
+	brasero_session_cfg_update (BRASERO_SESSION_CFG (session));
+}
+
+static void
+brasero_session_cfg_output_changed (BraseroBurnSession *session)
+{
+	/* In this case need to :
+	 * - load flags 
+	 * - check if all flags are thereafter supported
+	 * - for images, set a path if it wasn't already set
+	 */
+	brasero_session_cfg_update (BRASERO_SESSION_CFG (session));
+}
+
+static void
+brasero_session_cfg_check (BraseroSessionCfg *self)
+{
+	BraseroSessionCfgPrivate *priv;
+	BraseroBurnResult result;
+	BraseroDrive *burner;
+
+	priv = BRASERO_SESSION_CFG_PRIVATE (self);
+
+	if (priv->configuring)
+		return;
+
+	priv->configuring = TRUE;
+
+	burner = brasero_burn_session_get_burner (BRASERO_BURN_SESSION (self));
+	if (!burner) {
+		priv->configuring = FALSE;
+		g_signal_emit (self,
+			       session_cfg_signals [IS_VALID_SIGNAL],
+			       0,
+			       FALSE);
+		return;
+	}
+
+	if (brasero_drive_is_fake (burner))
+		/* Remove some impossible flags */
+		brasero_burn_session_remove_flag (BRASERO_BURN_SESSION (self),
+						  BRASERO_BURN_FLAG_DUMMY|
+						  BRASERO_BURN_FLAG_NO_TMP_FILES);
+	else
+		brasero_session_cfg_check_drive_settings (self);
+
+	priv->configuring = FALSE;
+	result = brasero_burn_caps_is_session_supported (priv->caps, BRASERO_BURN_SESSION (self));
+	g_signal_emit (self,
+		       session_cfg_signals [IS_VALID_SIGNAL],
+		       0,
+		       (result == BRASERO_BURN_OK));
+}
+
+static void
+brasero_session_cfg_caps_changed (BraseroPluginManager *manager,
+				  BraseroSessionCfg *self)
+{
+	/* In this case we need to check if:
+	 * - new flags are supported or not supported anymore
+	 * - new image types as input/output are supported
+	 * - if the current set of flags/input/output still works */
+	brasero_session_cfg_check (self);
+}
+
+static void
+brasero_session_cfg_init (BraseroSessionCfg *object)
+{
+	BraseroSessionCfgPrivate *priv;
+	BraseroPluginManager *manager;
+
+	priv = BRASERO_SESSION_CFG_PRIVATE (object);
+
+	priv->caps = brasero_burn_caps_get_default ();
+
+	manager = brasero_plugin_manager_get_default ();
+	priv->caps_sig = g_signal_connect (manager,
+					   "caps-changed",
+					   G_CALLBACK (brasero_session_cfg_caps_changed),
+					   object);
+}
+
+static void
+brasero_session_cfg_finalize (GObject *object)
+{
+	BraseroSessionCfgPrivate *priv;
+
+	priv = BRASERO_SESSION_CFG_PRIVATE (object);
+
+	if (priv->caps_sig) {
+		BraseroPluginManager *manager;
+
+		manager = brasero_plugin_manager_get_default ();
+		g_signal_handler_disconnect (manager, priv->caps_sig);
+		priv->caps_sig = 0;
+	}
+
+	if (priv->caps) {
+		g_object_unref (priv->caps);
+		priv->caps = NULL;
+	}
+
+	G_OBJECT_CLASS (brasero_session_cfg_parent_class)->finalize (object);
+}
+
+static void
+brasero_session_cfg_class_init (BraseroSessionCfgClass *klass)
+{
+	GObjectClass* object_class = G_OBJECT_CLASS (klass);
+	BraseroBurnSessionClass *session_class = BRASERO_BURN_SESSION_CLASS (klass);
+
+	g_type_class_add_private (klass, sizeof (BraseroSessionCfgPrivate));
+
+	object_class->finalize = brasero_session_cfg_finalize;
+
+	session_class->input_changed = brasero_session_cfg_input_changed;
+	session_class->output_changed = brasero_session_cfg_output_changed;
+
+	session_cfg_signals[IS_VALID_SIGNAL] =
+		g_signal_new ("is_valid",
+		              G_OBJECT_CLASS_TYPE (klass),
+		              G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_CLEANUP | G_SIGNAL_ACTION,
+		              0,
+		              NULL, NULL,
+		              g_cclosure_marshal_VOID__BOOLEAN,
+		              G_TYPE_NONE,
+			      1,
+		              G_TYPE_BOOLEAN);
+}
+
+BraseroSessionCfg *
+brasero_session_cfg_new (void)
+{
+	return g_object_new (BRASERO_TYPE_SESSION_CFG, NULL);
+}

Added: trunk/src/brasero-session-cfg.h
==============================================================================
--- (empty file)
+++ trunk/src/brasero-session-cfg.h	Sat Sep 20 13:43:33 2008
@@ -0,0 +1,61 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * brasero
+ * Copyright (C) Philippe Rouquier 2008 <bonfire-app wanadoo fr>
+ * 
+ * brasero 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 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * brasero 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _BRASERO_SESSION_CFG_H_
+#define _BRASERO_SESSION_CFG_H_
+
+#include <glib-object.h>
+
+#include "burn-session.h"
+
+G_BEGIN_DECLS
+
+#define BRASERO_TYPE_SESSION_CFG             (brasero_session_cfg_get_type ())
+#define BRASERO_SESSION_CFG(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), BRASERO_TYPE_SESSION_CFG, BraseroSessionCfg))
+#define BRASERO_SESSION_CFG_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), BRASERO_TYPE_SESSION_CFG, BraseroSessionCfgClass))
+#define BRASERO_IS_SESSION_CFG(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BRASERO_TYPE_SESSION_CFG))
+#define BRASERO_IS_SESSION_CFG_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), BRASERO_TYPE_SESSION_CFG))
+#define BRASERO_SESSION_CFG_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), BRASERO_TYPE_SESSION_CFG, BraseroSessionCfgClass))
+
+typedef struct _BraseroSessionCfgClass BraseroSessionCfgClass;
+typedef struct _BraseroSessionCfg BraseroSessionCfg;
+
+struct _BraseroSessionCfgClass
+{
+	BraseroBurnSessionClass parent_class;
+};
+
+struct _BraseroSessionCfg
+{
+	BraseroBurnSession parent_instance;
+};
+
+GType brasero_session_cfg_get_type (void) G_GNUC_CONST;
+
+#define BRASERO_DRIVE_PROPERTIES_FLAGS	       (BRASERO_BURN_FLAG_DUMMY|	\
+						BRASERO_BURN_FLAG_EJECT|	\
+						BRASERO_BURN_FLAG_BURNPROOF|	\
+						BRASERO_BURN_FLAG_NO_TMP_FILES)
+
+BraseroSessionCfg *
+brasero_session_cfg_new (void);
+
+G_END_DECLS
+
+#endif /* _BRASERO_SESSION_CFG_H_ */

Modified: trunk/src/brasero-src-selection.c
==============================================================================
--- trunk/src/brasero-src-selection.c	(original)
+++ trunk/src/brasero-src-selection.c	Sat Sep 20 13:43:33 2008
@@ -71,7 +71,7 @@
 		brasero_track_unref (priv->track);
 
 	priv->track = brasero_track_new (BRASERO_TRACK_TYPE_DISC);
-	if (drive && brasero_drive_is_fake (drive))
+	if (!drive || brasero_drive_is_fake (drive))
 		brasero_track_set_drive_source (priv->track, NULL);
 	else
 		brasero_track_set_drive_source (priv->track, drive);

Modified: trunk/src/burn-caps.c
==============================================================================
--- trunk/src/burn-caps.c	(original)
+++ trunk/src/burn-caps.c	Sat Sep 20 13:43:33 2008
@@ -2223,6 +2223,75 @@
 	return required_media;
 }
 
+BraseroImageFormat
+brasero_burn_caps_get_default_output_format (BraseroBurnCaps *self,
+					     BraseroBurnSession *session)
+{
+	BraseroTrackType source;
+	BraseroTrackType output;
+	BraseroBurnResult result;
+
+	if (!brasero_burn_session_is_dest_file (session))
+		return BRASERO_IMAGE_FORMAT_NONE;
+
+	brasero_burn_session_get_input_type (session, &source);
+	if (source.type == BRASERO_TRACK_TYPE_NONE)
+		return BRASERO_IMAGE_FORMAT_NONE;
+
+	if (source.type == BRASERO_TRACK_TYPE_IMAGE)
+		return source.subtype.img_format;
+
+	output.type = BRASERO_TRACK_TYPE_IMAGE;
+	output.subtype.img_format = BRASERO_IMAGE_FORMAT_NONE;
+
+	if (source.type == BRASERO_TRACK_TYPE_AUDIO) {
+		/* If that's AUDIO only without VIDEO then return */
+		if (!(source.subtype.audio_format & (BRASERO_VIDEO_FORMAT_UNDEFINED|BRASERO_VIDEO_FORMAT_VCD|BRASERO_VIDEO_FORMAT_VIDEO_DVD)))
+			return BRASERO_IMAGE_FORMAT_NONE;
+
+		/* Otherwise try all possible image types */
+		output.subtype.img_format = BRASERO_IMAGE_FORMAT_CDRDAO;
+		for (; output.subtype.img_format != BRASERO_IMAGE_FORMAT_NONE;
+		       output.subtype.img_format >>= 1) {
+		
+			result = brasero_burn_caps_is_output_supported (self,
+									session,
+									&output);
+			if (result == BRASERO_BURN_OK)
+				return output.subtype.img_format;
+		}
+
+		return BRASERO_IMAGE_FORMAT_NONE;
+	}
+
+	if (source.type == BRASERO_TRACK_TYPE_DATA
+	|| (source.type == BRASERO_TRACK_TYPE_DISC
+	&&  source.subtype.media & (BRASERO_MEDIUM_DVD|BRASERO_MEDIUM_DVD_DL))) {
+		output.subtype.img_format = BRASERO_IMAGE_FORMAT_BIN;
+		result = brasero_burn_caps_is_output_supported (self,
+								session,
+								&output);
+		if (result != BRASERO_BURN_OK)
+			return BRASERO_IMAGE_FORMAT_NONE;
+
+		return BRASERO_IMAGE_FORMAT_BIN;
+	}
+
+	/* for the input which are CDs there are lots of possible formats */
+	output.subtype.img_format = BRASERO_IMAGE_FORMAT_CDRDAO;
+	for (; output.subtype.img_format != BRASERO_IMAGE_FORMAT_NONE;
+	       output.subtype.img_format >>= 1) {
+	
+		result = brasero_burn_caps_is_output_supported (self,
+								session,
+								&output);
+		if (result == BRASERO_BURN_OK)
+			return output.subtype.img_format;
+	}
+
+	return BRASERO_IMAGE_FORMAT_NONE;
+}
+
 static BraseroPluginIOFlag
 brasero_caps_get_flags (BraseroCaps *caps,
 			BraseroBurnFlag session_flags,

Modified: trunk/src/burn-caps.h
==============================================================================
--- trunk/src/burn-caps.h	(original)
+++ trunk/src/burn-caps.h	Sat Sep 20 13:43:33 2008
@@ -119,6 +119,9 @@
 BraseroMedia
 brasero_burn_caps_get_required_media_type (BraseroBurnCaps *caps,
 					   BraseroBurnSession *session);
+BraseroImageFormat
+brasero_burn_caps_get_default_output_format (BraseroBurnCaps *caps,
+					     BraseroBurnSession *session);
 
 /**
  * Test the supported or compulsory flags for a given session

Modified: trunk/src/burn-image-format.c
==============================================================================
--- trunk/src/burn-image-format.c	(original)
+++ trunk/src/burn-image-format.c	Sat Sep 20 13:43:33 2008
@@ -796,3 +796,101 @@
 
 	return TRUE;
 }
+
+gchar *
+brasero_image_format_get_default_path (BraseroImageFormat format)
+{
+	const gchar *suffixes [] = {".iso",
+				    ".toc",
+				    ".cue",
+				    ".toc",
+				    NULL };
+	const gchar *suffix = NULL;
+	gchar *path;
+	gint i = 0;
+
+	if (format & BRASERO_IMAGE_FORMAT_BIN)
+		suffix = suffixes [0];
+	else if (format & BRASERO_IMAGE_FORMAT_CLONE)
+		suffix = suffixes [1];
+	else if (format & BRASERO_IMAGE_FORMAT_CUE)
+		suffix = suffixes [2];
+	else if (format & BRASERO_IMAGE_FORMAT_CDRDAO)
+		suffix = suffixes [3];
+
+	path = g_strdup_printf ("%s/brasero%s",
+				g_get_home_dir (),
+				suffix);
+
+	while (g_file_test (path, G_FILE_TEST_EXISTS)) {
+		g_free (path);
+
+		path = g_strdup_printf ("%s/brasero-%i%s",
+					g_get_home_dir (),
+					i,
+					suffix);
+		i ++;
+	}
+
+	return path;
+}
+
+gchar *
+brasero_image_format_fix_path_extension (BraseroImageFormat format,
+					 gboolean check_existence,
+					 gchar *path)
+{
+	gchar *dot;
+	guint i = 0;
+	gchar *retval = NULL;
+	const gchar *suffix = NULL;;
+	const gchar *suffixes [] = {".iso",
+				    ".toc",
+				    ".cue",
+				    ".toc",
+				    NULL };
+
+	/* search the last dot to check extension */
+	dot = g_utf8_strrchr (path, -1, '.');
+	if (dot && strlen (dot) < 5 && strlen (dot) > 1) {
+		if (format & BRASERO_IMAGE_FORMAT_BIN
+		&&  strcmp (suffixes [0], dot))
+			*dot = '\0';
+		else if (format & BRASERO_IMAGE_FORMAT_CLONE
+		     &&  strcmp (suffixes [1], dot))
+			*dot = '\0';
+		else if (format & BRASERO_IMAGE_FORMAT_CUE
+		     &&  strcmp (suffixes [2], dot))
+			*dot = '\0';
+		else if (format & BRASERO_IMAGE_FORMAT_CDRDAO
+		     &&  strcmp (suffixes [3], dot))
+			*dot = '\0';
+		else
+			return g_strdup (path);
+	}
+
+	/* determine the proper suffix */
+	if (format & BRASERO_IMAGE_FORMAT_BIN)
+		suffix = suffixes [0];
+	else if (format & BRASERO_IMAGE_FORMAT_CLONE)
+		suffix = suffixes [1];
+	else if (format & BRASERO_IMAGE_FORMAT_CUE)
+		suffix = suffixes [2];
+	else if (format & BRASERO_IMAGE_FORMAT_CDRDAO)
+		suffix = suffixes [3];
+	else
+		return g_strdup (path);
+
+	/* make sure the file doesn't exist */
+	retval = g_strdup_printf ("%s%s", path, suffix);
+	if (!check_existence)
+		return retval;
+
+	while (g_file_test (retval, G_FILE_TEST_EXISTS)) {
+		g_free (retval);
+		retval = g_strdup_printf ("%s-%i%s", path, i, suffix);
+		i ++;
+	}
+
+	return retval;
+}

Modified: trunk/src/burn-image-format.h
==============================================================================
--- trunk/src/burn-image-format.h	(original)
+++ trunk/src/burn-image-format.h	Sat Sep 20 13:43:33 2008
@@ -47,6 +47,13 @@
 brasero_image_format_identify_cuesheet (const gchar *path);
 
 gchar *
+brasero_image_format_get_default_path (BraseroImageFormat format);
+
+gchar *
+brasero_image_format_fix_path_extension (BraseroImageFormat format,
+					 gboolean check_existence,
+					 gchar *path);
+gchar *
 brasero_image_format_get_complement (BraseroImageFormat format,
 				     const gchar *path);
 

Modified: trunk/src/burn-session.c
==============================================================================
--- trunk/src/burn-session.c	(original)
+++ trunk/src/burn-session.c	Sat Sep 20 13:43:33 2008
@@ -652,11 +652,12 @@
 
 BraseroBurnResult
 brasero_burn_session_get_output (BraseroBurnSession *self,
-				 gchar **image,
-				 gchar **toc,
+				 gchar **image_ret,
+				 gchar **toc_ret,
 				 GError **error)
 {
-	BraseroBurnResult result;
+	gchar *toc = NULL;
+	gchar *image = NULL;
 	BraseroBurnSessionPrivate *priv;
 
 	g_return_val_if_fail (BRASERO_IS_BURN_SESSION (self), BRASERO_BURN_ERR);
@@ -668,25 +669,36 @@
 		return BRASERO_BURN_ERR;
 	}
 
-	if (image) {
+	image = g_strdup (priv->settings->image);
+	toc = g_strdup (priv->settings->toc);
+
+	if (!image && !toc)
+		return BRASERO_BURN_ERR;
+
+	if (image_ret) {
+		BraseroBurnResult result;
+
 		/* output paths were set so test them and returns them if OK */
-		if (priv->settings->image) {
+		if (image) {
 			result = brasero_burn_session_file_test (self,
-								 priv->settings->image,
+								 image,
 								 error);
 			if (result != BRASERO_BURN_OK) {
 				BRASERO_BURN_LOG ("Problem with image existence");
+				g_free (image);
+				g_free (toc);
 				return result;
 			}
 
-			*image = g_strdup (priv->settings->image);
+			*image_ret = image;
 		}
-		else if (priv->settings->toc) {
+		else if (toc) {
 			gchar *complement;
+			BraseroImageFormat format;
 
 			/* get the cuesheet complement */
-			complement = brasero_image_format_get_complement (priv->settings->format,
-									  priv->settings->toc);
+			format = brasero_burn_session_get_output_format (self);
+			complement = brasero_image_format_get_complement (format, toc);
 			if (!complement) {
 				BRASERO_BURN_LOG ("no output specified");
 
@@ -694,6 +706,8 @@
 					     BRASERO_BURN_ERROR,
 					     BRASERO_BURN_ERROR_GENERAL,
 					     _("no output specified"));
+
+				g_free (toc);
 				return BRASERO_BURN_ERR;
 			}
 
@@ -702,10 +716,12 @@
 								 error);
 			if (result != BRASERO_BURN_OK) {
 				BRASERO_BURN_LOG ("Problem with image existence");
+				g_free (complement);
+				g_free (toc);
 				return result;
 			}
 
-			*image = complement;
+			*image_ret = complement;
 		}
 		else {
 			BRASERO_BURN_LOG ("no output specified");
@@ -717,11 +733,15 @@
 			return BRASERO_BURN_ERR;
 		}
 	}
+	else
+		g_free (image);
+
+	if (toc_ret) {
+		if (toc) {
+			BraseroBurnResult result;
 
-	if (toc) {
-		if (priv->settings->toc) {
 			result = brasero_burn_session_file_test (self,
-								 priv->settings->toc,
+								 toc,
 								 error);
 			if (result != BRASERO_BURN_OK) {
 				BRASERO_BURN_LOG ("Problem with toc existence");
@@ -729,8 +749,10 @@
 			}
 		}
 
-		*toc = g_strdup (priv->settings->toc);
+		*toc_ret = toc;
 	}
+	else
+		g_free (toc);
 
 	return BRASERO_BURN_OK;
 }
@@ -767,23 +789,24 @@
 
 	priv = BRASERO_BURN_SESSION_PRIVATE (self);
 
-	if (!BRASERO_BURN_SESSION_WRITE_TO_FILE (priv)) {
-		BraseroMediumMonitor *monitor;
-		BraseroDrive *drive;
-		GSList *list;
-
-		monitor = brasero_medium_monitor_get_default ();
-		list = brasero_medium_monitor_get_media (monitor, BRASERO_MEDIA_TYPE_FILE);
-		drive = brasero_medium_get_drive (list->data);
-		brasero_burn_session_set_burner (self, drive);
-		g_object_unref (monitor);
-		g_slist_free (list);
-	}
-
 	if (priv->settings->format == format
 	&&  BRASERO_STR_EQUAL (image, priv->settings->image)
-	&&  BRASERO_STR_EQUAL (toc, priv->settings->toc))
+	&&  BRASERO_STR_EQUAL (toc, priv->settings->toc)) {
+		if (!BRASERO_BURN_SESSION_WRITE_TO_FILE (priv)) {
+			BraseroMediumMonitor *monitor;
+			BraseroDrive *drive;
+			GSList *list;
+
+			monitor = brasero_medium_monitor_get_default ();
+			list = brasero_medium_monitor_get_media (monitor, BRASERO_MEDIA_TYPE_FILE);
+			drive = brasero_medium_get_drive (list->data);
+			brasero_burn_session_set_burner (self, drive);
+			g_object_unref (monitor);
+			g_slist_free (list);
+		}
+
 		return BRASERO_BURN_OK;
+	}
 
 	if (priv->settings->image)
 		g_free (priv->settings->image);
@@ -803,9 +826,23 @@
 
 	priv->settings->format = format;
 
-	g_signal_emit (self,
-		       brasero_burn_session_signals [OUTPUT_CHANGED_SIGNAL],
-		       0);
+	if (!BRASERO_BURN_SESSION_WRITE_TO_FILE (priv)) {
+		BraseroMediumMonitor *monitor;
+		BraseroDrive *drive;
+		GSList *list;
+
+		monitor = brasero_medium_monitor_get_default ();
+		list = brasero_medium_monitor_get_media (monitor, BRASERO_MEDIA_TYPE_FILE);
+		drive = brasero_medium_get_drive (list->data);
+		brasero_burn_session_set_burner (self, drive);
+		g_object_unref (monitor);
+		g_slist_free (list);
+	}
+	else
+		g_signal_emit (self,
+			       brasero_burn_session_signals [OUTPUT_CHANGED_SIGNAL],
+			       0);
+
 	return BRASERO_BURN_OK;
 }
 
@@ -1842,7 +1879,7 @@
 	brasero_burn_session_signals [OUTPUT_CHANGED_SIGNAL] =
 	    g_signal_new ("output_changed",
 			  BRASERO_TYPE_BURN_SESSION,
-			  G_SIGNAL_RUN_LAST|G_SIGNAL_ACTION|G_SIGNAL_NO_RECURSE,
+			  G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION|G_SIGNAL_NO_RECURSE,
 			  G_STRUCT_OFFSET (BraseroBurnSessionClass, output_changed),
 			  NULL,
 			  NULL,
@@ -1853,7 +1890,7 @@
 	brasero_burn_session_signals [INPUT_CHANGED_SIGNAL] =
 	    g_signal_new ("input_changed",
 			  BRASERO_TYPE_BURN_SESSION,
-			  G_SIGNAL_RUN_LAST|G_SIGNAL_ACTION|G_SIGNAL_NO_RECURSE,
+			  G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION|G_SIGNAL_NO_RECURSE,
 			  G_STRUCT_OFFSET (BraseroBurnSessionClass, input_changed),
 			  NULL,
 			  NULL,

Modified: trunk/src/burn-session.h
==============================================================================
--- trunk/src/burn-session.h	(original)
+++ trunk/src/burn-session.h	Sat Sep 20 13:43:33 2008
@@ -61,9 +61,8 @@
 	 * it's better to have one global signal and dialogs asking for
 	 * the session properties they are interested in.
 	 */
-	void	(*input_changed)		(BraseroBurnSession *session);
-
-	void	(*output_changed)		(BraseroBurnSession *session);
+	void			(*input_changed)	(BraseroBurnSession *session);
+	void			(*output_changed)	(BraseroBurnSession *session);
 };
 
 GType brasero_burn_session_get_type ();



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