brasero r608 - in branches/brasero_0_7: . src src/plugins/cdrkit src/plugins/cdrtools src/plugins/growisofs



Author: philippr
Date: Sun Jan 20 17:18:41 2008
New Revision: 608
URL: http://svn.gnome.org/viewvc/brasero?rev=608&view=rev

Log:
2008-01-20  Philippe Rouquier  <philippr svn gnome org>

	Fix #506063 â Brasero fails miserably from burning a file > 4GB
	We now use iso level 3 and udf when we detect a file > 4GB
	That means some OS (MacOS X among a couple) may not work

	* src/brasero-data-disc.c: (brasero_data_disc_reset_real),
	(brasero_data_disc_restore_unreadable),
	(brasero_data_disc_file_free),
	(brasero_data_disc_remove_children_async_cb),
	(brasero_data_disc_file_new), (brasero_data_disc_symlink_new),
	(brasero_data_disc_invalid_utf8_new),
	(brasero_data_disc_dir_contents_end),
	(brasero_data_disc_delete_row_cb),
	(brasero_data_disc_path_remove_user),
	(brasero_data_disc_restore_excluded_children_cb),
	(brasero_data_disc_new_file),
	(brasero_data_disc_set_session_param),
	(brasero_data_disc_inotify_create_paths),
	(brasero_data_disc_inotify_modify_file_cb),
	(brasero_data_disc_start_monitoring_real):
	* src/burn-debug.c: (brasero_debug_data_fs_to_string):
	* src/burn-track.h:
	* src/plugins/cdrkit/burn-genisoimage.c:
	(brasero_genisoimage_set_argv_image),
	(brasero_genisoimage_export_caps):
	* src/plugins/cdrtools/burn-mkisofs.c:
	(brasero_mkisofs_set_argv_image), (brasero_mkisofs_export_caps):
	* src/plugins/growisofs/burn-growisofs.c:
	(brasero_growisofs_set_mkisofs_argv),
	(brasero_growisofs_export_caps):

Modified:
   branches/brasero_0_7/ChangeLog
   branches/brasero_0_7/src/brasero-data-disc.c
   branches/brasero_0_7/src/burn-debug.c
   branches/brasero_0_7/src/burn-track.h
   branches/brasero_0_7/src/plugins/cdrkit/burn-genisoimage.c
   branches/brasero_0_7/src/plugins/cdrtools/burn-mkisofs.c
   branches/brasero_0_7/src/plugins/growisofs/burn-growisofs.c

Modified: branches/brasero_0_7/src/brasero-data-disc.c
==============================================================================
--- branches/brasero_0_7/src/brasero-data-disc.c	(original)
+++ branches/brasero_0_7/src/brasero-data-disc.c	Sun Jan 20 17:18:41 2008
@@ -195,6 +195,8 @@
 	GSList *libnotify;
 	guint libnotify_id;
 
+	guint G2_files;
+
 	gint editing:1;
 	gint is_loading:1;
 	gint reject_files:1;
@@ -3244,6 +3246,7 @@
 
 	brasero_data_disc_clean (disc);
 
+	disc->priv->G2_files = 0;
 	disc->priv->activity_counter = 1;
 	brasero_data_disc_decrease_activity_counter (disc);
 
@@ -3574,6 +3577,11 @@
 		brasero_data_disc_joliet_incompat_add_paths (disc, paths);
 	}
 
+	/* update by the number of non grafted file */
+	if (info->type != GNOME_VFS_FILE_TYPE_DIRECTORY
+	&&  GET_SIZE_IN_SECTORS (info->size) > 1048576)
+		disc->priv->G2_files += g_slist_length (paths);
+
 	/* now let's see the tree */
 	for (; paths; paths = g_slist_remove (paths, path)) {
 		path = paths->data;
@@ -3799,7 +3807,7 @@
 {
 	if (!brasero_data_disc_is_excluded (disc, file->uri, NULL)) {
 		BraseroFile *parent;
-		char *parent_uri;
+		gchar *parent_uri;
 
 		parent_uri = g_path_get_dirname (file->uri);
 		parent = g_hash_table_lookup (disc->priv->dirs, parent_uri);
@@ -3810,9 +3818,13 @@
 
 		parent->sectors += file->sectors;
 	}
-	else
+	else {
 		brasero_data_disc_size_changed (disc, file->sectors * (-1));
 
+		if (file->sectors > 1048576)
+			disc->priv->G2_files --;
+	}
+
 	brasero_data_disc_file_object_free (disc, file);
 }
 
@@ -4127,6 +4139,11 @@
 
 	/* we update the parent directory */
 	sectors = GET_SIZE_IN_SECTORS (info->size);
+
+	if (info->type != GNOME_VFS_FILE_TYPE_DIRECTORY
+	&&  GET_SIZE_IN_SECTORS (info->size) > 1048576)
+		disc->priv->G2_files --;
+
 	dir->sectors -= sectors;
 	brasero_data_disc_size_changed (disc, sectors * (-1));
 
@@ -6026,12 +6043,16 @@
 #endif
 		brasero_data_disc_size_changed (disc, sectors);
 	}
-	else if (brasero_data_disc_is_excluded (disc, file->uri, NULL))
+	else if (brasero_data_disc_is_excluded (disc, file->uri, NULL)) {
 		brasero_data_disc_size_changed (disc, sectors);
+	}
 	/* That's mostly when loading a project */
 	else if (!g_slist_find (disc->priv->loading, parent))
 		parent->sectors -= sectors;
 
+	if (sectors > 1048576)
+		disc->priv->G2_files ++;
+
 	/* because of above we only insert it at the end */
 	g_hash_table_insert (disc->priv->files, file->uri, file);
 	brasero_data_disc_obj_new (disc, file);
@@ -6281,6 +6302,8 @@
 						   info->symlink_name,
 						   GET_SIZE_IN_SECTORS (info->size));
 
+	/* No need to check for 2G files here since we set a graft */
+
 end :
 	
 	uri = entry->uri;
@@ -6476,7 +6499,8 @@
 						    g_strdup (uri),
 						    sectors);
 		}
-	
+
+		/* since we graft here no need to check for 2G files */
 		brasero_data_disc_graft_new (disc, uri, path);
 		grafts = g_slist_prepend (grafts, path);
 
@@ -6586,6 +6610,11 @@
 			dir_sectors += GET_SIZE_IN_SECTORS (info->size);
 		}
 
+		if (info->type != GNOME_VFS_FILE_TYPE_DIRECTORY
+		&&  GET_SIZE_IN_SECTORS (info->size) > 1048576
+		&& !g_hash_table_lookup (disc->priv->files, current))
+			disc->priv->G2_files ++;
+
 		if (strlen (info->name) > 64) {
 			GSList *paths;
 
@@ -6978,6 +7007,10 @@
 		return;
 	}
 
+	if (info->type != GNOME_VFS_FILE_TYPE_DIRECTORY
+	&&  GET_SIZE_IN_SECTORS (info->size) > 1048576)
+		disc->priv->G2_files --;
+
 	sectors = GET_SIZE_IN_SECTORS (info->size);
 	brasero_data_disc_size_changed (disc, sectors * (-1));
 	parent->sectors -= sectors;
@@ -7087,35 +7120,6 @@
 		/* make an imported session file re-appear if need be */
 		brasero_data_disc_is_session_path_deleted (disc, path);
 		return;
-
-#if 0
-		BraseroVolFile *file;
-
-		/* could be used the day when a library allows full editing 
-		 * of multisession  */
-
-		if (uri != BRASERO_IMPORTED_FILE)
-			return;
-
-		/* get the volfile and add it to the list of excluded session files */
-		file = brasero_volume_file_from_path (path,
-						      disc->priv->session);
-		if (!file)
-			return;
-
-		/* update the size */
-		brasero_data_disc_size_changed (disc, (-1) * brasero_volume_file_size (file));
-
-		/* since it could a file with a graft point, it could already be
-		 * in the list. We check that and and eventually add it if it is
-		 * not in this list */
-		if (!g_slist_find (disc->priv->session_file_excluded, file))
-			disc->priv->session_file_excluded = g_slist_prepend (disc->priv->session_file_excluded,
-									     file);
-
-		return;
-#endif
-
 	}
 
 	if (!disc->priv->remove_user)
@@ -7423,6 +7427,10 @@
 		dir = g_hash_table_lookup (disc->priv->dirs, parent);
 		g_free (parent);
 
+		if (info->type != GNOME_VFS_FILE_TYPE_DIRECTORY
+		&&  GET_SIZE_IN_SECTORS (info->size) > 1048576)
+			disc->priv->G2_files ++;
+
 		dir->sectors += sectors;
 		brasero_data_disc_size_changed (disc, sectors);
 	}
@@ -7701,6 +7709,10 @@
 			parent = g_hash_table_lookup (disc->priv->dirs, parent_uri);
 			g_free (parent_uri);
 
+			if (info->type != GNOME_VFS_FILE_TYPE_DIRECTORY
+			&&  GET_SIZE_IN_SECTORS (info->size) > 1048576)
+				disc->priv->G2_files ++;
+
 			/* no need to check if parent is dummy. It
 			 * is done in brasero_data_disc_is_excluded */
 			sectors = GET_SIZE_IN_SECTORS (info->size);
@@ -8895,6 +8907,11 @@
 	if (!BRASERO_DATA_DISC (disc)->priv->joliet_non_compliant)
 		fs_type |= BRASERO_IMAGE_FS_JOLIET;
 
+	/* that's necessary for files > 2Gio. It's supported by all windows,
+	 * linux, only BSD (unsure), and MacOS X don't support it. */
+	if (BRASERO_DATA_DISC (disc)->priv->G2_files)
+		fs_type |= BRASERO_IMAGE_ISO_FS_LEVEL_3 | BRASERO_IMAGE_FS_UDF;
+
 	if (brasero_data_disc_is_video_DVD (BRASERO_DATA_DISC (disc)))
 		fs_type |= BRASERO_IMAGE_FS_VIDEO;
 
@@ -11916,6 +11933,9 @@
 		file = g_hash_table_lookup (disc->priv->dirs, parent);
 		g_free (parent);
 
+		if (GET_SIZE_IN_SECTORS (info->size) > 1048576)
+			disc->priv->G2_files ++;
+
 		sectors = GET_SIZE_IN_SECTORS (info->size);
 		file->sectors += sectors;
 		brasero_data_disc_size_changed (disc, sectors);
@@ -12215,6 +12235,13 @@
 
 		sectors = GET_SIZE_IN_SECTORS (info->size);
 		if (sectors != file->sectors) {
+			if (info->type != GNOME_VFS_FILE_TYPE_DIRECTORY) {
+				if (GET_SIZE_IN_SECTORS (info->size) > 1048576 && file->sectors <= 1048576)
+					disc->priv->G2_files ++;
+				else if (GET_SIZE_IN_SECTORS (info->size) <= 1048576 && file->sectors > 1048576)
+					disc->priv->G2_files --;
+			}
+
 			brasero_data_disc_size_changed (disc, sectors - file->sectors);
 			file->sectors = sectors;
 		}
@@ -12907,7 +12934,7 @@
 brasero_data_disc_start_monitoring_real (BraseroDataDisc *disc,
 					 BraseroFile *file)
 {
-	const gchar *path;
+	gchar *path;
 	gint dev_fd;
 	uint32_t mask;
 

Modified: branches/brasero_0_7/src/burn-debug.c
==============================================================================
--- branches/brasero_0_7/src/burn-debug.c	(original)
+++ branches/brasero_0_7/src/burn-debug.c	Sun Jan 20 17:18:41 2008
@@ -246,6 +246,8 @@
 		strcat (buffer, "ISO ");
 	if (fs_type & BRASERO_IMAGE_FS_UDF)
 		strcat (buffer, "UDF ");
+	if (fs_type & BRASERO_IMAGE_ISO_FS_LEVEL_3)
+		strcat (buffer, "Level 3 ");
 	if (fs_type & BRASERO_IMAGE_FS_JOLIET)
 		strcat (buffer, "JOLIET ");
 	if (fs_type & BRASERO_IMAGE_FS_VIDEO)

Modified: branches/brasero_0_7/src/burn-track.h
==============================================================================
--- branches/brasero_0_7/src/burn-track.h	(original)
+++ branches/brasero_0_7/src/burn-track.h	Sun Jan 20 17:18:41 2008
@@ -48,9 +48,11 @@
 	BRASERO_IMAGE_FS_UDF			= 1 << 1,
 	BRASERO_IMAGE_FS_JOLIET			= 1 << 2,
 	BRASERO_IMAGE_FS_VIDEO			= 1 << 3,
+	BRASERO_IMAGE_ISO_FS_LEVEL_3		= 1 << 4,
 	BRASERO_IMAGE_FS_ANY			= BRASERO_IMAGE_FS_ISO|
 						  BRASERO_IMAGE_FS_UDF|
 						  BRASERO_IMAGE_FS_JOLIET|
+						  BRASERO_IMAGE_ISO_FS_LEVEL_3|
 						  BRASERO_IMAGE_FS_VIDEO
 } BraseroImageFS;
 

Modified: branches/brasero_0_7/src/plugins/cdrkit/burn-genisoimage.c
==============================================================================
--- branches/brasero_0_7/src/plugins/cdrkit/burn-genisoimage.c	(original)
+++ branches/brasero_0_7/src/plugins/cdrkit/burn-genisoimage.c	Sun Jan 20 17:18:41 2008
@@ -228,10 +228,22 @@
 		BRASERO_JOB_NOT_READY (genisoimage);
 
 	brasero_track_get_type (track, &type);
-	if ((type.subtype.fs_type & BRASERO_IMAGE_FS_JOLIET))
+	if (type.subtype.fs_type & BRASERO_IMAGE_FS_JOLIET)
 		g_ptr_array_add (argv, g_strdup ("-J"));
 
-	if ((type.subtype.fs_type & BRASERO_IMAGE_FS_VIDEO))
+	if ((type.subtype.fs_type & BRASERO_IMAGE_FS_ISO)
+	&&  (type.subtype.fs_type & BRASERO_IMAGE_ISO_FS_LEVEL_3)) {
+		g_ptr_array_add (argv, g_strdup ("-iso-level"));
+		g_ptr_array_add (argv, g_strdup ("3"));
+
+		/* NOTE the following is specific to genisoimage */
+		/* g_ptr_array_add (argv, g_strdup ("-allow-limited-size")); */
+	}
+
+	if (type.subtype.fs_type & BRASERO_IMAGE_FS_UDF)
+		g_ptr_array_add (argv, g_strdup ("-udf"));
+
+	if (type.subtype.fs_type & BRASERO_IMAGE_FS_VIDEO)
 		g_ptr_array_add (argv, g_strdup ("-dvd-video"));
 
 	g_ptr_array_add (argv, g_strdup ("-graft-points"));
@@ -488,6 +500,8 @@
 				  BRASERO_BURN_FLAG_NONE);
 
 	input = brasero_caps_data_new (BRASERO_IMAGE_FS_ISO|
+				       BRASERO_IMAGE_FS_UDF|
+				       BRASERO_IMAGE_ISO_FS_LEVEL_3|
 				       BRASERO_IMAGE_FS_JOLIET|
 				       BRASERO_IMAGE_FS_VIDEO);
 

Modified: branches/brasero_0_7/src/plugins/cdrtools/burn-mkisofs.c
==============================================================================
--- branches/brasero_0_7/src/plugins/cdrtools/burn-mkisofs.c	(original)
+++ branches/brasero_0_7/src/plugins/cdrtools/burn-mkisofs.c	Sun Jan 20 17:18:41 2008
@@ -225,10 +225,19 @@
 		BRASERO_JOB_NOT_READY (mkisofs);
 
 	brasero_track_get_type (track, &type);
-	if ((type.subtype.fs_type & BRASERO_IMAGE_FS_JOLIET))
+	if (type.subtype.fs_type & BRASERO_IMAGE_FS_JOLIET)
 		g_ptr_array_add (argv, g_strdup ("-J"));
 
-	if ((type.subtype.fs_type & BRASERO_IMAGE_FS_VIDEO))
+	if ((type.subtype.fs_type & BRASERO_IMAGE_FS_ISO)
+	&&  (type.subtype.fs_type & BRASERO_IMAGE_ISO_FS_LEVEL_3)) {
+		g_ptr_array_add (argv, g_strdup ("-iso-level"));
+		g_ptr_array_add (argv, g_strdup ("3"));
+	}
+
+	if (type.subtype.fs_type & BRASERO_IMAGE_FS_UDF)
+		g_ptr_array_add (argv, g_strdup ("-udf"));
+
+	if (type.subtype.fs_type & BRASERO_IMAGE_FS_VIDEO)
 		g_ptr_array_add (argv, g_strdup ("-dvd-video"));
 
 	g_ptr_array_add (argv, g_strdup ("-graft-points"));
@@ -484,6 +493,8 @@
 				  BRASERO_BURN_FLAG_NONE);
 
 	input = brasero_caps_data_new (BRASERO_IMAGE_FS_ISO|
+				       BRASERO_IMAGE_FS_UDF|
+				       BRASERO_IMAGE_ISO_FS_LEVEL_3|
 				       BRASERO_IMAGE_FS_JOLIET|
 				       BRASERO_IMAGE_FS_VIDEO);
 

Modified: branches/brasero_0_7/src/plugins/growisofs/burn-growisofs.c
==============================================================================
--- branches/brasero_0_7/src/plugins/growisofs/burn-growisofs.c	(original)
+++ branches/brasero_0_7/src/plugins/growisofs/burn-growisofs.c	Sun Jan 20 17:18:41 2008
@@ -240,6 +240,17 @@
 	if (input.subtype.fs_type & BRASERO_IMAGE_FS_JOLIET)
 		g_ptr_array_add (argv, g_strdup ("-J"));
 
+	if ((input.subtype.fs_type & BRASERO_IMAGE_FS_ISO)
+	&&  (input.subtype.fs_type & BRASERO_IMAGE_ISO_FS_LEVEL_3)) {
+		/* That's the safest option. A few OS don't support that though,
+		 * like MacOSX and freebsd.*/
+		g_ptr_array_add (argv, g_strdup ("-iso-level"));
+		g_ptr_array_add (argv, g_strdup ("3"));
+	}
+
+	if (input.subtype.fs_type & BRASERO_IMAGE_FS_UDF)
+		g_ptr_array_add (argv, g_strdup ("-udf"));
+
 	if (input.subtype.fs_type & BRASERO_IMAGE_FS_VIDEO)
 		g_ptr_array_add (argv, g_strdup ("-dvd-video"));
 
@@ -688,6 +699,8 @@
 					BRASERO_MEDIUM_HAS_DATA);
 	
 	input = brasero_caps_data_new (BRASERO_IMAGE_FS_ISO|
+				       BRASERO_IMAGE_FS_UDF|
+				       BRASERO_IMAGE_ISO_FS_LEVEL_3|
 				       BRASERO_IMAGE_FS_JOLIET|
 				       BRASERO_IMAGE_FS_VIDEO);
 



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