From 40bf5d27b21fedc867bd9f6bd001697bd1077ba1 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 4 Feb 2012 21:09:11 +0000 Subject: -fix crash after lost parent event --- src/fs/gnunet-fs-gtk_event-handler.c | 161 +++++++++++++++++++++-------------- 1 file changed, 99 insertions(+), 62 deletions(-) diff --git a/src/fs/gnunet-fs-gtk_event-handler.c b/src/fs/gnunet-fs-gtk_event-handler.c index ab1fea71..1535f18d 100644 --- a/src/fs/gnunet-fs-gtk_event-handler.c +++ b/src/fs/gnunet-fs-gtk_event-handler.c @@ -402,11 +402,6 @@ start_download (GtkTreeView *tree_view, de->is_directory = GNUNET_FS_meta_data_test_for_directory (meta); if (save_as) have_a_suggestion = GNUNET_NO; - fprintf (stderr, - "lp %d, have-sug: %d\n", - local_parents, - have_a_suggestion); - if ( (GNUNET_YES == local_parents) && (GNUNET_YES == have_a_suggestion) ) /* Skip the dialog, call directly */ @@ -1838,12 +1833,13 @@ mark_download_completed (struct DownloadEntry *de, uint64_t size, * * @param src_model source model * @param src_iter parent of the nodes to move - * @param dst_model destination model + * @param dst_tab destination tab * @param dst_iter new parent of the entries we are moving */ static void copy_children (GtkTreeModel * src_model, GtkTreeIter * src_iter, - GtkTreeModel * dst_model, GtkTreeIter * dst_iter) + struct SearchTab *dst_tab, + GtkTreeIter * dst_iter) { GtkTreeIter src_child; GtkTreeIter dst_child; @@ -1857,7 +1853,8 @@ copy_children (GtkTreeModel * src_model, GtkTreeIter * src_iter, gchar *filename; gchar *uri_as_string; gchar *status_colour; - struct SearchResult *search_result; + struct SearchResult *search_result_old; + struct SearchResult *search_result_new; gchar *mimetype; guint applicability_rank; guint availability_certainty; @@ -1869,26 +1866,53 @@ copy_children (GtkTreeModel * src_model, GtkTreeIter * src_iter, return; do { - gtk_tree_model_get (src_model, &src_child, 0, &meta, 1, &uri, 2, - &filesize, 3, &preview, 4, &percent_progress, 5, - &percent_availability, 6, &filename, 7, - &uri_as_string, 8, &status_colour, 9, &search_result, - 10, &mimetype, 11, &applicability_rank, 12, - &availability_certainty, 13, &availability_rank, 14, - &completed, 15, &downloaded_filename, 16, - &downloaded_anonymity, -1); - gtk_tree_store_insert_with_values (GTK_TREE_STORE (dst_model), &dst_child, - dst_iter, G_MAXINT, 0, meta, 1, uri, 2, - filesize, 3, preview, 4, - percent_progress, 5, - percent_availability, 6, filename, 7, - uri_as_string, 8, status_colour, 9, - search_result, 10, mimetype, 11, - applicability_rank, 12, - availability_certainty, 13, - availability_rank, 14, completed, 15, - downloaded_filename, 16, - downloaded_anonymity, -1); + gtk_tree_model_get (src_model, &src_child, + 0, &meta, + 1, &uri, + 2, &filesize, + 3, &preview, + 4, &percent_progress, + 5, &percent_availability, + 6, &filename, + 7, &uri_as_string, + 8, &status_colour, + 9, &search_result_old, + 10, &mimetype, + 11, &applicability_rank, + 12, &availability_certainty, + 13, &availability_rank, + 14, &completed, + 15, &downloaded_filename, + 16, &downloaded_anonymity, + -1); + search_result_new = GNUNET_malloc (sizeof (struct SearchResult)); + search_result_new->tab = dst_tab; + search_result_new->download = search_result_old->download; + if (NULL != search_result_old->download) + { + search_result_old->download = NULL; + search_result_new->download->sr = search_result_new; + } + gtk_tree_store_insert_with_values (dst_tab->ts, &dst_child, + dst_iter, G_MAXINT, + 0, GNUNET_CONTAINER_meta_data_duplicate (meta), + 1, GNUNET_FS_uri_dup (uri), + 2, filesize, + 3, preview, + 4, percent_progress, + 5, percent_availability, + 6, filename, + 7, uri_as_string, + 8, status_colour, + 9, search_result_new, + 10, mimetype, + 11, applicability_rank, + 12, availability_certainty, + 13, availability_rank, + 14, completed, + 15, downloaded_filename, + 16, downloaded_anonymity, + -1); g_free (filename); g_free (downloaded_filename); g_free (uri_as_string); @@ -1896,36 +1920,17 @@ copy_children (GtkTreeModel * src_model, GtkTreeIter * src_iter, g_free (mimetype); if (preview != NULL) g_object_unref (preview); - gtk_tree_row_reference_free (search_result->rr); - path = gtk_tree_model_get_path (dst_model, &dst_child); - search_result->rr = gtk_tree_row_reference_new (dst_model, path); - search_result->result = NULL; + + path = gtk_tree_model_get_path (GTK_TREE_MODEL (dst_tab->ts), &dst_child); + search_result_new->rr = gtk_tree_row_reference_new (GTK_TREE_MODEL (dst_tab->ts), path); gtk_tree_path_free (path); - copy_children (src_model, &src_child, dst_model, &dst_child); + + copy_children (src_model, &src_child, dst_tab, &dst_child); } while (TRUE == gtk_tree_model_iter_next (src_model, &src_child)); } -/** - * Delete the entire given subtree from the model. Does not free - * anything inside of the respective model's fields (since they have - * been moved). - * - * @param model model that contains the subtree to remove - * @param iter root of the subtree to remove - */ -static void -delete_stale_subtree (GtkTreeModel * model, GtkTreeIter * iter) -{ - GtkTreeIter child; - - while (TRUE == gtk_tree_model_iter_children (model, &child, iter)) - delete_stale_subtree (model, &child); - gtk_tree_store_remove (GTK_TREE_STORE (model), iter); -} - - /** * Handle the case where an active download lost its * search parent by moving it to the URI tab. @@ -1937,19 +1942,25 @@ download_lost_parent (struct DownloadEntry *de) { GtkTreeIter iter; GtkTreePath *path; - GtkTreeRowReference *rr_old; GtkTreeModel *tm_old; GtkTreeIter iter_old; - GtkTreeIter child; GtkTreeModel *model; struct GNUNET_CONTAINER_MetaData *meta; struct GNUNET_FS_Uri *uri; + guint64 completed; + guint percent_progress; + guint percent_availability; + gchar *filename; + gchar *status_colour; + guint applicability_rank; + guint availability_certainty; + gint availability_rank; + gchar *downloaded_filename; + gint downloaded_anonymity; /* find the 'old' root */ - rr_old = de->sr->rr; - tm_old = gtk_tree_row_reference_get_model (rr_old); - path = gtk_tree_row_reference_get_path (rr_old); - gtk_tree_row_reference_free (rr_old); + tm_old = GTK_TREE_MODEL (de->sr->tab->ts); + path = gtk_tree_row_reference_get_path (de->sr->rr); if (! gtk_tree_model_get_iter (tm_old, &iter_old, path)) { GNUNET_break (0); @@ -1960,9 +1971,21 @@ download_lost_parent (struct DownloadEntry *de) gtk_tree_model_get (tm_old, &iter_old, 0, &meta, 1, &uri, + 4, &percent_progress, + 5, &percent_availability, + 6, &filename, + 8, &status_colour, + 11, &applicability_rank, + 12, &availability_certainty, + 13, &availability_rank, + 14, &completed, + 15, &downloaded_filename, + 16, &downloaded_anonymity, -1); GNUNET_assert (GNUNET_YES == GNUNET_FS_uri_test_equal (uri, de->uri)); - + GNUNET_assert (de->sr->download == de); + de->sr->download = NULL; + /* create the target root */ de->sr = GNUNET_GTK_add_to_uri_tab (meta, uri); de->sr->download = de; @@ -1978,10 +2001,24 @@ download_lost_parent (struct DownloadEntry *de) } gtk_tree_path_free (path); + gtk_tree_store_set (de->sr->tab->ts, &iter, + 4, percent_progress, + 5, percent_availability, + 6, filename, + 8, status_colour, + 11, applicability_rank, + 12, availability_certainty, + 13, availability_rank, + 14, completed, + 15, downloaded_filename, + 16, downloaded_anonymity, + -1); + g_free (filename); + g_free (downloaded_filename); + g_free (status_colour); + /* finally, move all children over as well */ - copy_children (tm_old, &iter_old, model, &iter); - while (gtk_tree_model_iter_children (model, &child, &iter)) - delete_stale_subtree (model, &child); + copy_children (tm_old, &iter_old, de->sr->tab, &iter); } -- cgit v1.2.3