brasero r1238 - in trunk: . src



Author: philippr
Date: Wed Sep  3 12:17:31 2008
New Revision: 1238
URL: http://svn.gnome.org/viewvc/brasero?rev=1238&view=rev

Log:
	Fix problems in last comment of #543377 No multisession:
	Don\'t crash any more
	Ability to import a disc after the project was loaded

	* src/brasero-data-project.c
	(brasero_data_project_uri_remove_graft),
	(brasero_data_project_remove_node_children_graft_cb),
	(brasero_data_project_node_removed),
	(brasero_data_project_add_imported_session_file),
	(brasero_data_project_load_contents):
	* src/brasero-file-node.c (brasero_file_node_ungraft),
	(brasero_file_node_destroy_with_children):


Modified:
   trunk/ChangeLog
   trunk/src/brasero-data-project.c
   trunk/src/brasero-file-node.c

Modified: trunk/src/brasero-data-project.c
==============================================================================
--- trunk/src/brasero-data-project.c	(original)
+++ trunk/src/brasero-data-project.c	Wed Sep  3 12:17:31 2008
@@ -841,7 +841,7 @@
 		brasero_utils_unregister_string (key);
 
 	if (graft) {
-		/* NOTE: no need to free graft->uri since that's key */
+		/* NOTE: no need to free graft->uri since that's the key */
 		g_slist_free (graft->nodes);
 		g_free (graft);
 	}
@@ -984,7 +984,7 @@
 			continue;
 
 		if (brasero_file_node_is_ancestor (data->node, iter_node))
-			graft->nodes = g_slist_remove (graft->nodes, iter_node);
+			brasero_file_node_ungraft (iter_node);
 	}
 
 	if (graft->nodes)
@@ -1074,24 +1074,18 @@
 		graft = BRASERO_FILE_NODE_GRAFT (node);
 		uri_node = graft->node;
 
-		if (g_slist_length (uri_node->nodes) == 1) {
+		/* NOTE: after this function the graft is invalid */
+		brasero_file_node_ungraft (node);
+
+		if (!uri_node->nodes) {
 			/* that's the last node grafted for this URI.
 			 * There are no more nodes for this URI after.
 			 * See if we should keep the URI in the hash;
 			 * if so, the URI must have parents in the hash
 			 */
-			if (brasero_data_project_uri_has_parent (self, uri_node->uri)) {
-				/* here that means that this URI is 
-				 * nowhere in the tree but has parent
-				 * URIs which are grafted. */
-				g_slist_free (uri_node->nodes);
-				uri_node->nodes = NULL;
-			}
-			else
+			if (!brasero_data_project_uri_has_parent (self, uri_node->uri))
 				brasero_data_project_uri_remove_graft (self, uri_node->uri);
 		}
-		else
-			uri_node->nodes = g_slist_remove (uri_node->nodes, node);
 	}
 	else if (!node->is_imported) {
 		gchar *uri;
@@ -1607,6 +1601,38 @@
 
 	node = brasero_file_node_check_name_existence (parent, BRASERO_VOLUME_FILE_NAME (file));
 	if (node) {
+		/* The node exists but it may be that we've loaded the project
+		 * before. Then the necessary directories to hold the grafted
+		 * files will have been created as fake directories. We need to
+		 * replace those whenever we run into one but not lose their 
+		 * children. */
+		if (node->is_fake && node->is_tmp_parent) {
+			BraseroGraft *graft;
+			BraseroURINode *uri_node;
+
+			graft = BRASERO_FILE_NODE_GRAFT (node);
+			uri_node = graft->node;
+
+			/* NOTE after this function graft is invalid */
+			brasero_file_node_ungraft (node);
+
+			/* see if uri_node is still needed */
+			if (!uri_node->nodes
+			&&  !brasero_data_project_uri_has_parent (self, uri_node->uri))
+				brasero_data_project_uri_remove_graft (self, uri_node->uri);
+
+			node->is_fake = FALSE;
+			node->is_imported = TRUE;
+			node->is_tmp_parent = FALSE;
+
+			/* Something has changed, tell the tree */
+			klass = BRASERO_DATA_PROJECT_GET_CLASS (self);
+			if (klass->node_changed)
+				klass->node_changed (self, node);
+
+			return node;
+		}
+
 		if (brasero_data_project_file_signal (self, NAME_COLLISION_SIGNAL, BRASERO_FILE_NODE_NAME (node)))
 			return NULL;
 
@@ -2839,6 +2865,28 @@
 		/* get the URI for this node. There should be one now that all
 		 * graft nodes are in the tree. */
 		uri = brasero_data_project_node_to_uri (self, tmp);
+		if (!uri) {
+			/* This node has been grafted under a node that was
+			 * imported or was itself an imported node. Since there
+			 * is no imported nodes any more, then it has to become
+			 * fake.
+			 * NOTE: it has to be a directory */
+			tmp->is_fake = TRUE;
+			tmp->is_loading = FALSE;
+			tmp->is_reloading = FALSE;
+			//tmp->is_tmp_parent = FALSE;
+
+			graft = brasero_data_project_uri_ensure_graft (self, NEW_FOLDER);
+			brasero_file_node_graft (tmp, graft);
+
+			priv->loading -= 2;
+
+			/* Signal that something has changed in the tree */
+			if (klass->node_added)
+				klass->node_added (self, tmp, uri);
+
+			continue;
+		}
 
 		/* graft it ? */
 		graft = brasero_data_project_uri_ensure_graft (self, uri);

Modified: trunk/src/brasero-file-node.c
==============================================================================
--- trunk/src/brasero-file-node.c	(original)
+++ trunk/src/brasero-file-node.c	Wed Sep  3 12:17:31 2008
@@ -651,7 +651,7 @@
 	/* Remove it from the URINode list of grafts */
 	graft->node->nodes = g_slist_remove (graft->node->nodes, node);
 
-	/* The name must be exactly the one of the URI*/
+	/* The name must be exactly the one of the URI */
 	node->is_grafted = FALSE;
 	node->union1.name = graft->name;
 
@@ -1006,7 +1006,7 @@
 	BraseroFileNode *next;
 	BraseroImport *import;
 	BraseroGraft *graft;
-
+g_print ("DEESTROYING %s %i\n", BRASERO_FILE_NODE_NAME (node), node->is_grafted);
 	/* destroy all children recursively */
 	for (child = BRASERO_FILE_NODE_CHILDREN (node); child; child = next) {
 		next = child->next;



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