[brasero] Improve data project size accuracy
- From: Philippe Rouquier <philippr src gnome org>
- To: svn-commits-list gnome org
- Subject: [brasero] Improve data project size accuracy
- Date: Mon, 25 May 2009 13:51:04 -0400 (EDT)
commit 961c3bc9815f25153fc456c594a51d9b3087fdbc
Author: Philippe Rouquier <bonfire-app wanadoo fr>
Date: Mon May 25 14:26:06 2009 +0200
Improve data project size accuracy
---
libbrasero-burn/brasero-data-options.c | 4 ++
libbrasero-burn/brasero-data-project.c | 52 ++++++++++++++++++++++++++++-
libbrasero-burn/brasero-data-project.h | 4 ++
libbrasero-burn/brasero-file-node.c | 38 +++++++++++++++------
libbrasero-burn/brasero-file-node.h | 1 +
libbrasero-burn/brasero-track-data-cfg.c | 16 ++++++++-
6 files changed, 101 insertions(+), 14 deletions(-)
diff --git a/libbrasero-burn/brasero-data-options.c b/libbrasero-burn/brasero-data-options.c
index 40980b7..d8f47f3 100644
--- a/libbrasero-burn/brasero-data-options.c
+++ b/libbrasero-burn/brasero-data-options.c
@@ -54,6 +54,10 @@ struct _BraseroDataOptionsPrivate
guint joliet_saved:1;
};
+/* FIXME: we need to react to a valid signal so that if joliet is on and the
+ * session is invalid we can try to see if deactivating it can make things
+ * workable again. */
+
#define BRASERO_DATA_OPTIONS_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_DATA_OPTIONS, BraseroDataOptionsPrivate))
enum {
diff --git a/libbrasero-burn/brasero-data-project.c b/libbrasero-burn/brasero-data-project.c
index 5561ad2..f524068 100644
--- a/libbrasero-burn/brasero-data-project.c
+++ b/libbrasero-burn/brasero-data-project.c
@@ -2644,6 +2644,7 @@ struct _MakeTrackDataSpan {
GSList *joliet_grafts;
guint64 files_num;
+ guint64 dir_num;
BraseroImageFS fs_type;
};
@@ -2682,8 +2683,10 @@ brasero_data_project_span_explore_folder_children (MakeTrackDataSpan *data,
brasero_data_project_span_set_fs_type (data, node);
data->files_num ++;
}
- else
+ else {
brasero_data_project_span_explore_folder_children (data, node);
+ data->dir_num ++;
+ }
}
}
@@ -2778,6 +2781,44 @@ brasero_data_project_span_generate (BraseroDataProject *self,
brasero_track_data_set_source (track, grafts, excluded);
}
+goffset
+brasero_data_project_improve_image_size_accuracy (goffset sectors,
+ guint64 dir_num,
+ BraseroImageFS fs_type)
+{
+ /* sector number should be increased in the following way to get
+ * a more accurate number:
+ * - the first (empty most of the time) 16 sectors
+ * - primary volume descriptor block
+ * - terminator volume descriptor block
+ * - one sector for root (and one more if there is joliet)
+ * - 4 sectors for the path table (at least!!)
+ * - for every directory add a block (for all entry records)
+ * and another one if there is joliet on
+ */
+ sectors += 23;
+ sectors += dir_num * 1;
+
+ if (fs_type & BRASERO_IMAGE_FS_JOLIET) {
+ /* For joliet :
+ * - 1 sector for the volume descriptor
+ * - 1 sector for the root descriptor
+ * - 4 sectors for the path table (at least!!)
+ */
+ sectors += 6;
+
+ /* For joliet 2 sectors per directory (at least!!) */
+ sectors += dir_num * 2;
+ }
+
+ /* Finally there is a 150 pad block at the end (only with mkisofs !!).
+ * That was probably done to avoid getting an image whose size would be
+ * less than 1 sec??? */
+ sectors += 150;
+
+ return sectors;
+}
+
BraseroBurnResult
brasero_data_project_span (BraseroDataProject *self,
goffset max_sectors,
@@ -2796,6 +2837,7 @@ brasero_data_project_span (BraseroDataProject *self,
if (!g_hash_table_size (priv->grafts))
return BRASERO_BURN_ERR;
+ callback_data.dir_num = 0;
callback_data.files_num = 0;
callback_data.grafts = NULL;
callback_data.joliet_grafts = NULL;
@@ -2869,8 +2911,10 @@ brasero_data_project_span (BraseroDataProject *self,
brasero_data_project_span_set_fs_type (&callback_data, children);
callback_data.files_num ++;
}
- else
+ else {
brasero_data_project_span_explore_folder_children (&callback_data, children);
+ callback_data.dir_num ++;
+ }
priv->spanned = g_slist_prepend (priv->spanned, children);
children = children->next;
@@ -2887,6 +2931,10 @@ brasero_data_project_span (BraseroDataProject *self,
append_slash,
track);
+ total_sectors = brasero_data_project_improve_image_size_accuracy (total_sectors,
+ callback_data.dir_num,
+ callback_data.fs_type);
+
brasero_track_data_set_data_blocks (track, total_sectors);
brasero_track_data_add_fs (track, callback_data.fs_type);
brasero_track_data_set_file_num (track, callback_data.files_num);
diff --git a/libbrasero-burn/brasero-data-project.h b/libbrasero-burn/brasero-data-project.h
index 2515633..384466a 100644
--- a/libbrasero-burn/brasero-data-project.h
+++ b/libbrasero-burn/brasero-data-project.h
@@ -126,6 +126,10 @@ goffset
brasero_data_project_get_sectors (BraseroDataProject *project);
goffset
+brasero_data_project_improve_image_size_accuracy (goffset blocks,
+ guint64 dir_num,
+ BraseroImageFS fs_type);
+goffset
brasero_data_project_get_folder_sectors (BraseroDataProject *project,
BraseroFileNode *node);
diff --git a/libbrasero-burn/brasero-file-node.c b/libbrasero-burn/brasero-file-node.c
index 3a7867d..b2fac94 100644
--- a/libbrasero-burn/brasero-file-node.c
+++ b/libbrasero-burn/brasero-file-node.c
@@ -771,7 +771,14 @@ brasero_file_node_add (BraseroFileNode *parent,
if (BRASERO_FILE_NODE_VIRTUAL (node))
return;
+ stats = brasero_file_node_get_tree_stats (node->parent, &depth);
if (!node->is_imported) {
+ /* book keeping */
+ if (!node->is_file)
+ stats->num_dir ++;
+ else
+ stats->children ++;
+
/* NOTE: parent will be changed afterwards !!! */
if (!node->is_grafted) {
/* propagate the size change*/
@@ -785,7 +792,6 @@ brasero_file_node_add (BraseroFileNode *parent,
/* Even imported should be included. The only type of nodes that are not
* heeded are the virtual nodes. */
- stats = brasero_file_node_get_tree_stats (node->parent, &depth);
if (node->is_file) {
if (depth < 6)
return;
@@ -807,13 +813,19 @@ brasero_file_node_set_from_info (BraseroFileNode *node,
* creation of a graft). If someone wants to set a new name,
* then rename_node is the function. */
- /* update the stats since a file could have been added to the tree but
- * at this point we didn't know what it was (a file or a directory).
- * Only do this if it wasn't a file before. */
- if (!node->is_file
- && (g_file_info_get_file_type (info) != G_FILE_TYPE_DIRECTORY)) {
- /* only count files */
- stats->children ++;
+ if (node->parent) {
+ /* update the stats since a file could have been added to the tree but
+ * at this point we didn't know what it was (a file or a directory).
+ * Only do this if it wasn't a file before.
+ * Do this only if it's in the tree. */
+ if (!node->is_file && (g_file_info_get_file_type (info) != G_FILE_TYPE_DIRECTORY)) {
+ stats->children ++;
+ stats->num_dir --;
+ }
+ else if (node->is_file && (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY)) {
+ stats->children --;
+ stats->num_dir ++;
+ }
}
if (!node->is_symlink
@@ -1129,9 +1141,13 @@ brasero_file_node_destroy_with_children (BraseroFileNode *node,
if (node->is_symlink)
stats->num_sym --;
- /* update file number statistics */
- if (!node->is_imported && node->is_file)
- stats->children --;
+ /* update file/directory number statistics */
+ if (!node->is_imported) {
+ if (node->is_file)
+ stats->children --;
+ else
+ stats->num_dir --;
+ }
}
/* destruction */
diff --git a/libbrasero-burn/brasero-file-node.h b/libbrasero-burn/brasero-file-node.h
index 685b4d2..616e387 100644
--- a/libbrasero-burn/brasero-file-node.h
+++ b/libbrasero-burn/brasero-file-node.h
@@ -72,6 +72,7 @@ typedef struct _BraseroImport BraseroImport;
struct _BraseroFileTreeStats {
guint children;
+ guint num_dir;
guint num_deep;
guint num_2GiB;
guint num_sym;
diff --git a/libbrasero-burn/brasero-track-data-cfg.c b/libbrasero-burn/brasero-track-data-cfg.c
index c4d4030..dea3073 100644
--- a/libbrasero-burn/brasero-track-data-cfg.c
+++ b/libbrasero-burn/brasero-track-data-cfg.c
@@ -2251,8 +2251,22 @@ brasero_track_data_cfg_get_size (BraseroTrack *track,
priv = BRASERO_TRACK_DATA_CFG_PRIVATE (track);
sectors = brasero_data_project_get_sectors (BRASERO_DATA_PROJECT (priv->tree));
- if (blocks)
+ if (blocks) {
+ BraseroFileNode *root;
+ BraseroImageFS fs_type;
+ BraseroFileTreeStats *stats;
+
+ if (!sectors)
+ return sectors;
+
+ fs_type = brasero_track_data_cfg_get_fs (BRASERO_TRACK_DATA (track));
+ root = brasero_data_project_get_root (BRASERO_DATA_PROJECT (priv->tree));
+ stats = BRASERO_FILE_NODE_STATS (root);
+ sectors = brasero_data_project_improve_image_size_accuracy (sectors,
+ stats->num_dir,
+ fs_type);
*blocks = sectors;
+ }
if (block_size)
*block_size = 2048;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]