aboutsummaryrefslogtreecommitdiff
path: root/src/fs/main_window_adv_pseudonym.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fs/main_window_adv_pseudonym.c')
-rw-r--r--src/fs/main_window_adv_pseudonym.c588
1 files changed, 588 insertions, 0 deletions
diff --git a/src/fs/main_window_adv_pseudonym.c b/src/fs/main_window_adv_pseudonym.c
new file mode 100644
index 00000000..88a8f2b3
--- /dev/null
+++ b/src/fs/main_window_adv_pseudonym.c
@@ -0,0 +1,588 @@
1/*
2 This file is part of GNUnet
3 (C) 2005, 2006, 2010 Christian Grothoff (and other contributing authors)
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 2, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
19*/
20
21/**
22 * @file src/main_window_adv_pseudonym.c
23 * @author Christian Grothoff
24 */
25#include "common.h"
26#include "gnunet-fs-gtk.h"
27
28static GtkBuilder *builder;
29
30
31/**
32 * Canonicalize spelling of currently selected keyword.
33 */
34void
35GNUNET_GTK_advertise_pseudonym_keyword_list_normalize_button_clicked_cb ()
36{
37 GtkTreeView *tv;
38 GtkTreeSelection *sel;
39 GtkTreeModel *tm;
40 GtkTreeIter iter;
41 gchar *value;
42 struct GNUNET_FS_Uri *uri;
43 struct GNUNET_FS_Uri *nuri;
44 char *nvalue;
45 char *emsg;
46
47 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
48 "GNUNET_GTK_advertise_pseudonym_keyword_list_tree_view"));
49 sel = gtk_tree_view_get_selection (tv);
50 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
51 {
52 GNUNET_break (0);
53 return;
54 }
55 gtk_tree_model_get (tm, &iter,
56 0, &value,
57 -1);
58 emsg = NULL;
59 uri = GNUNET_FS_uri_ksk_create (value, &emsg);
60 if (uri == NULL)
61 {
62 GNUNET_break (0);
63 GNUNET_free (emsg);
64 g_free (value);
65 return;
66 }
67 nuri = GNUNET_FS_uri_ksk_canonicalize (uri);
68 nvalue = GNUNET_FS_uri_ksk_to_string_fancy (nuri);
69 gtk_list_store_set (GTK_LIST_STORE (tm), &iter,
70 0, nvalue,
71 -1);
72 GNUNET_FS_uri_destroy (nuri);
73 GNUNET_FS_uri_destroy (uri);
74 GNUNET_free (nvalue);
75 g_free (value);
76}
77
78
79/**
80 * Remove the currently selected keyword from the list.
81 */
82void
83GNUNET_GTK_advertise_pseudonym_keyword_list_del_button_clicked_cb ()
84{
85 GtkTreeView *tv;
86 GtkTreeSelection *sel;
87 GtkTreeModel *tm;
88 GtkTreeIter iter;
89
90 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
91 "GNUNET_GTK_advertise_pseudonym_keyword_list_tree_view"));
92 sel = gtk_tree_view_get_selection (tv);
93 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
94 {
95 GNUNET_break (0);
96 return;
97 }
98 gtk_list_store_remove (GTK_LIST_STORE (tm),
99 &iter);
100}
101
102
103/**
104 * Add keyword from entry line to keyword list.
105 */
106void
107GNUNET_GTK_advertise_pseudonym_keyword_list_add_button_clicked_cb ()
108{
109 const char *keyword;
110 GtkEntry *entry;
111 GtkListStore *ls;
112 GtkTreeIter iter;
113
114 ls = GTK_LIST_STORE (gtk_builder_get_object (builder,
115 "GNUNET_GTK_keyword_list_store"));
116 entry = GTK_ENTRY (gtk_builder_get_object (builder,
117 "GNUNET_GTK_advertise_pseudonym_keyword_entry"));
118 keyword = gtk_entry_get_text (entry);
119 if (strlen (keyword) > 0)
120 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, keyword, -1);
121 gtk_entry_set_text (entry, "");
122}
123
124
125/**
126 * Update sensitivity of keyword add button.
127 */
128void
129GNUNET_GTK_advertise_pseudonym_keyword_entry_changed_cb ()
130{
131 const char *keyword;
132 GtkEntry *entry;
133 GtkWidget *button;
134
135 button = GTK_WIDGET (gtk_builder_get_object (builder,
136 "GNUNET_GTK_advertise_pseudonym_keyword_list_add_button"));
137 entry = GTK_ENTRY (gtk_builder_get_object (builder,
138 "GNUNET_GTK_advertise_pseudonym_keyword_entry"));
139 keyword = gtk_entry_get_text (entry);
140 gtk_widget_set_sensitive (button,
141 (strlen (keyword) > 0) ? TRUE : FALSE);
142}
143
144/**
145 * Update sensitivity of metadata delete button.
146 */
147static void
148metadata_selection_changed_cb (GtkTreeSelection *ts,
149 gpointer user_data)
150{
151 GtkTreeView *tv;
152 GtkTreeSelection *sel;
153 GtkWidget *button;
154
155 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
156 "GNUNET_GTK_advertise_pseudonym_metadata_tree_view"));
157 sel = gtk_tree_view_get_selection (tv);
158 button = GTK_WIDGET (gtk_builder_get_object (builder,
159 "GNUNET_GTK_advertise_pseudonym_metadata_delete_button"));
160 gtk_widget_set_sensitive (button,
161 gtk_tree_selection_get_selected (sel, NULL, NULL));
162}
163
164
165/**
166 * Update sensitivity of keyword delete and normalize button.
167 */
168static void
169keyword_selection_changed_cb (GtkTreeSelection *ts,
170 gpointer user_data)
171{
172 GtkTreeView *tv;
173 GtkTreeSelection *sel;
174 GtkWidget *button;
175
176 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
177 "GNUNET_GTK_advertise_pseudonym_keyword_list_tree_view"));
178 sel = gtk_tree_view_get_selection (tv);
179 button = GTK_WIDGET (gtk_builder_get_object (builder,
180 "GNUNET_GTK_advertise_pseudonym_keyword_list_del_button"));
181
182 gtk_widget_set_sensitive (button,
183 gtk_tree_selection_get_selected (sel, NULL, NULL));
184 button = GTK_WIDGET (gtk_builder_get_object (builder,
185 "GNUNET_GTK_advertise_pseudonym_keyword_list_normalize_button"));
186 gtk_widget_set_sensitive (button,
187 gtk_tree_selection_get_selected (sel, NULL, NULL));
188}
189
190
191/**
192 * Update sensitivity of metadata add button.
193 */
194void
195GNUNET_GTK_advertise_pseudonym_metadata_value_entry_changed_cb ()
196{
197 GtkTreeView *tv;
198 GtkTreeSelection *sel;
199 const char *value;
200 GtkEntry *entry;
201 GtkWidget *button;
202
203 entry = GTK_ENTRY (gtk_builder_get_object (builder,
204 "GNUNET_GTK_advertise_pseudonym_metadata_value_entry"));
205 value = gtk_entry_get_text (entry);
206 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
207 "GNUNET_GTK_advertise_pseudonym_metadata_type_tree_view"));
208 sel = gtk_tree_view_get_selection (tv);
209 button = GTK_WIDGET (gtk_builder_get_object (builder,
210 "GNUNET_GTK_advertise_pseudonym_metadata_add_button"));
211 gtk_widget_set_sensitive (button,
212 (strlen (value) > 0)
213 ? gtk_tree_selection_get_selected (sel, NULL, NULL)
214 : FALSE);
215}
216
217
218/**
219 * Add keyword to keyword list.
220 */
221void
222GNUNET_GTK_advertise_pseudonym_keyword_entry_activate_cb ()
223{
224 GNUNET_GTK_advertise_pseudonym_keyword_list_add_button_clicked_cb ();
225}
226
227
228void
229GNUNET_GTK_advertise_pseudonym_metadata_preview_file_chooser_button_file_set_cb ()
230{
231 GNUNET_break (0);
232}
233
234/**
235 * Delete currently selected item from meta data list.
236 */
237void
238GNUNET_GTK_advertise_pseudonym_metadata_delete_button_clicked_cb()
239{
240 GtkTreeView *tv;
241 GtkTreeSelection *sel;
242 GtkTreeModel *tm;
243 GtkTreeIter iter;
244
245 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
246 "GNUNET_GTK_advertise_pseudonym_metadata_tree_view"));
247 sel = gtk_tree_view_get_selection (tv);
248 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
249 {
250 GNUNET_break (0);
251 return;
252 }
253 gtk_list_store_remove (GTK_LIST_STORE (tm),
254 &iter);
255}
256
257
258/**
259 * Add metadata to metadata list.
260 */
261void
262GNUNET_GTK_advertise_pseudonym_metadata_add_button_clicked_cb ()
263{
264 const char *value;
265 char *avalue;
266 const char *ivalue;
267 GtkEntry *entry;
268 GtkListStore *ls;
269 GtkTreeModel *tm;
270 GtkTreeView *tv;
271 GtkTreeSelection *sel;
272 GtkTreeIter iter;
273 guint type;
274 size_t slen;
275 char *pos;
276
277 entry = GTK_ENTRY (gtk_builder_get_object (builder,
278 "GNUNET_GTK_advertise_pseudonym_metadata_value_entry"));
279 value = gtk_entry_get_text (entry);
280 if ((value == NULL) || (strlen (value) == 0))
281 {
282 GNUNET_break (0);
283 return;
284 }
285 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
286 "GNUNET_GTK_advertise_pseudonym_metadata_type_tree_view"));
287 tm = gtk_tree_view_get_model (tv);
288 sel = gtk_tree_view_get_selection (tv);
289 if (TRUE != gtk_tree_selection_get_selected (sel,
290 &tm,
291 &iter))
292 {
293 GNUNET_break (0);
294 return;
295 }
296 gtk_tree_model_get (tm,
297 &iter,
298 1, &type, -1);
299 ls = GTK_LIST_STORE (gtk_builder_get_object (builder,
300 "GNUNET_GTK_meta_data_list_store"));
301 if ( (type == EXTRACTOR_METATYPE_FILENAME) &&
302 (value[strlen(value)-1] != '/') )
303 {
304 GNUNET_asprintf (&avalue,
305 "%s/",
306 value);
307 /* if user typed '\' instead of '/', change it! */
308 slen = strlen (avalue);
309 while ( (slen > 1) &&
310 (avalue[slen-2] == '\\') )
311 {
312 avalue[slen-2] = '/';
313 avalue[slen-1] = '\0';
314 slen--;
315 }
316 while (NULL != (pos = strstr (avalue, "\\")))
317 *pos = '/';
318 /* remove '../' everywhere */
319 while (NULL != (pos = strstr (avalue, "../")))
320 {
321 pos[0] = '_';
322 pos[1] = '_';
323 pos[2] = '_';
324 }
325 ivalue = avalue;
326 }
327 else
328 {
329 ivalue = value;
330 avalue = NULL;
331 }
332
333 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT,
334 0, type,
335 1, (guint) EXTRACTOR_METAFORMAT_UTF8,
336 2, EXTRACTOR_metatype_to_string (type),
337 3, ivalue,
338 -1);
339 GNUNET_free_non_null (avalue);
340 gtk_entry_set_text (GTK_ENTRY (entry), "");
341}
342
343
344/**
345 * Callback with information about local (!) namespaces.
346 * Contains the names of the local namespace and the global
347 * ID. Adds the to the list store.
348 *
349 * @param cls closure, the list store.
350 * @param name human-readable identifier of the namespace
351 * @param id hash identifier for the namespace
352 */
353static void
354add_to_list (void *cls,
355 const char *name,
356 const GNUNET_HashCode *id)
357{
358 GtkListStore *ls = cls;
359 GtkTreeIter iter;
360
361 gtk_list_store_insert_with_values (ls,
362 &iter,
363 -1,
364 0, name,
365 1, GNUNET_FS_namespace_create (GNUNET_FS_GTK_get_fs_handle (),
366 name),
367 -1);
368
369}
370
371
372static void
373selection_changed_cb (GtkTreeSelection *ts,
374 gpointer user_data)
375{
376 GtkTreeIter iter;
377 GtkWidget *ok_button;
378
379 ok_button = GTK_WIDGET (gtk_builder_get_object (builder,
380 "GNUNET_GTK_select_pseudonym_ok_button"));
381 if (TRUE == gtk_tree_selection_get_selected (ts, NULL, &iter))
382 gtk_widget_set_sensitive (ok_button, TRUE);
383 else
384 gtk_widget_set_sensitive (ok_button, FALSE);
385}
386
387
388/**
389 * Advertise pseudonym selected.
390 */
391void
392GNUNET_GTK_main_menu_file_advertise_pseudonym_activate_cb (GtkWidget * dummy,
393 gpointer data)
394{
395 GtkWidget *ad;
396 struct GNUNET_FS_Namespace *ns;
397 struct GNUNET_FS_Namespace *nso;
398 GtkListStore *ls;
399 GtkTreeView *tv;
400 GtkTreeIter iter;
401 GtkTreeSelection *sel;
402 GtkTreeModel *tm;
403 GtkSpinButton *sb;
404 struct GNUNET_FS_BlockOptions bo;
405 struct GNUNET_FS_Uri *nxt;
406 struct GNUNET_FS_Uri *mrg;
407 struct GNUNET_FS_Uri *uri;
408 struct GNUNET_CONTAINER_MetaData *nm;
409 const char *root;
410 char *value;
411 guint ntype;
412 guint nformat;
413 guint type;
414 guint max_type;
415
416 builder = GNUNET_GTK_get_new_builder ("select_pseudonym_dialog.glade");
417 if (builder == NULL)
418 {
419 GNUNET_break (0);
420 return;
421 }
422 ad = GTK_WIDGET (gtk_builder_get_object (builder,
423 "GNUNET_GTK_select_pseudonym_dialog"));
424 ls = GTK_LIST_STORE (gtk_builder_get_object (builder,
425 "GNUNET_GTK_select_pseudonym_liststore"));
426 GNUNET_FS_namespace_list (GNUNET_FS_GTK_get_fs_handle (),
427 &add_to_list,
428 ls);
429 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
430 "GNUNET_GTK_select_pseudonym_tree_view"));
431 sel = gtk_tree_view_get_selection (tv);
432 g_signal_connect(G_OBJECT(sel), "changed",
433 G_CALLBACK(selection_changed_cb), NULL);
434 if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
435 {
436 gtk_widget_destroy (ad);
437 g_object_unref (G_OBJECT (builder));
438 builder = NULL;
439 return;
440 }
441 GNUNET_assert (TRUE == gtk_tree_selection_get_selected (sel,
442 &tm,
443 &iter));
444 gtk_tree_model_get (tm,
445 &iter,
446 1, &ns,
447 -1);
448 /* free all namespaces from list store except "ns" */
449 if (TRUE ==
450 gtk_tree_model_get_iter_first (tm, &iter))
451 {
452 do
453 {
454 gtk_tree_model_get (tm, &iter,
455 1, &nso,
456 -1);
457 if (ns != nso)
458 GNUNET_FS_namespace_delete (nso, GNUNET_NO);
459 }
460 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
461 }
462 gtk_widget_destroy (ad);
463 g_object_unref (G_OBJECT (builder));
464 builder = NULL;
465
466
467 builder = GNUNET_GTK_get_new_builder ("advertise_pseudonym_dialog.glade");
468 if (builder == NULL)
469 {
470 GNUNET_break (0);
471 return;
472 }
473 GNUNET_FS_GTK_setup_expiration_year_adjustment (builder);
474 ad = GTK_WIDGET (gtk_builder_get_object (builder,
475 "GNUNET_GTK_advertise_pseudonym_dialog"));
476 ls = GTK_LIST_STORE (gtk_builder_get_object (builder,
477 "GNUNET_GTK_metatype_list_store"));
478 max_type = EXTRACTOR_metatype_get_max ();
479 type = 1;
480 while (type < max_type - 1)
481 {
482 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT,
483 0, EXTRACTOR_metatype_to_string (type),
484 1, type,
485 2, EXTRACTOR_metatype_to_description (type),
486 -1);
487 type++;
488 }
489 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
490 "GNUNET_GTK_advertise_pseudonym_metadata_type_tree_view"));
491 sel = gtk_tree_view_get_selection (tv);
492 g_signal_connect(G_OBJECT(sel), "changed",
493 G_CALLBACK(GNUNET_GTK_advertise_pseudonym_metadata_value_entry_changed_cb), NULL);
494
495 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
496 "GNUNET_GTK_advertise_pseudonym_metadata_tree_view"));
497 sel = gtk_tree_view_get_selection (tv);
498 g_signal_connect(G_OBJECT(sel), "changed",
499 G_CALLBACK(metadata_selection_changed_cb), NULL);
500
501 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
502 "GNUNET_GTK_advertise_pseudonym_keyword_list_tree_view"));
503 sel = gtk_tree_view_get_selection (tv);
504 g_signal_connect(G_OBJECT(sel), "changed",
505 G_CALLBACK(keyword_selection_changed_cb), NULL);
506 if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
507 {
508 gtk_widget_destroy (ad);
509 g_object_unref (G_OBJECT (builder));
510 builder = NULL;
511 return;
512 }
513 /* get keywords from list store */
514 nxt = NULL;
515 mrg = NULL;
516 uri = NULL;
517 tm = GTK_TREE_MODEL (gtk_builder_get_object (builder,
518 "GNUNET_GTK_keyword_list_store"));
519 if (TRUE ==
520 gtk_tree_model_get_iter_first (tm, &iter))
521 {
522 do
523 {
524 gtk_tree_model_get (tm, &iter,
525 0, &value,
526 -1);
527 nxt = GNUNET_FS_uri_ksk_create_from_args (1, (const char**) &value);
528 mrg = GNUNET_FS_uri_ksk_merge (nxt, uri);
529 GNUNET_FS_uri_destroy (nxt);
530 if (NULL != uri)
531 GNUNET_FS_uri_destroy (uri);
532 uri = mrg;
533 g_free (value);
534 }
535 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
536 }
537 /* get meta */
538 nm = GNUNET_CONTAINER_meta_data_create ();
539 tm = GTK_TREE_MODEL (gtk_builder_get_object (builder,
540 "GNUNET_GTK_meta_data_list_store"));
541 if (TRUE ==
542 gtk_tree_model_get_iter_first (tm, &iter))
543 {
544 do
545 {
546 gtk_tree_model_get (tm, &iter,
547 0, &ntype,
548 1, &nformat,
549 3, &value,
550 -1);
551 GNUNET_CONTAINER_meta_data_insert (nm,
552 "<user>",
553 ntype,
554 nformat,
555 "text/plain",
556 value,
557 strlen (value)+1);
558 g_free (value);
559 }
560 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
561 }
562 bo.anonymity_level = gtk_spin_button_get_value (GTK_SPIN_BUTTON (gtk_builder_get_object (builder,
563 "GNUNET_GTK_advertise_pseudonym_anonymity_spin_button")));
564 bo.content_priority = gtk_spin_button_get_value (GTK_SPIN_BUTTON (gtk_builder_get_object (builder,
565 "GNUNET_GTK_advertise_pseudonym_priority_spin_button")));
566 sb = GTK_SPIN_BUTTON (gtk_builder_get_object (builder,
567 "GNUNET_GTK_advertise_pseudonym_expiration_year_spin_button"));
568 bo.expiration_time = GNUNET_FS_GTK_get_expiration_time (sb);
569 root = gtk_entry_get_text (GTK_ENTRY (gtk_builder_get_object (builder,
570 "GNUNET_GTK_advertise_pseudonym_root_entry")));
571 GNUNET_FS_namespace_advertise (GNUNET_FS_GTK_get_fs_handle (),
572 uri,
573 ns,
574 nm,
575 &bo,
576 root,
577 NULL, NULL);
578 GNUNET_FS_namespace_delete (ns, GNUNET_NO);
579 GNUNET_CONTAINER_meta_data_destroy (nm);
580 if (NULL != uri)
581 GNUNET_FS_uri_destroy (uri);
582 gtk_widget_destroy (ad);
583 g_object_unref (G_OBJECT (builder));
584 builder = NULL;
585}
586
587
588/* end of main_window_adv_pseudonym.c */