brasero r671 - in trunk: . po src src/plugins/checksum src/plugins/local-track



Author: philippr
Date: Wed Mar 12 21:46:44 2008
New Revision: 671
URL: http://svn.gnome.org/viewvc/brasero?rev=671&view=rev

Log:
	Make all md5 plugin use glib\'s. That also adds possibility to use SHA1/SHA256 to checksum.
	Fix #438849 â md5 checksuming is a little weak

	* src/brasero-plugin-option.c:
	(brasero_plugin_option_save_settings),
	(brasero_plugin_option_add_conf_widget):
	* src/brasero-sum-dialog.c:
	(brasero_sum_dialog_set_track_checksum_type),
	(brasero_sum_dialog_check_disc_sum):
	* src/burn-basics.h:
	* src/burn-caps.c: (brasero_burn_caps_new_checksuming_task):
	* src/burn-plugin-private.h:
	* src/burn-plugin.c: (brasero_plugin_conf_option_choice_pair_free),
	(brasero_plugin_conf_option_free),
	(brasero_plugin_conf_option_choice_add),
	(brasero_plugin_conf_option_choice_get):
	* src/burn-plugin.h:
	* src/burn-track.c: (brasero_track_set_checksum):
	* src/burn-track.h:
	* src/burn-volume-obj.c: (brasero_volume_is_mounted),
	(brasero_volume_umount_finish), (brasero_volume_umount),
	(brasero_volume_mount_finish), (brasero_volume_mount),
	(brasero_volume_ejected_cb), (brasero_volume_eject_finish),
	(brasero_volume_eject):
	* src/burn.c: (brasero_burn_eject_dest_media),
	(brasero_burn_lock_checksum_media),
	(brasero_burn_unlock_dest_media), (brasero_burn_check_real),
	(brasero_burn_record_session):
	* src/plugins/checksum/Makefile.am:
	* src/plugins/checksum/burn-md5.c:
	* src/plugins/checksum/burn-md5.h:
	* src/plugins/checksum/burn-md5sum-file.c:
	(brasero_md5sum_file_get_file_checksum),
	(brasero_md5sum_file_add_file_checksum),
	(brasero_md5sum_file_explore_directory),
	(brasero_md5sum_file_create_checksum),
	(brasero_md5sum_file_check_files), (brasero_md5sum_file_end),
	(brasero_md5sum_file_thread), (brasero_md5sum_file_activate),
	(brasero_md5sum_file_clock_tick), (brasero_md5sum_file_stop),
	(brasero_md5sum_file_export_caps):
	* src/plugins/checksum/burn-md5sum-file.h:
	* src/plugins/checksum/burn-md5sum.c: (brasero_md5sum_read),
	(brasero_md5sum_write), (brasero_md5sum_checksum),
	(brasero_md5sum_checksum_fd_input),
	(brasero_md5sum_checksum_file_input),
	(brasero_md5sum_create_checksum),
	(brasero_md5sum_image_and_checksum), (brasero_md5sum_end),
	(brasero_md5sum_thread), (brasero_md5sum_clock_tick),
	(brasero_md5sum_stop), (brasero_md5sum_finalize),
	(brasero_md5sum_export_caps):
	* src/plugins/local-track/burn-local-image.c:
	(brasero_local_track_read_checksum),
	(brasero_local_track_download_checksum),
	(brasero_local_track_thread_finished),
	(brasero_local_track_thread), (brasero_local_track_start),
	(brasero_local_track_stop):

Removed:
   trunk/src/plugins/checksum/burn-md5.c
   trunk/src/plugins/checksum/burn-md5.h
Modified:
   trunk/ChangeLog
   trunk/po/ChangeLog
   trunk/po/POTFILES.in
   trunk/src/brasero-plugin-option.c
   trunk/src/brasero-sum-dialog.c
   trunk/src/burn-basics.h
   trunk/src/burn-caps.c
   trunk/src/burn-plugin-private.h
   trunk/src/burn-plugin.c
   trunk/src/burn-plugin.h
   trunk/src/burn-track.c
   trunk/src/burn-track.h
   trunk/src/burn-volume-obj.c
   trunk/src/burn.c
   trunk/src/plugins/checksum/Makefile.am
   trunk/src/plugins/checksum/burn-md5sum-file.c
   trunk/src/plugins/checksum/burn-md5sum-file.h
   trunk/src/plugins/checksum/burn-md5sum.c
   trunk/src/plugins/local-track/burn-local-image.c

Modified: trunk/po/POTFILES.in
==============================================================================
--- trunk/po/POTFILES.in	(original)
+++ trunk/po/POTFILES.in	Wed Mar 12 21:46:44 2008
@@ -60,7 +60,6 @@
 src/plugins/cdrtools/burn-cdrecord.c
 src/plugins/cdrtools/burn-mkisofs.c
 src/plugins/cdrtools/burn-readcd.c
-src/plugins/checksum/burn-md5.c
 src/plugins/checksum/burn-md5sum.c
 src/plugins/dvdcss/burn-dvdcss.c
 src/plugins/growisofs/burn-dvd-rw-format.c

Modified: trunk/src/brasero-plugin-option.c
==============================================================================
--- trunk/src/brasero-plugin-option.c	(original)
+++ trunk/src/brasero-plugin-option.c	Wed Mar 12 21:46:44 2008
@@ -41,6 +41,12 @@
 #include <gtk/gtkcheckbutton.h>
 #include <gtk/gtkstock.h>
 #include <gtk/gtkframe.h>
+#include <gtk/gtkcomboboxentry.h>
+#include <gtk/gtktreemodel.h>
+#include <gtk/gtkliststore.h>
+#include <gtk/gtkcellrenderer.h>
+#include <gtk/gtkcellrenderertext.h>
+#include <gtk/gtkcelllayout.h>
 
 #include <gconf/gconf-client.h>
 
@@ -48,6 +54,12 @@
 #include "burn-plugin-private.h"
 #include "brasero-plugin-option.h"
 
+enum {
+	STRING_COL,
+	VALUE_COL,
+	COL_NUM
+};
+
 typedef struct _BraseroPluginOptionPrivate BraseroPluginOptionPrivate;
 struct _BraseroPluginOptionPrivate
 {
@@ -73,7 +85,9 @@
 brasero_plugin_option_save_settings (BraseroPluginOption *self)
 {
 	GSList *iter;
+	GtkTreeModel *model;
 	GConfClient *client;
+	GtkTreeIter tree_iter;
 	BraseroPluginOptionPrivate *priv;
 
 	priv = BRASERO_PLUGIN_OPTION_PRIVATE (self);
@@ -112,6 +126,13 @@
 			gconf_client_set_string (client, key, value_str, NULL);
 			break;
 
+		case BRASERO_PLUGIN_OPTION_CHOICE:
+			model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget->widget));
+			gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget->widget), &tree_iter);
+			gtk_tree_model_get (model, &tree_iter,
+					    VALUE_COL, &value_int,
+					    -1);
+			gconf_client_set_int (client, key, value_int, NULL);
 		default:
 			break;
 		}
@@ -172,6 +193,7 @@
 	BraseroPluginOptionPrivate *priv;
 	BraseroPluginOptionWidget *info;
 	GSList *suboptionsw = NULL;
+	GtkListStore *model;
 	GConfClient *client;
 	gboolean value_bool;
 	gchar *value_str;
@@ -181,6 +203,8 @@
 	GtkWidget *label;
 	GtkWidget *hbox;
 	GtkWidget *box;
+	GtkTreeIter iter;
+	GtkCellRenderer *renderer;
 	BraseroPluginConfOptionType type;
 	gchar *description;
 	gchar *key;
@@ -302,6 +326,56 @@
 		g_free (value_str);
 		break;
 
+	case BRASERO_PLUGIN_OPTION_CHOICE:
+		box = gtk_hbox_new (FALSE, 6);
+
+		label = gtk_label_new (description);
+		gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+		gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
+
+		model = gtk_list_store_new (COL_NUM,
+					    G_TYPE_STRING,
+					    G_TYPE_INT);
+		widget = gtk_combo_box_new_with_model (GTK_TREE_MODEL (model));
+		g_object_unref (model);
+		gtk_widget_show (widget);
+		gtk_box_pack_start (GTK_BOX (box), widget, FALSE, TRUE, 0);
+
+		renderer = gtk_cell_renderer_text_new ();
+		gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (widget), renderer, TRUE);
+		gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (widget), renderer,
+						"text", STRING_COL,
+						NULL);
+
+		value_int = gconf_client_get_int (client, key, NULL);
+		suboptions = brasero_plugin_conf_option_choice_get (option);
+		for (; suboptions; suboptions = suboptions->next) {
+			BraseroPluginChoicePair *pair;
+
+			pair = suboptions->data;
+			gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+			gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+					    STRING_COL, pair->string,
+					    VALUE_COL, pair->value,
+					    -1);
+
+			if (pair->value == value_int)
+				gtk_combo_box_set_active_iter (GTK_COMBO_BOX (widget), &iter);
+		}
+
+		if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter)) {
+			if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter))
+				gtk_combo_box_set_active_iter (GTK_COMBO_BOX (widget), &iter);
+		}
+
+		gtk_widget_show_all (box);
+		gtk_box_pack_start (GTK_BOX (hbox),
+				    box,
+				    FALSE,
+				    FALSE,
+				    0);
+		break;
+
 	default:
 		widget = NULL;
 		break;

Modified: trunk/src/brasero-sum-dialog.c
==============================================================================
--- trunk/src/brasero-sum-dialog.c	(original)
+++ trunk/src/brasero-sum-dialog.c	Wed Mar 12 21:46:44 2008
@@ -52,6 +52,8 @@
 #include "brasero-sum-dialog.h"
 #include "brasero-tool-dialog.h"
 #include "burn-drive.h"
+#include "burn-medium.h"
+#include "burn-volume-obj.h"
 #include "brasero-xfer.h"
 #include "burn-basics.h"
 #include "burn-debug.h"
@@ -513,10 +515,76 @@
 	return brasero_sum_dialog_success (self);
 }
 
+static BraseroChecksumType
+brasero_sum_dialog_set_track_checksum_type (BraseroSumDialog *self,
+					    BraseroDrive *drive,
+					    BraseroTrack *track,
+					    GError **error)
+{
+	BraseroMedium *medium;
+	gboolean retval;
+	gchar *filename;
+	gchar *root;
+
+	medium = brasero_drive_get_medium (drive);
+
+	retval = brasero_volume_mount (BRASERO_VOLUME (medium), TRUE, error);
+	if (!retval)
+		return BRASERO_CHECKSUM_NONE;
+
+	root = brasero_volume_get_mount_point (BRASERO_VOLUME (medium), error);
+	if (!root)
+		return BRASERO_CHECKSUM_NONE;
+
+	filename = g_build_path (G_DIR_SEPARATOR_S, root, BRASERO_MD5_FILE, NULL);
+	if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
+		g_free (filename);
+
+		brasero_track_set_checksum (track,
+					    BRASERO_CHECKSUM_MD5_FILE,
+					    BRASERO_MD5_FILE);
+
+		return BRASERO_CHECKSUM_MD5_FILE;
+	}
+	g_free (filename);
+
+	filename = g_build_path (G_DIR_SEPARATOR_S, root, BRASERO_SHA1_FILE, NULL);
+	if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
+		g_free (filename);
+
+		brasero_track_set_checksum (track,
+					    BRASERO_CHECKSUM_SHA1_FILE,
+					    BRASERO_SHA1_FILE);
+
+		return BRASERO_CHECKSUM_SHA1_FILE;
+	}
+	g_free (filename);
+
+	filename = g_build_path (G_DIR_SEPARATOR_S, root, BRASERO_SHA256_FILE, NULL);
+	if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
+		g_free (filename);
+
+		brasero_track_set_checksum (track,
+					    BRASERO_CHECKSUM_SHA256_FILE,
+					    BRASERO_SHA256_FILE);
+
+		return BRASERO_CHECKSUM_SHA256_FILE;
+	}
+	g_free (filename);
+
+	g_set_error (error,
+		     BRASERO_ERROR,
+		     BRASERO_ERROR_GENERAL,
+		     _("no checksum file could be found on the disc."));
+
+	return BRASERO_CHECKSUM_NONE;
+}
+
 static gboolean
 brasero_sum_dialog_check_disc_sum (BraseroSumDialog *self,
 				   BraseroDrive *drive)
 {
+	BraseroChecksumType checksum_type;
 	GSList *wrong_sums = NULL;
 	BraseroBurnResult result;
 	GError *error = NULL;
@@ -527,9 +595,19 @@
 	/* get the checksum */
 	track = brasero_track_new (BRASERO_TRACK_TYPE_DISC);
 	brasero_track_set_drive_source (track, drive);
-	brasero_track_set_checksum (track,
-				    BRASERO_CHECKSUM_MD5_FILE,
-				    BRASERO_MD5_FILE);
+
+	checksum_type = brasero_sum_dialog_set_track_checksum_type (self,
+								    drive,
+								    track,
+								    &error);
+
+	if (checksum_type == BRASERO_CHECKSUM_NONE) {
+		brasero_sum_dialog_message_error (self, error);
+		brasero_track_unref (track);
+		g_error_free (error);
+		return FALSE;
+	}
+
 	brasero_burn_session_add_track (self->priv->session, track);
 
 	/* It's good practice to unref the track afterwards as we don't need it

Modified: trunk/src/burn-basics.h
==============================================================================
--- trunk/src/burn-basics.h	(original)
+++ trunk/src/burn-basics.h	Wed Mar 12 21:46:44 2008
@@ -43,7 +43,10 @@
 #define BRASERO_PLUGIN_DIRECTORY		BRASERO_LIBDIR "/brasero/plugins"
 
 #define BRASERO_BURN_TMP_FILE_NAME		"brasero_tmp_XXXXXX"
+
 #define BRASERO_MD5_FILE			".checksum.md5"
+#define BRASERO_SHA1_FILE			".checksum.sha1"
+#define BRASERO_SHA256_FILE			".checksum.sha256"
 
 typedef enum {
 	BRASERO_BURN_ERROR_NONE,

Modified: trunk/src/burn-caps.c
==============================================================================
--- trunk/src/burn-caps.c	(original)
+++ trunk/src/burn-caps.c	Wed Mar 12 21:46:44 2008
@@ -1476,7 +1476,7 @@
 			continue;
 
 		/* check this caps test supports the right checksum type */
-		if (test->type == checksum_type) {
+		if (test->type & checksum_type) {
 			links = test->links;
 			break;
 		}

Modified: trunk/src/burn-plugin-private.h
==============================================================================
--- trunk/src/burn-plugin-private.h	(original)
+++ trunk/src/burn-plugin-private.h	Wed Mar 12 21:46:44 2008
@@ -34,6 +34,12 @@
 
 G_BEGIN_DECLS
 
+struct _BraseroPluginChoicePair {
+	gchar *string;
+	guint value;
+};
+typedef struct _BraseroPluginChoicePair BraseroPluginChoicePair;
+
 BraseroPlugin *
 brasero_plugin_new (const gchar *path);
 
@@ -131,6 +137,9 @@
 gint
 brasero_plugin_conf_option_int_get_max (BraseroPluginConfOption *option);
 
+GSList *
+brasero_plugin_conf_option_choice_get (BraseroPluginConfOption *option);
+
 G_END_DECLS
 
 #endif /* _BURN_PLUGIN_PRIVATE_H */

Modified: trunk/src/burn-plugin.c
==============================================================================
--- trunk/src/burn-plugin.c	(original)
+++ trunk/src/burn-plugin.c	Wed Mar 12 21:46:44 2008
@@ -67,6 +67,8 @@
 		} range;
 
 		GSList *suboptions;
+
+		GSList *choices;
 	} specifics;
 };
 
@@ -190,6 +192,12 @@
 /**
  * Plugin configure options
  */
+static void
+brasero_plugin_conf_option_choice_pair_free (BraseroPluginChoicePair *pair)
+{
+	g_free (pair->string);
+	g_free (pair);
+}
 
 static void
 brasero_plugin_conf_option_free (BraseroPluginConfOption *option)
@@ -197,6 +205,11 @@
 	if (option->type == BRASERO_PLUGIN_OPTION_BOOL)
 		g_slist_free (option->specifics.suboptions);
 
+	if (option->type == BRASERO_PLUGIN_OPTION_CHOICE) {
+		g_slist_foreach (option->specifics.choices, (GFunc) brasero_plugin_conf_option_choice_pair_free, NULL);
+		g_slist_free (option->specifics.choices);
+	}
+
 	g_free (option->key);
 	g_free (option->description);
 
@@ -303,6 +316,24 @@
 	return BRASERO_BURN_OK;
 }
 
+BraseroBurnResult
+brasero_plugin_conf_option_choice_add (BraseroPluginConfOption *option,
+				       const gchar *string,
+				       gint value)
+{
+	BraseroPluginChoicePair *pair;
+
+	if (option->type != BRASERO_PLUGIN_OPTION_CHOICE)
+		return BRASERO_BURN_ERR;
+
+	pair = g_new0 (BraseroPluginChoicePair, 1);
+	pair->value = value;
+	pair->string = g_strdup (string);
+	option->specifics.choices = g_slist_append (option->specifics.choices, pair);
+
+	return BRASERO_BURN_OK;
+}
+
 GSList *
 brasero_plugin_conf_option_bool_get_suboptions (BraseroPluginConfOption *option)
 {
@@ -327,6 +358,14 @@
 	return option->specifics.range.min;
 }
 
+GSList *
+brasero_plugin_conf_option_choice_get (BraseroPluginConfOption *option)
+{
+	if (option->type != BRASERO_PLUGIN_OPTION_CHOICE)
+		return NULL;
+	return option->specifics.choices;
+}
+
 /**
  * Used to set the caps of plugin
  */

Modified: trunk/src/burn-plugin.h
==============================================================================
--- trunk/src/burn-plugin.h	(original)
+++ trunk/src/burn-plugin.h	Wed Mar 12 21:46:44 2008
@@ -170,6 +170,7 @@
 	BRASERO_PLUGIN_OPTION_BOOL,
 	BRASERO_PLUGIN_OPTION_INT,
 	BRASERO_PLUGIN_OPTION_STRING,
+	BRASERO_PLUGIN_OPTION_CHOICE
 } BraseroPluginConfOptionType;
 
 BraseroPluginConfOption *
@@ -190,6 +191,11 @@
 					  gint min,
 					  gint max);
 
+BraseroBurnResult
+brasero_plugin_conf_option_choice_add (BraseroPluginConfOption *option,
+				       const gchar *string,
+				       gint value);
+
 /**
  * Boiler plate for plugin definition to save the hassle of definition.
  * To be put at the beginning of the .c file.

Modified: trunk/src/burn-track.c
==============================================================================
--- trunk/src/burn-track.c	(original)
+++ trunk/src/burn-track.c	Wed Mar 12 21:46:44 2008
@@ -910,7 +910,9 @@
 	BraseroBurnResult result = BRASERO_BURN_OK;
 
 	if (type == track->checksum_type
-	&&  type == BRASERO_CHECKSUM_MD5
+	&& (type == BRASERO_CHECKSUM_MD5
+	||  type == BRASERO_CHECKSUM_SHA1
+	||  type == BRASERO_CHECKSUM_SHA256)
 	&&  strcmp (checksum, track->checksum))
 		result = BRASERO_BURN_ERR;
 

Modified: trunk/src/burn-track.h
==============================================================================
--- trunk/src/burn-track.h	(original)
+++ trunk/src/burn-track.h	Wed Mar 12 21:46:44 2008
@@ -70,7 +70,10 @@
 	BRASERO_CHECKSUM_NONE			= 0,
 	BRASERO_CHECKSUM_MD5			= 1,
 	BRASERO_CHECKSUM_MD5_FILE		= 1 << 1,
-	BRASERO_CHECKSUM_ANY			= BRASERO_CHECKSUM_MD5
+	BRASERO_CHECKSUM_SHA1			= 1 << 2,
+	BRASERO_CHECKSUM_SHA1_FILE		= 1 << 3,
+	BRASERO_CHECKSUM_SHA256			= 1 << 4,
+	BRASERO_CHECKSUM_SHA256_FILE		= 1 << 5
 } BraseroChecksumType;
 
 #define	BRASERO_MIN_AUDIO_TRACK_LENGTH		((gint64) 6 * 1000000000)

Modified: trunk/src/burn-volume-obj.c
==============================================================================
--- trunk/src/burn-volume-obj.c	(original)
+++ trunk/src/burn-volume-obj.c	Wed Mar 12 21:46:44 2008
@@ -113,6 +113,9 @@
 	GVolume *volume;
 	BraseroVolumePrivate *priv;
 
+	if (!self)
+		return FALSE;
+
 	priv = BRASERO_VOLUME_PRIVATE (self);
 
 	volume = brasero_volume_get_gvolume (self);
@@ -217,6 +220,13 @@
 					       result,
 					       &priv->error);
 
+	if (priv->error) {
+		if (priv->error->code == G_IO_ERROR_FAILED_HANDLED) {
+			g_error_free (priv->error);
+			priv->error = NULL;
+		}
+	}
+
 	brasero_volume_operation_end (self);
 
 	if (priv->result)
@@ -235,6 +245,9 @@
 	GVolume *volume;
 	BraseroVolumePrivate *priv;
 
+	if (!self)
+		return TRUE;
+
 	priv = BRASERO_VOLUME_PRIVATE (self);
 
 	volume = brasero_volume_get_gvolume (self);
@@ -281,6 +294,13 @@
 					      result,
 					      &priv->error);
 
+	if (priv->error) {
+		if (priv->error->code == G_IO_ERROR_FAILED_HANDLED) {
+			g_error_free (priv->error);
+			priv->error = NULL;
+		}
+	}
+
 	brasero_volume_operation_end (self);
 
 	if (priv->result)
@@ -294,10 +314,14 @@
 		      gboolean wait,
 		      GError **error)
 {
+	GMount *mount;
 	gboolean result;
 	GVolume *volume;
 	BraseroVolumePrivate *priv;
 
+	if (!self)
+		return FALSE;
+
 	priv = BRASERO_VOLUME_PRIVATE (self);
 
 	volume = brasero_volume_get_gvolume (self);
@@ -306,6 +330,13 @@
 		return FALSE;
 	}
 
+	mount = g_volume_get_mount (volume);
+	if (mount) {
+		g_object_unref (volume);
+		g_object_unref (mount);
+		return TRUE;
+	}
+
 	if (wait) {
 		g_volume_mount (volume,
 				G_MOUNT_MOUNT_NONE,
@@ -330,6 +361,14 @@
 }
 
 static void
+brasero_volume_ejected_cb (BraseroDrive *drive,
+			   gpointer callback_data)
+{
+	BraseroVolume *self = BRASERO_VOLUME (callback_data);
+	brasero_volume_operation_end (self);
+}
+
+static void
 brasero_volume_eject_finish (GObject *source,
 			     GAsyncResult *result,
 			     gpointer user_data)
@@ -342,7 +381,16 @@
 					     result,
 					     &priv->error);
 
-	brasero_volume_operation_end (self);
+	if (priv->error) {
+		if (priv->error->code == G_IO_ERROR_FAILED_HANDLED) {
+			g_error_free (priv->error);
+			priv->error = NULL;
+		}
+
+		brasero_volume_operation_end (self);
+	}
+	else if (!priv->result)
+		brasero_volume_operation_end (self);
 }
 
 gboolean
@@ -350,30 +398,46 @@
 		      gboolean wait,
 		      GError **error)
 {
-	GDrive *drive;
+	GDrive *gdrive;
 	gboolean result;
 	GVolume *volume;
 	BraseroVolumePrivate *priv;
 
+	if (!self)
+		return TRUE;
+
 	priv = BRASERO_VOLUME_PRIVATE (self);
 
 	volume = brasero_volume_get_gvolume (self);
-	drive = g_volume_get_drive (volume);
+	gdrive = g_volume_get_drive (volume);
 	g_object_unref (volume);
 
-	if (!g_drive_can_eject (drive))
+	if (!g_drive_can_eject (gdrive)) {
+		g_object_unref (gdrive);
 		return FALSE;
+	}
 
 	if (wait) {
-		g_drive_eject (drive,
+		gulong eject_sig;
+		BraseroDrive *drive;
+
+		drive = brasero_medium_get_drive (BRASERO_MEDIUM (self));
+		eject_sig = g_signal_connect (drive,
+					      "medium-removed",
+					      G_CALLBACK (brasero_volume_ejected_cb),
+					      self);
+
+		g_drive_eject (gdrive,
 			       G_MOUNT_UNMOUNT_NONE,
 			       priv->cancel,
 			       brasero_volume_eject_finish,
 			       self);
 		result = brasero_volume_wait_for_operation_end (self, error);
+
+		g_signal_handler_disconnect (drive, eject_sig);
 	}
 	else {
-		g_drive_eject (drive,
+		g_drive_eject (gdrive,
 			       G_MOUNT_UNMOUNT_NONE,
 			       priv->cancel,
 			       NULL,
@@ -381,6 +445,7 @@
 		result = TRUE;
 	}
 
+	g_object_unref (gdrive);
 	return result;
 }
 

Modified: trunk/src/burn.c
==============================================================================
--- trunk/src/burn.c	(original)
+++ trunk/src/burn.c	Wed Mar 12 21:46:44 2008
@@ -264,9 +264,7 @@
 		}
 	}
 
-	brasero_volume_eject (BRASERO_VOLUME (medium), TRUE, NULL);
-	medium = brasero_drive_get_medium (priv->dest);
-	if (medium && brasero_medium_get_status (medium) != BRASERO_MEDIUM_NONE) {
+	if (!brasero_volume_eject (BRASERO_VOLUME (medium), TRUE, NULL)) {
 		gchar *name;
 
 		name = brasero_drive_get_display_name (priv->dest);
@@ -953,7 +951,6 @@
 							  BRASERO_BURN_WARNING_CHECKSUM,
 							  BRASERO_MEDIUM_NONE,
 							  error);
-
 		if (result != BRASERO_BURN_OK)
 			return result;
 	}
@@ -1042,7 +1039,7 @@
 
 	priv->dest_locked = 0;
 	brasero_drive_unlock (priv->dest);
-	medium = brasero_drive_get_medium (priv->src);
+	medium = brasero_drive_get_medium (priv->dest);
 
 	if (BRASERO_BURN_SESSION_EJECT (priv->session))
 		brasero_volume_eject (BRASERO_VOLUME (medium), FALSE, NULL);
@@ -1623,7 +1620,9 @@
 	/* if the input is a DISC, ask/mount/unmount and lock it (as dest) */
 	medium = brasero_drive_get_medium (priv->dest);
 	if (type.type == BRASERO_TRACK_TYPE_DISC
-	&&  checksum_type == BRASERO_CHECKSUM_MD5_FILE
+	&& (checksum_type == BRASERO_CHECKSUM_MD5_FILE
+	||  checksum_type == BRASERO_CHECKSUM_SHA1_FILE
+	||  checksum_type == BRASERO_CHECKSUM_SHA256_FILE)
 	&& !brasero_volume_is_mounted (BRASERO_VOLUME (medium))) {
 		result = brasero_burn_mount_media (self, error);
 		if (result != BRASERO_BURN_OK)
@@ -1650,7 +1649,9 @@
 		/* make sure one last time it is not mounted IF and only IF the
 		 * checksum type is NOT FILE_MD5 */
 		if (priv->dest
-		&&  checksum_type == BRASERO_CHECKSUM_MD5
+		&& (checksum_type == BRASERO_CHECKSUM_MD5
+		||  checksum_type == BRASERO_CHECKSUM_SHA1
+		||  checksum_type == BRASERO_CHECKSUM_SHA256)
 		&&  brasero_volume_is_mounted (BRASERO_VOLUME (medium))
 		&& !brasero_volume_umount (BRASERO_VOLUME (medium), TRUE, NULL)) {
 			g_set_error (error,
@@ -1945,7 +1946,9 @@
 
 	priv->dest = NULL;
 
-	if (type == BRASERO_CHECKSUM_MD5) {
+	if (type == BRASERO_CHECKSUM_MD5
+	||  type == BRASERO_CHECKSUM_SHA1
+	||  type == BRASERO_CHECKSUM_SHA256) {
 		const gchar *checksum = NULL;
 
 		checksum = brasero_track_get_checksum (track);
@@ -1959,9 +1962,21 @@
 	else if (type == BRASERO_CHECKSUM_MD5_FILE) {
 		track = brasero_track_new (BRASERO_TRACK_TYPE_DISC);
 		brasero_track_set_checksum (track,
-					    BRASERO_CHECKSUM_MD5_FILE,
+					    type,
 					    BRASERO_MD5_FILE);
 	}
+	else if (type == BRASERO_CHECKSUM_SHA1_FILE) {
+		track = brasero_track_new (BRASERO_TRACK_TYPE_DISC);
+		brasero_track_set_checksum (track,
+					    type,
+					    BRASERO_SHA1_FILE);
+	}
+	else if (type == BRASERO_CHECKSUM_SHA256_FILE) {
+		track = brasero_track_new (BRASERO_TRACK_TYPE_DISC);
+		brasero_track_set_checksum (track,
+					    type,
+					    BRASERO_SHA256_FILE);
+	}
 
 	brasero_burn_session_push_tracks (priv->session);
 
@@ -1983,7 +1998,9 @@
 	if (result != BRASERO_BURN_OK)
 		return result;
 
-	if (type == BRASERO_CHECKSUM_MD5) {
+	if (type == BRASERO_CHECKSUM_MD5
+	||  type == BRASERO_CHECKSUM_SHA1
+	||  type == BRASERO_CHECKSUM_SHA256) {
 		guint track_num;
 		BraseroDrive *drive;
 		BraseroMedium *medium;

Modified: trunk/src/plugins/checksum/Makefile.am
==============================================================================
--- trunk/src/plugins/checksum/Makefile.am	(original)
+++ trunk/src/plugins/checksum/Makefile.am	Wed Mar 12 21:46:44 2008
@@ -24,9 +24,7 @@
 md5sumdir = $(libdir)/brasero/plugins
 md5sum_LTLIBRARIES = libbrasero-md5sum.la
 libbrasero_md5sum_la_SOURCES = burn-md5sum.c	\
-			       burn-md5sum.h	\
-			       burn-md5.c 	\
-			       burn-md5.h
+			       burn-md5sum.h
 
 libbrasero_md5sum_la_LDFLAGS = -module -avoid-version
 libbrasero_md5sum_la_LIBADD = $(BRASERO_BASE_LIBS)
@@ -34,9 +32,7 @@
 md5sumfiledir = $(libdir)/brasero/plugins
 md5sumfile_LTLIBRARIES = libbrasero-md5sum-file.la
 libbrasero_md5sum_file_la_SOURCES = burn-md5sum-file.c	\
-				    burn-md5sum-file.h	\
-				    burn-md5.c 		\
-				    burn-md5.h
+				    burn-md5sum-file.h	
 
 libbrasero_md5sum_file_la_LDFLAGS = -module -avoid-version
 libbrasero_md5sum_file_la_LIBADD = $(BRASERO_BASE_LIBS)

Modified: trunk/src/plugins/checksum/burn-md5sum-file.c
==============================================================================
--- trunk/src/plugins/checksum/burn-md5sum-file.c	(original)
+++ trunk/src/plugins/checksum/burn-md5sum-file.c	Wed Mar 12 21:46:44 2008
@@ -39,9 +39,10 @@
 
 #include <gmodule.h>
 
+#include <gconf/gconf-client.h>
+
 #include "burn-plugin.h"
 #include "burn-job.h"
-#include "burn-md5.h"
 #include "burn-md5sum-file.h"
 #include "burn-volume.h"
 #include "burn-drive.h"
@@ -50,11 +51,10 @@
 BRASERO_PLUGIN_BOILERPLATE (BraseroMd5sumFile, brasero_md5sum_file, BRASERO_TYPE_JOB, BraseroJob);
 
 struct _BraseroMd5sumFilePrivate {
-	BraseroMD5Ctx *ctx;
-	BraseroMD5 md5;
-
 	/* the path to read from when we check */
 	gchar *sums_path;
+	BraseroChecksumType checksum_type;
+
 	gint64 file_num;
 
 	/* the FILE to write to when we generate */
@@ -70,35 +70,95 @@
 
 #define BRASERO_MD5SUM_FILE_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_MD5SUM_FILE, BraseroMd5sumFilePrivate))
 
+#define BLOCK_SIZE			64
+#define GCONF_KEY_CHECKSUM_TYPE		"/apps/brasero/config/checksum_files"
+
 static BraseroJobClass *parent_class = NULL;
 
 static BraseroBurnResult
-brasero_md5sum_file_start_md5 (BraseroMd5sumFile *self,
-			       const gchar *path,
-			       const gchar *graft_path,
-			       GError **error)
+brasero_md5sum_file_get_file_checksum (BraseroMd5sumFile *self,
+				       GChecksumType type,
+				       const gchar *path,
+				       gchar **checksum_string,
+				       GError **error)
+{
+	BraseroMd5sumFilePrivate *priv;
+	guchar buffer [BLOCK_SIZE];
+	GChecksum *checksum;
+	gint read_bytes;
+	FILE *file;
+
+	priv = BRASERO_MD5SUM_FILE_PRIVATE (self);
+
+	file = fopen (path, "r");
+	if (!file) {
+		gchar *name = NULL;
+
+		/* If the file doesn't exist carry on with next */
+		if (errno == ENOENT)
+			return BRASERO_BURN_RETRY;
+
+		name = g_path_get_basename (path);
+
+		g_set_error (error,
+			     BRASERO_BURN_ERROR,
+			     BRASERO_BURN_ERROR_GENERAL,
+			     _("the file %s couldn't be read (%s)"),
+			     name,
+			     strerror (errno));
+		g_free (name);
+
+		return BRASERO_BURN_ERR;
+	}
+
+	checksum = g_checksum_new (type);
+
+	read_bytes = fread (buffer, 1, BLOCK_SIZE, file);
+	g_checksum_update (checksum, buffer, read_bytes);
+
+	while (read_bytes == BLOCK_SIZE) {
+		if (priv->cancel)
+			return BRASERO_BURN_CANCEL;
+
+		read_bytes = fread (buffer, 1, BLOCK_SIZE, file);
+		g_checksum_update (checksum, buffer, read_bytes);
+	}
+
+	*checksum_string = g_strdup (g_checksum_get_string (checksum));
+	g_checksum_free (checksum);
+	fclose (file);
+
+	return BRASERO_BURN_OK;
+}
+
+static BraseroBurnResult
+brasero_md5sum_file_add_file_checksum (BraseroMd5sumFile *self,
+				       const gchar *path,
+				       GChecksumType checksum_type,
+				       const gchar *graft_path,
+				       GError **error)
 {
 	BraseroBurnResult result = BRASERO_BURN_OK;
-	gchar md5_checksum [MD5_STRING_LEN + 1];
 	BraseroMd5sumFilePrivate *priv;
+	gchar *checksum_string = NULL;
 	gint written;
 
 	priv = BRASERO_MD5SUM_FILE_PRIVATE (self);
 
 	/* write to the file */
-	result = brasero_md5_file_to_string (priv->ctx,
-					     path,
-					     md5_checksum,
-					     0,
-					     -1,
-					     error);
+	result = brasero_md5sum_file_get_file_checksum (self,
+							checksum_type,
+							path,
+							&checksum_string,
+							error);
 	if (result != BRASERO_BURN_OK)
-		return result;
+		return BRASERO_BURN_ERR;
 
-	written = fwrite (md5_checksum,
-			  strlen (md5_checksum),
+	written = fwrite (checksum_string,
+			  strlen (checksum_string),
 			  1,
 			  priv->file);
+	g_free (checksum_string);
 
 	if (written != 1) {
 		g_set_error (error,
@@ -142,11 +202,12 @@
 
 static BraseroBurnResult
 brasero_md5sum_file_explore_directory (BraseroMd5sumFile *self,
-				  gint64 file_nb,
-				  const gchar *directory,
-				  const gchar *disc_path,
-				  GHashTable *excludedH,
-				  GError **error)
+				       GChecksumType checksum_type,
+				       gint64 file_nb,
+				       const gchar *directory,
+				       const gchar *disc_path,
+				       GHashTable *excludedH,
+				       GError **error)
 {
 	BraseroBurnResult result = BRASERO_BURN_OK;
 	BraseroMd5sumFilePrivate *priv;
@@ -177,11 +238,12 @@
 		graft_path = g_build_path (G_DIR_SEPARATOR_S, disc_path, name, NULL);
 		if (g_file_test (path, G_FILE_TEST_IS_DIR)) {
 			result = brasero_md5sum_file_explore_directory (self,
-								   file_nb,
-								   path,
-								   graft_path,
-								   excludedH,
-								   error);
+									checksum_type,
+									file_nb,
+									path,
+									graft_path,
+									excludedH,
+									error);
 			g_free (path);
 			g_free (graft_path);
 
@@ -191,10 +253,11 @@
 			continue;
 		}
 
-		result = brasero_md5sum_file_start_md5 (self,
-						   path,
-						   graft_path,
-						   error);
+		result = brasero_md5sum_file_add_file_checksum (self,
+								path,
+								checksum_type,
+								graft_path,
+								error);
 		g_free (graft_path);
 		g_free (path);
 
@@ -216,22 +279,65 @@
 }
 
 static BraseroBurnResult
-brasero_md5sum_file_grafts (BraseroMd5sumFile *self, GError **error)
+brasero_md5sum_file_create_checksum (BraseroMd5sumFile *self,
+				     GError **error)
 {
 	GSList *iter;
 	gint64 file_nb;
 	BraseroTrack *track;
+	GConfClient *client;
 	GHashTable *excludedH;
+	GChecksumType gchecksum_type;
 	BraseroMd5sumFilePrivate *priv;
+	BraseroChecksumType checksum_type;
 	BraseroBurnResult result = BRASERO_BURN_OK;
 
 	priv = BRASERO_MD5SUM_FILE_PRIVATE (self);
 
+	/* get the checksum type */
+	client = gconf_client_get_default ();
+	checksum_type = gconf_client_get_int (client, GCONF_KEY_CHECKSUM_TYPE, NULL);
+	g_object_unref (client);
+
+	if (checksum_type == BRASERO_CHECKSUM_NONE)
+		gchecksum_type = G_CHECKSUM_MD5;
+	else if (checksum_type & BRASERO_CHECKSUM_MD5_FILE)
+		gchecksum_type = G_CHECKSUM_MD5;
+	else if (checksum_type & BRASERO_CHECKSUM_SHA1_FILE)
+		gchecksum_type = G_CHECKSUM_SHA1;
+	else if (checksum_type & BRASERO_CHECKSUM_SHA256_FILE)
+		gchecksum_type = G_CHECKSUM_SHA256;
+	else
+		gchecksum_type = G_CHECKSUM_MD5;
+
 	/* opens a file for the sums */
-	result = brasero_job_get_tmp_file (BRASERO_JOB (self),
-					   ".md5",
-					   &priv->sums_path,
-					   error);
+	switch (gchecksum_type) {
+	case G_CHECKSUM_MD5:
+		priv->checksum_type = BRASERO_CHECKSUM_MD5_FILE;
+		result = brasero_job_get_tmp_file (BRASERO_JOB (self),
+						   ".md5",
+						   &priv->sums_path,
+						   error);
+		break;
+	case G_CHECKSUM_SHA1:
+		priv->checksum_type = BRASERO_CHECKSUM_SHA1_FILE;
+		result = brasero_job_get_tmp_file (BRASERO_JOB (self),
+						   ".sha1",
+						   &priv->sums_path,
+						   error);
+		break;
+	case G_CHECKSUM_SHA256:
+		priv->checksum_type = BRASERO_CHECKSUM_SHA256_FILE;
+		result = brasero_job_get_tmp_file (BRASERO_JOB (self),
+						   ".sha256",
+						   &priv->sums_path,
+						   error);
+		break;
+	default:
+		result = BRASERO_BURN_CANCEL;
+		break;
+	}
+
 	if (result != BRASERO_BURN_OK)
 		return result;
 
@@ -264,8 +370,6 @@
 			g_hash_table_insert (excludedH, path, path);
 	}
 
-	priv->ctx = brasero_md5_new ();
-
 	/* it's now time to start reporting our progress */
 	brasero_job_set_current_action (BRASERO_JOB (self),
 				        BRASERO_BURN_ACTION_CHECKSUM,
@@ -296,23 +400,25 @@
 		if (!graft->uri)
 			continue;
 
-		/* get the current and futures paths */
+		/* get the current and future paths */
 		uri = graft->uri;
 		path = g_filename_from_uri (uri, NULL, NULL);
 		graft_path = graft->path;
 
 		if (g_file_test (path, G_FILE_TEST_IS_DIR))
 			result = brasero_md5sum_file_explore_directory (self,
-								   file_nb,
-								   path,
-								   graft_path,
-								   excludedH,
-								   error);
+									gchecksum_type,
+									file_nb,
+									path,
+									graft_path,
+									excludedH,
+									error);
 		else {
-			result = brasero_md5sum_file_start_md5 (self,
-							   path,
-							   graft_path,
-							   error);
+			result = brasero_md5sum_file_add_file_checksum (self,
+									path,
+									gchecksum_type,
+									graft_path,
+									error);
 			priv->file_num ++;
 			brasero_job_set_progress (BRASERO_JOB (self),
 						  (gdouble) priv->file_num /
@@ -324,9 +430,6 @@
 			break;
 	}
 
-	brasero_md5_free (priv->ctx);
-	priv->ctx = NULL;
-
 	g_hash_table_destroy (excludedH);
 
 	/* that's finished we close the file */
@@ -338,8 +441,8 @@
 
 static gint
 brasero_md5sum_file_get_line_num (BraseroMd5sumFile *self,
-			     FILE *file,
-			     GError **error)
+				  FILE *file,
+				  GError **error)
 {
 	gint c;
 	gint num = 0;
@@ -362,7 +465,9 @@
 }
 
 static BraseroBurnResult
-brasero_md5sum_file_disc_files (BraseroMd5sumFile *self, GError **error)
+brasero_md5sum_file_check_files (BraseroMd5sumFile *self,
+				 BraseroChecksumType checksum_type,
+				 GError **error)
 {
 	gchar *root;
 	gchar *path;
@@ -371,9 +476,11 @@
 	guint file_num;
 	FILE *file = NULL;
 	const gchar *name;
+	gint checksum_len;
 	BraseroTrack *track;
-	gboolean has_wrongsums;
 	BraseroMedium *medium;
+	gboolean has_wrongsums;
+	GChecksumType gchecksum_type;
 	BraseroMd5sumFilePrivate *priv;
 	gchar filename [MAXPATHLEN + 1];
 	BraseroBurnResult result = BRASERO_BURN_OK;
@@ -418,10 +525,27 @@
 	}
 
 	file_num = 0;
-	priv->ctx = brasero_md5_new ();
+
+	/* Get the checksum type */
+	switch (checksum_type) {
+	case BRASERO_CHECKSUM_MD5_FILE:
+		gchecksum_type = G_CHECKSUM_MD5;
+		break;
+	case BRASERO_CHECKSUM_SHA1_FILE:
+		gchecksum_type = G_CHECKSUM_SHA1;
+		break;
+	case BRASERO_CHECKSUM_SHA256_FILE:
+		gchecksum_type = G_CHECKSUM_SHA256;
+		break;
+	default:
+		gchecksum_type = G_CHECKSUM_MD5;
+		break;
+	}
+
+	checksum_len = g_checksum_type_get_length (gchecksum_type) * 2;
 	while (1) {
-		gchar checksum_file [MD5_STRING_LEN + 1];
-		gchar checksum_real [MD5_STRING_LEN + 1];
+		gchar checksum_file [512];
+		gchar *checksum_real;
 		gint i;
 		int c;
 
@@ -429,7 +553,7 @@
 			break;
 
 		/* first read the checksum string */
-		if (fread (checksum_file, 1, MD5_STRING_LEN, file) != MD5_STRING_LEN) {
+		if (fread (checksum_file, 1, checksum_len, file) != checksum_len) {
 			if (!feof (file))
 				g_set_error (error,
 					     BRASERO_BURN_ERROR,
@@ -437,8 +561,8 @@
 					     strerror (errno));
 			break;
 		}
+		checksum_file [checksum_len] = '\0';
 
-		checksum_file [MD5_STRING_LEN] = '\0';
 		if (priv->cancel)
 			break;
 
@@ -497,28 +621,30 @@
 		}
 
 		filename [i] = 0;
-		result = brasero_md5_file_to_string (priv->ctx,
-						     filename,
-						     checksum_real,
-						     0,
-						     -1,
-						     error);
+		checksum_real = NULL;
+		result = brasero_md5sum_file_get_file_checksum (self,
+								gchecksum_type,
+								filename,
+								&checksum_real,
+								error);
 		if (result == BRASERO_BURN_RETRY)
-			checksum_real [0] = '\0';
-		else if (result != BRASERO_BURN_OK)
+			continue;
+
+		if (result != BRASERO_BURN_OK)
 			break;
 
 		file_num++;
 		brasero_job_set_progress (BRASERO_JOB (self), (gdouble) file_num / (gdouble) file_nb);
-
 		BRASERO_JOB_LOG (self,
 				 "comparing checksums for file %s : %s (from md5 file) / %s (current)",
 				 filename, checksum_file, checksum_real);
+
 		if (strcmp (checksum_file, checksum_real)) {
 			has_wrongsums = TRUE;
 			brasero_job_add_wrong_checksum (BRASERO_JOB (self), filename);
 		}
 
+		g_free (checksum_real);
 		if (priv->cancel)
 			break;
 	}
@@ -527,11 +653,6 @@
 	if (file)
 		fclose (file);
 
-	if (priv->ctx) {
-		brasero_md5_free (priv->ctx);
-		priv->ctx = NULL;
-	}
-
 	if (result != BRASERO_BURN_OK)
 		return result;
 
@@ -556,14 +677,12 @@
 static gboolean
 brasero_md5sum_file_end (gpointer data)
 {
-	BraseroMd5sumFile *self;
 	BraseroTrack *track;
 	BraseroTrackType input;
+	BraseroMd5sumFile *self;
 	BraseroJobAction action;
-	BraseroBurnResult result;
 	BraseroMd5sumFilePrivate *priv;
 	BraseroMd5sumFileThreadCtx *ctx;
-	gchar checksum [MD5_STRING_LEN + 1];
 
 	ctx = data;
 	self = ctx->sum;
@@ -584,37 +703,7 @@
 
 	brasero_job_get_action (BRASERO_JOB (self), &action);
 	if (action == BRASERO_JOB_ACTION_CHECKSUM) {
-		BraseroChecksumType type;
-
-		/* we were asked to check the sum of the track so get the type
-		 * of the checksum first to see what to do */
-		track = NULL;
-		brasero_job_get_current_track (BRASERO_JOB (self), &track);
-		type = brasero_track_get_checksum_type (track);
-
-		if (type == BRASERO_CHECKSUM_MD5_FILE) {
-			/* in this case all was already set in session */
-			brasero_job_finished_track (BRASERO_JOB (self));
-			return FALSE;
-		}
-
-		/* DISC checking. Set the checksum for the track and at the same
-		 * time compare it to a potential one */
-		brasero_md5_string (&priv->md5, checksum);
-		checksum [MD5_STRING_LEN] = '\0';
-
-		BRASERO_JOB_LOG (self,
-				 "setting new checksum (type = %i) %s (%s before)",
-				 type,
-				 checksum,
-				 brasero_track_get_checksum (track));
-
-		result = brasero_track_set_checksum (track,
-						     BRASERO_CHECKSUM_MD5,
-						     checksum);
-		if (result != BRASERO_BURN_OK)
-			goto error;
-
+		/* everything was done in thread */
 		brasero_job_finished_track (BRASERO_JOB (self));
 		return FALSE;
 	}
@@ -643,7 +732,18 @@
 
 		graft = g_new0 (BraseroGraftPt, 1);
 		graft->uri = g_strconcat ("file://", priv->sums_path, NULL);
-		graft->path = g_strdup ("/"BRASERO_CHECKSUM_FILE);
+		switch (priv->checksum_type) {
+		case BRASERO_CHECKSUM_SHA1_FILE:
+			graft->path = g_strdup ("/"BRASERO_SHA1_FILE);
+			break;
+		case BRASERO_CHECKSUM_SHA256_FILE:
+			graft->path = g_strdup ("/"BRASERO_SHA256_FILE);
+			break;
+		case BRASERO_CHECKSUM_MD5_FILE:
+		default:
+			graft->path = g_strdup ("/"BRASERO_MD5_FILE);
+			break;
+		}
 		new_grafts = g_slist_prepend (new_grafts, graft);
 
 		track = brasero_track_new (BRASERO_TRACK_TYPE_DATA);
@@ -653,7 +753,7 @@
 		brasero_track_set_data_source (track, new_grafts, excluded);
 
 		brasero_track_set_checksum (track,
-					    BRASERO_CHECKSUM_MD5_FILE,
+					    priv->checksum_type,
 					    graft->uri);
 
 		brasero_job_add_track (BRASERO_JOB (self), track);
@@ -665,26 +765,6 @@
 		brasero_job_finished_track (BRASERO_JOB (self));
 		return FALSE;
 	}
-	else if (input.type == BRASERO_TRACK_TYPE_IMAGE) {
-		track = NULL;
-		brasero_job_get_current_track (BRASERO_JOB (self), &track);
-
-		brasero_md5_string (&priv->md5, checksum);
-		checksum [MD5_STRING_LEN] = '\0';
-
-		BRASERO_JOB_LOG (self,
-				 "setting new checksum %s (%s before)",
-				 checksum,
-				 brasero_track_get_checksum (track));
-
-		result = brasero_track_set_checksum (track,
-						     BRASERO_CHECKSUM_MD5,
-						     checksum);
-		if (result != BRASERO_BURN_OK)
-			goto error;
-
-		brasero_job_finished_track (BRASERO_JOB (self));
-	}
 	else
 		goto error;
 
@@ -738,8 +818,8 @@
 
 		brasero_job_get_current_track (BRASERO_JOB (self), &track);
 		type = brasero_track_get_checksum_type (track);
-		if (type == BRASERO_CHECKSUM_MD5_FILE)
-			result = brasero_md5sum_file_disc_files (self, &error);
+		if (type & (BRASERO_CHECKSUM_MD5_FILE|BRASERO_CHECKSUM_SHA1_FILE|BRASERO_CHECKSUM_SHA256))
+			result = brasero_md5sum_file_check_files (self, type, &error);
 		else
 			result = BRASERO_BURN_ERR;
 	}
@@ -748,7 +828,7 @@
 
 		brasero_job_get_input_type (BRASERO_JOB (self), &type);
 		if (type.type == BRASERO_TRACK_TYPE_DATA)
-			result = brasero_md5sum_file_grafts (self, &error);
+			result = brasero_md5sum_file_create_checksum (self, &error);
 		else
 			result = BRASERO_BURN_ERR;
 	}
@@ -813,9 +893,14 @@
 		BraseroGraftPt *graft;
 
 		graft = grafts->data;
-		if (graft->path 
-		&& !strcmp (graft->path, "/"BRASERO_CHECKSUM_FILE))
-			return BRASERO_BURN_NOT_RUNNING;
+		if (graft->path) {
+			if (!strcmp (graft->path, "/"BRASERO_MD5_FILE))
+				return BRASERO_BURN_NOT_RUNNING;
+			if (!strcmp (graft->path, "/"BRASERO_SHA1_FILE))
+				return BRASERO_BURN_NOT_RUNNING;
+			if (!strcmp (graft->path, "/"BRASERO_SHA256_FILE))
+				return BRASERO_BURN_NOT_RUNNING;
+		}
 	}
 
 	return BRASERO_BURN_OK;
@@ -827,8 +912,6 @@
 	BraseroMd5sumFilePrivate *priv;
 
 	priv = BRASERO_MD5SUM_FILE_PRIVATE (job);
-	if (!priv->ctx)
-		return BRASERO_BURN_OK;
 
 	/* we'll need that function later. For the moment, when generating a
 	 * file we can't know how many files there are. Just when checking it */
@@ -844,9 +927,6 @@
 
 	priv = BRASERO_MD5SUM_FILE_PRIVATE (job);
 
-	if (priv->ctx)
-		brasero_md5_cancel (priv->ctx);
-
 	if (priv->thread) {
 		priv->cancel = 1;
 		g_thread_join (priv->thread);
@@ -924,6 +1004,7 @@
 brasero_md5sum_file_export_caps (BraseroPlugin *plugin, gchar **error)
 {
 	GSList *input;
+	BraseroPluginConfOption *checksum_type;
 
 	brasero_plugin_define (plugin,
 			       "md5sum-file",
@@ -956,9 +1037,24 @@
 				       BRASERO_MEDIUM_APPENDABLE|
 				       BRASERO_MEDIUM_HAS_DATA);
 	brasero_plugin_check_caps (plugin,
-				   BRASERO_CHECKSUM_MD5_FILE,
+				   BRASERO_CHECKSUM_MD5_FILE|
+				   BRASERO_CHECKSUM_SHA1_FILE|
+				   BRASERO_CHECKSUM_SHA256_FILE,
 				   input);
 	g_slist_free (input);
 
+	/* add some configure options */
+	checksum_type = brasero_plugin_conf_option_new (GCONF_KEY_CHECKSUM_TYPE,
+							_("Hashing algorithm to be used:"),
+							BRASERO_PLUGIN_OPTION_CHOICE);
+	brasero_plugin_conf_option_choice_add (checksum_type,
+					       _("MD5"), BRASERO_CHECKSUM_MD5_FILE);
+	brasero_plugin_conf_option_choice_add (checksum_type,
+					       _("SHA1"), BRASERO_CHECKSUM_SHA1_FILE);
+	brasero_plugin_conf_option_choice_add (checksum_type,
+					       _("SHA256"), BRASERO_CHECKSUM_SHA256_FILE);
+
+	brasero_plugin_add_conf_option (plugin, checksum_type);
+
 	return BRASERO_BURN_OK;
 }

Modified: trunk/src/plugins/checksum/burn-md5sum-file.h
==============================================================================
--- trunk/src/plugins/checksum/burn-md5sum-file.h	(original)
+++ trunk/src/plugins/checksum/burn-md5sum-file.h	Wed Mar 12 21:46:44 2008
@@ -37,8 +37,6 @@
 #define BRASERO_IS_MD5SUM_FILE_CLASS(k)		(G_TYPE_CHECK_CLASS_TYPE ((k), BRASERO_TYPE_MD5SUM_FILE))
 #define BRASERO_MD5SUM_FILE_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), BRASERO_TYPE_MD5SUM_FILE, BraseroMd5sumFileClass))
 
-#define BRASERO_CHECKSUM_FILE	".checksum.md5"
-
 G_END_DECLS
 
 #endif /* BURN_SUM_FILE_H */

Modified: trunk/src/plugins/checksum/burn-md5sum.c
==============================================================================
--- trunk/src/plugins/checksum/burn-md5sum.c	(original)
+++ trunk/src/plugins/checksum/burn-md5sum.c	Wed Mar 12 21:46:44 2008
@@ -32,6 +32,7 @@
 #include <ctype.h>
 #include <sys/param.h>
 #include <unistd.h>
+#include <fcntl.h>
 
 #include <glib.h>
 #include <glib-object.h>
@@ -40,9 +41,10 @@
 
 #include <gmodule.h>
 
+#include <gconf/gconf-client.h>
+
 #include "burn-plugin.h"
 #include "burn-job.h"
-#include "burn-md5.h"
 #include "burn-md5sum.h"
 #include "burn-volume.h"
 #include "burn-drive.h"
@@ -50,12 +52,12 @@
 BRASERO_PLUGIN_BOILERPLATE (BraseroMd5sum, brasero_md5sum, BRASERO_TYPE_JOB, BraseroJob);
 
 struct _BraseroMd5sumPrivate {
-	BraseroMD5Ctx *ctx;
-	BraseroMD5 md5;
+	GChecksum *checksum;
+	BraseroChecksumType checksum_type;
 
-	/* the path and fd for the file containing the md5 of files */
-	gchar *sums_path;
+	/* That's for progress reporting */
 	gint64 total;
+	gint64 bytes;
 
 	/* this is for the thread and the end of it */
 	GThread *thread;
@@ -67,14 +69,16 @@
 
 #define BRASERO_MD5SUM_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_MD5SUM, BraseroMd5sumPrivate))
 
+#define GCONF_KEY_CHECKSUM_TYPE		"/apps/brasero/config/checksum_image"
+
 static BraseroJobClass *parent_class = NULL;
 
 static gint
-brasero_md5sum_live_read (BraseroMd5sum *self,
-			  int fd,
-			  guchar *buffer,
-			  gint bytes,
-			  GError **error)
+brasero_md5sum_read (BraseroMd5sum *self,
+		     int fd,
+		     guchar *buffer,
+		     gint bytes,
+		     GError **error)
 {
 	gint total = 0;
 	gint read_bytes;
@@ -118,11 +122,11 @@
 }
 
 static BraseroBurnResult
-brasero_md5sum_live_write (BraseroMd5sum *self,
-			   int fd,
-			   guchar *buffer,
-			   gint bytes,
-			   GError **error)
+brasero_md5sum_write (BraseroMd5sum *self,
+		      int fd,
+		      guchar *buffer,
+		      gint bytes,
+		      GError **error)
 {
 	gint bytes_remaining;
 	gint bytes_written = 0;
@@ -166,12 +170,12 @@
 }
 
 static BraseroBurnResult
-brasero_md5sum_live (BraseroMd5sum *self,
-		     GError **error)
+brasero_md5sum_checksum (BraseroMd5sum *self,
+			 GChecksumType checksum_type,
+			 int fd_in,
+			 int fd_out,
+			 GError **error)
 {
-	int fd_in = -1;
-	int fd_out = -1;
-	guint sum_bytes;
 	gint read_bytes;
 	guchar buffer [2048];
 	BraseroBurnResult result;
@@ -179,82 +183,87 @@
 
 	priv = BRASERO_MD5SUM_PRIVATE (self);
 
-	BRASERO_JOB_LOG (self, "starting md5 generation live");
-	result = brasero_job_set_nonblocking (BRASERO_JOB (self), error);
-	if (result != BRASERO_BURN_OK)
-		return result;
-
-	brasero_job_get_fd_in (BRASERO_JOB (self), &fd_in);
-	brasero_job_get_fd_out (BRASERO_JOB (self), &fd_out);
-
-	priv->ctx = brasero_md5_new ();
-	brasero_md5_init (priv->ctx, &priv->md5);
-
+	priv->checksum = g_checksum_new (checksum_type);
 	result = BRASERO_BURN_OK;
 	while (1) {
-		sum_bytes = 0;
-
-		read_bytes = brasero_md5sum_live_read (self,
-						       fd_in,
-						       buffer,
-						       sizeof (buffer),
-						       error);
-		if (read_bytes == -2) {
-			result = BRASERO_BURN_CANCEL;
-			goto end;
-		}
+		read_bytes = brasero_md5sum_read (self,
+						  fd_in,
+						  buffer,
+						  sizeof (buffer),
+						  error);
+		if (read_bytes == -2)
+			return BRASERO_BURN_CANCEL;
 
-		if (read_bytes == -1) {
-			result = BRASERO_BURN_ERR;
-			goto end;
-		}
+		if (read_bytes == -1)
+			return BRASERO_BURN_ERR;
 
 		if (!read_bytes)
 			break;
 
 		/* it can happen when we're just asked to generate a checksum
 		 * that we don't need to output the received data */
-		if (fd_out > 0
-		&&  brasero_md5sum_live_write (self, fd_out, buffer, read_bytes, error) != BRASERO_BURN_OK)
-			goto end;
-
-		sum_bytes = brasero_md5_sum (priv->ctx,
-					     &priv->md5,
-					     buffer,
-					     read_bytes);
-		if (sum_bytes == -1) {
-			result = BRASERO_BURN_CANCEL;
-			goto end;
+		if (fd_out > 0) {
+			result = brasero_md5sum_write (self,
+						       fd_out,
+						       buffer,
+						       read_bytes, error);
+			if (result != BRASERO_BURN_OK)
+				break;
 		}
 
-		/* this could be a problem, disc recording is more important */
-		if (sum_bytes)
-			break;
+		g_checksum_update (priv->checksum,
+				   buffer,
+				   read_bytes);
+
+		priv->bytes += read_bytes;
 	}
 
-	brasero_md5_end (priv->ctx, &priv->md5, buffer + (read_bytes - sum_bytes), sum_bytes);
+	return result;
+}
 
-end:
+static BraseroBurnResult
+brasero_md5sum_checksum_fd_input (BraseroMd5sum *self,
+				  GChecksumType checksum_type,
+				  GError **error)
+{
+	int fd_in = -1;
+	int fd_out = -1;
+	BraseroBurnResult result;
+	BraseroMd5sumPrivate *priv;
 
-	brasero_md5_free (priv->ctx);
-	priv->ctx = NULL;
+	priv = BRASERO_MD5SUM_PRIVATE (self);
 
-	return result;
+	BRASERO_JOB_LOG (self, "Starting md5 generation live (size = %i)", priv->total);
+	result = brasero_job_set_nonblocking (BRASERO_JOB (self), error);
+	if (result != BRASERO_BURN_OK)
+		return result;
+
+	brasero_job_get_fd_in (BRASERO_JOB (self), &fd_in);
+	brasero_job_get_fd_out (BRASERO_JOB (self), &fd_out);
+
+	return brasero_md5sum_checksum (self, checksum_type, fd_in, fd_out, error);
 }
 
 static BraseroBurnResult
-brasero_md5sum_image_live (BraseroMd5sum *self, GError **error)
+brasero_md5sum_checksum_file_input (BraseroMd5sum *self,
+				    GChecksumType checksum_type,
+				    GError **error)
 {
 	BraseroMd5sumPrivate *priv;
 	BraseroBurnResult result;
 	BraseroTrack *track;
+	int fd_out = -1;
+	int fd_in = -1;
 	gchar *path;
 
 	priv = BRASERO_MD5SUM_PRIVATE (self);
 
-	if (brasero_job_get_fd_in (BRASERO_JOB (self), NULL) == BRASERO_BURN_OK)
-		return brasero_md5sum_live (self, error);
+	BRASERO_JOB_LOG (self,
+			 "Starting checksuming file %s (size = %i)",
+			 path,
+			 priv->total);
 
+	/* get all information */
 	brasero_job_get_current_track (BRASERO_JOB (self), &track);
 	path = brasero_track_get_image_source (track, FALSE);
 	if (!path) {
@@ -265,40 +274,67 @@
 		return BRASERO_BURN_ERR;
 	}
 
-	result = brasero_track_get_image_size (track, NULL, NULL, &priv->total, error);
-	if (result != BRASERO_BURN_OK)
-		return result;
+	fd_in = open (path, O_RDONLY);
+	if (!fd_in) {
+		gchar *name = NULL;
 
-	brasero_job_set_current_action (BRASERO_JOB (self),
-					BRASERO_BURN_ACTION_CHECKSUM,
-					_("Creating image checksum"),
-					FALSE);
+		if (errno == ENOENT)
+			return BRASERO_BURN_RETRY;
 
-	brasero_job_start_progress (BRASERO_JOB (self), FALSE);
+		name = g_path_get_basename (path);
+
+		g_set_error (error,
+			     BRASERO_BURN_ERROR,
+			     BRASERO_BURN_ERROR_GENERAL,
+			     _("the file %s couldn't be read (%s)"),
+			     name,
+			     strerror (errno));
+		g_free (name);
+		g_free (path);
 
-	priv->ctx = brasero_md5_new ();
-	result = brasero_md5_file (priv->ctx,
-				   path,
-				   &priv->md5,
-				   0,
-				   -1,
-				   error);
+		return BRASERO_BURN_ERR;
+	}
+
+	/* and here we go */
+	brasero_job_get_fd_out (BRASERO_JOB (self), &fd_out);
+	result = brasero_md5sum_checksum (self, checksum_type, fd_in, fd_out, error);
 	g_free (path);
-	brasero_md5_free (priv->ctx);
-	priv->ctx = NULL;
+	close (fd_in);
 
 	return result;
 }
 
 static BraseroBurnResult
-brasero_md5sum_image (BraseroMd5sum *self, GError **error)
+brasero_md5sum_create_checksum (BraseroMd5sum *self,
+				GError **error)
 {
-	gchar *path;
-	BraseroTrack *track;
 	BraseroBurnResult result;
 	BraseroMd5sumPrivate *priv;
+	BraseroTrack *track = NULL;
+	GChecksumType checksum_type;
 
 	priv = BRASERO_MD5SUM_PRIVATE (self);
+
+	/* get the checksum type */
+	switch (priv->checksum_type) {
+		case BRASERO_CHECKSUM_MD5:
+			checksum_type = G_CHECKSUM_MD5;
+			break;
+		case BRASERO_CHECKSUM_SHA1:
+			checksum_type = G_CHECKSUM_SHA1;
+			break;
+		case BRASERO_CHECKSUM_SHA256:
+			checksum_type = G_CHECKSUM_SHA256;
+			break;
+		default:
+			return BRASERO_BURN_ERR;
+	}
+
+	brasero_job_set_current_action (BRASERO_JOB (self),
+					BRASERO_BURN_ACTION_CHECKSUM,
+					_("Creating image checksum"),
+					FALSE);
+	brasero_job_start_progress (BRASERO_JOB (self), FALSE);
 	brasero_job_get_current_track (BRASERO_JOB (self), &track);
 
 	/* see if another plugin is sending us data to checksum */
@@ -308,54 +344,56 @@
 		/* we're only able to checksum ISO format at the moment so that
 		 * means we can only handle last session */
 		medium = brasero_track_get_medium_source (track);
-		brasero_medium_get_last_data_track_space (medium, &priv->total, NULL);
+		brasero_medium_get_last_data_track_space (medium,
+							  &priv->total,
+							  NULL);
+
+		return brasero_md5sum_checksum_fd_input (self, checksum_type, error);
+	}
+	else {
+		result = brasero_track_get_image_size (track,
+						       NULL,
+						       NULL,
+						       &priv->total,
+						       error);
+		if (result != BRASERO_BURN_OK)
+			return result;
 
-		BRASERO_JOB_LOG (self,
-				 "Starting checksuming (live) (size = %i)",
-				 priv->total);
-
-		brasero_job_set_current_action (BRASERO_JOB (self),
-						BRASERO_BURN_ACTION_CHECKSUM,
-						_("Creating local image checksum"),
-						FALSE);
-		brasero_job_start_progress (BRASERO_JOB (self), FALSE);
-
-		return brasero_md5sum_live (self, error);
-	}
-
-	/* get all needed information about the image */
-	result = brasero_track_get_image_size (track,
-					       NULL,
-					       NULL,
-					       &priv->total,
-					       error);
-	if (result != BRASERO_BURN_OK)
-		return result;
+		return brasero_md5sum_checksum_file_input (self, checksum_type, error);
+	}
 
-	path = brasero_track_get_image_source (track, FALSE);
+	return BRASERO_BURN_OK;
+}
 
-	/* simply open the file, read and checksum */
-	BRASERO_JOB_LOG (self,
-			 "Starting checksuming %s (size = %i)",
-			 path,
-			 priv->total);
+static BraseroBurnResult
+brasero_md5sum_image_and_checksum (BraseroMd5sum *self,
+				   GError **error)
+{
+	GConfClient *client;
+	BraseroBurnResult result;
+	GChecksumType checksum_type;
+	BraseroMd5sumPrivate *priv;
 
-	brasero_job_set_current_action (BRASERO_JOB (self),
-					BRASERO_BURN_ACTION_CHECKSUM,
-					_("Creating local image checksum"),
-					FALSE);
-	brasero_job_start_progress (BRASERO_JOB (self), FALSE);
+	priv = BRASERO_MD5SUM_PRIVATE (self);
+	client = gconf_client_get_default ();
+	priv->checksum_type = gconf_client_get_int (client, GCONF_KEY_CHECKSUM_TYPE, NULL);
+	g_object_unref (client);
+
+	if (priv->checksum_type == BRASERO_CHECKSUM_NONE)
+		checksum_type = G_CHECKSUM_MD5;
+	else if (priv->checksum_type & BRASERO_CHECKSUM_MD5)
+		checksum_type = G_CHECKSUM_MD5;
+	else if (priv->checksum_type & BRASERO_CHECKSUM_SHA1)
+		checksum_type = G_CHECKSUM_SHA1;
+	else if (priv->checksum_type & BRASERO_CHECKSUM_SHA256)
+		checksum_type = G_CHECKSUM_SHA256;
+	else
+		checksum_type = G_CHECKSUM_MD5;
 
-	priv->ctx = brasero_md5_new ();
-	result = brasero_md5_file (priv->ctx,
-				   path,
-				   &priv->md5,
-				   0,
-				   priv->total,
-				   error);
-	brasero_md5_free (priv->ctx);
-	priv->ctx = NULL;
-	g_free (path);
+	if (brasero_job_get_fd_in (BRASERO_JOB (self), NULL) == BRASERO_BURN_OK)
+		result = brasero_md5sum_checksum_fd_input (self, checksum_type, error);
+	else
+		result = brasero_md5sum_checksum_file_input (self, checksum_type, error);
 
 	return result;
 }
@@ -372,12 +410,10 @@
 {
 	BraseroMd5sum *self;
 	BraseroTrack *track;
-	BraseroTrackType input;
-	BraseroJobAction action;
+	const gchar *checksum;
 	BraseroBurnResult result;
 	BraseroMd5sumPrivate *priv;
 	BraseroMd5sumThreadCtx *ctx;
-	gchar checksum [MD5_STRING_LEN + 1];
 
 	ctx = data;
 	self = ctx->sum;
@@ -392,116 +428,36 @@
 		error = ctx->error;
 		ctx->error = NULL;
 
-		brasero_job_error (BRASERO_JOB (self), error);
-		return FALSE;
-	}
-
-	brasero_job_get_action (BRASERO_JOB (self), &action);
-	if (action == BRASERO_JOB_ACTION_CHECKSUM) {
-		BraseroChecksumType type;
-
-		/* we were asked to check the sum of the track so get the type
-		 * of the checksum first to see what to do */
-		track = NULL;
-		brasero_job_get_current_track (BRASERO_JOB (self), &track);
-		type = brasero_track_get_checksum_type (track);
-
-		if (type == BRASERO_CHECKSUM_MD5_FILE) {
-			/* in this case all was already set in session */
-			brasero_job_finished_track (BRASERO_JOB (self));
-			return FALSE;
-		}
-
-		/* DISC checking. Set the checksum for the track and at the same
-		 * time compare it to a potential one */
-		brasero_md5_string (&priv->md5, checksum);
-		checksum [MD5_STRING_LEN] = '\0';
-
-		BRASERO_JOB_LOG (self,
-				 "setting new checksum (type = %i) %s (%s before)",
-				 type,
-				 checksum,
-				 brasero_track_get_checksum (track));
-
-		result = brasero_track_set_checksum (track,
-						     BRASERO_CHECKSUM_MD5,
-						     checksum);
-		if (result != BRASERO_BURN_OK)
-			goto error;
-
-		brasero_job_finished_track (BRASERO_JOB (self));
-		return FALSE;
-	}
-
-	/* we were asked to create a checksum. Its type depends on the input */
-	brasero_job_get_input_type (BRASERO_JOB (self), &input);
-
-	/* let's create a new DATA track with the md5 file created */
-	if (input.type == BRASERO_TRACK_TYPE_DATA) {
-		GSList *grafts;
-		GSList *excluded;
-		BraseroGraftPt *graft;
-		BraseroTrackType type;
-		GSList *new_grafts = NULL;
-
-		/* for DATA track we add the file to the track */
-		brasero_job_get_current_track (BRASERO_JOB (self), &track);
-		brasero_track_get_type (track, &type);
-		grafts = brasero_track_get_data_grafts_source (track);
-
-		for (; grafts; grafts = grafts->next) {
-			graft = grafts->data;
-			graft = brasero_graft_point_copy (graft);
-			new_grafts = g_slist_prepend (new_grafts, graft);
-		}
-
-		graft = g_new0 (BraseroGraftPt, 1);
-		graft->uri = g_strconcat ("file://", priv->sums_path, NULL);
-		graft->path = g_strdup ("/"BRASERO_CHECKSUM_FILE);
-		new_grafts = g_slist_prepend (new_grafts, graft);
-
-		track = brasero_track_new (BRASERO_TRACK_TYPE_DATA);
-		brasero_track_add_data_fs (track, type.subtype.fs_type);
-
-		excluded = brasero_track_get_data_excluded_source (track, TRUE);
-		brasero_track_set_data_source (track, new_grafts, excluded);
+		g_checksum_free (priv->checksum);
+		priv->checksum = NULL;
 
-		brasero_track_set_checksum (track,
-					    BRASERO_CHECKSUM_MD5_FILE,
-					    graft->uri);
-
-		brasero_job_add_track (BRASERO_JOB (self), track);
-
-		/* It's good practice to unref the track afterwards as we don't 
-		 * need it anymore. BraseroTaskCtx refs it. */
-		brasero_track_unref (track);
-
-		brasero_job_finished_track (BRASERO_JOB (self));
+		brasero_job_error (BRASERO_JOB (self), error);
 		return FALSE;
 	}
-	else if (input.type == BRASERO_TRACK_TYPE_IMAGE) {
-		track = NULL;
-		brasero_job_get_current_track (BRASERO_JOB (self), &track);
 
-		brasero_md5_string (&priv->md5, checksum);
-		checksum [MD5_STRING_LEN] = '\0';
+	/* we were asked to check the sum of the track so get the type
+	 * of the checksum first to see what to do */
+	track = NULL;
+	brasero_job_get_current_track (BRASERO_JOB (self), &track);
 
-		BRASERO_JOB_LOG (self,
-				 "setting new checksum %s (%s before)",
-				 checksum,
-				 brasero_track_get_checksum (track));
-
-		result = brasero_track_set_checksum (track,
-						     BRASERO_CHECKSUM_MD5,
-						     checksum);
-		if (result != BRASERO_BURN_OK)
-			goto error;
+	/* Set the checksum for the track and at the same time compare it to a
+	 * potential previous one. */
+	checksum = g_checksum_get_string (priv->checksum);
+	BRASERO_JOB_LOG (self,
+			 "setting new checksum (type = %i) %s (%s before)",
+			 priv->checksum_type,
+			 checksum,
+			 brasero_track_get_checksum (track));
+	result = brasero_track_set_checksum (track,
+					     priv->checksum_type,
+					     checksum);
+	g_checksum_free (priv->checksum);
+	priv->checksum = NULL;
 
-		brasero_job_finished_track (BRASERO_JOB (self));
-	}
-	else
+	if (result != BRASERO_BURN_OK)
 		goto error;
 
+	brasero_job_finished_track (BRASERO_JOB (self));
 	return FALSE;
 
 error:
@@ -547,13 +503,12 @@
 	brasero_job_get_action (BRASERO_JOB (self), &action);
 
 	if (action == BRASERO_JOB_ACTION_CHECKSUM) {
-		BraseroChecksumType type;
 		BraseroTrack *track;
 
 		brasero_job_get_current_track (BRASERO_JOB (self), &track);
-		type = brasero_track_get_checksum_type (track);
-		if (type == BRASERO_CHECKSUM_MD5)
-			result = brasero_md5sum_image (self, &error);
+		priv->checksum_type = brasero_track_get_checksum_type (track);
+		if (priv->checksum_type & (BRASERO_CHECKSUM_MD5|BRASERO_CHECKSUM_SHA1|BRASERO_CHECKSUM_SHA256))
+			result = brasero_md5sum_create_checksum (self, &error);
 		else
 			result = BRASERO_BURN_ERR;
 	}
@@ -562,7 +517,7 @@
 
 		brasero_job_get_input_type (BRASERO_JOB (self), &type);
 		if (type.type == BRASERO_TRACK_TYPE_IMAGE)
-			result = brasero_md5sum_image_live (self, &error);
+			result = brasero_md5sum_image_and_checksum (self, &error);
 		else
 			result = BRASERO_BURN_ERR;
 	}
@@ -613,17 +568,15 @@
 	BraseroMd5sumPrivate *priv;
 
 	priv = BRASERO_MD5SUM_PRIVATE (job);
-	if (!priv->ctx)
+	if (!priv->checksum)
 		return BRASERO_BURN_OK;
 
-	if (priv->total) {
-		gint64 written = 0;
+	if (!priv->total)
+		return BRASERO_BURN_OK;
 
-		written = brasero_md5_get_written (priv->ctx);
-		brasero_job_set_progress (job,
-					  (gdouble) written /
-					  (gdouble) priv->total);
-	}
+	brasero_job_set_progress (job,
+				  (gdouble) priv->bytes /
+				  (gdouble) priv->total);
 
 	return BRASERO_BURN_OK;
 }
@@ -636,9 +589,6 @@
 
 	priv = BRASERO_MD5SUM_PRIVATE (job);
 
-	if (priv->ctx)
-		brasero_md5_cancel (priv->ctx);
-
 	if (priv->thread) {
 		priv->cancel = 1;
 		g_thread_join (priv->thread);
@@ -651,9 +601,9 @@
 		priv->end_id = 0;
 	}
 
-	if (priv->sums_path) {
-		g_free (priv->sums_path);
-		priv->sums_path = NULL;
+	if (priv->checksum) {
+		g_checksum_free (priv->checksum);
+		priv->checksum = NULL;
 	}
 
 	return BRASERO_BURN_OK;
@@ -682,6 +632,11 @@
 		priv->end_id = 0;
 	}
 
+	if (priv->checksum) {
+		g_checksum_free (priv->checksum);
+		priv->checksum = NULL;
+	}
+
 	G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
@@ -705,6 +660,7 @@
 brasero_md5sum_export_caps (BraseroPlugin *plugin, gchar **error)
 {
 	GSList *input;
+	BraseroPluginConfOption *checksum_type;
 
 	brasero_plugin_define (plugin,
 			       "md5sum",
@@ -718,12 +674,29 @@
 					BRASERO_PLUGIN_IO_ACCEPT_PIPE,
 					BRASERO_IMAGE_FORMAT_BIN);
 	brasero_plugin_process_caps (plugin, input);
-	brasero_plugin_check_caps (plugin, BRASERO_CHECKSUM_MD5, input);
+	brasero_plugin_check_caps (plugin,
+				   BRASERO_CHECKSUM_MD5|
+				   BRASERO_CHECKSUM_SHA1|
+				   BRASERO_CHECKSUM_SHA256,
+				   input);
 	g_slist_free (input);
 
 	brasero_plugin_set_process_flags (plugin,
 					  BRASERO_PLUGIN_RUN_FIRST|
 					  BRASERO_PLUGIN_RUN_LAST);
 
+	/* add some configure options */
+	checksum_type = brasero_plugin_conf_option_new (GCONF_KEY_CHECKSUM_TYPE,
+							_("Hashing algorithm to be used:"),
+							BRASERO_PLUGIN_OPTION_CHOICE);
+	brasero_plugin_conf_option_choice_add (checksum_type,
+					       _("MD5"), BRASERO_CHECKSUM_MD5);
+	brasero_plugin_conf_option_choice_add (checksum_type,
+					       _("SHA1"), BRASERO_CHECKSUM_SHA1);
+	brasero_plugin_conf_option_choice_add (checksum_type,
+					       _("SHA256"), BRASERO_CHECKSUM_SHA256);
+
+	brasero_plugin_add_conf_option (plugin, checksum_type);
+
 	return BRASERO_BURN_OK;
 }

Modified: trunk/src/plugins/local-track/burn-local-image.c
==============================================================================
--- trunk/src/plugins/local-track/burn-local-image.c	(original)
+++ trunk/src/plugins/local-track/burn-local-image.c	Wed Mar 12 21:46:44 2008
@@ -51,9 +51,10 @@
 	guint64 data_size;
 	guint64 read_bytes;
 
-	gchar checksum [33];
-	gchar *checksum_src;
-	gchar *checksum_dest;
+	gchar *checksum;
+	gchar *checksum_path;
+	GChecksumType gchecksum_type;
+	BraseroChecksumType checksum_type;
 
 	GHashTable *nonlocals;
 
@@ -64,6 +65,8 @@
 	GSList *dest_list;
 
 	GError *error;
+
+	guint download_checksum:1;
 };
 typedef struct _BraseroLocalTrackPrivate BraseroLocalTrackPrivate;
 
@@ -375,26 +378,30 @@
 	gint bytes;
 	FILE *file;
 	gchar *path;
+	gchar buffer [512];
 	BraseroLocalTrackPrivate *priv;
 
 	priv = BRASERO_LOCAL_TRACK_PRIVATE (self);
 
-	memset (priv->checksum, 0, sizeof (priv->checksum));
-
 	/* get the file_checksum from the md5 file */
-	path = g_filename_from_uri (priv->checksum_dest, NULL, NULL);
+	path = g_filename_from_uri (priv->checksum_path, NULL, NULL);
 	file = fopen (path, "r");
 	g_free (path);
 
 	if (!file)
 		return BRASERO_BURN_ERR;
 
-	bytes = fread (priv->checksum, 1, sizeof (priv->checksum) - 1, file);
+	bytes = fread (buffer,
+		       1,
+		       g_checksum_type_get_length (priv->gchecksum_type) - 1,
+		       file);
 	fclose (file);
+	buffer [g_checksum_type_get_length (priv->gchecksum_type)] = '\0';
 
-	if (bytes != sizeof (priv->checksum) - 1)
+	if (bytes != g_checksum_type_get_length (priv->gchecksum_type) - 1)
 		return BRASERO_BURN_ERR;
 
+	priv->checksum = g_strdup (buffer);
 	return BRASERO_BURN_OK;
 }
 
@@ -403,42 +410,95 @@
 {
 	BraseroLocalTrackPrivate *priv;
 	BraseroBurnResult result;
+	BraseroTrack *track;
+	gchar *checksum_src;
 	GFile *src, *dest;
+	gchar *uri;
 
 	priv = BRASERO_LOCAL_TRACK_PRIVATE (self);
 
-	/* generate a unique name for dest */
+	/* generate a unique name for destination */
 	result = brasero_job_get_tmp_file (BRASERO_JOB (self),
 					   NULL,
-					   &priv->checksum_dest,
+					   &priv->checksum_path,
 					   NULL);
 	if (result != BRASERO_BURN_OK)
 		goto error;
 
 	brasero_job_set_current_action (BRASERO_JOB (self),
 					BRASERO_BURN_ACTION_FILE_COPY,
-					_("Copying files md5sum file"),
+					_("Copying checksum file"),
 					TRUE);
 
-	src = g_file_new_for_uri (priv->checksum_src);
-	dest = g_file_new_for_uri (priv->checksum_dest);
+	/* This is an image. See if there is any checksum sitting in the same
+	 * directory to check our download integrity. Try all types of checksum. */
+	brasero_job_get_current_track (BRASERO_JOB (self), &track);
+	uri = brasero_track_get_image_source (track, TRUE);
+	dest = g_file_new_for_uri (priv->checksum_path);
+
+	/* Try with three difference sources */
+	checksum_src = g_strdup_printf ("%s.md5", uri);
+	src = g_file_new_for_uri (checksum_src);
+	g_free (checksum_src);
 
 	result = brasero_local_track_transfer (self,
 					       src,
 					       dest,
 					       NULL);
+	g_object_unref (src);
 
-	g_object_unref (dest);
+	if (result == BRASERO_BURN_OK) {
+		priv->gchecksum_type = G_CHECKSUM_MD5;
+		priv->checksum_type = BRASERO_CHECKSUM_MD5;
+		goto end;
+	}
+
+	checksum_src = g_strdup_printf ("%s.sha1", uri);
+	src = g_file_new_for_uri (checksum_src);
+	g_free (checksum_src);
+
+	result = brasero_local_track_transfer (self,
+					       src,
+					       dest,
+					       NULL);
+	g_object_unref (src);
+
+	if (result == BRASERO_BURN_OK) {
+		priv->gchecksum_type = G_CHECKSUM_SHA1;
+		priv->checksum_type = BRASERO_CHECKSUM_SHA1;
+		goto end;
+	}
+
+	checksum_src = g_strdup_printf ("%s.sha256", uri);
+	src = g_file_new_for_uri (checksum_src);
+	g_free (checksum_src);
+
+	result = brasero_local_track_transfer (self,
+					       src,
+					       dest,
+					       NULL);
 	g_object_unref (src);
 
+	if (result != BRASERO_BURN_OK) {
+		g_free (uri);
+		g_object_unref (dest);
+		goto error;
+	}
+
+	priv->gchecksum_type = G_CHECKSUM_SHA256;
+	priv->checksum_type = BRASERO_CHECKSUM_SHA256;
+
+end:
+
+	g_object_unref (dest);
+	g_free (uri);
+
 	return result;
 
 error:
 	/* we give up */
-	g_free (priv->checksum_src);
-	priv->checksum_src = NULL;
-	g_free (priv->checksum_dest);
-	priv->checksum_dest = NULL;
+	g_free (priv->checksum_path);
+	priv->checksum_path = NULL;
 	return result;
 }
 
@@ -521,9 +581,9 @@
 		BRASERO_JOB_NOT_SUPPORTED (self);
 	}
 
-	if (priv->checksum)
+	if (priv->download_checksum)
 		brasero_track_set_checksum (track,
-					    BRASERO_CHECKSUM_MD5,
+					    priv->checksum_type,
 					    priv->checksum);
 
 	brasero_job_add_track (BRASERO_JOB (self), track);
@@ -570,8 +630,8 @@
 	}
 
 	/* successfully downloaded files, get a checksum if we can. */
-	if (priv->checksum_src
-	&& !priv->checksum_dest
+	if (priv->download_checksum
+	&& !priv->checksum_path
 	&&  brasero_local_track_download_checksum (self) == BRASERO_BURN_OK)
 		brasero_local_track_read_checksum (self);
 
@@ -765,12 +825,10 @@
 	case BRASERO_TRACK_TYPE_IMAGE:
 		uri = brasero_track_get_image_source (track, TRUE);
 		brasero_local_track_add_if_non_local (self, uri, error);
-
-		/* This is an image. See if there is any md5 sum sitting in the
-		 * same directory to check our download integrity */
-		priv->checksum_src = g_strdup_printf ("%s.md5", uri);
 		g_free (uri);
 
+		priv->download_checksum = TRUE;
+
 		uri = brasero_track_get_toc_source (track, TRUE);
 		brasero_local_track_add_if_non_local (self, uri, error);
 		g_free (uri);
@@ -848,14 +906,14 @@
 		priv->nonlocals = NULL;
 	}
 
-	if (priv->checksum_src) {
-		g_free (priv->checksum_src);
-		priv->checksum_src = NULL;
+	if (priv->checksum_path) {
+		g_free (priv->checksum_path);
+		priv->checksum_path = NULL;
 	}
 
-	if (priv->checksum_dest) {
-		g_free (priv->checksum_dest);
-		priv->checksum_dest = NULL;
+	if (priv->checksum) {
+		g_free (priv->checksum);
+		priv->checksum = NULL;
 	}
 
 	return BRASERO_BURN_OK;



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