gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r19689 - gnunet-gtk/src/fs


From: gnunet
Subject: [GNUnet-SVN] r19689 - gnunet-gtk/src/fs
Date: Sat, 4 Feb 2012 22:09:11 +0100

Author: grothoff
Date: 2012-02-04 22:09:11 +0100 (Sat, 04 Feb 2012)
New Revision: 19689

Modified:
   gnunet-gtk/src/fs/gnunet-fs-gtk_event-handler.c
Log:
-fix crash after lost parent event

Modified: gnunet-gtk/src/fs/gnunet-fs-gtk_event-handler.c
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk_event-handler.c     2012-02-04 20:26:25 UTC 
(rev 19688)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk_event-handler.c     2012-02-04 21:09:11 UTC 
(rev 19689)
@@ -402,11 +402,6 @@
   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 @@
  *
  * @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 @@
   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 @@
     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,37 +1920,18 @@
     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 @@
 {
   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 @@
   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 @@
   }
   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);
 }
 
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]