brasero r1255 - in trunk: . src src/plugins/cdrkit src/plugins/cdrtools src/plugins/checksum



Author: philippr
Date: Mon Sep  8 18:10:29 2008
New Revision: 1255
URL: http://svn.gnome.org/viewvc/brasero?rev=1255&view=rev

Log:
	Fix checksums for DVD+RW with which we didn\'t start at the right address
	in multisession

	* src/burn-track.h:
	* src/burn.c (brasero_burn_action_changed),
	(brasero_burn_record_session):
	* src/plugins/cdrkit/burn-readom.c
	(brasero_readom_argv_set_iso_boundary), (brasero_readom_get_size):
	* src/plugins/cdrtools/burn-readcd.c
	(brasero_readcd_argv_set_iso_boundary), (brasero_readcd_get_size):
	* src/plugins/checksum/burn-checksum-files.c
	(brasero_checksum_files_end):


Modified:
   trunk/ChangeLog
   trunk/src/burn-track.h
   trunk/src/burn.c
   trunk/src/plugins/cdrkit/burn-readom.c
   trunk/src/plugins/cdrtools/burn-readcd.c
   trunk/src/plugins/checksum/burn-checksum-files.c

Modified: trunk/src/burn-track.h
==============================================================================
--- trunk/src/burn-track.h	(original)
+++ trunk/src/burn-track.h	Mon Sep  8 18:10:29 2008
@@ -323,6 +323,13 @@
 			  const gchar *tag,
 			  GValue **value);
 
+/*
+ * Commonly used Tags
+ */
+
+#define BRASERO_TRACK_MEDIUM_ADDRESS_START_TAG	"track::medium::address::start"
+#define BRASERO_TRACK_MEDIUM_ADDRESS_END_TAG	"track::medium::address::end"
+
 G_END_DECLS
 
 #endif /* _BURN_TRACK_H */

Modified: trunk/src/burn.c
==============================================================================
--- trunk/src/burn.c	(original)
+++ trunk/src/burn.c	Mon Sep  8 18:10:29 2008
@@ -70,6 +70,9 @@
 
 	gint appcookie;
 
+	guint64 session_start;
+	guint64 session_end;
+
 	guint src_locked:1;
 	guint dest_locked:1;
 
@@ -1184,7 +1187,40 @@
 			     BraseroBurnAction action,
 			     BraseroBurn *burn)
 {
+	BraseroBurnPrivate *priv;
+	BraseroMedia media;
+
 	brasero_burn_action_changed_real (burn, action);
+
+	if (action != BRASERO_BURN_ACTION_START_RECORDING)
+		return;
+
+	priv = BRASERO_BURN_PRIVATE (burn);
+
+	media = brasero_burn_session_get_dest_media (priv->session);
+	if ((BRASERO_MEDIUM_IS (media, BRASERO_MEDIUM_DVDRW_PLUS)
+	||   BRASERO_MEDIUM_IS (media, BRASERO_MEDIUM_DVDRW_RESTRICTED))) {
+		BraseroBurnFlag flags;
+		BraseroMedium *medium;
+		BraseroDrive *drive;
+		gint64 len = 0;
+
+		drive = brasero_burn_session_get_burner (priv->session);
+		medium = brasero_drive_get_medium (drive);
+		flags = brasero_burn_session_get_flags (priv->session);
+
+		/* we need to save some parameters for later checksuming */
+		brasero_task_ctx_get_session_output_size (BRASERO_TASK_CTX (priv->task),
+							  &len,
+							  NULL);
+
+		if (flags & (BRASERO_BURN_FLAG_MERGE|BRASERO_BURN_FLAG_APPEND))
+			priv->session_start = brasero_medium_get_next_writable_address (medium);
+		else
+			priv->session_start = 0;
+
+		priv->session_end = priv->session_start + len;
+	}
 }
 
 void
@@ -2085,17 +2121,47 @@
 	if (type == BRASERO_CHECKSUM_MD5
 	||  type == BRASERO_CHECKSUM_SHA1
 	||  type == BRASERO_CHECKSUM_SHA256) {
-		guint track_num;
+		BraseroMedia media;
 		BraseroDrive *drive;
 		BraseroMedium *medium;
 
-		/* get the last track number */
+		/* get the last written track address in case of DVD+RW/DVD-RW
+		 * restricted overwrite since there is no such thing as track
+		 * number for these drives. */
 		drive = brasero_burn_session_get_burner (priv->session);
 		medium = brasero_drive_get_medium (drive);
-		track_num = brasero_medium_get_track_num (medium);
+		media = brasero_medium_get_status (medium);
+
+		if (!BRASERO_MEDIUM_IS (media, BRASERO_MEDIUM_DVDRW_PLUS)
+		&&  !BRASERO_MEDIUM_IS (media, BRASERO_MEDIUM_DVDRW_RESTRICTED)) {
+			guint track_num;
 
-		BRASERO_BURN_LOG ("Last written track num == %i", track_num);
-		brasero_track_set_drive_track (track, track_num);
+			track_num = brasero_medium_get_track_num (medium);
+
+			BRASERO_BURN_LOG ("Last written track num == %i", track_num);
+			brasero_track_set_drive_track (track, track_num);
+		}
+		else {
+			GValue *value;
+
+			value = g_new0 (GValue, 1);
+			g_value_init (value, G_TYPE_UINT64);
+
+			BRASERO_BURN_LOG ("Start of last written track address == %lli", priv->session_start);
+			g_value_set_uint64 (value, priv->session_start);
+			brasero_track_tag_add (track,
+					       BRASERO_TRACK_MEDIUM_ADDRESS_START_TAG,
+					       value);
+
+			value = g_new0 (GValue, 1);
+			g_value_init (value, G_TYPE_UINT64);
+
+			BRASERO_BURN_LOG ("End of last written track address == %lli", priv->session_end);
+			g_value_set_uint64 (value, priv->session_end);
+			brasero_track_tag_add (track,
+					       BRASERO_TRACK_MEDIUM_ADDRESS_END_TAG,
+					       value);
+		}
 	}
 
 	result = brasero_burn_check_real (burn, track, error);

Modified: trunk/src/plugins/cdrkit/burn-readom.c
==============================================================================
--- trunk/src/plugins/cdrkit/burn-readom.c	(original)
+++ trunk/src/plugins/cdrkit/burn-readom.c	Mon Sep  8 18:10:29 2008
@@ -120,13 +120,39 @@
 {
 	gint64 nb_blocks;
 	BraseroTrack *track;
+	GValue *value = NULL;
 	BraseroTrackType output;
 
 	brasero_job_get_current_track (BRASERO_JOB (readom), &track);
 	brasero_job_get_output_type (BRASERO_JOB (readom), &output);
 
+	brasero_track_tag_lookup (track,
+				  BRASERO_TRACK_MEDIUM_ADDRESS_START_TAG,
+				  &value);
+	if (value) {
+		guint64 start, end;
+
+		/* we were given an address to start */
+		start = g_value_get_uint64 (value);
+
+		/* get the length now */
+		value = NULL;
+		brasero_track_tag_lookup (track,
+					  BRASERO_TRACK_MEDIUM_ADDRESS_END_TAG,
+					  &value);
+
+		end = g_value_get_uint64 (value);
+
+		BRASERO_JOB_LOG (readom,
+				 "reading from sector %lli to %lli",
+				 start,
+				 end);
+		g_ptr_array_add (argv, g_strdup_printf ("-sectors=%lli-%lli",
+							start,
+							end));
+	}
 	/* 0 means all disc, -1 problem */
-	if (brasero_track_get_drive_track (track) > 0) {
+	else if (brasero_track_get_drive_track (track) > 0) {
 		gint64 start;
 		BraseroMedium *medium;
 
@@ -182,13 +208,32 @@
 			 GError **error)
 {
 	gint64 blocks;
+	GValue *value = NULL;
 	BraseroTrackType output;
 	BraseroTrack *track = NULL;
 
 	brasero_job_get_current_track (BRASERO_JOB (self), &track);
 	brasero_job_get_output_type (BRASERO_JOB (self), &output);
 
-	if (brasero_track_get_drive_track (track) > 0) {
+	brasero_track_tag_lookup (track,
+				  BRASERO_TRACK_MEDIUM_ADDRESS_START_TAG,
+				  &value);
+	if (value) {
+		guint64 start, end;
+
+		/* we were given an address to start */
+		start = g_value_get_uint64 (value);
+
+		/* get the length now */
+		value = NULL;
+		brasero_track_tag_lookup (track,
+					  BRASERO_TRACK_MEDIUM_ADDRESS_END_TAG,
+					  &value);
+
+		end = g_value_get_uint64 (value);
+		blocks = end - start;
+	}
+	else if (brasero_track_get_drive_track (track) > 0) {
 		BraseroMedium *medium;
 
 		medium = brasero_track_get_medium_source (track);

Modified: trunk/src/plugins/cdrtools/burn-readcd.c
==============================================================================
--- trunk/src/plugins/cdrtools/burn-readcd.c	(original)
+++ trunk/src/plugins/cdrtools/burn-readcd.c	Mon Sep  8 18:10:29 2008
@@ -120,13 +120,39 @@
 {
 	gint64 nb_blocks;
 	BraseroTrack *track;
+	GValue *value = NULL;
 	BraseroTrackType output;
 
 	brasero_job_get_current_track (BRASERO_JOB (readcd), &track);
 	brasero_job_get_output_type (BRASERO_JOB (readcd), &output);
 
+	brasero_track_tag_lookup (track,
+				  BRASERO_TRACK_MEDIUM_ADDRESS_START_TAG,
+				  &value);
+	if (value) {
+		guint64 start, end;
+
+		/* we were given an address to start */
+		start = g_value_get_uint64 (value);
+
+		/* get the length now */
+		value = NULL;
+		brasero_track_tag_lookup (track,
+					  BRASERO_TRACK_MEDIUM_ADDRESS_END_TAG,
+					  &value);
+
+		end = g_value_get_uint64 (value);
+
+		BRASERO_JOB_LOG (readcd,
+				 "reading from sector %lli to %lli",
+				 start,
+				 end);
+		g_ptr_array_add (argv, g_strdup_printf ("-sectors=%lli-%lli",
+							start,
+							end));
+	}
 	/* 0 means all disc, -1 problem */
-	if (brasero_track_get_drive_track (track) > 0) {
+	else if (brasero_track_get_drive_track (track) > 0) {
 		gint64 start;
 		BraseroMedium *medium;
 
@@ -182,13 +208,32 @@
 			 GError **error)
 {
 	gint64 blocks;
+	GValue *value = NULL;
 	BraseroTrackType output;
 	BraseroTrack *track = NULL;
 
 	brasero_job_get_current_track (BRASERO_JOB (self), &track);
 	brasero_job_get_output_type (BRASERO_JOB (self), &output);
 
-	if (brasero_track_get_drive_track (track) > 0) {
+	brasero_track_tag_lookup (track,
+				  BRASERO_TRACK_MEDIUM_ADDRESS_START_TAG,
+				  &value);
+	if (value) {
+		guint64 start, end;
+
+		/* we were given an address to start */
+		start = g_value_get_uint64 (value);
+
+		/* get the length now */
+		value = NULL;
+		brasero_track_tag_lookup (track,
+					  BRASERO_TRACK_MEDIUM_ADDRESS_END_TAG,
+					  &value);
+
+		end = g_value_get_uint64 (value);
+		blocks = end - start;
+	}
+	else if (brasero_track_get_drive_track (track) > 0) {
 		BraseroMedium *medium;
 
 		medium = brasero_track_get_medium_source (track);

Modified: trunk/src/plugins/checksum/burn-checksum-files.c
==============================================================================
--- trunk/src/plugins/checksum/burn-checksum-files.c	(original)
+++ trunk/src/plugins/checksum/burn-checksum-files.c	Mon Sep  8 18:10:29 2008
@@ -952,6 +952,11 @@
 			break;
 		}
 
+		BRASERO_JOB_LOG (self,
+				 "Adding graft for checksum file %s %s",
+				 graft->path,
+				 graft->uri);
+
 		new_grafts = g_slist_prepend (new_grafts, graft);
 		excluded = brasero_track_get_data_excluded_source (track, TRUE);
 



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