aboutsummaryrefslogtreecommitdiff
path: root/src/fs/gnunet-fs-gtk_main-window-search.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fs/gnunet-fs-gtk_main-window-search.c')
-rw-r--r--src/fs/gnunet-fs-gtk_main-window-search.c204
1 files changed, 159 insertions, 45 deletions
diff --git a/src/fs/gnunet-fs-gtk_main-window-search.c b/src/fs/gnunet-fs-gtk_main-window-search.c
index 6b621a1a..3296151d 100644
--- a/src/fs/gnunet-fs-gtk_main-window-search.c
+++ b/src/fs/gnunet-fs-gtk_main-window-search.c
@@ -29,9 +29,120 @@
29 29
30 30
31/** 31/**
32 * How long until we decide a SKS namespace GNS lookup has failed?
33 */
34#define LOOKUP_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 2)
35
36/**
32 * Start a search. 37 * Start a search.
33 * 38 *
34 * @param builder the main window context 39 * @param uri uri to search for, freed in this function
40 * @param anonymity_level degree of anonymity to apply for the search
41 */
42static void
43search_for_uri (struct GNUNET_FS_Uri *uri,
44 guint anonymity_level)
45{
46 /* start search */
47 GNUNET_FS_search_start (GNUNET_FS_GTK_get_fs_handle (),
48 uri, anonymity_level,
49 GNUNET_FS_SEARCH_OPTION_NONE, NULL);
50 GNUNET_FS_uri_destroy (uri);
51}
52
53
54
55
56/**
57 * Abort the given search lookup.
58 *
59 * @param sl lookup to abort.
60 */
61void
62abort_search_lookup (struct SearchLookup *sl)
63{
64 struct GNUNET_GTK_MainWindowContext *main_ctx = GNUNET_FS_GTK_get_main_context ();
65
66 GNUNET_CONTAINER_DLL_remove (main_ctx->sl_head,
67 main_ctx->sl_tail,
68 sl);
69 if (GNUNET_SCHEDULER_NO_TASK != sl->timeout_task)
70 {
71 GNUNET_SCHEDULER_cancel (sl->timeout_task);
72 sl->timeout_task = GNUNET_SCHEDULER_NO_TASK;
73 }
74 if (NULL != sl->gns)
75 {
76 GNUNET_GNS_lookup_cancel (sl->gns);
77 sl->gns = NULL;
78 }
79 g_free (sl->keywords);
80 GNUNET_free (sl);
81}
82
83
84/**
85 * Task run when the GNS timeout during the resolution of
86 * the GNS namespace times out.
87 *
88 * @param cls the 'struct SearchLookup'
89 * @param tc scheduler context
90 */
91static void
92timeout_search_lookup (void *cls,
93 const struct GNUNET_SCHEDULER_TaskContext *tc)
94{
95 struct SearchLookup *sl = cls;
96
97 sl->timeout_task = GNUNET_SCHEDULER_NO_TASK;
98 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
99 _("Failed to resolve namespace in time\n"));
100 abort_search_lookup (sl);
101}
102
103
104
105/**
106 * Iterator called on obtained result for a GNS lookup for
107 * the public key of a namespace identifier.
108 *
109 * @param cls closure
110 * @param rd_count number of records in @a rd
111 * @param rd the records in reply
112 */
113static void
114handle_gns_result (void *cls,
115 uint32_t rd_count,
116 const struct GNUNET_NAMESTORE_RecordData *rd)
117{
118 struct SearchLookup *sl = cls;
119 unsigned int i;
120 struct GNUNET_FS_Uri *uri;
121
122 sl->gns = NULL;
123 for (i=0;i<rd_count;i++)
124 {
125 if (GNUNET_NAMESTORE_TYPE_PKEY != rd[i].record_type)
126 continue;
127 if (sizeof (struct GNUNET_CRYPTO_EccPublicKey) != rd[i].data_size)
128 {
129 GNUNET_break_op (0);
130 continue;
131 }
132 uri = GNUNET_FS_uri_sks_create (rd[i].data, sl->keywords);
133 search_for_uri (uri, sl->anonymity_level);
134 abort_search_lookup (sl);
135 return;
136 }
137 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
138 _("Failed to resolve namespace in time\n"));
139 abort_search_lookup (sl);
140}
141
142/**
143 * Start a search.
144 *
145 * @param main_ctx the main window context
35 */ 146 */
36static void 147static void
37start_search (struct GNUNET_GTK_MainWindowContext *main_ctx) 148start_search (struct GNUNET_GTK_MainWindowContext *main_ctx)
@@ -39,8 +150,11 @@ start_search (struct GNUNET_GTK_MainWindowContext *main_ctx)
39 guint anonymity_level; 150 guint anonymity_level;
40 gchar *keywords; 151 gchar *keywords;
41 gchar *mime_keyword; 152 gchar *mime_keyword;
42 struct GNUNET_CRYPTO_EccPublicKey *nsid; 153 const char *nsid;
43 struct GNUNET_FS_Uri *uri; 154 struct GNUNET_FS_Uri *uri;
155 struct GNUNET_CRYPTO_EccPublicKey pub_sks_zone;
156 struct SearchLookup *sl;
157 char *emsg;
44 158
45 /* get anonymity level */ 159 /* get anonymity level */
46 if (!GNUNET_GTK_get_selected_anonymity_level 160 if (!GNUNET_GTK_get_selected_anonymity_level
@@ -73,28 +187,17 @@ start_search (struct GNUNET_GTK_MainWindowContext *main_ctx)
73 mime_keyword = NULL; 187 mime_keyword = NULL;
74 } 188 }
75 } 189 }
76
77 /* get selected namespace */
78 { 190 {
79 GtkTreeRowReference *ref; 191 GtkComboBox *namespace_box;
80 GtkTreeIter iter; 192
81 193 namespace_box = GTK_COMBO_BOX (GNUNET_FS_GTK_get_main_window_object ("main_window_search_namespace_combobox"));
82 nsid = NULL; 194 nsid = gtk_entry_get_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (namespace_box))));
83 ref = main_ctx->selected_ns_row; 195 if ( (NULL != nsid) &&
84 if (NULL != ref) 196 ( (0 == strcasecmp (nsid,
85 { 197 "<none>")) ||
86 GtkTreePath *namespace_treepath; 198 (0 == strcasecmp (nsid,
87 GtkTreeModel *namespace_model; 199 _("<none>"))) ) )
88 200 nsid = NULL;
89 namespace_model = gtk_tree_row_reference_get_model (ref);
90 namespace_treepath = gtk_tree_row_reference_get_path (ref);
91 if ( (NULL != namespace_treepath) &&
92 (gtk_tree_model_get_iter (namespace_model, &iter, namespace_treepath)))
93 gtk_tree_model_get (namespace_model, &iter,
94 GNUNET_GTK_FS_MAIN_WINDOW_SEARCH_MIME_MC_TYPE,
95 &nsid,
96 -1);
97 }
98 } 201 }
99 202
100 /* get keywords and compose keyword string */ 203 /* get keywords and compose keyword string */
@@ -117,31 +220,41 @@ start_search (struct GNUNET_GTK_MainWindowContext *main_ctx)
117 220
118 /* build KSK/SKS URI */ 221 /* build KSK/SKS URI */
119 if (NULL != nsid) 222 if (NULL != nsid)
120 { 223 {
121 uri = GNUNET_FS_uri_sks_create (nsid, keywords); 224 sl = GNUNET_new (struct SearchLookup);
122 GNUNET_assert (uri != NULL); 225 sl->keywords = keywords;
226 sl->anonymity_level = anonymity_level;
227 sl->timeout_task = GNUNET_SCHEDULER_add_delayed (LOOKUP_TIMEOUT,
228 &timeout_search_lookup, sl);
229 GNUNET_CRYPTO_ecc_key_get_public (main_ctx->sks_zone,
230 &pub_sks_zone);
231 sl->gns = GNUNET_GNS_lookup (main_ctx->gns,
232 nsid,
233 &pub_sks_zone,
234 GNUNET_NAMESTORE_TYPE_PKEY,
235 GNUNET_NO,
236 NULL /* no shortening */,
237 &handle_gns_result,
238 sl);
239 GNUNET_CONTAINER_DLL_insert (main_ctx->sl_head,
240 main_ctx->sl_tail,
241 sl);
242 return;
123 } 243 }
124 else
125 {
126 char *emsg = NULL;
127 244
128 uri = GNUNET_FS_uri_ksk_create (keywords, &emsg); 245 emsg = NULL;
129 if (NULL == uri) 246 uri = GNUNET_FS_uri_ksk_create (keywords, &emsg);
130 { 247 if (NULL == uri)
131 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Invalid keyword string `%s': %s"), 248 {
132 keywords, emsg); 249 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
133 g_free (keywords); 250 _("Invalid keyword string `%s': %s"),
134 GNUNET_free_non_null (emsg); 251 keywords, emsg);
135 return; 252 g_free (keywords);
136 } 253 GNUNET_free_non_null (emsg);
137 } 254 return;
255 }
138 g_free (keywords); 256 g_free (keywords);
139 257 search_for_uri (uri, anonymity_level);
140 /* start search */
141 GNUNET_FS_search_start (GNUNET_FS_GTK_get_fs_handle (),
142 uri, anonymity_level,
143 GNUNET_FS_SEARCH_OPTION_NONE, NULL);
144 GNUNET_FS_uri_destroy (uri);
145} 258}
146 259
147 260
@@ -156,6 +269,7 @@ main_window_search_button_clicked_cb (GtkButton * button,
156 gpointer user_data) 269 gpointer user_data)
157{ 270{
158 struct GNUNET_GTK_MainWindowContext *main_ctx = user_data; 271 struct GNUNET_GTK_MainWindowContext *main_ctx = user_data;
272
159 start_search (main_ctx); 273 start_search (main_ctx);
160} 274}
161 275