From 283a796b4c7f91e46360ae2984d4bf556ec9111b Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 4 Feb 2012 19:30:06 +0000 Subject: -simplify data structures by eliminating the DownloadContext -- virtually a full duplicate of the DownloadEntry --- src/fs/gnunet-fs-gtk_download-save-as.c | 139 ++++++++++--------------- src/fs/gnunet-fs-gtk_download-save-as.h | 73 +++---------- src/fs/gnunet-fs-gtk_event-handler.c | 175 ++++++++++++-------------------- src/fs/gnunet-fs-gtk_event-handler.h | 65 ++++++++++-- src/fs/gnunet-fs-gtk_open-directory.c | 2 +- src/fs/gnunet-fs-gtk_open-uri.c | 10 +- 6 files changed, 193 insertions(+), 271 deletions(-) diff --git a/src/fs/gnunet-fs-gtk_download-save-as.c b/src/fs/gnunet-fs-gtk_download-save-as.c index 8cf3b1de..63b711cd 100644 --- a/src/fs/gnunet-fs-gtk_download-save-as.c +++ b/src/fs/gnunet-fs-gtk_download-save-as.c @@ -34,10 +34,10 @@ struct DownloadAsDialogContext { /** - * Download context for which this dialog determines the + * Download entry for which this dialog determines the * filename (and other options). */ - struct DownloadContext *dc; + struct DownloadEntry *de; /** * Builder for the dialog. @@ -53,21 +53,24 @@ struct DownloadAsDialogContext /** - * Free resources associated with the given download context. + * Free resources associated with the given download entry. * - * @param dc context to free + * @param de context to free */ -static void -save_as_dialog_free_download_context (struct DownloadContext *dc) +void +GNUNET_FS_GTK_free_download_entry (struct DownloadEntry *de) { - if (NULL != dc->rr) - gtk_tree_row_reference_free (dc->rr); - GNUNET_free_non_null (dc->filename); - if (NULL != dc->meta) - GNUNET_CONTAINER_meta_data_destroy (dc->meta); - if (NULL != dc->uri) - GNUNET_FS_uri_destroy (dc->uri); - GNUNET_free (dc); + GNUNET_assert (NULL == de->dc); + if (NULL != de->sr) + { + GNUNET_assert (de->sr->download == de); + de->sr->download = NULL; + } + GNUNET_free_non_null (de->filename); + if (NULL != de->meta) + GNUNET_CONTAINER_meta_data_destroy (de->meta); + GNUNET_FS_uri_destroy (de->uri); + GNUNET_free (de); } @@ -87,7 +90,7 @@ GNUNET_GTK_save_as_dialog_delete_event_cb (GtkWidget * widget, GdkEvent * event, { struct DownloadAsDialogContext *dlc = user_data; - save_as_dialog_free_download_context (dlc->dc); + GNUNET_FS_GTK_free_download_entry (dlc->de); g_object_unref (G_OBJECT (dlc->builder)); GNUNET_free (dlc); return FALSE; @@ -108,37 +111,36 @@ GNUNET_GTK_save_as_dialog_response_cb (GtkDialog * dialog, gpointer user_data) { struct DownloadAsDialogContext *dlc = user_data; - struct DownloadContext *dc; + struct DownloadEntry *de; GtkToggleButton *cb; - dc = dlc->dc; - + de = dlc->de; if (GTK_RESPONSE_OK != response_id) { - save_as_dialog_free_download_context (dc); + GNUNET_FS_GTK_free_download_entry (de); gtk_widget_destroy (GTK_WIDGET (dialog)); g_object_unref (G_OBJECT (dlc->builder)); GNUNET_free (dlc); return; } - GNUNET_free_non_null (dc->filename); - dc->filename = + GNUNET_free_non_null (de->filename); + de->filename = GNUNET_GTK_filechooser_get_filename_utf8 (GTK_FILE_CHOOSER (dlc->dialog)); cb = GTK_TOGGLE_BUTTON (gtk_builder_get_object (dlc->builder, "GNUNET_GTK_save_as_recursive_check_button")); - dc->is_recursive = + de->is_recursive = (TRUE == gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cb))) ? GNUNET_YES : GNUNET_NO; - dc->anonymity = - gtk_spin_button_get_value (GTK_SPIN_BUTTON - (gtk_builder_get_object - (dlc->builder, - "GNUNET_GTK_save_as_dialog_anonymity_spin_button"))); + de->anonymity = + (uint32_t) gtk_spin_button_get_value (GTK_SPIN_BUTTON + (gtk_builder_get_object + (dlc->builder, + "GNUNET_GTK_save_as_dialog_anonymity_spin_button"))); gtk_widget_destroy (GTK_WIDGET (dialog)); g_object_unref (G_OBJECT (dlc->builder)); GNUNET_free (dlc); - GNUNET_FS_GTK_download_context_start_download (dc); + GNUNET_FS_GTK_download_context_start_download (de); } @@ -147,23 +149,23 @@ GNUNET_GTK_save_as_dialog_response_cb (GtkDialog * dialog, * continutation when the dialog is complete. Will release the 'dc' * resources if the dialog is cancelled. * - * @param dc download context for the file/directory + * @param de download context for the file/directory */ void -GNUNET_FS_GTK_open_download_as_dialog (struct DownloadContext *dc) +GNUNET_FS_GTK_open_download_as_dialog (struct DownloadEntry *de) { struct DownloadAsDialogContext *dlc; GtkWidget *cb; dlc = GNUNET_malloc (sizeof (struct DownloadAsDialogContext)); - dlc->dc = dc; + dlc->de = de; dlc->builder = GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_download_as_dialog.glade", dlc); if (NULL == dlc->builder) { GNUNET_break (0); - save_as_dialog_free_download_context (dc); + GNUNET_FS_GTK_free_download_entry (de); GNUNET_free (dlc); return; } @@ -174,18 +176,18 @@ GNUNET_FS_GTK_open_download_as_dialog (struct DownloadContext *dc) set recursive 'default' value based on what the 'dc' tells us */ cb = GTK_WIDGET (gtk_builder_get_object (dlc->builder, "GNUNET_GTK_save_as_recursive_check_button")); - if (GNUNET_FS_meta_data_test_for_directory (dc->meta)) + if (GNUNET_FS_meta_data_test_for_directory (de->meta)) gtk_widget_set_sensitive (cb, TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cb), - dc->is_recursive); + de->is_recursive); /* initialize filename based on filename from 'dc' */ - if (NULL != dc->filename) + if (NULL != de->filename) { char *dirname; char *basename; - dirname = GNUNET_strdup (dc->filename); + dirname = GNUNET_strdup (de->filename); basename = (char *) GNUNET_STRINGS_get_short_name (dirname); /* basename now points into 'dirname'; cut 'dirname' off at the '/' before basename */ if (basename > dirname) @@ -194,7 +196,7 @@ GNUNET_FS_GTK_open_download_as_dialog (struct DownloadContext *dc) /* FIXME: remove following lines after testing... */ fprintf (stderr, "Splitting `%s' into `%s' + `%s' for file chooser dialog.\n", - dc->filename, + de->filename, dirname, basename); @@ -214,74 +216,45 @@ GNUNET_FS_GTK_open_download_as_dialog (struct DownloadContext *dc) * respective tree model and trigger a start of the download using the * FS-API. * - * @param dc download context of the download to execute + * @param de download context of the download to execute */ void -GNUNET_FS_GTK_download_context_start_download (struct DownloadContext *dc) +GNUNET_FS_GTK_download_context_start_download (struct DownloadEntry *de) { enum GNUNET_FS_DownloadOptions opt; struct GNUNET_FS_Handle *fs; - struct DownloadEntry *de; uint64_t len; - GtkTreeIter iter; - GtkTreePath *path; - de = GNUNET_malloc (sizeof (struct DownloadEntry)); - de->uri = dc->uri; - dc->uri = NULL; - de->meta = dc->meta; - de->tab = dc->tab; - dc->meta = NULL; - if (NULL != dc->rr) - { - de->rr = gtk_tree_row_reference_copy (dc->rr); - path = gtk_tree_row_reference_get_path (de->rr); - if ( (NULL != path) && - (gtk_tree_model_get_iter (GTK_TREE_MODEL (de->tab->ts), &iter, path)) ) - { - /* Store filename and anonymity as specified by the user. - * These will be re-used when this is a directory, and the user - * downloads its children. - */ - gtk_tree_store_set (de->tab->ts, &iter, 15, dc->filename, 16, dc->anonymity, -1); - } - else - { - /* We could not find the referenced row in the search tab; this is - conceivable as the search tab might have been closed by the - user while the 'save as' dialog was open. In this case, this - is equivalent to having no search, so we drop the (now invalid) - 'sr' reference */ - dc->sr = NULL; - } - if (NULL != path) - gtk_tree_path_free (path); - } fs = GNUNET_FS_GTK_get_fs_handle (); opt = GNUNET_FS_DOWNLOAD_OPTION_NONE; - if (dc->is_recursive) + if (de->is_recursive) opt |= GNUNET_FS_DOWNLOAD_OPTION_RECURSIVE; len = GNUNET_FS_uri_chk_get_file_size (de->uri); - if (NULL != dc->sr) + if (NULL != de->sr) { GNUNET_break (NULL != - GNUNET_FS_download_start_from_search (fs, dc->sr, - dc->filename, + GNUNET_FS_download_start_from_search (fs, + de->sr->result, + de->filename, NULL /* tempname */ , 0 /* offset */ , - len, dc->anonymity, opt, + len, + de->anonymity, opt, de)); } else { GNUNET_break (NULL != - GNUNET_FS_download_start (fs, de->uri, NULL /* meta */ , - dc->filename, NULL /* tempname */ , + GNUNET_FS_download_start (fs, + de->uri, + de->meta, + de->filename, NULL /* tempname */ , 0 /* offset */ , - len, dc->anonymity, opt, de, - NULL /* parent download ctx */ )); + len, + de->anonymity, opt, + de, + (NULL != de->pde) ? de->pde->dc : NULL)); } - save_as_dialog_free_download_context (dc); } diff --git a/src/fs/gnunet-fs-gtk_download-save-as.h b/src/fs/gnunet-fs-gtk_download-save-as.h index 37a6e3a9..db0f8018 100644 --- a/src/fs/gnunet-fs-gtk_download-save-as.h +++ b/src/fs/gnunet-fs-gtk_download-save-as.h @@ -27,62 +27,7 @@ #define GNUNET_FS_GTK_DOWNLOAD_SAVE_AS_H #include "gnunet-fs-gtk_common.h" - - -/** - * Information we keep for a download. - */ -struct DownloadContext; - - -/** - * Information we keep for a download. - */ -struct DownloadContext -{ - /** - * URI for the download. - */ - struct GNUNET_FS_Uri *uri; - - /** - * Meta data. - */ - struct GNUNET_CONTAINER_MetaData *meta; - - /** - * Suggested filename, or NULL. - */ - char *filename; - - /** - * Row reference (if URI was found by search, or - * part of directory, etc.); otherwise NULL (download by URI). - */ - GtkTreeRowReference *rr; - - /** - * Associated search result, or NULL. - */ - struct GNUNET_FS_SearchResult *sr; - - /** - * Is this a recursive download? - */ - int is_recursive; - - /** - * Desired (default) anonymity level. - */ - int anonymity; - - /** - * Tab where this download is currently on display. - * (this is the same as sr->tab, but sr is opaque here). - */ - struct SearchTab *tab; - -}; +#include "gnunet-fs-gtk_event-handler.h" /** @@ -91,10 +36,10 @@ struct DownloadContext * respective tree model and trigger a start of the download using the * FS-API. * - * @param dc download context of the download to execute + * @param de download entry of the download to execute */ void -GNUNET_FS_GTK_download_context_start_download (struct DownloadContext *dc); +GNUNET_FS_GTK_download_context_start_download (struct DownloadEntry *de); /** @@ -106,7 +51,17 @@ GNUNET_FS_GTK_download_context_start_download (struct DownloadContext *dc); * @param dc download context for the file/directory */ void -GNUNET_FS_GTK_open_download_as_dialog (struct DownloadContext *dc); +GNUNET_FS_GTK_open_download_as_dialog (struct DownloadEntry *de); + + +/** + * Free resources associated with the given download entry. + * + * @param de context to free + */ +void +GNUNET_FS_GTK_free_download_entry (struct DownloadEntry *de); + #endif diff --git a/src/fs/gnunet-fs-gtk_event-handler.c b/src/fs/gnunet-fs-gtk_event-handler.c index 5c0a5710..ae0ab3db 100644 --- a/src/fs/gnunet-fs-gtk_event-handler.c +++ b/src/fs/gnunet-fs-gtk_event-handler.c @@ -88,37 +88,6 @@ struct PublishEntry }; -/** - * Information we keep for each search result entry in any search tab. - * An entry like this is also generated for downloads by-URI. Used to - * quickly identify the tab and row of the result; stored in the - * user-context of the FS library for the search result. - */ -struct SearchResult -{ - /** - * Where in the tab is this result? - */ - GtkTreeRowReference *rr; - - /** - * Tab storing this result. - */ - struct SearchTab *tab; - - /** - * Search result for top-level results and - * namespace-update results. - */ - struct GNUNET_FS_SearchResult *result; - - /** - * Associated download, or NULL for none. - */ - struct DownloadEntry *download; -}; - - /** * Head of linked list of tabs for searches. @@ -327,7 +296,7 @@ start_download (GtkTreeView *tree_view, struct GNUNET_FS_Uri *uri; struct GNUNET_CONTAINER_MetaData *meta; struct SearchResult *sr; - struct DownloadContext *dc; + struct DownloadEntry *de; char *buf = NULL; char *tmp; size_t tmplen; @@ -357,6 +326,11 @@ start_download (GtkTreeView *tree_view, have no URI and downloading makes no sense. Ignore! */ return; } + if (NULL != sr->download) + { + /* download already active! */ + return; + } if (!(GNUNET_FS_uri_test_chk (uri) || GNUNET_FS_uri_test_loc (uri))) { /* can only download chk/loc URIs, ignore */ @@ -414,16 +388,14 @@ start_download (GtkTreeView *tree_view, GNUNET_free_non_null (filename); /* now setup everything for the save-as dialog */ - dc = GNUNET_malloc (sizeof (struct DownloadContext)); - dc->uri = GNUNET_FS_uri_dup (uri); - - dc->filename = buf; - dc->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); - dc->rr = gtk_tree_row_reference_new (tm, path); - dc->sr = sr->result; - dc->anonymity = anonymity; - dc->is_recursive = is_recursive; - dc->tab = tab; + de = GNUNET_malloc (sizeof (struct DownloadEntry)); + de->uri = GNUNET_FS_uri_dup (uri); + de->filename = buf; + de->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); + de->sr = sr; + sr->download = de; + de->anonymity = anonymity; + de->is_recursive = is_recursive; fprintf (stderr, "lp %d, have-sug: %d\n", local_parents, @@ -431,9 +403,9 @@ start_download (GtkTreeView *tree_view, if ( (GNUNET_YES == local_parents) && (GNUNET_YES == have_a_suggestion) ) /* Skip the dialog, call directly */ - GNUNET_FS_GTK_download_context_start_download (dc); + GNUNET_FS_GTK_download_context_start_download (de); else - GNUNET_FS_GTK_open_download_as_dialog (dc); + GNUNET_FS_GTK_open_download_as_dialog (de); } @@ -1511,18 +1483,16 @@ setup_inner_search (struct GNUNET_FS_SearchContext *sc, * Setup a new top-level entry in the URI/orphan tab. If necessary, create * the URI tab first. * - * @param iter set to the new entry (OUT only) - * @param srp set to search result (can be NULL) + * @param iter set to the new entry (OUT only) -- FIXME: remove, obtainable as 'RETVAL->rr' * @param meta metadata for the new entry * @param uri URI for the new entry - * @return the 'uri_tab' the result was added to + * @return the search result that was set up */ -struct SearchTab * -GNUNET_GTK_add_to_uri_tab (GtkTreeIter *iter, struct SearchResult **srp, +struct SearchResult * +GNUNET_GTK_add_to_uri_tab (GtkTreeIter *iter, const struct GNUNET_CONTAINER_MetaData *meta, const struct GNUNET_FS_Uri *uri) { - struct SearchResult *sr; GtkNotebook *notebook; gint page; @@ -1542,10 +1512,7 @@ GNUNET_GTK_add_to_uri_tab (GtkTreeIter *iter, struct SearchResult **srp, gtk_notebook_set_current_page (notebook, page); break; } - sr = GNUNET_GTK_add_search_result (uri_tab, iter, NULL, uri, meta, NULL, 0); - if (NULL != srp) - *srp = sr; - return uri_tab; + return GNUNET_GTK_add_search_result (uri_tab, iter, NULL, uri, meta, NULL, 0); } @@ -1570,15 +1537,15 @@ change_download_color (struct DownloadEntry *de, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Changing download DE=%p color to %s\n", de, color); - path = gtk_tree_row_reference_get_path (de->rr); - if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (de->tab->ts), &iter, path)) + path = gtk_tree_row_reference_get_path (de->sr->rr); + if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (de->sr->tab->ts), &iter, path)) { GNUNET_break (0); gtk_tree_path_free (path); return; } gtk_tree_path_free (path); - gtk_tree_store_set (de->tab->ts, &iter, 8, color, -1); + gtk_tree_store_set (de->sr->tab->ts, &iter, 8, color, -1); } @@ -1591,16 +1558,8 @@ change_download_color (struct DownloadEntry *de, static void stop_download (struct DownloadEntry *de) { - if (NULL != de->sr) - { - GNUNET_assert (de->sr->download == de); - de->sr->download = NULL; - } change_download_color (de, "white"); - gtk_tree_row_reference_free (de->rr); - GNUNET_FS_uri_destroy (de->uri); - GNUNET_CONTAINER_meta_data_destroy (de->meta); - GNUNET_free (de); + GNUNET_FS_GTK_free_download_entry (de); } @@ -1732,8 +1691,8 @@ mark_download_progress (struct DownloadEntry *de, uint64_t size, "Marking download progress for DE=%p, %llu/%llu, %llu@%llu depth=%u\n", de, completed, size, block_size, offset, depth); - path = gtk_tree_row_reference_get_path (de->rr); - if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (de->tab->ts), &iter, path)) + path = gtk_tree_row_reference_get_path (de->sr->rr); + if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (de->sr->tab->ts), &iter, path)) { GNUNET_break (0); gtk_tree_path_free (path); @@ -1744,7 +1703,7 @@ mark_download_progress (struct DownloadEntry *de, uint64_t size, 'progress' once the download has started and re-use the space in the display? Probably yes, at least once we have a custom CellRenderer... */ - gtk_tree_store_set (de->tab->ts, &iter, + gtk_tree_store_set (de->sr->tab->ts, &iter, 4, (guint) ((size > 0) ? (100 * completed / size) : 100) /* progress */, @@ -1760,8 +1719,8 @@ mark_download_progress (struct DownloadEntry *de, uint64_t size, /* got a data block of a directory, list its contents */ struct AddDirectoryEntryContext ade; - ade.tab = de->tab; - ade.prr = de->rr; + ade.tab = de->sr->tab; + ade.prr = de->sr->rr; ade.check_duplicates = GNUNET_NO; if (GNUNET_SYSERR == GNUNET_FS_directory_list_contents ((size_t) block_size, block_data, @@ -1771,7 +1730,7 @@ mark_download_progress (struct DownloadEntry *de, uint64_t size, GNUNET_break (GNUNET_OK == GNUNET_CONTAINER_meta_data_delete (de->meta, EXTRACTOR_METATYPE_MIMETYPE, NULL, 0)); - gtk_tree_store_set (de->tab->ts, &iter, + gtk_tree_store_set (de->sr->tab->ts, &iter, 10, "" /* unknown mime type */, -1); } } @@ -1794,15 +1753,15 @@ mark_download_error (struct DownloadEntry *de, change_download_color (de, "red"); de->is_done = GNUNET_YES; - path = gtk_tree_row_reference_get_path (de->rr); - if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (de->tab->ts), &iter, path)) + path = gtk_tree_row_reference_get_path (de->sr->rr); + if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (de->sr->tab->ts), &iter, path)) { GNUNET_break (0); gtk_tree_path_free (path); return; } gtk_tree_path_free (path); - gtk_tree_store_set (de->tab->ts, &iter, 4, 0, 7, emsg, -1); + gtk_tree_store_set (de->sr->tab->ts, &iter, 4, 0, 7, emsg, -1); } @@ -1832,8 +1791,8 @@ mark_download_completed (struct DownloadEntry *de, uint64_t size, { /* download was for a directory (and we have a temp file for scanning); add contents of the directory to the view */ - ade.tab = de->tab; - ade.prr = de->rr; + ade.tab = de->sr->tab; + ade.prr = de->sr->rr; ade.check_duplicates = GNUNET_YES; GNUNET_FS_GTK_mmap_and_scan (filename, &add_directory_entry, &ade); } @@ -1915,12 +1874,6 @@ copy_children (GtkTreeModel * src_model, GtkTreeIter * src_iter, search_result->rr = gtk_tree_row_reference_new (dst_model, path); search_result->result = NULL; gtk_tree_path_free (path); - if (search_result->download != NULL) - { - gtk_tree_row_reference_free (search_result->download->rr); - search_result->download->rr = - gtk_tree_row_reference_copy (search_result->rr); - } copy_children (src_model, &src_child, dst_model, &dst_child); } while (TRUE == gtk_tree_model_iter_next (src_model, &src_child)); @@ -1957,7 +1910,6 @@ download_lost_parent (struct DownloadEntry *de) { GtkTreeIter iter; GtkTreePath *path; - struct SearchTab *tab; GtkTreeRowReference *rr_old; GtkTreeModel *tm_old; GtkTreeIter iter_old; @@ -1965,17 +1917,16 @@ download_lost_parent (struct DownloadEntry *de) GtkTreeModel *model; /* first, move the root of the respective 'de'-tree */ - rr_old = de->rr; - tab = GNUNET_GTK_add_to_uri_tab (&iter, &de->sr, de->meta, de->uri); - de->tab = tab; + rr_old = de->sr->rr; + de->sr = GNUNET_GTK_add_to_uri_tab (&iter, de->meta, de->uri); de->sr->download = de; - model = GTK_TREE_MODEL (de->tab->ts); - path = gtk_tree_model_get_path (model, &iter); - de->rr = gtk_tree_row_reference_new (model, path); - gtk_tree_path_free (path); + + model = GTK_TREE_MODEL (de->sr->tab->ts); + 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); + if (! gtk_tree_model_get_iter (tm_old, &iter_old, path)) { GNUNET_break (0); @@ -2014,13 +1965,11 @@ setup_download (struct DownloadEntry *de, struct DownloadEntry *pde, { GtkTreeIter iter; GtkTreePath *path; - struct SearchResult *srp; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Setting up download, initially DE=%p, PDE=%p for %p & %p into %llu/%llu `%s'\n", de, pde, sr, dc, completed, size, filename); GNUNET_assert (NULL != uri); - srp = NULL; if (NULL == de) { /* no existing download entry to build on, create a fresh one */ @@ -2032,47 +1981,49 @@ setup_download (struct DownloadEntry *de, struct DownloadEntry *pde, GNUNET_assert (GNUNET_YES == GNUNET_FS_uri_test_equal (de->uri, uri)); } de->dc = dc; - de->sr = sr; de->pde = pde; if ( (meta != NULL) && (de->meta == NULL) ) de->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); - if (NULL != sr) + if (NULL != sr) { - /* got a search result; display the download in the same location as the search result */ - GNUNET_assert (sr->download == NULL); - sr->download = de; - de->rr = gtk_tree_row_reference_copy (sr->rr); - de->tab = sr->tab; - srp = sr; + /* have a search result, establish mapping de <--> sr */ + if (NULL == de->sr) + { + GNUNET_assert (sr->download == NULL); + de->sr = sr; + sr->download = de; + } + else + { + GNUNET_assert (sr == de->sr); + } } - if (NULL == de->rr) + if (NULL == de->sr) { /* Stand-alone download with no 'row'/search result affiliated with the download so far; create a fresh entry for this download in the URI tab */ - de->tab = GNUNET_GTK_add_to_uri_tab (&iter, &srp, meta, uri); - path = gtk_tree_model_get_path (GTK_TREE_MODEL (de->tab->ts), &iter); - de->rr = gtk_tree_row_reference_new (GTK_TREE_MODEL (de->tab->ts), path); - gtk_tree_path_free (path); - srp->download = de; + de->sr = GNUNET_GTK_add_to_uri_tab (&iter, meta, uri); + de->sr->download = de; } - GNUNET_assert (NULL != de->tab); - path = gtk_tree_row_reference_get_path (de->rr); - if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (de->tab->ts), &iter, path)) + path = gtk_tree_row_reference_get_path (de->sr->rr); + if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (de->sr->tab->ts), &iter, path)) { GNUNET_break (0); gtk_tree_path_free (path); return de; } gtk_tree_path_free (path); - gtk_tree_store_set (de->tab->ts, &iter, + gtk_tree_store_set (de->sr->tab->ts, &iter, 4, (guint) ((size > 0) ? (100 * completed / size) : 100) /* progress */ , 6, filename /* filename/description */ , 8, "blue" /* status colour: pending */ , - 9, srp, + 9, de->sr, 14, completed, + 15, de->filename, + 16, de->anonymity, -1); return de; } diff --git a/src/fs/gnunet-fs-gtk_event-handler.h b/src/fs/gnunet-fs-gtk_event-handler.h index a36ec604..bfd667de 100644 --- a/src/fs/gnunet-fs-gtk_event-handler.h +++ b/src/fs/gnunet-fs-gtk_event-handler.h @@ -23,6 +23,9 @@ * @brief Main event handler for file-sharing * @author Christian Grothoff */ +#ifndef GNUNET_FS_GTK_EVENT_HANDLER_H +#define GNUNET_FS_GTK_EVENT_HANDLER_H + #include "gnunet-fs-gtk_common.h" @@ -133,35 +136,75 @@ struct DownloadEntry struct SearchResult *sr; /** - * FS handle to control the download. + * FS handle to control the download, NULL if the download + * has not yet started. */ struct GNUNET_FS_DownloadContext *dc; /** - * URI for the download. + * URI for the download, never NULL. */ struct GNUNET_FS_Uri *uri; /** - * Meta data for the download. + * Meta data for the download, can be NULL (i.e. for download + * by URI). In that case, we'll need to figure out if the + * result is a directory later! */ struct GNUNET_CONTAINER_MetaData *meta; /** - * Where in the tree view is this download being displayed. + * Suggested (or selected) filename for the download on the + * local disk, or NULL for on suggestion. + */ + char *filename; + + /** + * Is this a recursive download? + */ + int is_recursive; + + /** + * Desired (default) anonymity level. + */ + uint32_t anonymity; + + /** + * Has the download completed (or failed)? + */ + int is_done; + +}; + + +/** + * Information we keep for each search result entry in any search tab. + * An entry like this is also generated for downloads by-URI. Used to + * quickly identify the tab and row of the result; stored in the + * user-context of the FS library for the search result. + */ +struct SearchResult +{ + /** + * Where in the tab is this result? */ GtkTreeRowReference *rr; /** - * Tab where this download is currently on display. + * Tab storing this result. */ struct SearchTab *tab; /** - * Has the download completed (or errored)? + * Search result for top-level results and + * namespace-update results. */ - int is_done; + struct GNUNET_FS_SearchResult *result; + /** + * Associated download, or NULL for none. + */ + struct DownloadEntry *download; }; @@ -170,13 +213,12 @@ struct DownloadEntry * the URI tab first. * * @param iter set to the new entry (OUT only) - * @param srp set to search result (can be NULL) * @param meta metadata for the new entry * @param uri URI for the new entry - * @return the 'uri_tab' the result was added to + * @return the search result that was set up */ -struct SearchTab * -GNUNET_GTK_add_to_uri_tab (GtkTreeIter * iter, struct SearchResult **sr, +struct SearchResult * +GNUNET_GTK_add_to_uri_tab (GtkTreeIter * iter, const struct GNUNET_CONTAINER_MetaData *meta, const struct GNUNET_FS_Uri *uri); @@ -228,4 +270,5 @@ GNUNET_GTK_fs_event_handler (void *cls, const struct GNUNET_FS_ProgressInfo *info); +#endif /* end of gnunet-fs-gtk-event_handler.h */ diff --git a/src/fs/gnunet-fs-gtk_open-directory.c b/src/fs/gnunet-fs-gtk_open-directory.c index 21247d2b..0c13f7f3 100644 --- a/src/fs/gnunet-fs-gtk_open-directory.c +++ b/src/fs/gnunet-fs-gtk_open-directory.c @@ -90,7 +90,7 @@ add_child (void *cls, const char *filename, const struct GNUNET_FS_Uri *uri, EXTRACTOR_METAFORMAT_UTF8, "text/plain", acc->filename, strlen (acc->filename) + 1); - acc->tab = GNUNET_GTK_add_to_uri_tab (&iter, NULL, dmeta, NULL); + acc->tab = GNUNET_GTK_add_to_uri_tab (&iter, dmeta, NULL)->tab; tp = gtk_tree_model_get_path (GTK_TREE_MODEL (acc->tab->ts), &iter); acc->prr = gtk_tree_row_reference_new (GTK_TREE_MODEL (acc->tab->ts), tp); gtk_tree_path_free (tp); diff --git a/src/fs/gnunet-fs-gtk_open-uri.c b/src/fs/gnunet-fs-gtk_open-uri.c index 90235c76..be0e0f86 100644 --- a/src/fs/gnunet-fs-gtk_open-uri.c +++ b/src/fs/gnunet-fs-gtk_open-uri.c @@ -94,12 +94,12 @@ GNUNET_GTK_open_url_dialog_execute_button_clicked_cb (GtkButton * button, } if (GNUNET_FS_uri_test_chk (uri) || GNUNET_FS_uri_test_loc (uri)) { - struct DownloadContext *dc; + struct DownloadEntry *de; - dc = GNUNET_malloc (sizeof (struct DownloadContext)); - dc->uri = uri; - dc->anonymity = anonymity_level; - GNUNET_FS_GTK_open_download_as_dialog (dc); + de = GNUNET_malloc (sizeof (struct DownloadEntry)); + de->uri = uri; + de->anonymity = anonymity_level; + GNUNET_FS_GTK_open_download_as_dialog (de); gtk_widget_destroy (dialog); g_object_unref (G_OBJECT (builder)); return; -- cgit v1.2.3