aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/fs/Makefile.am2
-rw-r--r--src/plugins/fs/content_tracking.c178
-rw-r--r--src/plugins/fs/content_tracking.h42
-rw-r--r--src/plugins/fs/directory.c13
-rw-r--r--src/plugins/fs/namespace.c600
-rw-r--r--src/plugins/fs/namespace_search.c187
6 files changed, 519 insertions, 503 deletions
diff --git a/src/plugins/fs/Makefile.am b/src/plugins/fs/Makefile.am
index 17bd42ac..7e3b4dfe 100644
--- a/src/plugins/fs/Makefile.am
+++ b/src/plugins/fs/Makefile.am
@@ -11,11 +11,13 @@ plugin_LTLIBRARIES = \
11 11
12libgnunetgtkmodule_fs_la_SOURCES = \ 12libgnunetgtkmodule_fs_la_SOURCES = \
13 collection.c collection.h \ 13 collection.c collection.h \
14 content_tracking.c content_tracking.h \
14 directory.c \ 15 directory.c \
15 fs.c fs.h \ 16 fs.c fs.h \
16 helper.c helper.h \ 17 helper.c helper.h \
17 meta.c meta.h \ 18 meta.c meta.h \
18 namespace.c namespace.h \ 19 namespace.c namespace.h \
20 namespace_search.c \
19 search.c search.h \ 21 search.c search.h \
20 download.c download.h \ 22 download.c download.h \
21 upload.c upload.h 23 upload.c upload.h
diff --git a/src/plugins/fs/content_tracking.c b/src/plugins/fs/content_tracking.c
new file mode 100644
index 00000000..1767432d
--- /dev/null
+++ b/src/plugins/fs/content_tracking.c
@@ -0,0 +1,178 @@
1
2/*
3 This file is part of GNUnet.
4 (C) 2005, 2006 Christian Grothoff (and other contributing authors)
5
6 GNUnet is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published
8 by the Free Software Foundation; either version 2, or (at your
9 option) any later version.
10
11 GNUnet is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNUnet; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.
20*/
21
22/**
23 * @file src/plugins/fs/content_tracking.c
24 * @brief code for tracking available content
25 * @author Christian Grothoff
26 */
27
28#include "platform.h"
29#include "gnunetgtk_common.h"
30#include "fs.h"
31#include "helper.h"
32#include "meta.h"
33#include "namespace.h"
34#include "content_tracking.h"
35#include <GNUnet/gnunet_util_crypto.h>
36#include <GNUnet/gnunet_uritrack_lib.h>
37#include <GNUnet/gnunet_namespace_lib.h>
38#include <extractor.h>
39
40static void * clearContentList(void * mdl) {
41 GtkTreeModel * model = GTK_TREE_MODEL(mdl);
42 struct ECRS_URI * uri;
43 struct ECRS_MetaData * meta;
44 GtkTreeIter iter;
45
46 DEBUG_BEGIN();
47 if (gtk_tree_model_get_iter_first(model,
48 &iter)) {
49 do {
50 gtk_tree_model_get(model,
51 &iter,
52 NAMESPACE_URI, &uri,
53 NAMESPACE_META, &meta,
54 -1);
55 ECRS_freeUri(uri);
56 ECRS_freeMetaData(meta);
57 gtk_list_store_set(GTK_LIST_STORE(model),
58 &iter,
59 NAMESPACE_URI, NULL,
60 NAMESPACE_META, NULL,
61 -1);
62 } while (gtk_list_store_remove(GTK_LIST_STORE(model),
63 &iter));
64 }
65 DEBUG_END();
66 return NULL;
67}
68
69
70void on_clearAvailableContentButton_clicked_fs(GtkWidget * dummy1,
71 GtkWidget * dummy2) {
72 GtkWidget * contentList;
73 GtkTreeModel * model;
74
75 DEBUG_BEGIN();
76 contentList
77 = glade_xml_get_widget(getMainXML(),
78 "availableContentList");
79 model
80 = gtk_tree_view_get_model(GTK_TREE_VIEW(contentList));
81 URITRACK_clearTrackedURIS(ectx,
82 cfg);
83 gtkSaveCall(&clearContentList, model);
84 DEBUG_END();
85}
86
87void on_trackingCheckButton_toggled_fs(GtkWidget * dummy1,
88 GtkWidget * dummy2) {
89 GtkWidget * trackCheckButton;
90
91 trackCheckButton
92 = glade_xml_get_widget(getMainXML(),
93 "trackingCheckButton");
94 URITRACK_trackURIS(ectx,
95 cfg,
96 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(trackCheckButton)) == TRUE ?
97 YES : NO);
98}
99
100
101
102/**
103 * Add the given content to the globally available
104 * content model. Check that it is not already
105 * present!
106 */
107static void * updateView(void * cls) {
108 const ECRS_FileInfo * fi = cls;
109 GtkTreeIter iter;
110 char * filename;
111 char * uriString;
112 unsigned long long size;
113 char * size_h;
114 GtkWidget * contentList;
115 GtkTreeModel * model;
116
117 contentList
118 = glade_xml_get_widget(getMainXML(),
119 "availableContentList");
120 model
121 = gtk_tree_view_get_model(GTK_TREE_VIEW(contentList));
122 filename = ECRS_getFirstFromMetaData(fi->meta,
123 EXTRACTOR_FILENAME,
124 EXTRACTOR_TITLE,
125 EXTRACTOR_DESCRIPTION,
126 EXTRACTOR_SUBJECT,
127 EXTRACTOR_ARTIST,
128 EXTRACTOR_AUTHOR,
129 EXTRACTOR_PUBLISHER,
130 EXTRACTOR_CREATOR,
131 EXTRACTOR_PRODUCER,
132 EXTRACTOR_UNKNOWN,
133 -1);
134 if (filename == NULL) {
135 filename = STRDUP(_("no name given"));
136 } else {
137 char * dotdot;
138
139 while (NULL != (dotdot = strstr(filename, "..")))
140 dotdot[0] = dotdot[1] = '_';
141 filename = validate_utf8(filename);
142 }
143
144 if (ECRS_isFileUri(fi->uri))
145 size = ECRS_fileSize(fi->uri);
146 else
147 size = 0;
148 uriString = ECRS_uriToString(fi->uri);
149 gtk_list_store_append(GTK_LIST_STORE(model),
150 &iter);
151 size_h = string_get_fancy_byte_size(size);
152 gtk_list_store_set(GTK_LIST_STORE(model),
153 &iter,
154 NAMESPACE_FILENAME, filename,
155 NAMESPACE_SIZE, size,
156 NAMESPACE_HSIZE, size_h,
157 NAMESPACE_URISTRING, uriString,
158 NAMESPACE_URI, ECRS_dupUri(fi->uri),
159 NAMESPACE_META, ECRS_dupMetaData(fi->meta),
160 -1);
161 FREE(size_h);
162 FREE(filename);
163 FREE(uriString);
164 return NULL;
165}
166
167/**
168 * Add the given content to the globally available
169 * content model. Check that it is not already
170 * present!
171 */
172int updateViewSave(const ECRS_FileInfo * fi,
173 const HashCode512 * key,
174 int isRoot,
175 void * closure) {
176 gtkSaveCall(&updateView, (void*) fi);
177 return OK;
178}
diff --git a/src/plugins/fs/content_tracking.h b/src/plugins/fs/content_tracking.h
new file mode 100644
index 00000000..075810aa
--- /dev/null
+++ b/src/plugins/fs/content_tracking.h
@@ -0,0 +1,42 @@
1/*
2 This file is part of GNUnet.
3 (C) 2005, 2006 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/plugins/fs/content_tracking.h
23 * @brief code for tracking available content
24 * @author Christian Grothoff
25 */
26
27#ifndef CONTENT_TRACKING_H
28#define CONTENT_TRACKING_H
29
30#include <GNUnet/gnunet_ecrs_lib.h>
31
32/**
33 * Add the given content to the globally available
34 * content model. Check that it is not already
35 * present!
36 */
37int updateViewSave(const ECRS_FileInfo * fi,
38 const HashCode512 * key,
39 int isRoot,
40 void * closure);
41
42#endif
diff --git a/src/plugins/fs/directory.c b/src/plugins/fs/directory.c
index 810fb52e..5f030368 100644
--- a/src/plugins/fs/directory.c
+++ b/src/plugins/fs/directory.c
@@ -89,15 +89,7 @@ void on_open_menu_activate_fs(GtkWidget * dummy1,
89 SearchList * list; 89 SearchList * list;
90 struct ECRS_URI * uri; 90 struct ECRS_URI * uri;
91 const char * kws[2]; 91 const char * kws[2];
92#if 1
93 /* somehow on my system I get this (and only this event)
94 always twice -- not sure why, but this is a workaround
95 for now */
96 static int modulo;
97 92
98 if (0 == (1 & modulo++))
99 return;
100#endif
101 dn = selectFile(); 93 dn = selectFile();
102 if (dn == NULL) 94 if (dn == NULL)
103 return; 95 return;
@@ -114,10 +106,7 @@ void on_open_menu_activate_fs(GtkWidget * dummy1,
114 } 106 }
115 fd = disk_file_open(NULL, 107 fd = disk_file_open(NULL,
116 dn, 108 dn,
117#ifdef O_LARGEFILE 109 O_LARGEFILE | O_RDONLY);
118 O_LARGEFILE |
119#endif
120 O_RDONLY);
121 if (fd == -1) { 110 if (fd == -1) {
122 addLogEntry(_("Error opening file `%s'."), 111 addLogEntry(_("Error opening file `%s'."),
123 dn); 112 dn);
diff --git a/src/plugins/fs/namespace.c b/src/plugins/fs/namespace.c
index c81cbaa6..4baff68d 100644
--- a/src/plugins/fs/namespace.c
+++ b/src/plugins/fs/namespace.c
@@ -1,6 +1,6 @@
1/* 1/*
2 This file is part of GNUnet. 2 This file is part of GNUnet.
3 (C) 2005, 2006 Christian Grothoff (and other contributing authors) 3 (C) 2005, 2006, 2007 Christian Grothoff (and other contributing authors)
4 4
5 GNUnet is free software; you can redistribute it and/or modify 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 6 it under the terms of the GNU General Public License as published
@@ -20,7 +20,7 @@
20 20
21/** 21/**
22 * @file src/plugins/fs/namespace.c 22 * @file src/plugins/fs/namespace.c
23 * @brief code for operations with namespaces 23 * @brief operations creating/deleting and adding to/updating namespaces
24 * @author Christian Grothoff 24 * @author Christian Grothoff
25 */ 25 */
26 26
@@ -30,31 +30,34 @@
30#include "helper.h" 30#include "helper.h"
31#include "meta.h" 31#include "meta.h"
32#include "namespace.h" 32#include "namespace.h"
33#include "content_tracking.h"
33#include <GNUnet/gnunet_util_crypto.h> 34#include <GNUnet/gnunet_util_crypto.h>
34#include <GNUnet/gnunet_uritrack_lib.h> 35#include <GNUnet/gnunet_uritrack_lib.h>
35#include <GNUnet/gnunet_namespace_lib.h> 36#include <GNUnet/gnunet_namespace_lib.h>
36#include <extractor.h> 37#include <extractor.h>
37 38
38/** 39/**
39 * @brief linked list of pages in the search notebook 40 * @brief linked list of pages in the namespace notebook
40 */ 41 */
41typedef struct NL { 42typedef struct NL {
42 struct NL * next; 43 struct NL * next;
43 GtkWidget * treeview; 44 GtkWidget * treeview;
44 GtkWidget * namespacepage; 45 GtkWidget * namespacepage;
46 GtkWidget * addButton;
45 GtkTreeModel * model; 47 GtkTreeModel * model;
46 GtkWidget * anonymityButton;
47 char * name; 48 char * name;
48 HashCode512 id; 49 HashCode512 id;
49 struct ECRS_MetaData * meta; 50 struct ECRS_MetaData * meta;
50} NamespaceList; 51} NamespaceList;
51 52
53static GtkTreeSelection * content_selection;
54
52static NamespaceList * head; 55static NamespaceList * head;
53 56
54static GladeXML * metaXML; 57static GladeXML * metaXML;
55 58
56static GtkWidget * makeNamespaceFrame(GtkWidget ** treeview, 59static GtkWidget * makeNamespaceFrame(GtkWidget ** treeview,
57 GtkWidget ** anonSpin) { 60 GtkWidget ** addButton) {
58 GtkWidget * child; 61 GtkWidget * child;
59 GtkWidget * resultList; 62 GtkWidget * resultList;
60 GtkCellRenderer * renderer; 63 GtkCellRenderer * renderer;
@@ -73,8 +76,8 @@ static GtkWidget * makeNamespaceFrame(GtkWidget ** treeview,
73 "namespaceContentFrame"); 76 "namespaceContentFrame");
74 resultList = glade_xml_get_widget(namespaceXML, 77 resultList = glade_xml_get_widget(namespaceXML,
75 "namespaceContentFrameTreeView"); 78 "namespaceContentFrameTreeView");
76 *anonSpin = glade_xml_get_widget(namespaceXML, 79 *addButton = glade_xml_get_widget(namespaceXML,
77 "namespaceAnonymitySpinButton"); 80 "addButton");
78 if (treeview != NULL) 81 if (treeview != NULL)
79 (*treeview) = GTK_WIDGET(GTK_TREE_VIEW(resultList)); 82 (*treeview) = GTK_WIDGET(GTK_TREE_VIEW(resultList));
80 model = 83 model =
@@ -94,6 +97,9 @@ static GtkWidget * makeNamespaceFrame(GtkWidget ** treeview,
94 GTK_TREE_MODEL(model)); 97 GTK_TREE_MODEL(model));
95 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(resultList)), 98 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(resultList)),
96 GTK_SELECTION_MULTIPLE); 99 GTK_SELECTION_MULTIPLE);
100
101
102
97 renderer = gtk_cell_renderer_text_new(); 103 renderer = gtk_cell_renderer_text_new();
98 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(resultList), 104 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(resultList),
99 -1, 105 -1,
@@ -234,113 +240,7 @@ static GtkWidget * makeNamespaceFrame(GtkWidget ** treeview,
234 return child; 240 return child;
235} 241}
236 242
237/**
238 * Add the given content to the globally available
239 * content model. Check that it is not already
240 * present!
241 */
242static void * updateView(void * cls) {
243 const ECRS_FileInfo * fi = cls;
244 GtkTreeIter iter;
245 char * filename;
246 char * uriString;
247 unsigned long long size;
248 char * size_h;
249 GtkWidget * contentList;
250 GtkTreeModel * model;
251
252 contentList
253 = glade_xml_get_widget(getMainXML(),
254 "availableContentList");
255 model
256 = gtk_tree_view_get_model(GTK_TREE_VIEW(contentList));
257 filename = ECRS_getFirstFromMetaData(fi->meta,
258 EXTRACTOR_FILENAME,
259 EXTRACTOR_TITLE,
260 EXTRACTOR_DESCRIPTION,
261 EXTRACTOR_SUBJECT,
262 EXTRACTOR_ARTIST,
263 EXTRACTOR_AUTHOR,
264 EXTRACTOR_PUBLISHER,
265 EXTRACTOR_CREATOR,
266 EXTRACTOR_PRODUCER,
267 EXTRACTOR_UNKNOWN,
268 -1);
269 if (filename == NULL) {
270 filename = STRDUP(_("no name given"));
271 } else {
272 char * dotdot;
273 243
274 while (NULL != (dotdot = strstr(filename, "..")))
275 dotdot[0] = dotdot[1] = '_';
276 filename = validate_utf8(filename);
277 }
278
279 if (ECRS_isFileUri(fi->uri))
280 size = ECRS_fileSize(fi->uri);
281 else
282 size = 0;
283 uriString = ECRS_uriToString(fi->uri);
284 gtk_list_store_append(GTK_LIST_STORE(model),
285 &iter);
286 size_h = string_get_fancy_byte_size(size);
287 gtk_list_store_set(GTK_LIST_STORE(model),
288 &iter,
289 NAMESPACE_FILENAME, filename,
290 NAMESPACE_SIZE, size,
291 NAMESPACE_HSIZE, size_h,
292 NAMESPACE_URISTRING, uriString,
293 NAMESPACE_URI, ECRS_dupUri(fi->uri),
294 NAMESPACE_META, ECRS_dupMetaData(fi->meta),
295 -1);
296 FREE(size_h);
297 FREE(filename);
298 FREE(uriString);
299 return NULL;
300}
301
302/**
303 * Add the given content to the globally available
304 * content model. Check that it is not already
305 * present!
306 */
307static int updateViewSave(const ECRS_FileInfo * fi,
308 const HashCode512 * key,
309 int isRoot,
310 void * closure) {
311 gtkSaveCall(&updateView, (void*) fi);
312 return OK;
313}
314
315
316static void * clearContentList(void * mdl) {
317 GtkTreeModel * model = GTK_TREE_MODEL(mdl);
318 struct ECRS_URI * uri;
319 struct ECRS_MetaData * meta;
320 GtkTreeIter iter;
321
322 DEBUG_BEGIN();
323 if (gtk_tree_model_get_iter_first(model,
324 &iter)) {
325 do {
326 gtk_tree_model_get(model,
327 &iter,
328 NAMESPACE_URI, &uri,
329 NAMESPACE_META, &meta,
330 -1);
331 ECRS_freeUri(uri);
332 ECRS_freeMetaData(meta);
333 gtk_list_store_set(GTK_LIST_STORE(model),
334 &iter,
335 NAMESPACE_URI, NULL,
336 NAMESPACE_META, NULL,
337 -1);
338 } while (gtk_list_store_remove(GTK_LIST_STORE(model),
339 &iter));
340 }
341 DEBUG_END();
342 return NULL;
343}
344 244
345/** 245/**
346 * Update the model that lists the content of a namespace: 246 * Update the model that lists the content of a namespace:
@@ -454,6 +354,22 @@ static int addNamespaceContentToModel(void * cls,
454} 354}
455 355
456/** 356/**
357 * The user has edited the search entry.
358 * Update search button status.
359 */
360static void on_namespaceContentSelectionChanged(gpointer signal,
361 gpointer cls) {
362 NamespaceList * list = head;
363
364 while (list != NULL) {
365 gtk_widget_set_sensitive(list->addButton,
366 gtk_tree_selection_count_selected_rows(content_selection) > 0);
367 list = list->next;
368 }
369}
370
371
372/**
457 * Add a tab for the given namespace. 373 * Add a tab for the given namespace.
458 */ 374 */
459static int addTabForNamespace(void * unused, 375static int addTabForNamespace(void * unused,
@@ -463,7 +379,7 @@ static int addTabForNamespace(void * unused,
463 int rating) { 379 int rating) {
464 NamespaceList * list; 380 NamespaceList * list;
465 GtkWidget * label; 381 GtkWidget * label;
466 GtkWidget * spin; 382 GtkWidget * addButton;
467 GtkWidget * notebook; 383 GtkWidget * notebook;
468 GtkListStore * model; 384 GtkListStore * model;
469 385
@@ -475,9 +391,9 @@ static int addTabForNamespace(void * unused,
475 list->meta = ECRS_dupMetaData(md); 391 list->meta = ECRS_dupMetaData(md);
476 list->namespacepage 392 list->namespacepage
477 = makeNamespaceFrame(&list->treeview, 393 = makeNamespaceFrame(&list->treeview,
478 &spin); 394 &addButton);
479 list->anonymityButton 395 list->addButton
480 = spin; 396 = addButton;
481 model = GTK_LIST_STORE 397 model = GTK_LIST_STORE
482 (gtk_tree_view_get_model 398 (gtk_tree_view_get_model
483 (GTK_TREE_VIEW(list->treeview))); 399 (GTK_TREE_VIEW(list->treeview)));
@@ -486,6 +402,8 @@ static int addTabForNamespace(void * unused,
486 list->next 402 list->next
487 = head; 403 = head;
488 head = list; 404 head = list;
405 /* update sensitivity of add button */
406 on_namespaceContentSelectionChanged(NULL, NULL);
489 notebook 407 notebook
490 = glade_xml_get_widget(getMainXML(), 408 = glade_xml_get_widget(getMainXML(),
491 "localNamespacesNotebook"); 409 "localNamespacesNotebook");
@@ -673,19 +591,11 @@ void namespaceDelete_clicked_fs(GtkWidget * dummy1,
673 gtk_widget_destroy(dialog); 591 gtk_widget_destroy(dialog);
674 if (GTK_RESPONSE_YES != ret) 592 if (GTK_RESPONSE_YES != ret)
675 return; 593 return;
676
677 gtk_notebook_remove_page(GTK_NOTEBOOK(notebook), 594 gtk_notebook_remove_page(GTK_NOTEBOOK(notebook),
678 num); 595 num);
679 if (prev == NULL)
680 head = list->next;
681 else
682 prev->next = list->next;
683 NS_deleteNamespace(ectx, 596 NS_deleteNamespace(ectx,
684 cfg, 597 cfg,
685 list->name); 598 list->name);
686 FREE(list->name);
687 ECRS_freeMetaData(list->meta);
688 FREE(list);
689 DEBUG_END(); 599 DEBUG_END();
690} 600}
691 601
@@ -696,7 +606,6 @@ typedef struct {
696 HashCode512 * lastId; 606 HashCode512 * lastId;
697 HashCode512 thisId; 607 HashCode512 thisId;
698 HashCode512 * nextId; 608 HashCode512 * nextId;
699 struct ECRS_MetaData * meta;
700} IUC; 609} IUC;
701 610
702/** 611/**
@@ -710,24 +619,17 @@ static void initiateUpload(GtkTreeModel * model,
710 IUC * cls = data; 619 IUC * cls = data;
711 struct ECRS_URI * resultURI; 620 struct ECRS_URI * resultURI;
712 struct ECRS_URI * dst; 621 struct ECRS_URI * dst;
713 struct ECRS_MetaData * ometa;
714 struct ECRS_MetaData * meta; 622 struct ECRS_MetaData * meta;
715 NamespaceList * list; 623 NamespaceList * list;
716 ECRS_FileInfo fi; 624 ECRS_FileInfo fi;
717 625
718 DEBUG_BEGIN(); 626 DEBUG_BEGIN();
719 dst = NULL; 627 dst = NULL;
720 meta = cls->meta;
721 gtk_tree_model_get(model, 628 gtk_tree_model_get(model,
722 iter, 629 iter,
723 NAMESPACE_URI, &dst, 630 NAMESPACE_URI, &dst,
724 NAMESPACE_META, &ometa, 631 NAMESPACE_META, &meta,
725 -1); 632 -1);
726 /* FIXME: we may want to optionally combine the metadata from the
727 original file ID (ometa) with the new metadata (cls->meta) here;
728 or if we limit us to one file at a time, show the original
729 metadata immediately with the dialog. */
730
731 if (dst == NULL) { 633 if (dst == NULL) {
732 GE_BREAK(ectx, 0); 634 GE_BREAK(ectx, 0);
733 return; 635 return;
@@ -780,51 +682,23 @@ void on_namespaceInsertMetaDataDialogMetaDataAddButton_clicked_fs(GtkWidget * du
780 "metaDataTreeView"); 682 "metaDataTreeView");
781} 683}
782 684
685/**
686 * User clicked the "add" button, add content from
687 * available content list to the currently selected
688 * namespace.
689 */
783void on_namespaceInsertButton_clicked_fs(GtkWidget * dummy1, 690void on_namespaceInsertButton_clicked_fs(GtkWidget * dummy1,
784 GtkWidget * dummy2) { 691 GtkWidget * dummy2) {
692
785 const char * identifierName; 693 const char * identifierName;
786 NamespaceList * list; 694 NamespaceList * list;
787 GtkWidget * nameLine; 695 GtkWidget * nameLine;
788 GtkWidget * page; 696 GtkWidget * page;
789 GtkWidget * notebook; 697 GtkWidget * notebook;
790 GtkWidget * dialog; 698 GtkWidget * dialog;
791 struct ECRS_MetaData * meta;
792 HashCode512 nextId; 699 HashCode512 nextId;
793 GtkWidget * contentList;
794 GtkTreeSelection * selection;
795 IUC cls; 700 IUC cls;
796 gint num; 701 gint num;
797 GtkTreeIter iter;
798
799 DEBUG_BEGIN();
800 contentList
801 = glade_xml_get_widget(getMainXML(),
802 "availableContentList");
803 selection
804 = gtk_tree_view_get_selection(GTK_TREE_VIEW(contentList));
805 if (0 == gtk_tree_selection_count_selected_rows(selection)) {
806 /* IMPROVE-ME: disable the menu item
807 as long as this may happen! */
808 dialog = gtk_message_dialog_new
809 (NULL,
810 GTK_DIALOG_MODAL,
811 GTK_MESSAGE_ERROR,
812 GTK_BUTTONS_CLOSE,
813 _("You must select some available content for publication first!"));
814 gtk_dialog_run(GTK_DIALOG(dialog));
815 gtk_widget_destroy(dialog);
816 return;
817 }
818 if (FALSE == gtk_tree_selection_get_selected(selection,
819 NULL,
820 &iter)) {
821 GE_BREAK(ectx, 0);
822 return;
823 }
824 gtk_tree_model_get(gtk_tree_view_get_model(GTK_TREE_VIEW(contentList)),
825 &iter,
826 NAMESPACE_META, &meta,
827 -1);
828 702
829 notebook 703 notebook
830 = glade_xml_get_widget(getMainXML(), 704 = glade_xml_get_widget(getMainXML(),
@@ -848,12 +722,6 @@ void on_namespaceInsertButton_clicked_fs(GtkWidget * dummy1,
848 "namespaceInsertDialog", 722 "namespaceInsertDialog",
849 PACKAGE_NAME); 723 PACKAGE_NAME);
850 connectGladeWithPlugins(metaXML); 724 connectGladeWithPlugins(metaXML);
851 createMetaDataListTreeView(metaXML,
852 "metaDataTreeView",
853 "namespaceInsertPreview",
854 meta);
855 createMetaTypeComboBox(metaXML,
856 "namespaceInsertMetaTypeComboBox");
857 dialog = glade_xml_get_widget(metaXML, 725 dialog = glade_xml_get_widget(metaXML,
858 "namespaceInsertDialog"); 726 "namespaceInsertDialog");
859 gtk_dialog_set_default_response(GTK_DIALOG(dialog), 727 gtk_dialog_set_default_response(GTK_DIALOG(dialog),
@@ -875,10 +743,6 @@ void on_namespaceInsertButton_clicked_fs(GtkWidget * dummy1,
875 gtk_widget_destroy(dialog); 743 gtk_widget_destroy(dialog);
876 return; 744 return;
877 } 745 }
878
879 meta = getMetaDataFromList(metaXML,
880 "metaDataTreeView",
881 "namespaceInsertPreview");
882 cls.anonymityLevel 746 cls.anonymityLevel
883 = getSpinButtonValue(metaXML, 747 = getSpinButtonValue(metaXML,
884 "anonymitySpinButton"); 748 "anonymitySpinButton");
@@ -904,27 +768,25 @@ void on_namespaceInsertButton_clicked_fs(GtkWidget * dummy1,
904 &nextId); 768 &nextId);
905 cls.nextId = &nextId; 769 cls.nextId = &nextId;
906 } 770 }
907 cls.meta = meta;
908 ggc_tree_selection_selected_foreach 771 ggc_tree_selection_selected_foreach
909 (selection, 772 (content_selection,
910 &initiateUpload, 773 &initiateUpload,
911 &cls); 774 &cls);
912
913 ECRS_freeMetaData(meta);
914 } 775 }
915 gtk_widget_destroy(dialog); 776 gtk_widget_destroy(dialog);
916 UNREF(metaXML); 777 UNREF(metaXML);
917 metaXML = NULL; 778 metaXML = NULL;
918 DEBUG_END();
919} 779}
920 780
781
782/**
783 * FIXME!!!
784 */
921void on_namespaceUpdateButton_clicked_fs(GtkWidget * dummy1, 785void on_namespaceUpdateButton_clicked_fs(GtkWidget * dummy1,
922 GtkWidget * dummy2) { 786 GtkWidget * dummy2) {
923 const char * identifierName; 787 const char * identifierName;
924 NamespaceList * list; 788 NamespaceList * list;
925 GtkWidget * nameLine; 789 GtkWidget * nameLine;
926 GtkWidget * page;
927 GtkWidget * notebook;
928 GtkWidget * dialog; 790 GtkWidget * dialog;
929 GtkWidget * spin; 791 GtkWidget * spin;
930 GtkWidget * update; 792 GtkWidget * update;
@@ -932,84 +794,14 @@ void on_namespaceUpdateButton_clicked_fs(GtkWidget * dummy1,
932 struct ECRS_MetaData * meta; 794 struct ECRS_MetaData * meta;
933 HashCode512 nextId; 795 HashCode512 nextId;
934 HashCode512 prevId; 796 HashCode512 prevId;
935 GtkWidget * contentList;
936 GtkTreeSelection * selection; 797 GtkTreeSelection * selection;
937 GtkTreeSelection * selectionNamespace;
938 IUC cls; 798 IUC cls;
939 gint num;
940 char * last; 799 char * last;
941 char * next; 800 char * next;
942 char * freq; 801 char * freq;
943 802
944 DEBUG_BEGIN(); 803 DEBUG_BEGIN();
945 contentList
946 = glade_xml_get_widget(getMainXML(),
947 "availableContentList");
948 selection
949 = gtk_tree_view_get_selection(GTK_TREE_VIEW(contentList));
950 if (0 == gtk_tree_selection_count_selected_rows(selection)) {
951 /* IMPROVE-ME: disable the menu item
952 as long as this may happen! */
953 dialog = gtk_message_dialog_new
954 (NULL,
955 GTK_DIALOG_MODAL,
956 GTK_MESSAGE_ERROR,
957 GTK_BUTTONS_CLOSE,
958 _("You must select some available content for publication first!"));
959 gtk_dialog_run(GTK_DIALOG(dialog));
960 gtk_widget_destroy(dialog);
961 return;
962 }
963 if (FALSE == gtk_tree_selection_get_selected(selection,
964 NULL,
965 &iter)) {
966 GE_BREAK(ectx, 0);
967 return;
968 }
969 gtk_tree_model_get(gtk_tree_view_get_model(GTK_TREE_VIEW(contentList)),
970 &iter,
971 NAMESPACE_META, &meta,
972 -1);
973
974 notebook
975 = glade_xml_get_widget(getMainXML(),
976 "localNamespacesNotebook");
977 num = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
978 GE_ASSERT(ectx, num != -1);
979 page =gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
980 num);
981 list = head;
982 while ( (list != NULL) &&
983 (list->namespacepage != page) )
984 list = list->next;
985 if (list == NULL) {
986 GE_BREAK(ectx, 0);
987 return;
988 }
989 cls.namespaceName = list->name;
990 804
991 /* check that in namespace (updateable) content is selected! */
992 selectionNamespace
993 = gtk_tree_view_get_selection(GTK_TREE_VIEW(list->treeview));
994 if (0 == gtk_tree_selection_count_selected_rows(selectionNamespace)) {
995 /* IMPROVE-ME: disable the menu item
996 as long as this may happen! */
997 dialog = gtk_message_dialog_new
998 (NULL,
999 GTK_DIALOG_MODAL,
1000 GTK_MESSAGE_ERROR,
1001 GTK_BUTTONS_CLOSE,
1002 _("You must select some existing namespace content to be updated first!"));
1003 gtk_dialog_run(GTK_DIALOG(dialog));
1004 gtk_widget_destroy(dialog);
1005 return;
1006 }
1007 if (FALSE == gtk_tree_selection_get_selected(selectionNamespace,
1008 NULL,
1009 &iter)) {
1010 GE_BREAK(ectx, 0);
1011 return;
1012 }
1013 gtk_tree_model_get(list->model, 805 gtk_tree_model_get(list->model,
1014 &iter, 806 &iter,
1015 IN_NAMESPACE_LAST_STRING, &last, 807 IN_NAMESPACE_LAST_STRING, &last,
@@ -1022,6 +814,8 @@ void on_namespaceUpdateButton_clicked_fs(GtkWidget * dummy1,
1022 PACKAGE_NAME); 814 PACKAGE_NAME);
1023 connectGladeWithPlugins(metaXML); 815 connectGladeWithPlugins(metaXML);
1024 816
817
818
1025 nameLine = glade_xml_get_widget(metaXML, 819 nameLine = glade_xml_get_widget(metaXML,
1026 "identifierLabel"); 820 "identifierLabel");
1027 gtk_label_set_text(GTK_LABEL(nameLine), 821 gtk_label_set_text(GTK_LABEL(nameLine),
@@ -1137,9 +931,6 @@ void on_namespaceUpdateButton_clicked_fs(GtkWidget * dummy1,
1137 strlen(identifierName), 931 strlen(identifierName),
1138 &nextId); 932 &nextId);
1139 cls.nextId = &nextId; 933 cls.nextId = &nextId;
1140 cls.meta = getMetaDataFromList(metaXML,
1141 "namespaceUpdateMetaDataTreeView",
1142 "namespaceUpdatePreviewImage");
1143 spin = glade_xml_get_widget(metaXML, 934 spin = glade_xml_get_widget(metaXML,
1144 "namespaceUpdateAnonymitySpinButton"); 935 "namespaceUpdateAnonymitySpinButton");
1145 cls.anonymityLevel 936 cls.anonymityLevel
@@ -1149,7 +940,6 @@ void on_namespaceUpdateButton_clicked_fs(GtkWidget * dummy1,
1149 (selection, 940 (selection,
1150 &initiateUpload, 941 &initiateUpload,
1151 &cls); 942 &cls);
1152 ECRS_freeMetaData(cls.meta);
1153 } 943 }
1154 gtk_widget_destroy(dialog); 944 gtk_widget_destroy(dialog);
1155 UNREF(metaXML); 945 UNREF(metaXML);
@@ -1163,187 +953,6 @@ void on_namespaceUpdateButton_clicked_fs(GtkWidget * dummy1,
1163 DEBUG_END(); 953 DEBUG_END();
1164} 954}
1165 955
1166void on_clearAvailableContentButton_clicked_fs(GtkWidget * dummy1,
1167 GtkWidget * dummy2) {
1168 GtkWidget * contentList;
1169 GtkTreeModel * model;
1170
1171 DEBUG_BEGIN();
1172 contentList
1173 = glade_xml_get_widget(getMainXML(),
1174 "availableContentList");
1175 model
1176 = gtk_tree_view_get_model(GTK_TREE_VIEW(contentList));
1177 URITRACK_clearTrackedURIS(ectx,
1178 cfg);
1179 gtkSaveCall(&clearContentList, model);
1180 DEBUG_END();
1181}
1182
1183void on_trackingCheckButton_toggled_fs(GtkWidget * dummy1,
1184 GtkWidget * dummy2) {
1185 GtkWidget * trackCheckButton;
1186
1187 trackCheckButton
1188 = glade_xml_get_widget(getMainXML(),
1189 "trackingCheckButton");
1190 URITRACK_trackURIS(ectx,
1191 cfg,
1192 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(trackCheckButton)) == TRUE ?
1193 YES : NO);
1194}
1195
1196/**
1197 * The spin button giving the rating for a particular namespace
1198 * has been changed. Store the new rating for the namespace.
1199 */
1200void on_namespaceRatingSpinButton_changed_fs(GtkWidget * dummy,
1201 GtkWidget * dummy2) {
1202 GtkWidget * spin;
1203 GtkWidget * ncbe;
1204 GtkTreeModel * model;
1205 GtkTreeIter iter;
1206 char * encStr;
1207 char * description;
1208 int rating;
1209 int newrating;
1210
1211 DEBUG_BEGIN();
1212 spin
1213 = glade_xml_get_widget(getMainXML(),
1214 "namespaceRatingSpinButton");
1215 ncbe
1216 = glade_xml_get_widget(getMainXML(),
1217 "searchNamespaceComboBoxEntry");
1218 model = gtk_combo_box_get_model(GTK_COMBO_BOX(ncbe));
1219 description = NULL;
1220 encStr = NULL;
1221 if (TRUE == gtk_combo_box_get_active_iter(GTK_COMBO_BOX(ncbe),
1222 &iter)) {
1223 gtk_tree_model_get(model,
1224 &iter,
1225 NS_SEARCH_DESCRIPTION, &description,
1226 NS_SEARCH_ENCNAME, &encStr,
1227 NS_SEARCH_RATING, &rating,
1228 -1);
1229 if ( (description != NULL) &&
1230 (0 == strcmp(description,
1231 _("globally"))) ) {
1232 /* just to be sure */
1233 gtk_widget_set_sensitive(spin,
1234 FALSE);
1235 } else {
1236 if (encStr != NULL) {
1237 newrating = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin));
1238 rating = NS_rankNamespace(ectx,
1239 cfg,
1240 encStr,
1241 newrating - rating);
1242 if (rating != newrating) {
1243 /* concurrent modification? */
1244 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin),
1245 rating);
1246 GE_BREAK(ectx, 0);
1247 }
1248 gtk_list_store_set(GTK_LIST_STORE(model),
1249 &iter,
1250 NS_SEARCH_RATING, rating,
1251 -1);
1252 }
1253 }
1254 } else {
1255 /* FIXME: if enc2hash succeeds, we may want to keep this
1256 active */
1257 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin),
1258 0);
1259 gtk_widget_set_sensitive(spin,
1260 FALSE);
1261 }
1262 if (description != NULL)
1263 free(description);
1264 if (encStr != NULL)
1265 free(encStr);
1266 DEBUG_END();
1267}
1268
1269
1270/**
1271 * The namespace in the search window has changed.
1272 * Update the trust level (possibly changing sensitivity)
1273 * and set the search string to the root (if available).
1274 */
1275void on_searchNamespaceComboBoxEntry_changed_fs(GtkWidget * dummy,
1276 GtkWidget * dummy2) {
1277 GtkWidget * keyword;
1278 GtkWidget * spin;
1279 GtkWidget * ncbe;
1280 GtkTreeModel * model;
1281 GtkTreeIter iter;
1282 int rating;
1283 char * encStr;
1284 char * descStr;
1285 HashCode512 ns;
1286 HashCode512 root;
1287 EncName enc;
1288
1289 DEBUG_BEGIN();
1290 spin
1291 = glade_xml_get_widget(getMainXML(),
1292 "namespaceRatingSpinButton");
1293 ncbe
1294 = glade_xml_get_widget(getMainXML(),
1295 "searchNamespaceComboBoxEntry");
1296 model = gtk_combo_box_get_model(GTK_COMBO_BOX(ncbe));
1297 descStr = NULL;
1298 encStr = NULL;
1299 if (TRUE == gtk_combo_box_get_active_iter(GTK_COMBO_BOX(ncbe),
1300 &iter)) {
1301 gtk_tree_model_get(model,
1302 &iter,
1303 NS_SEARCH_DESCRIPTION, &descStr,
1304 NS_SEARCH_ENCNAME, &encStr,
1305 NS_SEARCH_RATING, &rating,
1306 -1);
1307 if ( (descStr != NULL) &&
1308 (0 == strcmp(descStr,
1309 _("globally"))) ) {
1310 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin),
1311 0);
1312 gtk_widget_set_sensitive(spin,
1313 FALSE);
1314 } else if (encStr != NULL) {
1315 enc2hash(encStr,
1316 &ns);
1317 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin),
1318 rating);
1319 gtk_widget_set_sensitive(spin,
1320 TRUE);
1321 if (OK == NS_getNamespaceRoot(ectx,
1322 cfg,
1323 encStr,
1324 &root)) {
1325 hash2enc(&root,
1326 &enc);
1327 keyword
1328 = glade_xml_get_widget(getMainXML(),
1329 "fssearchKeywordComboBoxEntry");
1330 gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(keyword))),
1331 (const gchar*) &enc);
1332 }
1333 }
1334 } else {
1335 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin),
1336 0);
1337 gtk_widget_set_sensitive(spin,
1338 FALSE);
1339 }
1340 if (descStr != NULL)
1341 free(descStr);
1342 if (encStr != NULL)
1343 free(encStr);
1344 DEBUG_END();
1345}
1346
1347 956
1348 957
1349void fs_namespace_start() { 958void fs_namespace_start() {
@@ -1375,8 +984,18 @@ void fs_namespace_start() {
1375 G_TYPE_POINTER); /* uri */ 984 G_TYPE_POINTER); /* uri */
1376 gtk_tree_view_set_model(GTK_TREE_VIEW(contentList), 985 gtk_tree_view_set_model(GTK_TREE_VIEW(contentList),
1377 GTK_TREE_MODEL(model)); 986 GTK_TREE_MODEL(model));
1378 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(contentList)), 987 content_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(contentList));
988 gtk_tree_selection_set_mode(content_selection,
1379 GTK_SELECTION_MULTIPLE); 989 GTK_SELECTION_MULTIPLE);
990
991 g_signal_connect_data(content_selection,
992 "changed",
993 G_CALLBACK(&on_namespaceContentSelectionChanged),
994 NULL,
995 NULL,
996 0);
997
998
1380 renderer = gtk_cell_renderer_text_new(); 999 renderer = gtk_cell_renderer_text_new();
1381 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(contentList), 1000 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(contentList),
1382 -1, 1001 -1,
@@ -1398,11 +1017,11 @@ void fs_namespace_start() {
1398 renderer = gtk_cell_renderer_text_new(); 1017 renderer = gtk_cell_renderer_text_new();
1399 g_object_set (renderer, "xalign", 1.00, NULL); 1018 g_object_set (renderer, "xalign", 1.00, NULL);
1400 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(contentList), 1019 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(contentList),
1401 -1, 1020 -1,
1402 _("Filesize"), 1021 _("Filesize"),
1403 renderer, 1022 renderer,
1404 "text", NAMESPACE_HSIZE, 1023 "text", NAMESPACE_HSIZE,
1405 NULL); 1024 NULL);
1406 column = gtk_tree_view_get_column(GTK_TREE_VIEW(contentList), 1025 column = gtk_tree_view_get_column(GTK_TREE_VIEW(contentList),
1407 col - 1); 1026 col - 1);
1408 gtk_tree_view_column_set_resizable(column, TRUE); 1027 gtk_tree_view_column_set_resizable(column, TRUE);
@@ -1439,57 +1058,56 @@ void fs_namespace_start() {
1439 DEBUG_END(); 1058 DEBUG_END();
1440} 1059}
1441 1060
1442#if 0
1443void on_availableContentList_destroy_fs(GtkWidget * dummy1,
1444 GtkWidget * dummy2) {
1445 GtkWidget * contentList;
1446 GtkTreeModel * model;
1447 1061
1448 contentList 1062void on_localNamespaceContentFrameTreeView_destroy_fs(GtkWidget * tree,
1449 = glade_xml_get_widget(getMainXML(), 1063 GtkWidget * dummy2) {
1450 "availableContentList");
1451 model
1452 = gtk_tree_view_get_model(GTK_TREE_VIEW(contentList));
1453 clearContentList(model);
1454}
1455
1456void on_localNamespacesNotebook_destroy_fs(GtkWidget * dummy1,
1457 GtkWidget * dummy2) {
1458 NamespaceList * pos;
1459 GtkTreeIter iter; 1064 GtkTreeIter iter;
1460 struct ECRS_URI * u; 1065 struct ECRS_URI * u;
1461 struct ECRS_MetaData * m; 1066 struct ECRS_MetaData * m;
1462 1067 NamespaceList * prev;
1463 while (head != NULL) { 1068 NamespaceList * pos;
1464 pos = head->next; 1069 NamespaceList * next;
1465 FREE(head->name); 1070
1466 ECRS_freeMetaData(head->meta); 1071 pos = head;
1467 1072 while (pos != NULL) {
1468 if (gtk_tree_model_get_iter_first(head->model, 1073 next = pos->next;
1469 &iter)) { 1074 if (pos->treeview == tree)
1470 do { 1075 break;
1471 gtk_tree_model_get(head->model, 1076 prev = pos;
1472 &iter, 1077 pos = next;
1473 IN_NAMESPACE_URI, &u, 1078 }
1474 IN_NAMESPACE_META, &m, 1079 if (pos == NULL) {
1475 -1); 1080 GE_BREAK(NULL, 0);
1476 gtk_list_store_set(GTK_LIST_STORE(head->model), 1081 return;
1477 &iter, 1082 }
1478 IN_NAMESPACE_URI, NULL, 1083 if (prev == NULL)
1479 IN_NAMESPACE_META, NULL, 1084 head = pos->next;
1480 -1); 1085 else
1481 if (u != NULL) 1086 prev->next = pos->next;
1482 ECRS_freeUri(u); 1087 FREE(pos->name);
1483 if (m != NULL) 1088 ECRS_freeMetaData(pos->meta);
1484 ECRS_freeMetaData(m); 1089 if (gtk_tree_model_get_iter_first(pos->model,
1485 } while (gtk_tree_model_iter_next(head->model, 1090 &iter)) {
1486 &iter)); 1091 do {
1487 } 1092 gtk_tree_model_get(pos->model,
1488 FREE(head); 1093 &iter,
1489 head = pos; 1094 IN_NAMESPACE_URI, &u,
1095 IN_NAMESPACE_META, &m,
1096 -1);
1097 gtk_list_store_set(GTK_LIST_STORE(pos->model),
1098 &iter,
1099 IN_NAMESPACE_URI, NULL,
1100 IN_NAMESPACE_META, NULL,
1101 -1);
1102 if (u != NULL)
1103 ECRS_freeUri(u);
1104 if (m != NULL)
1105 ECRS_freeMetaData(m);
1106 } while (gtk_tree_model_iter_next(pos->model,
1107 &iter));
1490 } 1108 }
1109 FREE(pos);
1491} 1110}
1492#endif
1493 1111
1494void fs_namespace_stop() { 1112void fs_namespace_stop() {
1495 URITRACK_unregisterTrackCallback(&updateViewSave, 1113 URITRACK_unregisterTrackCallback(&updateViewSave,
diff --git a/src/plugins/fs/namespace_search.c b/src/plugins/fs/namespace_search.c
new file mode 100644
index 00000000..f5f7b1d8
--- /dev/null
+++ b/src/plugins/fs/namespace_search.c
@@ -0,0 +1,187 @@
1/*
2 This file is part of GNUnet.
3 (C) 2005, 2006 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/plugins/fs/namespace_search.c
23 * @brief code for namespace-related operations on the search frame
24 * @author Christian Grothoff
25 */
26
27#include "platform.h"
28#include "gnunetgtk_common.h"
29#include "fs.h"
30#include "helper.h"
31#include "meta.h"
32#include <GNUnet/gnunet_util_crypto.h>
33#include <GNUnet/gnunet_uritrack_lib.h>
34#include <GNUnet/gnunet_namespace_lib.h>
35#include <extractor.h>
36
37
38/**
39 * The spin button giving the rating for a particular namespace
40 * has been changed. Store the new rating for the namespace.
41 */
42void on_namespaceRatingSpinButton_changed_fs(GtkWidget * dummy,
43 GtkWidget * dummy2) {
44 GtkWidget * spin;
45 GtkWidget * ncbe;
46 GtkTreeModel * model;
47 GtkTreeIter iter;
48 char * encStr;
49 char * description;
50 int rating;
51 int newrating;
52
53 DEBUG_BEGIN();
54 spin
55 = glade_xml_get_widget(getMainXML(),
56 "namespaceRatingSpinButton");
57 ncbe
58 = glade_xml_get_widget(getMainXML(),
59 "searchNamespaceComboBoxEntry");
60 model = gtk_combo_box_get_model(GTK_COMBO_BOX(ncbe));
61 description = NULL;
62 encStr = NULL;
63 if (TRUE == gtk_combo_box_get_active_iter(GTK_COMBO_BOX(ncbe),
64 &iter)) {
65 gtk_tree_model_get(model,
66 &iter,
67 NS_SEARCH_DESCRIPTION, &description,
68 NS_SEARCH_ENCNAME, &encStr,
69 NS_SEARCH_RATING, &rating,
70 -1);
71 if ( (description != NULL) &&
72 (0 == strcmp(description,
73 _("globally"))) ) {
74 /* just to be sure */
75 gtk_widget_set_sensitive(spin,
76 FALSE);
77 } else {
78 if (encStr != NULL) {
79 newrating = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin));
80 rating = NS_rankNamespace(ectx,
81 cfg,
82 encStr,
83 newrating - rating);
84 if (rating != newrating) {
85 /* concurrent modification? */
86 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin),
87 rating);
88 GE_BREAK(ectx, 0);
89 }
90 gtk_list_store_set(GTK_LIST_STORE(model),
91 &iter,
92 NS_SEARCH_RATING, rating,
93 -1);
94 }
95 }
96 } else {
97 /* FIXME: if enc2hash succeeds, we may want to keep this
98 active */
99 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin),
100 0);
101 gtk_widget_set_sensitive(spin,
102 FALSE);
103 }
104 if (description != NULL)
105 free(description);
106 if (encStr != NULL)
107 free(encStr);
108 DEBUG_END();
109}
110
111
112/**
113 * The namespace in the search window has changed.
114 * Update the trust level (possibly changing sensitivity)
115 * and set the search string to the root (if available).
116 */
117void on_searchNamespaceComboBoxEntry_changed_fs(GtkWidget * dummy,
118 GtkWidget * dummy2) {
119 GtkWidget * keyword;
120 GtkWidget * spin;
121 GtkWidget * ncbe;
122 GtkTreeModel * model;
123 GtkTreeIter iter;
124 int rating;
125 char * encStr;
126 char * descStr;
127 HashCode512 ns;
128 HashCode512 root;
129 EncName enc;
130
131 DEBUG_BEGIN();
132 spin
133 = glade_xml_get_widget(getMainXML(),
134 "namespaceRatingSpinButton");
135 ncbe
136 = glade_xml_get_widget(getMainXML(),
137 "searchNamespaceComboBoxEntry");
138 model = gtk_combo_box_get_model(GTK_COMBO_BOX(ncbe));
139 descStr = NULL;
140 encStr = NULL;
141 if (TRUE == gtk_combo_box_get_active_iter(GTK_COMBO_BOX(ncbe),
142 &iter)) {
143 gtk_tree_model_get(model,
144 &iter,
145 NS_SEARCH_DESCRIPTION, &descStr,
146 NS_SEARCH_ENCNAME, &encStr,
147 NS_SEARCH_RATING, &rating,
148 -1);
149 if ( (descStr != NULL) &&
150 (0 == strcmp(descStr,
151 _("globally"))) ) {
152 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin),
153 0);
154 gtk_widget_set_sensitive(spin,
155 FALSE);
156 } else if (encStr != NULL) {
157 enc2hash(encStr,
158 &ns);
159 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin),
160 rating);
161 gtk_widget_set_sensitive(spin,
162 TRUE);
163 if (OK == NS_getNamespaceRoot(ectx,
164 cfg,
165 encStr,
166 &root)) {
167 hash2enc(&root,
168 &enc);
169 keyword
170 = glade_xml_get_widget(getMainXML(),
171 "fssearchKeywordComboBoxEntry");
172 gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(keyword))),
173 (const gchar*) &enc);
174 }
175 }
176 } else {
177 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin),
178 0);
179 gtk_widget_set_sensitive(spin,
180 FALSE);
181 }
182 if (descStr != NULL)
183 free(descStr);
184 if (encStr != NULL)
185 free(encStr);
186 DEBUG_END();
187}