brasero r1297 - in trunk: . src
- From: philippr svn gnome org
- To: svn-commits-list gnome org
- Subject: brasero r1297 - in trunk: . src
- Date: Sat, 20 Sep 2008 13:43:33 +0000 (UTC)
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]