[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r32425 - gnunet-gtk/src/fs
From: |
gnunet |
Subject: |
[GNUnet-SVN] r32425 - gnunet-gtk/src/fs |
Date: |
Wed, 19 Feb 2014 14:51:25 +0100 |
Author: grothoff
Date: 2014-02-19 14:51:25 +0100 (Wed, 19 Feb 2014)
New Revision: 32425
Modified:
gnunet-gtk/src/fs/gnunet-fs-gtk_event-handler.c
gnunet-gtk/src/fs/gnunet-fs-gtk_event-handler.h
Log:
-move meta/uri into search result instead of just having it in tree model,
benefit from resulting cleaner ownership of the data to eliminate leaks and
possibly some crashes
Modified: gnunet-gtk/src/fs/gnunet-fs-gtk_event-handler.c
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk_event-handler.c 2014-02-19 08:52:25 UTC
(rev 32424)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk_event-handler.c 2014-02-19 13:51:25 UTC
(rev 32425)
@@ -783,14 +783,12 @@
{
struct GNUNET_GTK_MainWindowContext *mctx = GNUNET_FS_GTK_get_main_context
();
struct SearchTab *st = GNUNET_FS_GTK_get_current_search_tab ();
- struct GNUNET_CONTAINER_MetaData *meta;
GtkTreeView *tv;
GtkTreeSelection *sel;
GtkTreeModel *model;
GtkTreeIter iter;
GtkTreeIter parent_iter;
struct SearchResult *sr;
- struct GNUNET_FS_Uri *uri;
GtkTreePath *path;
const gchar *filename;
gchar *downloaddir;
@@ -803,27 +801,25 @@
sel = gtk_tree_view_get_selection (tv);
if (!gtk_tree_selection_get_selected (sel, &model, &iter))
return;
-
- meta = NULL;
-
gtk_tree_model_get (model, &iter,
- SEARCH_TAB_MC_METADATA, &meta,
- SEARCH_TAB_MC_URI, &uri,
SEARCH_TAB_MC_SEARCH_RESULT, &sr,
-1);
-
- if (uri == NULL)
+ if (NULL == sr)
+ {
+ GNUNET_break (0);
return;
-
- if (GNUNET_FS_uri_test_ksk (uri) ||
- GNUNET_FS_uri_test_sks (uri))
+ }
+ GNUNET_assert (NULL != sr->uri);
+ if (GNUNET_FS_uri_test_ksk (sr->uri) ||
+ GNUNET_FS_uri_test_sks (sr->uri))
{
- GNUNET_FS_GTK_handle_uri (uri, 1);
+ GNUNET_FS_GTK_handle_uri (sr->uri, 1);
return;
}
- if (!((NULL == sr->download) && (NULL != uri) &&
- ((GNUNET_FS_uri_test_chk (uri) || GNUNET_FS_uri_test_loc (uri)))))
+ if (!((NULL == sr->download) && (NULL != sr->uri) &&
+ ((GNUNET_FS_uri_test_chk (sr->uri) ||
+ GNUNET_FS_uri_test_loc (sr->uri)))))
return;
path = gtk_tree_model_get_path (model, &iter);
@@ -845,7 +841,7 @@
/* else pde remains zero */
setup_download_list_entry (de, de->pde, sr);
- de->uri = GNUNET_FS_uri_dup (uri);
+ de->uri = GNUNET_FS_uri_dup (sr->uri);
GNUNET_asprintf (&de->filename,
"%s%s%s",
downloaddir,
@@ -858,7 +854,7 @@
else
de->anonymity = 1;
de->is_recursive = recursive;
- de->is_directory = GNUNET_FS_meta_data_test_for_directory (meta);
+ de->is_directory = GNUNET_FS_meta_data_test_for_directory (sr->meta);
if (save_as == GNUNET_NO)
GNUNET_FS_GTK_download_context_start_download (de);
@@ -1299,9 +1295,7 @@
GtkWidget *child;
GtkTreePath *path;
struct SearchResult *sr;
- struct GNUNET_FS_Uri *uri;
struct SearchListPopupContext *spc;
- struct GNUNET_CONTAINER_MetaData *meta;
int is_directory = GNUNET_NO;
struct UriPopulationContext uri_pop_ctx;
@@ -1311,18 +1305,22 @@
spc->rr = gtk_tree_row_reference_new (tm, path);
gtk_tree_path_free (path);
gtk_tree_model_get (tm, iter,
- SEARCH_TAB_MC_URI, &uri,
- SEARCH_TAB_MC_METADATA, &meta,
SEARCH_TAB_MC_SEARCH_RESULT, &sr,
-1);
- if (meta != NULL)
- is_directory = GNUNET_FS_meta_data_test_for_directory (meta);
+ if (NULL == sr)
+ {
+ GNUNET_break (0);
+ return;
+ }
+ if (NULL != sr->meta)
+ is_directory = GNUNET_FS_meta_data_test_for_directory (sr->meta);
spc->sr = sr;
menu = GTK_MENU (gtk_menu_new ());
if ( (NULL == sr->download) &&
- (NULL != uri) &&
- ( (GNUNET_FS_uri_test_chk (uri) || GNUNET_FS_uri_test_loc (uri))) )
+ (NULL != sr->uri) &&
+ ( (GNUNET_FS_uri_test_chk (sr->uri) ||
+ GNUNET_FS_uri_test_loc (sr->uri))) )
{
/* only display download menus if there is a URI */
child = gtk_menu_item_new_with_label (_("_Download"));
@@ -1364,7 +1362,7 @@
/* check for embedded URIs */
uri_pop_ctx.counter = 0;
uri_pop_ctx.menu = menu;
- find_embedded_uris (meta,
+ find_embedded_uris (sr->meta,
&populate_popup_with_uri_items,
&uri_pop_ctx);
if (0 < uri_pop_ctx.counter)
@@ -1387,7 +1385,7 @@
gtk_widget_show (child);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), child);
}
- if (NULL != uri)
+ if (NULL != sr->uri)
{
child = gtk_menu_item_new_with_label (_("_Copy URI to Clipboard"));
g_signal_connect (child, "activate",
@@ -1633,13 +1631,11 @@
* @param iter parent of the subtree to check
*/
static void
-move_downloads_in_subtree (GtkTreeModel *tm,
+remove_results_in_subtree (GtkTreeModel *tm,
GtkTreeIter *iter)
{
GtkTreeIter child;
struct SearchResult *sr;
- struct GNUNET_CONTAINER_MetaData *meta;
- struct GNUNET_FS_Uri *uri;
if (gtk_tree_model_iter_children (tm,
&child,
@@ -1647,21 +1643,12 @@
{
do
{
- if (NULL != sr->download)
- {
- download_lost_parent (sr->download);
- continue;
- }
gtk_tree_model_get (tm, &child,
- SEARCH_TAB_MC_METADATA, &meta,
- SEARCH_TAB_MC_URI, &uri,
SEARCH_TAB_MC_SEARCH_RESULT, &sr,
-1);
- move_downloads_in_subtree (tm, &child);
- GNUNET_FS_uri_destroy (uri);
- if (NULL != meta)
- GNUNET_CONTAINER_meta_data_destroy (meta);
+ remove_results_in_subtree (tm, &child);
gtk_tree_row_reference_free (sr->rr);
+ sr->rr = NULL;
if (NULL != sr->probe)
{
GNUNET_FS_probe_stop (sr->probe);
@@ -1670,13 +1657,29 @@
pl_tail,
sr);
}
- GNUNET_free (sr);
/* get ready for removal of the tree */
gtk_tree_store_set (GTK_TREE_STORE (tm), &child,
SEARCH_TAB_MC_METADATA, NULL,
SEARCH_TAB_MC_URI, NULL,
SEARCH_TAB_MC_SEARCH_RESULT, NULL,
-1);
+ if (NULL != sr->download)
+ {
+ /* 'sr' still referenced from download; do not free */
+ sr->tab = NULL;
+ continue;
+ }
+ if (NULL != sr->uri)
+ {
+ GNUNET_FS_uri_destroy (sr->uri);
+ sr->uri = NULL;
+ }
+ if (NULL != sr->meta)
+ {
+ GNUNET_CONTAINER_meta_data_destroy (sr->meta);
+ sr->meta = NULL;
+ }
+ GNUNET_free (sr);
}
while (gtk_tree_model_iter_next (tm, &child));
}
@@ -1697,39 +1700,37 @@
GtkTreePath *tp;
GtkTreeModel *tm;
GtkTreeIter iter;
- struct GNUNET_FS_Uri *uri;
- struct GNUNET_CONTAINER_MetaData *meta;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Freeing a search result SR=%p\n",
sr);
- if ( (NULL == sr) ||
- (NULL == sr->rr) ||
- (NULL == (tm = gtk_tree_row_reference_get_model (sr->rr))) ||
- (NULL == (tp = gtk_tree_row_reference_get_path (sr->rr))) )
+ if (NULL == sr)
{
GNUNET_break (0);
return;
}
- if (! gtk_tree_model_get_iter (tm, &iter, tp))
+ if ( (NULL != sr->rr) &&
+ (NULL != (tm = gtk_tree_row_reference_get_model (sr->rr))) &&
+ (NULL != (tp = gtk_tree_row_reference_get_path (sr->rr))) )
{
- GNUNET_break (0);
+ if (! gtk_tree_model_get_iter (tm, &iter, tp))
+ {
+ GNUNET_break (0);
+ gtk_tree_path_free (tp);
+ return;
+ }
+ /* get ready for later removal of the tree */
+ gtk_tree_store_set (GTK_TREE_STORE (tm), &iter,
+ SEARCH_TAB_MC_METADATA, NULL,
+ SEARCH_TAB_MC_URI, NULL,
+ SEARCH_TAB_MC_SEARCH_RESULT, NULL,
+ -1);
gtk_tree_path_free (tp);
- return;
- }
- gtk_tree_path_free (tp);
- gtk_tree_model_get (tm, &iter,
- SEARCH_TAB_MC_METADATA, &meta,
- SEARCH_TAB_MC_URI, &uri,
- -1);
- if (NULL != uri)
- GNUNET_FS_uri_destroy (uri);
- if (NULL != meta)
- GNUNET_CONTAINER_meta_data_destroy (meta);
- if (NULL != sr->rr)
- {
gtk_tree_row_reference_free (sr->rr);
sr->rr = NULL;
+ remove_results_in_subtree (tm, &iter);
+ GNUNET_FS_GTK_remove_treestore_subtree (GTK_TREE_STORE (tm),
+ &iter);
}
if (NULL != sr->probe)
{
@@ -1739,9 +1740,23 @@
pl_tail,
sr);
}
+ if (NULL != sr->download)
+ {
+ /* 'sr' still referenced from download; do not free */
+ sr->tab = NULL;
+ return;
+ }
+ if (NULL != sr->uri)
+ {
+ GNUNET_FS_uri_destroy (sr->uri);
+ sr->uri = NULL;
+ }
+ if (NULL != sr->meta)
+ {
+ GNUNET_CONTAINER_meta_data_destroy (sr->meta);
+ sr->meta = NULL;
+ }
GNUNET_free (sr);
- move_downloads_in_subtree (tm, &iter);
- GNUNET_FS_GTK_remove_treestore_subtree (GTK_TREE_STORE (tm), &iter);
}
@@ -1759,11 +1774,9 @@
GtkTreeSelection *sel;
GtkTreeModel *model;
GtkTreeIter iter;
- struct GNUNET_CONTAINER_MetaData *meta;
GdkPixbuf *pixbuf;
GtkTreePath *selpath;
struct SearchResult *sr;
- struct GNUNET_FS_Uri *uri;
struct GNUNET_GTK_MainWindowContext *mctx = GNUNET_FS_GTK_get_main_context
();
gtk_list_store_clear (mctx->md_liststore);
@@ -1778,21 +1791,21 @@
current_selected_search_result = NULL;
return;
}
- meta = NULL;
pixbuf = NULL;
-
gtk_tree_model_get (model, &iter,
- SEARCH_TAB_MC_METADATA, &meta,
SEARCH_TAB_MC_PREVIEW, &pixbuf,
- SEARCH_TAB_MC_URI, &uri,
SEARCH_TAB_MC_SEARCH_RESULT, &sr,
-1);
-
+ if (NULL == sr)
+ return;
selpath = gtk_tree_model_get_path (model, &iter);
- if (current_selected_search_result == NULL || gtk_tree_path_compare
(selpath, current_selected_search_result) != 0)
+ if ( (NULL == current_selected_search_result) ||
+ (0 != gtk_tree_path_compare (selpath, current_selected_search_result)) )
{
- if ((NULL == sr->download) && (NULL != uri) &&
- ((GNUNET_FS_uri_test_chk (uri) || GNUNET_FS_uri_test_loc (uri))))
+ if ( (NULL == sr->download) &&
+ (NULL != sr->uri) &&
+ ( (GNUNET_FS_uri_test_chk (sr->uri) ||
+ GNUNET_FS_uri_test_loc (sr->uri)) ) )
{
char *download_directory;
char *filename;
@@ -1803,9 +1816,10 @@
anonymity = -1;
download_directory = NULL;
filename = get_suggested_filename_anonymity2 (model, &iter,
- &download_directory, &anonymity);
+ &download_directory,
+ &anonymity);
- is_directory = GNUNET_FS_meta_data_test_for_directory (meta);
+ is_directory = GNUNET_FS_meta_data_test_for_directory (sr->meta);
gtk_widget_set_sensitive (GTK_WIDGET
(mctx->download_recursive_checkbutton), is_directory);
/* TODO: make this configurable */
@@ -1839,8 +1853,8 @@
else
gtk_image_clear (mctx->preview_image);
- if (NULL != meta)
- GNUNET_CONTAINER_meta_data_iterate (meta,
+ if (NULL != sr->meta)
+ GNUNET_CONTAINER_meta_data_iterate (sr->meta,
&GNUNET_FS_GTK_add_meta_data_to_list_store,
mctx->md_liststore);
}
@@ -1979,6 +1993,8 @@
gtk_tree_model_get (tm, &child,
SEARCH_TAB_MC_SEARCH_RESULT, &sr,
-1);
+ if (NULL == sr)
+ continue;
if ( (NULL != sr->download) &&
(GNUNET_YES == sr->download->is_done) )
{
@@ -2022,6 +2038,11 @@
gtk_tree_model_get (tm, &iter,
SEARCH_TAB_MC_SEARCH_RESULT, &sr,
-1);
+ if (NULL == sr)
+ {
+ GNUNET_break (0);
+ continue;
+ }
if ( (NULL != sr->download) &&
(GNUNET_YES == sr->download->is_done) )
{
@@ -2100,7 +2121,6 @@
struct GNUNET_TIME_Relative probe_time)
{
GtkTreeIter iter;
- struct GNUNET_CONTAINER_MetaData *ometa;
GtkTreeView *tv;
GtkTreePath *tp;
GtkTreeStore *ts;
@@ -2129,17 +2149,18 @@
desc = GNUNET_FS_GTK_get_description_from_metadata (meta, &desc_is_a_dup);
mime = get_mimetype_from_metadata (meta);
pixbuf = GNUNET_FS_GTK_get_thumbnail_from_meta_data (meta);
- gtk_tree_model_get (tm, &iter,
- SEARCH_TAB_MC_METADATA, &ometa,
- -1);
- if (NULL != ometa)
- GNUNET_CONTAINER_meta_data_destroy (ometa);
+ if (NULL != sr->meta)
+ {
+ GNUNET_CONTAINER_meta_data_destroy (sr->meta);
+ sr->meta = NULL;
+ }
+ sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta);
if (availability_certainty > 0)
percent_avail = 50 + (gint) (availability_rank * 50.0 /
availability_certainty);
else
percent_avail = 50;
gtk_tree_store_set (ts, &iter,
- SEARCH_TAB_MC_METADATA,
GNUNET_CONTAINER_meta_data_duplicate (meta),
+ SEARCH_TAB_MC_METADATA, sr->meta,
SEARCH_TAB_MC_PREVIEW, pixbuf,
SEARCH_TAB_MC_PERCENT_AVAILABILITY, (guint)
percent_avail,
SEARCH_TAB_MC_UNKNOWN_AVAILABILITY, (0 ==
availability_certainty) ? (gint) (probe_time.rel_value_us /
GNUNET_FS_PROBE_UPDATE_FREQUENCY.rel_value_us) : -1,
@@ -2153,7 +2174,7 @@
{
get_download_list_entry (sr->download, &iter);
gtk_tree_store_set (downloads_treestore, &iter,
- SEARCH_TAB_MC_METADATA,
GNUNET_CONTAINER_meta_data_duplicate (meta),
+ SEARCH_TAB_MC_METADATA, sr->meta,
SEARCH_TAB_MC_PREVIEW, pixbuf,
SEARCH_TAB_MC_PERCENT_AVAILABILITY, (guint)
percent_avail,
SEARCH_TAB_MC_UNKNOWN_AVAILABILITY, (0 ==
availability_certainty) ? (gint) (probe_time.rel_value_us /
GNUNET_FS_PROBE_UPDATE_FREQUENCY.rel_value_us) : -1,
@@ -2329,9 +2350,11 @@
else
ts = downloads_treestore;
}
+ sr->uri = (uri == NULL) ? NULL : GNUNET_FS_uri_dup (uri);
+ sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta);
gtk_tree_store_insert_with_values (ts, &iter, pitr, G_MAXINT,
- SEARCH_TAB_MC_METADATA,
GNUNET_CONTAINER_meta_data_duplicate (meta),
- SEARCH_TAB_MC_URI, (uri == NULL) ? NULL :
GNUNET_FS_uri_dup (uri),
+ SEARCH_TAB_MC_METADATA, sr->meta,
+ SEARCH_TAB_MC_URI, sr->uri,
SEARCH_TAB_MC_FILESIZE, fsize,
SEARCH_TAB_MC_PREVIEW, pixbuf,
SEARCH_TAB_MC_PERCENT_PROGRESS, 0,
Modified: gnunet-gtk/src/fs/gnunet-fs-gtk_event-handler.h
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk_event-handler.h 2014-02-19 08:52:25 UTC
(rev 32424)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk_event-handler.h 2014-02-19 13:51:25 UTC
(rev 32425)
@@ -207,6 +207,16 @@
struct SearchResult *prev;
/**
+ * URI corresponding to the result.
+ */
+ struct GNUNET_FS_Uri *uri;
+
+ /**
+ * Meta data associated with the result.
+ */
+ struct GNUNET_CONTAINER_MetaData *meta;
+
+ /**
* Where in the tab is this result?
*/
GtkTreeRowReference *rr;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r32425 - gnunet-gtk/src/fs,
gnunet <=