brasero r671 - in trunk: . po src src/plugins/checksum src/plugins/local-track
- From: philippr svn gnome org
- To: svn-commits-list gnome org
- Subject: brasero r671 - in trunk: . po src src/plugins/checksum src/plugins/local-track
- Date: Wed, 12 Mar 2008 21:46:45 +0000 (GMT)
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]