diff options
Diffstat (limited to 'src/fs/gnunet-fs-gtk_main-window-search.c')
-rw-r--r-- | src/fs/gnunet-fs-gtk_main-window-search.c | 204 |
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 | */ | ||
42 | static void | ||
43 | search_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 | */ | ||
61 | void | ||
62 | abort_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 | */ | ||
91 | static void | ||
92 | timeout_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 | */ | ||
113 | static void | ||
114 | handle_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 | */ |
36 | static void | 147 | static void |
37 | start_search (struct GNUNET_GTK_MainWindowContext *main_ctx) | 148 | start_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 | ||