aboutsummaryrefslogtreecommitdiff
path: root/src/fs
diff options
context:
space:
mode:
Diffstat (limited to 'src/fs')
-rw-r--r--src/fs/gnunet-fs-gtk-download.c2
-rw-r--r--src/fs/gnunet-fs-gtk-edit_publish_dialog.c1074
-rw-r--r--src/fs/gnunet-fs-gtk-edit_publish_dialog.h16
-rw-r--r--src/fs/gnunet-fs-gtk-main_window_adv_pseudonym.c631
-rw-r--r--src/fs/gnunet-fs-gtk-main_window_create_pseudonym.c49
-rw-r--r--src/fs/gnunet-fs-gtk-main_window_file_publish.c516
-rw-r--r--src/fs/gnunet-fs-gtk-main_window_open_directory.c50
-rw-r--r--src/fs/gnunet-fs-gtk.c34
-rw-r--r--src/fs/gnunet-fs-gtk.h13
9 files changed, 1277 insertions, 1108 deletions
diff --git a/src/fs/gnunet-fs-gtk-download.c b/src/fs/gnunet-fs-gtk-download.c
index d9451e1c..1a7ff302 100644
--- a/src/fs/gnunet-fs-gtk-download.c
+++ b/src/fs/gnunet-fs-gtk-download.c
@@ -203,7 +203,7 @@ GNUNET_FS_GTK_open_download_as_dialog (struct DownloadContext *dc)
203 dlc->response = 0; 203 dlc->response = 0;
204 dlc->dc = dc; 204 dlc->dc = dc;
205 g_object_set_data (G_OBJECT (ad), "dialog-context", dlc); 205 g_object_set_data (G_OBJECT (ad), "dialog-context", dlc);
206 gtk_widget_show_all (ad); 206 gtk_window_present (GTK_WINDOW (ad));
207} 207}
208 208
209/* end of gnunet-fs-gtk-download.c */ 209/* end of gnunet-fs-gtk-download.c */
diff --git a/src/fs/gnunet-fs-gtk-edit_publish_dialog.c b/src/fs/gnunet-fs-gtk-edit_publish_dialog.c
index 2465e6ac..37fe1a2a 100644
--- a/src/fs/gnunet-fs-gtk-edit_publish_dialog.c
+++ b/src/fs/gnunet-fs-gtk-edit_publish_dialog.c
@@ -24,87 +24,26 @@
24 */ 24 */
25#include "gnunet-fs-gtk-common.h" 25#include "gnunet-fs-gtk-common.h"
26#include "gnunet-fs-gtk-edit_publish_dialog.h" 26#include "gnunet-fs-gtk-edit_publish_dialog.h"
27#include "gnunet-fs-gtk.h"
27#include <gnunet/gnunet_util_lib.h> 28#include <gnunet/gnunet_util_lib.h>
29#include <gdk/gdkkeysyms.h>
28 30
29/** 31#define PUBSTATE "edit-publication-state"
30 * Builder for the current dialog.
31 */
32static GtkBuilder *builder;
33
34/**
35 * Are we editing metadata for a directory?
36 */
37static int is_directory;
38
39/**
40 * Set to YES if the preview was changed.
41 */
42static int preview_changed;
43
44void
45GNUNET_GTK_edit_file_information_keyword_list_normalize_button_clicked_cb ()
46{
47 GNUNET_break (0);
48}
49
50void
51GNUNET_GTK_edit_file_information_keyword_list_del_button_clicked_cb ()
52{
53 GtkTreeView *tv;
54 GtkTreeSelection *sel;
55 GtkTreeModel *tm;
56 GtkTreeIter iter;
57
58 tv = GTK_TREE_VIEW (gtk_builder_get_object
59 (builder,
60 "GNUNET_GTK_edit_file_information_keyword_list_tree_view"));
61 sel = gtk_tree_view_get_selection (tv);
62 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
63 {
64 GNUNET_break (0);
65 return;
66 }
67 gtk_list_store_remove (GTK_LIST_STORE (tm), &iter);
68}
69
70void
71GNUNET_GTK_edit_file_information_keyword_list_add_button_clicked_cb ()
72{
73 const char *keyword;
74 GtkEntry *entry;
75 GtkListStore *ls;
76 GtkTreeIter iter;
77
78 ls = GTK_LIST_STORE (gtk_builder_get_object
79 (builder, "GNUNET_GTK_keyword_list_store"));
80 entry =
81 GTK_ENTRY (gtk_builder_get_object
82 (builder, "GNUNET_GTK_edit_file_information_keyword_entry"));
83 keyword = gtk_entry_get_text (entry);
84 if (strlen (keyword) > 0)
85 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, keyword, -1);
86 gtk_entry_set_text (entry, "");
87}
88 32
89 33struct edit_publication_state
90void
91GNUNET_GTK_edit_file_information_keyword_entry_changed_cb ()
92{ 34{
93 const char *keyword; 35 int *do_index;
94 GtkEntry *entry; 36 char **short_fn;
95 GtkWidget *button; 37 guint *anonymity_level;
96 38 guint *priority;
97 button = 39 struct GNUNET_FS_FileInformation *fip;
98 GTK_WIDGET (gtk_builder_get_object 40 gint preview_changed;
99 (builder, 41 gboolean allow_no_keywords;
100 "GNUNET_GTK_edit_file_information_keyword_list_add_button")); 42 gboolean is_directory;
101 entry = 43 GNUNET_FS_GTK_edit_publish_dialog_cb cb;
102 GTK_ENTRY (gtk_builder_get_object 44 gchar *root;
103 (builder, "GNUNET_GTK_edit_file_information_keyword_entry")); 45 gpointer cls;
104 keyword = gtk_entry_get_text (entry); 46};
105 gtk_widget_set_sensitive (button, (strlen (keyword) > 0) ? TRUE : FALSE);
106}
107
108 47
109static void 48static void
110metadata_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data) 49metadata_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
@@ -112,165 +51,222 @@ metadata_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
112 GtkTreeView *tv; 51 GtkTreeView *tv;
113 GtkTreeSelection *sel; 52 GtkTreeSelection *sel;
114 GtkWidget *button; 53 GtkWidget *button;
54 GtkBuilder *builder;
55
56 builder = GTK_BUILDER (user_data);
115 57
116 tv = GTK_TREE_VIEW (gtk_builder_get_object 58 tv = GTK_TREE_VIEW (gtk_builder_get_object
117 (builder, 59 (builder,
118 "GNUNET_GTK_edit_file_information_metadata_tree_view")); 60 "GNUNET_GTK_edit_publication_metadata_tree_view"));
119 sel = gtk_tree_view_get_selection (tv); 61 sel = gtk_tree_view_get_selection (tv);
120 button = 62 button =
121 GTK_WIDGET (gtk_builder_get_object 63 GTK_WIDGET (gtk_builder_get_object
122 (builder, 64 (builder,
123 "GNUNET_GTK_edit_file_information_metadata_delete_button")); 65 "GNUNET_GTK_edit_publication_delete_button"));
124 gtk_widget_set_sensitive (button, 66 gtk_widget_set_sensitive (button,
125 gtk_tree_selection_get_selected (sel, NULL, NULL)); 67 gtk_tree_selection_get_selected (sel, NULL, NULL));
126} 68}
127 69
128
129static void 70static void
130keyword_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data) 71keywords_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
131{ 72{
132 GtkTreeView *tv; 73 GtkTreeView *tv;
133 GtkTreeSelection *sel; 74 GtkTreeSelection *sel;
134 GtkWidget *button; 75 GtkWidget *button;
76 GtkBuilder *builder;
77
78 builder = GTK_BUILDER (user_data);
79
135 80
136 tv = GTK_TREE_VIEW (gtk_builder_get_object 81 tv = GTK_TREE_VIEW (gtk_builder_get_object
137 (builder, 82 (builder,
138 "GNUNET_GTK_edit_file_information_keyword_list_tree_view")); 83 "GNUNET_GTK_edit_publication_keyword_list_tree_view"));
139 sel = gtk_tree_view_get_selection (tv); 84 sel = gtk_tree_view_get_selection (tv);
140 button = 85 button =
141 GTK_WIDGET (gtk_builder_get_object 86 GTK_WIDGET (gtk_builder_get_object
142 (builder, 87 (builder,
143 "GNUNET_GTK_edit_file_information_keyword_list_del_button")); 88 "GNUNET_GTK_edit_publication_keyword_list_del_button"));
144 89
145 gtk_widget_set_sensitive (button, 90 gtk_widget_set_sensitive (button,
146 gtk_tree_selection_get_selected (sel, NULL, NULL)); 91 gtk_tree_selection_get_selected (sel, NULL, NULL));
147 button = 92 button =
148 GTK_WIDGET (gtk_builder_get_object 93 GTK_WIDGET (gtk_builder_get_object
149 (builder, 94 (builder,
150 "GNUNET_GTK_edit_file_information_keyword_list_normalize_button")); 95 "GNUNET_GTK_edit_publication_keyword_list_normalize_button"));
151 gtk_widget_set_sensitive (button, 96 gtk_widget_set_sensitive (button,
152 gtk_tree_selection_get_selected (sel, NULL, NULL)); 97 gtk_tree_selection_get_selected (sel, NULL, NULL));
153} 98}
154 99
155 100
156void 101void
157GNUNET_GTK_edit_file_information_metadata_value_entry_changed_cb () 102GNUNET_GTK_edit_publication_window_realize_cb (GtkWidget *widget,
103 gpointer user_data)
158{ 104{
105 GtkBuilder *builder;
106 GtkListStore *metatypes_list;
107 GtkTreeIter iter;
159 GtkTreeView *tv; 108 GtkTreeView *tv;
160 GtkTreeSelection *sel; 109 GtkTreeSelection *sel;
161 const char *value; 110 guint type;
162 GtkEntry *entry; 111 guint max_type;
163 GtkWidget *button;
164 112
165 entry = 113 builder = GTK_BUILDER (user_data);
166 GTK_ENTRY (gtk_builder_get_object 114 metatypes_list = GTK_LIST_STORE (gtk_builder_get_object (builder,
167 (builder, 115 "GNUNET_GTK_publication_metadata_types_liststore"));
168 "GNUNET_GTK_edit_file_information_metadata_value_entry")); 116
169 value = gtk_entry_get_text (entry); 117 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
170 tv = GTK_TREE_VIEW (gtk_builder_get_object 118 "GNUNET_GTK_edit_publication_metadata_tree_view"));
171 (builder,
172 "GNUNET_GTK_edit_file_information_metadata_type_tree_view"));
173 sel = gtk_tree_view_get_selection (tv); 119 sel = gtk_tree_view_get_selection (tv);
174 button = 120 g_signal_connect (G_OBJECT (sel), "changed",
175 GTK_WIDGET (gtk_builder_get_object 121 G_CALLBACK (metadata_selection_changed_cb), builder);
176 (builder,
177 "GNUNET_GTK_edit_file_information_metadata_add_button"));
178 gtk_widget_set_sensitive (button,
179 (strlen (value) >
180 0) ? gtk_tree_selection_get_selected (sel, NULL,
181 NULL) :
182 FALSE);
183}
184 122
123 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
124 "GNUNET_GTK_edit_publication_keyword_list_tree_view"));
125 sel = gtk_tree_view_get_selection (tv);
126 g_signal_connect (G_OBJECT (sel), "changed",
127 G_CALLBACK (keywords_selection_changed_cb), builder);
185 128
186void 129 max_type = EXTRACTOR_metatype_get_max ();
187GNUNET_GTK_edit_file_information_keyword_entry_activate_cb () 130 for (type = 1; type < max_type - 1; type++)
188{ 131 gtk_list_store_insert_with_values (metatypes_list, &iter, G_MAXINT,
189 GNUNET_GTK_edit_file_information_keyword_list_add_button_clicked_cb (); 132 0, type,
133 1, EXTRACTOR_METAFORMAT_UTF8,
134 2, EXTRACTOR_metatype_to_string (type),
135 3, EXTRACTOR_metatype_to_description (type), -1);
190} 136}
191 137
192
193void 138void
194GNUNET_GTK_edit_file_information_metadata_preview_file_chooser_button_file_set_cb 139GNUNET_GTK_edit_publication_add_button_clicked_cb (GtkButton *button,
195 (GtkFileChooserButton * widget, gpointer user_data) 140 gpointer user_data)
196{ 141{
197 gchar *fn; 142 GtkBuilder *builder;
198 GtkImage *image; 143 GtkTreeView *meta_tree;
144 GtkListStore *meta_list;
145 GtkTreeIter iter;
199 146
200 fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget)); 147 builder = GTK_BUILDER (user_data);
201 image = 148 meta_tree = GTK_TREE_VIEW (gtk_builder_get_object (builder,
202 GTK_IMAGE (gtk_builder_get_object 149 "GNUNET_GTK_edit_publication_metadata_tree_view"));
203 (builder, 150 meta_list = GTK_LIST_STORE (gtk_tree_view_get_model (meta_tree));
204 "GNUNET_GTK_edit_file_information_metadata_preview_image")); 151
205 gtk_image_set_from_file (image, fn); 152 gtk_list_store_insert (meta_list, &iter, 0);
206 preview_changed = GNUNET_YES; 153 /* type == -1 means "not set" */
154 gtk_list_store_set (meta_list, &iter, 0, -1, 1, EXTRACTOR_METAFORMAT_UTF8,
155 2, _("Select a type"), 3, _("Specify a value"), 4, NULL, -1);
207} 156}
208 157
158gboolean
159GNUNET_GTK_edit_publication_keyword_entry_key_press_event_cb (GtkWidget *widget,
160 GdkEventKey *event, gpointer user_data)
161{
162 GtkBuilder *builder;
163 GtkButton *add_button;
164 builder = GTK_BUILDER (user_data);
165
166 if (event->keyval == GDK_KEY_Return)
167 {
168 add_button = GTK_BUTTON (gtk_builder_get_object (builder,
169 "GNUNET_GTK_edit_publication_add_button"));
170 GNUNET_GTK_edit_publication_add_button_clicked_cb (add_button, user_data);
171 return TRUE;
172 }
173 return FALSE;
174}
209 175
210void 176void
211GNUNET_GTK_edit_file_information_metadata_delete_button_clicked_cb () 177GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer_edited_cb (
178 GtkCellRendererText *renderer, gchar *path, gchar *new_text,
179 gpointer user_data)
212{ 180{
213 GtkTreeView *tv; 181 GtkBuilder *builder;
214 GtkTreeSelection *sel; 182 GtkTreeView *meta_tree;
215 GtkTreeModel *tm; 183 GtkListStore *meta_list;
184 GtkCellRendererCombo *combo;
185 GtkTreeModel *combo_model;
216 GtkTreeIter iter; 186 GtkTreeIter iter;
187 gint type_id;
188 gchar *description = NULL;
189 GtkTreeIter *pass_data = NULL;
190
191 builder = GTK_BUILDER (user_data);
192 meta_tree = GTK_TREE_VIEW (gtk_builder_get_object (builder,
193 "GNUNET_GTK_edit_publication_metadata_tree_view"));
194 meta_list = GTK_LIST_STORE (gtk_tree_view_get_model (meta_tree));
195 if (!gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (meta_list), &iter, path))
196 return;
217 197
218 tv = GTK_TREE_VIEW (gtk_builder_get_object 198 combo = GTK_CELL_RENDERER_COMBO (gtk_builder_get_object (builder,
219 (builder, 199 "GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer"));
220 "GNUNET_GTK_edit_file_information_metadata_tree_view")); 200
221 sel = gtk_tree_view_get_selection (tv); 201 pass_data = g_object_get_data (G_OBJECT (combo), "selected-type");
222 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter)) 202 if (!pass_data)
223 {
224 GNUNET_break (0);
225 return; 203 return;
226 } 204 g_object_get (combo, "model", &combo_model, NULL);
227 gtk_list_store_remove (GTK_LIST_STORE (tm), &iter); 205 gtk_tree_model_get (combo_model, pass_data, 0, &type_id, 2, &description, -1);
206 g_free (combo_model);
207 g_free (pass_data);
208 g_object_set_data (G_OBJECT (combo), "selected-type", NULL);
209
210 gtk_list_store_set (meta_list, &iter, 0, type_id, 1,
211 EXTRACTOR_METAFORMAT_UTF8, 2, new_text, 4, description, -1);
212 g_free (description);
228} 213}
229 214
215void
216GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer_changed_cb (
217 GtkCellRendererCombo *combo, gchar *path_string, GtkTreeIter *new_iter,
218 gpointer user_data)
219{
220 GtkTreeIter *pass_data;
221
222 pass_data = g_object_get_data (G_OBJECT (combo), "selected-type");
223 if (pass_data)
224 g_free (pass_data);
225 pass_data = g_new0 (GtkTreeIter, 1);
226 *pass_data = *new_iter;
227 g_object_set_data (G_OBJECT (combo), "selected-type", pass_data);
228}
230 229
231void 230void
232GNUNET_GTK_edit_file_information_metadata_add_button_clicked_cb () 231GNUNET_GTK_edit_publication_metadata_tree_view_value_renderer_edited_cb (
232 GtkCellRendererText *renderer, gchar *path, gchar *new_text,
233 gpointer user_data)
233{ 234{
234 const char *value; 235 GtkBuilder *builder;
236 GtkTreeView *meta_tree;
237 GtkListStore *meta_list;
238 GtkTreeIter iter;
239 gint metatype;
235 char *avalue; 240 char *avalue;
236 const char *ivalue; 241 const char *ivalue;
237 GtkEntry *entry;
238 GtkListStore *ls;
239 GtkTreeModel *tm;
240 GtkTreeView *tv;
241 GtkTreeSelection *sel;
242 GtkTreeIter iter;
243 guint type;
244 size_t slen; 242 size_t slen;
245 char *pos; 243 char *pos;
246 244
247 entry = 245 GObject *pubwindow;
248 GTK_ENTRY (gtk_builder_get_object 246 struct edit_publication_state *state = NULL;
249 (builder, 247
250 "GNUNET_GTK_edit_file_information_metadata_value_entry")); 248 builder = GTK_BUILDER (user_data);
251 value = gtk_entry_get_text (entry); 249 meta_tree = GTK_TREE_VIEW (gtk_builder_get_object (builder,
252 if ((value == NULL) || (strlen (value) == 0)) 250 "GNUNET_GTK_edit_publication_metadata_tree_view"));
253 { 251 meta_list = GTK_LIST_STORE (gtk_tree_view_get_model (meta_tree));
254 GNUNET_break (0); 252 if (!gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (meta_list), &iter, path))
255 return; 253 return;
256 } 254
257 tv = GTK_TREE_VIEW (gtk_builder_get_object 255 pubwindow = gtk_builder_get_object (builder,
258 (builder, 256 "GNUNET_GTK_edit_publication_window");
259 "GNUNET_GTK_edit_file_information_metadata_type_tree_view")); 257 state = g_object_get_data (pubwindow, PUBSTATE);
260 tm = gtk_tree_view_get_model (tv); 258 if (!state)
261 sel = gtk_tree_view_get_selection (tv);
262 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
263 { 259 {
264 GNUNET_break (0); 260 GNUNET_break (0);
265 return; 261 return;
266 } 262 }
267 gtk_tree_model_get (tm, &iter, 1, &type, -1); 263
268 ls = GTK_LIST_STORE (gtk_builder_get_object 264 gtk_tree_model_get (GTK_TREE_MODEL (meta_list), &iter, 0, &metatype, -1);
269 (builder, "GNUNET_GTK_meta_data_list_store")); 265 if (metatype == EXTRACTOR_METATYPE_FILENAME
270 if ((type == EXTRACTOR_METATYPE_FILENAME) && 266 && new_text[strlen (new_text) - 1] != '/'
271 (value[strlen (value) - 1] != '/') && (is_directory)) 267 && state->is_directory)
272 { 268 {
273 GNUNET_asprintf (&avalue, "%s/", value); 269 GNUNET_asprintf (&avalue, "%s/", new_text);
274 /* if user typed '\' instead of '/', change it! */ 270 /* if user typed '\' instead of '/', change it! */
275 slen = strlen (avalue); 271 slen = strlen (avalue);
276 while ((slen > 1) && (avalue[slen - 2] == '\\')) 272 while ((slen > 1) && (avalue[slen - 2] == '\\'))
@@ -281,7 +277,7 @@ GNUNET_GTK_edit_file_information_metadata_add_button_clicked_cb ()
281 } 277 }
282 while (NULL != (pos = strstr (avalue, "\\"))) 278 while (NULL != (pos = strstr (avalue, "\\")))
283 *pos = '/'; 279 *pos = '/';
284 /* remove '../' everywhere */ 280 // remove '../' everywhere
285 while (NULL != (pos = strstr (avalue, "../"))) 281 while (NULL != (pos = strstr (avalue, "../")))
286 { 282 {
287 pos[0] = '_'; 283 pos[0] = '_';
@@ -292,158 +288,260 @@ GNUNET_GTK_edit_file_information_metadata_add_button_clicked_cb ()
292 } 288 }
293 else 289 else
294 { 290 {
295 ivalue = value; 291 ivalue = new_text;
296 avalue = NULL; 292 avalue = NULL;
297 } 293 }
298 294
299 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, type, 1, 295 gtk_list_store_set (meta_list, &iter, 3, ivalue, -1);
300 (guint) EXTRACTOR_METAFORMAT_UTF8, 2,
301 EXTRACTOR_metatype_to_string (type), 3,
302 ivalue, -1);
303 GNUNET_free_non_null (avalue); 296 GNUNET_free_non_null (avalue);
304 gtk_entry_set_text (GTK_ENTRY (entry), "");
305} 297}
306 298
299void
300GNUNET_GTK_edit_publication_delete_button_clicked_cb (GtkButton *button,
301 gpointer user_data)
302{
303 GtkTreeView *tv;
304 GtkTreeSelection *sel;
305 GtkTreeModel *tm;
306 GtkTreeIter iter;
307 GtkBuilder *builder = GTK_BUILDER (user_data);
307 308
308/** 309 tv = GTK_TREE_VIEW (gtk_builder_get_object
309 * Add each of the keywords to the keyword list store. 310 (builder,
310 * 311 "GNUNET_GTK_edit_publication_metadata_tree_view"));
311 * @param cls closure 312 sel = gtk_tree_view_get_selection (tv);
312 * @param keyword the keyword 313 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
313 * @param is_mandatory is the keyword mandatory (in a search) 314 {
314 * @return GNUNET_OK to continue to iterate 315 GNUNET_break (0);
315 */ 316 return;
316static int 317 }
317add_keyword (void *cls, const char *keyword, int is_mandatory) 318 if (gtk_list_store_remove (GTK_LIST_STORE (tm), &iter))
319 gtk_tree_selection_select_iter (sel, &iter);
320}
321
322void
323GNUNET_GTK_edit_publication_keyword_list_add_button_clicked_cb (
324 GtkButton *button, gpointer user_data)
318{ 325{
326 const char *keyword;
327 GtkEntry *entry;
319 GtkListStore *ls; 328 GtkListStore *ls;
320 GtkTreeIter iter; 329 GtkTreeIter iter;
330 GtkBuilder *builder;
331 GtkWidget *ok;
332
333 builder = GTK_BUILDER (user_data);
321 334
322 ls = GTK_LIST_STORE (gtk_builder_get_object 335 ls = GTK_LIST_STORE (gtk_builder_get_object
323 (builder, "GNUNET_GTK_keyword_list_store")); 336 (builder, "GNUNET_GTK_publication_keywords_liststore"));
324 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, keyword, -1); 337 entry =
325 return GNUNET_OK; 338 GTK_ENTRY (gtk_builder_get_object
339 (builder, "GNUNET_GTK_edit_publication_keyword_entry"));
340 keyword = gtk_entry_get_text (entry);
341 if (strlen (keyword) > 0)
342 {
343 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, keyword, 1, TRUE, -1);
344 ok = GTK_WIDGET (gtk_builder_get_object (builder,
345 "GNUNET_GTK_edit_publication_confirm_button"));
346 gtk_widget_set_sensitive (ok, TRUE);
347 }
348 gtk_entry_set_text (entry, "");
326} 349}
327 350
351gboolean
352gtk_tree_model_get_item_count_cb (GtkTreeModel *model, GtkTreePath *path,
353 GtkTreeIter *iter, gpointer data)
354{
355 gint *counter = (gint *) data;
356 *counter += 1;
357 return FALSE;
358}
328 359
329/** 360void
330 * Add the given meta data to the model (or make it the preview 361GNUNET_GTK_edit_publication_keyword_entry_changed_cb (GtkEditable *editable,
331 * image if it is an image). 362 gpointer user_data)
332 *
333 * @param cls closure, NULL
334 * @param plugin_name name of the plugin that produced this value;
335 * special values can be used (i.e. '<zlib>' for zlib being
336 * used in the main libextractor library and yielding
337 * meta data).
338 * @param type libextractor-type describing the meta data
339 * @param format basic format information about data
340 * @param data_mime_type mime-type of data (not of the original file);
341 * can be NULL (if mime-type is not known)
342 * @param data actual meta-data found
343 * @param data_len number of bytes in data
344 * @return 0 to continue extracting
345 */
346static int
347add_meta_item (void *cls, const char *plugin_name, enum EXTRACTOR_MetaType type,
348 enum EXTRACTOR_MetaFormat format, const char *data_mime_type,
349 const char *data, size_t data_len)
350{ 363{
351 GtkListStore *ls; 364 const char *keyword;
365 GtkEntry *entry;
366 GtkWidget *button;
367 GtkBuilder *builder;
368
369 builder = GTK_BUILDER (user_data);
370
371 button =
372 GTK_WIDGET (gtk_builder_get_object
373 (builder,
374 "GNUNET_GTK_edit_publication_keyword_list_add_button"));
375 entry =
376 GTK_ENTRY (gtk_builder_get_object
377 (builder, "GNUNET_GTK_edit_publication_keyword_entry"));
378 keyword = gtk_entry_get_text (entry);
379 gtk_widget_set_sensitive (button, (strlen (keyword) > 0) ? TRUE : FALSE);
380}
381
382
383gint
384gtk_tree_model_get_item_count (GtkTreeModel *model)
385{
386 gint c = 0;
387 gtk_tree_model_foreach (model, &gtk_tree_model_get_item_count_cb, &c);
388 return c;
389}
390
391gboolean
392gtk_tree_model_has_items_cb (GtkTreeModel *model, GtkTreePath *path,
393 GtkTreeIter *iter, gpointer data)
394{
395 gboolean *val = (gboolean *) data;
396 *val = TRUE;
397 return TRUE;
398}
399
400gboolean
401gtk_tree_model_has_items (GtkTreeModel *model)
402{
403 gboolean b = FALSE;
404 gtk_tree_model_foreach (model, &gtk_tree_model_has_items_cb, &b);
405 return b;
406}
407
408void
409GNUNET_GTK_edit_publication_keyword_list_del_button_clicked_cb (
410 GtkButton *button, gpointer user_data)
411{
412 GtkTreeView *tv;
413 GtkTreeSelection *sel;
414 GtkTreeModel *tm;
352 GtkTreeIter iter; 415 GtkTreeIter iter;
416 GtkBuilder *builder;
417 GtkWidget *ok;
418 GObject *pubwindow;
419 struct edit_publication_state *state = NULL;
420 builder = GTK_BUILDER (user_data);
353 421
354 switch (format) 422 tv = GTK_TREE_VIEW (gtk_builder_get_object
423 (builder,
424 "GNUNET_GTK_edit_publication_keyword_list_tree_view"));
425
426 sel = gtk_tree_view_get_selection (tv);
427 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
355 { 428 {
356 case EXTRACTOR_METAFORMAT_UTF8:
357 case EXTRACTOR_METAFORMAT_C_STRING:
358 ls = GTK_LIST_STORE (gtk_builder_get_object
359 (builder, "GNUNET_GTK_meta_data_list_store"));
360 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, (guint) type, 1,
361 (guint) format, 2,
362 EXTRACTOR_metatype_to_string (type), 3,
363 data, -1);
364 break;
365 case EXTRACTOR_METAFORMAT_UNKNOWN:
366 break;
367 case EXTRACTOR_METAFORMAT_BINARY:
368 break;
369 default:
370 GNUNET_break (0); 429 GNUNET_break (0);
430 return;
371 } 431 }
372 return 0; 432 if (gtk_list_store_remove (GTK_LIST_STORE (tm), &iter))
433 gtk_tree_selection_select_iter (sel, &iter);
434
435 ok = GTK_WIDGET (gtk_builder_get_object (builder,
436 "GNUNET_GTK_edit_publication_confirm_button"));
437
438 pubwindow = gtk_builder_get_object (builder,
439 "GNUNET_GTK_edit_publication_window");
440 state = g_object_get_data (pubwindow, PUBSTATE);
441 if (!state)
442 {
443 GNUNET_break (0);
444 return;
445 }
446
447 if (!state->allow_no_keywords && !gtk_tree_model_has_items (tm))
448 gtk_widget_set_sensitive (ok, FALSE);
373} 449}
374 450
451void
452GNUNET_GTK_edit_publication_keyword_list_normalize_button_clicked_cb (
453 GtkButton *button, gpointer user_data)
454{
455 GtkTreeView *tv;
456 GtkTreeSelection *sel;
457 GtkTreeModel *tm;
458 GtkTreeIter iter, inserted;
459 gchar *value;
460 struct GNUNET_FS_Uri *uri;
461 struct GNUNET_FS_Uri *nuri;
462 char *nvalue;
463 char *emsg;
464 GtkBuilder *builder;
465 builder = GTK_BUILDER (user_data);
375 466
376/** 467 tv = GTK_TREE_VIEW (gtk_builder_get_object
377 * Function called to extract the information from FI. 468 (builder,
378 * 469 "GNUNET_GTK_edit_publication_keyword_list_tree_view"));
379 * @param cls closure 470 sel = gtk_tree_view_get_selection (tv);
380 * @param fi the entry in the publish-structure 471 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
381 * @param length length of the file or directory 472 return;
382 * @param meta metadata for the file or directory (can be modified) 473 gtk_tree_model_get (tm, &iter, 0, &value, -1);
383 * @param uri pointer to the keywords that will be used for this entry (can be modified) 474 emsg = NULL;
384 * @param bo block options 475 uri = GNUNET_FS_uri_ksk_create (value, &emsg);
385 * @param do_index should we index (can be modified) 476 if (uri == NULL)
386 * @param client_info pointer to client context set upon creation (can be modified) 477 {
387 * @return GNUNET_SYSERR (aborts after first call) 478 GNUNET_break (0);
388 */ 479 GNUNET_free (emsg);
389static int 480 g_free (value);
390file_information_extract (void *cls, struct GNUNET_FS_FileInformation *fi, 481 return;
391 uint64_t length, 482 }
392 struct GNUNET_CONTAINER_MetaData *meta, 483 nuri = GNUNET_FS_uri_ksk_canonicalize (uri);
393 struct GNUNET_FS_Uri **uri, 484 nvalue = GNUNET_FS_uri_ksk_to_string_fancy (nuri);
394 struct GNUNET_FS_BlockOptions *bo, int *do_index, 485
395 void **client_info) 486 if (strcmp (value, nvalue) != 0)
487 {
488 gtk_list_store_insert_after (GTK_LIST_STORE (tm), &inserted, &iter);
489 gtk_list_store_set (GTK_LIST_STORE (tm), &inserted, 0, nvalue, -1);
490 }
491 GNUNET_FS_uri_destroy (nuri);
492 GNUNET_FS_uri_destroy (uri);
493 GNUNET_free (nvalue);
494 g_free (value);
495}
496
497void
498GNUNET_GTK_edit_publication_normalization_checkbox_toggled_cb (
499 GtkToggleButton *button, gpointer user_data)
396{ 500{
397 GtkImage *img; 501 GtkBuilder *builder;
398 GdkPixbuf *pixbuf; 502 GtkToggleButton *norm_button;
399 struct tm *t; 503 builder = GTK_BUILDER (user_data);
400 int year; 504 norm_button = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder,
401 time_t tp; 505 "GNUNET_GTK_edit_publication_keyword_list_normalize_button"));
506 gtk_widget_set_sensitive (GTK_WIDGET (norm_button),
507 !gtk_toggle_button_get_active (norm_button));
508}
402 509
403 if (NULL != *uri) 510void
404 GNUNET_FS_uri_ksk_get_keywords (*uri, &add_keyword, NULL); 511GNUNET_GTK_edit_publication_metadata_preview_file_chooser_button_file_set_cb (
405 if (NULL != meta) 512 GtkFileChooserButton *widget, gpointer user_data)
513{
514 gchar *fn;
515 GtkImage *image;
516 GObject *pubwindow;
517 GtkBuilder *builder = GTK_BUILDER (user_data);
518 struct edit_publication_state *state = NULL;
519
520 pubwindow = gtk_builder_get_object (builder,
521 "GNUNET_GTK_edit_publication_window");
522 state = g_object_get_data (pubwindow, PUBSTATE);
523 if (!state)
406 { 524 {
407 GNUNET_CONTAINER_meta_data_iterate (meta, &add_meta_item, NULL); 525 GNUNET_break (0);
408 pixbuf = GNUNET_FS_GTK_get_thumbnail_from_meta_data (meta); 526 return;
409 if (pixbuf != NULL)
410 {
411 img =
412 GTK_IMAGE (gtk_builder_get_object
413 (builder,
414 "GNUNET_GTK_edit_file_information_metadata_preview_image"));
415 gtk_image_set_from_pixbuf (img, pixbuf);
416 }
417 } 527 }
418 tp = bo->expiration_time.abs_value / 1000; /* ms to seconds */ 528
419 t = gmtime (&tp); 529 fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
420 if (t == NULL) 530 image =
421 year = 0; 531 GTK_IMAGE (gtk_builder_get_object
422 else 532 (builder,
423 year = t->tm_year + 1900; 533 "GNUNET_GTK_edit_publication_metadata_preview_image"));
424 gtk_spin_button_set_value (GTK_SPIN_BUTTON 534 gtk_image_set_from_file (image, fn);
425 (gtk_builder_get_object 535 state->preview_changed = GNUNET_YES;
426 (builder,
427 "GNUNET_GTK_edit_file_information_expiration_year_spin_button")),
428 year);
429 gtk_spin_button_set_value (GTK_SPIN_BUTTON
430 (gtk_builder_get_object
431 (builder,
432 "GNUNET_GTK_edit_file_information_anonymity_spin_button")),
433 bo->anonymity_level);
434 gtk_spin_button_set_value (GTK_SPIN_BUTTON
435 (gtk_builder_get_object
436 (builder,
437 "GNUNET_GTK_edit_file_information_priority_spin_button")),
438 bo->content_priority);
439 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
440 (gtk_builder_get_object
441 (builder,
442 "GNUNET_GTK_edit_file_information_index_check_button")),
443 *do_index);
444 return GNUNET_SYSERR; /* only visit top-level item */
445} 536}
446 537
538struct fiu_context
539{
540 GtkBuilder *builder;
541 char **short_fn;
542 gchar *root;
543 struct GNUNET_CONTAINER_MetaData *md;
544};
447 545
448/** 546/**
449 * Copy binary meta data from to the new container and also 547 * Copy binary meta data from to the new container and also
@@ -469,7 +567,9 @@ preserve_meta_items (void *cls, const char *plugin_name,
469 const char *data_mime_type, const char *data, 567 const char *data_mime_type, const char *data,
470 size_t data_len) 568 size_t data_len)
471{ 569{
472 struct GNUNET_CONTAINER_MetaData *md = cls; 570 struct fiu_context *context = (struct fiu_context *) cls;
571 GtkBuilder *builder = context->builder;
572 struct GNUNET_CONTAINER_MetaData *md = context->md;
473 GtkTreeModel *tm; 573 GtkTreeModel *tm;
474 GtkTreeIter iter; 574 GtkTreeIter iter;
475 gchar *value; 575 gchar *value;
@@ -477,13 +577,25 @@ preserve_meta_items (void *cls, const char *plugin_name,
477 guint nformat; 577 guint nformat;
478 int keep; 578 int keep;
479 579
580 GObject *pubwindow;
581 struct edit_publication_state *state = NULL;
582
583 pubwindow = gtk_builder_get_object (builder,
584 "GNUNET_GTK_edit_publication_window");
585 state = g_object_get_data (pubwindow, PUBSTATE);
586 if (!state)
587 {
588 GNUNET_break (0);
589 return 0;
590 }
591
480 keep = GNUNET_NO; 592 keep = GNUNET_NO;
481 switch (format) 593 switch (format)
482 { 594 {
483 case EXTRACTOR_METAFORMAT_UTF8: 595 case EXTRACTOR_METAFORMAT_UTF8:
484 case EXTRACTOR_METAFORMAT_C_STRING: 596 case EXTRACTOR_METAFORMAT_C_STRING:
485 tm = GTK_TREE_MODEL (gtk_builder_get_object 597 tm = GTK_TREE_MODEL (gtk_builder_get_object
486 (builder, "GNUNET_GTK_meta_data_list_store")); 598 (builder, "GNUNET_GTK_publication_metadata_liststore"));
487 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter)) 599 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
488 { 600 {
489 do 601 do
@@ -505,7 +617,7 @@ preserve_meta_items (void *cls, const char *plugin_name,
505 case EXTRACTOR_METAFORMAT_UNKNOWN: 617 case EXTRACTOR_METAFORMAT_UNKNOWN:
506 break; 618 break;
507 case EXTRACTOR_METAFORMAT_BINARY: 619 case EXTRACTOR_METAFORMAT_BINARY:
508 if (preview_changed == GNUNET_NO) 620 if (state->preview_changed == GNUNET_NO)
509 keep = GNUNET_YES; 621 keep = GNUNET_YES;
510 break; 622 break;
511 default: 623 default:
@@ -542,7 +654,9 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
542 struct GNUNET_FS_BlockOptions *bo, int *do_index, 654 struct GNUNET_FS_BlockOptions *bo, int *do_index,
543 void **client_info) 655 void **client_info)
544{ 656{
545 char **short_fn = cls; 657 struct fiu_context *context = (struct fiu_context *) cls;
658 char **short_fn = context->short_fn;
659 GtkBuilder *builder = context->builder;
546 struct GNUNET_CONTAINER_MetaData *nm; 660 struct GNUNET_CONTAINER_MetaData *nm;
547 GtkTreeModel *tm; 661 GtkTreeModel *tm;
548 GtkTreeIter iter; 662 GtkTreeIter iter;
@@ -558,26 +672,49 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
558 const char *mime; 672 const char *mime;
559 GFile *f; 673 GFile *f;
560 GFileInfo *finfo; 674 GFileInfo *finfo;
675 gboolean auto_normalize = FALSE;
561 676
562 bo->anonymity_level = 677 GObject *pubwindow;
563 gtk_spin_button_get_value (GTK_SPIN_BUTTON 678 struct edit_publication_state *state = NULL;
564 (gtk_builder_get_object 679
565 (builder, 680 pubwindow = gtk_builder_get_object (builder,
566 "GNUNET_GTK_edit_file_information_anonymity_spin_button"))); 681 "GNUNET_GTK_edit_publication_window");
682 state = g_object_get_data (pubwindow, PUBSTATE);
683 if (!state)
684 {
685 GNUNET_break (0);
686 return GNUNET_SYSERR;
687 }
688
689 if (!GNUNET_GTK_get_selected_anonymity_level (builder,
690 "GNUNET_GTK_edit_publication_anonymity_combobox", &bo->anonymity_level))
691 return GNUNET_SYSERR;
567 bo->content_priority = 692 bo->content_priority =
568 gtk_spin_button_get_value (GTK_SPIN_BUTTON 693 gtk_spin_button_get_value (GTK_SPIN_BUTTON
569 (gtk_builder_get_object 694 (gtk_builder_get_object
570 (builder, 695 (builder,
571 "GNUNET_GTK_edit_file_information_priority_spin_button"))); 696 "GNUNET_GTK_edit_publication_priority_spin_button")));
572 *do_index = 697 *do_index =
573 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON 698 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
574 (gtk_builder_get_object 699 (gtk_builder_get_object
575 (builder, 700 (builder,
576 "GNUNET_GTK_edit_file_information_index_check_button"))); 701 "GNUNET_GTK_edit_publication_index_checkbutton")));
702 auto_normalize = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
703 (gtk_builder_get_object
704 (builder,
705 "GNUNET_GTK_edit_publication_normalization_checkbox")));
577 sb = GTK_SPIN_BUTTON (gtk_builder_get_object 706 sb = GTK_SPIN_BUTTON (gtk_builder_get_object
578 (builder, 707 (builder,
579 "GNUNET_GTK_edit_file_information_expiration_year_spin_button")); 708 "GNUNET_GTK_edit_publication_expiration_year_spin_button"));
580 bo->expiration_time = GNUNET_FS_GTK_get_expiration_time (sb); 709 bo->expiration_time = GNUNET_FS_GTK_get_expiration_time (sb);
710
711 g_free (context->root);
712 context->root =
713 g_strdup (gtk_entry_get_text (GTK_ENTRY
714 (gtk_builder_get_object
715 (builder,
716 "GNUNET_GTK_edit_publication_root_entry"))));
717
581 /* update URI */ 718 /* update URI */
582 if (NULL != (*uri)) 719 if (NULL != (*uri))
583 GNUNET_FS_uri_destroy (*uri); 720 GNUNET_FS_uri_destroy (*uri);
@@ -586,7 +723,7 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
586 mrg = NULL; 723 mrg = NULL;
587 724
588 tm = GTK_TREE_MODEL (gtk_builder_get_object 725 tm = GTK_TREE_MODEL (gtk_builder_get_object
589 (builder, "GNUNET_GTK_keyword_list_store")); 726 (builder, "GNUNET_GTK_publication_keywords_liststore"));
590 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter)) 727 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
591 { 728 {
592 do 729 do
@@ -598,6 +735,24 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
598 if (NULL != *uri) 735 if (NULL != *uri)
599 GNUNET_FS_uri_destroy (*uri); 736 GNUNET_FS_uri_destroy (*uri);
600 *uri = mrg; 737 *uri = mrg;
738 if (auto_normalize)
739 {
740 char *emsg = NULL;
741 struct GNUNET_FS_Uri *nuri;
742
743 nuri = GNUNET_FS_uri_ksk_create (value, &emsg);
744 if (nuri == NULL)
745 GNUNET_free_non_null (emsg);
746 else
747 {
748 nxt = GNUNET_FS_uri_ksk_canonicalize (nuri);
749 mrg = GNUNET_FS_uri_ksk_merge (nxt, *uri);
750 GNUNET_FS_uri_destroy (nxt);
751 if (NULL != *uri)
752 GNUNET_FS_uri_destroy (*uri);
753 *uri = mrg;
754 }
755 }
601 g_free (value); 756 g_free (value);
602 } 757 }
603 while (TRUE == gtk_tree_model_iter_next (tm, &iter)); 758 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
@@ -605,30 +760,31 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
605 760
606 /* update meta */ 761 /* update meta */
607 nm = GNUNET_CONTAINER_meta_data_create (); 762 nm = GNUNET_CONTAINER_meta_data_create ();
608 GNUNET_CONTAINER_meta_data_iterate (meta, &preserve_meta_items, nm); 763 context->md = nm;
764 GNUNET_CONTAINER_meta_data_iterate (meta, &preserve_meta_items, context);
609 765
610 GNUNET_CONTAINER_meta_data_clear (meta); 766 GNUNET_CONTAINER_meta_data_clear (meta);
611 tm = GTK_TREE_MODEL (gtk_builder_get_object 767 tm = GTK_TREE_MODEL (gtk_builder_get_object
612 (builder, "GNUNET_GTK_meta_data_list_store")); 768 (builder, "GNUNET_GTK_publication_metadata_liststore"));
613 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter)) 769 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
614 { 770 {
615 do 771 do
616 { 772 {
617 gtk_tree_model_get (tm, &iter, 0, &ntype, 1, &nformat, 3, &value, -1); 773 gtk_tree_model_get (tm, &iter, 0, &ntype, 1, &nformat, 3, &value, -1);
618 GNUNET_CONTAINER_meta_data_insert (nm, "<user>", ntype, nformat, 774 if (ntype >= 0)
619 "text/plain", value, 775 GNUNET_CONTAINER_meta_data_insert (nm, "<user>", ntype, nformat,
620 strlen (value) + 1); 776 "text/plain", value, strlen (value) + 1);
621 g_free (value); 777 g_free (value);
622 } 778 }
623 while (TRUE == gtk_tree_model_iter_next (tm, &iter)); 779 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
624 } 780 }
625 GNUNET_CONTAINER_meta_data_merge (meta, nm); 781 GNUNET_CONTAINER_meta_data_merge (meta, nm);
626 if (preview_changed == GNUNET_YES) 782 if (state->preview_changed == GNUNET_YES)
627 { 783 {
628 fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER 784 fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER
629 (gtk_builder_get_object 785 (gtk_builder_get_object
630 (builder, 786 (builder,
631 "GNUNET_GTK_edit_file_information_metadata_preview_file_chooser_button"))); 787 "GNUNET_GTK_edit_publication_metadata_preview_file_chooser_button")));
632 f = g_file_new_for_path (fn); 788 f = g_file_new_for_path (fn);
633 finfo = 789 finfo =
634 g_file_query_info (f, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, 0, NULL, 790 g_file_query_info (f, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, 0, NULL,
@@ -663,32 +819,190 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
663 return GNUNET_SYSERR; /* only visit top-level item */ 819 return GNUNET_SYSERR; /* only visit top-level item */
664} 820}
665 821
822void
823GNUNET_GTK_edit_publication_cancel_button_clicked_cb (
824 GtkButton *button, gpointer user_data)
825{
826 GtkBuilder *builder;
827 GObject *pubwindow;
828 struct edit_publication_state *state = NULL;
829
830 builder = GTK_BUILDER (user_data);
831
832 pubwindow = gtk_builder_get_object (builder,
833 "GNUNET_GTK_edit_publication_window");
834 state = g_object_get_data (pubwindow, PUBSTATE);
835 if (!state)
836 {
837 GNUNET_break (0);
838 return;
839 }
840
841 state->cb (state->cls, state->do_index, state->short_fn,
842 state->anonymity_level, state->priority, NULL, state->fip, GTK_RESPONSE_CANCEL);
843 g_free (state);
844 g_object_set_data (pubwindow, PUBSTATE, NULL);
845 gtk_widget_hide (GTK_WIDGET (pubwindow));
846}
847
848void
849GNUNET_GTK_edit_publication_confirm_button_clicked_cb (
850 GtkButton *button, gpointer user_data)
851{
852 GtkBuilder *builder;
853 GObject *pubwindow;
854 struct edit_publication_state *state = NULL;
855 struct fiu_context ctx;
856
857 builder = GTK_BUILDER (user_data);
858
859 pubwindow = gtk_builder_get_object (builder,
860 "GNUNET_GTK_edit_publication_window");
861 state = g_object_get_data (pubwindow, PUBSTATE);
862 if (!state)
863 {
864 GNUNET_break (0);
865 return;
866 }
867
868 ctx.builder = builder;
869 ctx.short_fn = state->short_fn;
870 ctx.root = NULL;
871 ctx.md = NULL;
872
873 GNUNET_FS_file_information_inspect (state->fip, &file_information_update, &ctx);
874 if (!GNUNET_GTK_get_selected_anonymity_level (builder,
875 "GNUNET_GTK_edit_publication_anonymity_combobox", state->anonymity_level))
876 *state->priority =
877 gtk_spin_button_get_value (GTK_SPIN_BUTTON
878 (gtk_builder_get_object
879 (builder,
880 "GNUNET_GTK_edit_publication_priority_spin_button")));
881 *state->do_index =
882 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
883 (gtk_builder_get_object
884 (builder,
885 "GNUNET_GTK_edit_publication_index_checkbutton")));
886
887
888 state->cb (state->cls, state->do_index, state->short_fn,
889 state->anonymity_level, state->priority, ctx.root, state->fip,
890 GTK_RESPONSE_OK);
891 g_free (state);
892 g_object_set_data (pubwindow, PUBSTATE, NULL);
893 gtk_widget_hide (GTK_WIDGET (pubwindow));
894}
666 895
667/** 896/**
668 * Open the dialog to edit file information data. 897 * Add each of the keywords to the keyword list store.
898 *
899 * @param cls closure
900 * @param keyword the keyword
901 * @param is_mandatory is the keyword mandatory (in a search)
902 * @return GNUNET_OK to continue to iterate
669 */ 903 */
670void 904static int
671GNUNET_FS_GTK_edit_publish_dialog (int *do_index, char **short_fn, 905add_keyword (void *cls, const char *keyword, int is_mandatory)
672 guint * anonymity_level, guint * priority,
673 struct GNUNET_FS_FileInformation *fip)
674{ 906{
675 GtkWidget *ad;
676 GtkListStore *ls; 907 GtkListStore *ls;
677 GtkTreeIter iter; 908 GtkTreeIter iter;
678 guint type;
679 guint max_type;
680 GtkTreeView *tv;
681 GtkTreeSelection *sel;
682 909
683 GNUNET_assert (builder == NULL); 910 ls = GTK_LIST_STORE (cls);
684 builder = 911 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, keyword, 1, FALSE, -1);
685 GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_publish_edit_dialog.glade"); 912 return GNUNET_OK;
686 if (builder == NULL) 913}
914
915/**
916 * Function called to extract the information from FI.
917 *
918 * @param cls closure
919 * @param fi the entry in the publish-structure
920 * @param length length of the file or directory
921 * @param meta metadata for the file or directory (can be modified)
922 * @param uri pointer to the keywords that will be used for this entry (can be modified)
923 * @param bo block options
924 * @param do_index should we index (can be modified)
925 * @param client_info pointer to client context set upon creation (can be modified)
926 * @return GNUNET_SYSERR (aborts after first call)
927 */
928static int
929file_information_extract (void *cls, struct GNUNET_FS_FileInformation *fi,
930 uint64_t length,
931 struct GNUNET_CONTAINER_MetaData *meta,
932 struct GNUNET_FS_Uri **uri,
933 struct GNUNET_FS_BlockOptions *bo, int *do_index,
934 void **client_info)
935{
936 GtkBuilder *builder = GTK_BUILDER (cls);
937 GtkImage *img;
938 GdkPixbuf *pixbuf;
939 struct tm *t;
940 int year;
941 time_t tp;
942 GtkListStore *ls;
943
944 ls = GTK_LIST_STORE (gtk_builder_get_object
945 (builder, "GNUNET_GTK_publication_keywords_liststore"));
946
947 if (NULL != *uri)
948 GNUNET_FS_uri_ksk_get_keywords (*uri, &add_keyword, ls);
949 if (NULL != meta)
687 { 950 {
688 GNUNET_break (0); 951 ls = GTK_LIST_STORE (gtk_builder_get_object (builder,
689 return; 952 "GNUNET_GTK_publication_metadata_liststore"));
953 GNUNET_CONTAINER_meta_data_iterate (meta, &GNUNET_FS_GTK_add_meta_data_to_list_store, ls);
954 pixbuf = GNUNET_FS_GTK_get_thumbnail_from_meta_data (meta);
955 if (pixbuf != NULL)
956 {
957 img =
958 GTK_IMAGE (gtk_builder_get_object
959 (builder,
960 "GNUNET_GTK_publication_metadata_preview_image"));
961 gtk_image_set_from_pixbuf (img, pixbuf);
962 }
690 } 963 }
691 preview_changed = GNUNET_NO; 964 tp = bo->expiration_time.abs_value / 1000; /* ms to seconds */
965 t = gmtime (&tp);
966 if (t == NULL)
967 year = 0;
968 else
969 year = t->tm_year + 1900;
970 gtk_spin_button_set_value (GTK_SPIN_BUTTON
971 (gtk_builder_get_object
972 (builder,
973 "GNUNET_GTK_edit_publication_expiration_year_spin_button")),
974 year);
975 GNUNET_GTK_select_anonymity_level (builder,
976 "GNUNET_GTK_edit_publication_anonymity_combobox", bo->anonymity_level);
977 gtk_spin_button_set_value (GTK_SPIN_BUTTON
978 (gtk_builder_get_object
979 (builder,
980 "GNUNET_GTK_edit_publication_priority_spin_button")),
981 bo->content_priority);
982 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
983 (gtk_builder_get_object
984 (builder,
985 "GNUNET_GTK_edit_publication_index_checkbutton")),
986 *do_index);
987 return GNUNET_SYSERR; /* only visit top-level item */
988}
989
990
991/**
992 * Open the dialog to edit file information data.
993 */
994void
995GNUNET_FS_GTK_edit_publish_dialog (GtkBuilder *builder, GtkWindow *parent, int *do_index,
996 char **short_fn, guint *anonymity_level, guint *priority,
997 struct GNUNET_FS_FileInformation *fip, gboolean allow_no_keywords,
998 GNUNET_FS_GTK_edit_publish_dialog_cb cb, gpointer cls)
999{
1000 GtkWidget *dialog;
1001 GObject *pubwindow;
1002 GtkEntry *entry;
1003 GtkWidget *ok;
1004 struct edit_publication_state *state;
1005
692 GNUNET_FS_GTK_setup_expiration_year_adjustment (builder); 1006 GNUNET_FS_GTK_setup_expiration_year_adjustment (builder);
693 if (GNUNET_FS_file_information_is_directory (fip)) 1007 if (GNUNET_FS_file_information_is_directory (fip))
694 { 1008 {
@@ -696,80 +1010,60 @@ GNUNET_FS_GTK_edit_publish_dialog (int *do_index, char **short_fn,
696 gtk_widget_hide (GTK_WIDGET 1010 gtk_widget_hide (GTK_WIDGET
697 (gtk_builder_get_object 1011 (gtk_builder_get_object
698 (builder, 1012 (builder,
699 "GNUNET_GTK_edit_file_information_index_check_button"))); 1013 "GNUNET_GTK_edit_publication_index_checkbutton")));
700 gtk_widget_hide (GTK_WIDGET 1014 gtk_widget_hide (GTK_WIDGET
701 (gtk_builder_get_object 1015 (gtk_builder_get_object
702 (builder, 1016 (builder,
703 "GNUNET_GTK_edit_file_information_index_label"))); 1017 "GNUNET_GTK_edit_publication_index_label")));
704
705 } 1018 }
706 1019 if (allow_no_keywords)
707 ad = GTK_WIDGET (gtk_builder_get_object
708 (builder, "GNUNET_GTK_edit_file_information_dialog"));
709 ls = GTK_LIST_STORE (gtk_builder_get_object
710 (builder, "GNUNET_GTK_metatype_list_store"));
711 max_type = EXTRACTOR_metatype_get_max ();
712 type = 1;
713 while (type < max_type - 1)
714 { 1020 {
715 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, 1021 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder,
716 EXTRACTOR_metatype_to_string (type), 1, 1022 "GNUNET_GTK_edit_publication_root_entry")));
717 type, 2, 1023 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder,
718 EXTRACTOR_metatype_to_description (type), 1024 "GNUNET_GTK_edit_publication_root_label")));
719 -1);
720 type++;
721 } 1025 }
1026 gtk_list_store_clear (GTK_LIST_STORE (gtk_builder_get_object (
1027 builder, "GNUNET_GTK_publication_keywords_liststore")));
1028 gtk_list_store_clear (GTK_LIST_STORE (gtk_builder_get_object (
1029 builder, "GNUNET_GTK_publication_metadata_liststore")));
1030
1031 GNUNET_FS_file_information_inspect (fip, &file_information_extract, builder);
1032
1033 dialog = GTK_WIDGET (gtk_builder_get_object (builder,
1034 "GNUNET_GTK_edit_publication_window"));
1035
1036 gtk_window_set_title (GTK_WINDOW (dialog), *short_fn);
1037
1038 state = g_new0 (struct edit_publication_state, 1);
1039 state->do_index = do_index;
1040 state->short_fn = short_fn;
1041 state->root = NULL;
1042 state->anonymity_level = anonymity_level;
1043 state->priority = priority;
1044 state->fip = fip;
1045 state->preview_changed = GNUNET_NO;
1046 state->allow_no_keywords = allow_no_keywords;
1047 state->is_directory = GNUNET_FS_file_information_is_directory (fip);
1048 state->cb = cb;
1049 state->cls = cls;
722 1050
723 GNUNET_FS_file_information_inspect (fip, &file_information_extract, NULL); 1051 entry =
724 tv = GTK_TREE_VIEW (gtk_builder_get_object 1052 GTK_ENTRY (gtk_builder_get_object
725 (builder, 1053 (builder, "GNUNET_GTK_edit_publication_keyword_entry"));
726 "GNUNET_GTK_edit_file_information_metadata_type_tree_view")); 1054 gtk_entry_set_text (entry, "");
727 sel = gtk_tree_view_get_selection (tv);
728 g_signal_connect (G_OBJECT (sel), "changed",
729 G_CALLBACK
730 (GNUNET_GTK_edit_file_information_metadata_value_entry_changed_cb),
731 NULL);
732 1055
733 tv = GTK_TREE_VIEW (gtk_builder_get_object 1056 pubwindow = gtk_builder_get_object (builder,
734 (builder, 1057 "GNUNET_GTK_edit_publication_window");
735 "GNUNET_GTK_edit_file_information_metadata_tree_view")); 1058 g_object_set_data (pubwindow, PUBSTATE, state);
736 sel = gtk_tree_view_get_selection (tv);
737 g_signal_connect (G_OBJECT (sel), "changed",
738 G_CALLBACK (metadata_selection_changed_cb), NULL);
739 1059
740 tv = GTK_TREE_VIEW (gtk_builder_get_object 1060 ok = GTK_WIDGET (gtk_builder_get_object (builder,
741 (builder, 1061 "GNUNET_GTK_edit_publication_confirm_button"));
742 "GNUNET_GTK_edit_file_information_keyword_list_tree_view")); 1062 gtk_widget_set_sensitive (ok, allow_no_keywords ? TRUE : FALSE);
743 sel = gtk_tree_view_get_selection (tv); 1063
744 g_signal_connect (G_OBJECT (sel), "changed", 1064 gtk_window_set_transient_for (GTK_WINDOW (pubwindow), parent);
745 G_CALLBACK (keyword_selection_changed_cb), NULL); 1065
746 gtk_window_set_title (GTK_WINDOW (ad), *short_fn); 1066 gtk_window_present (GTK_WINDOW (dialog));
747 if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
748 {
749 gtk_widget_destroy (ad);
750 g_object_unref (G_OBJECT (builder));
751 builder = NULL;
752 return;
753 }
754 GNUNET_FS_file_information_inspect (fip, &file_information_update, short_fn);
755 *anonymity_level =
756 gtk_spin_button_get_value (GTK_SPIN_BUTTON
757 (gtk_builder_get_object
758 (builder,
759 "GNUNET_GTK_edit_file_information_anonymity_spin_button")));
760 *priority =
761 gtk_spin_button_get_value (GTK_SPIN_BUTTON
762 (gtk_builder_get_object
763 (builder,
764 "GNUNET_GTK_edit_file_information_priority_spin_button")));
765 *do_index =
766 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
767 (gtk_builder_get_object
768 (builder,
769 "GNUNET_GTK_edit_file_information_index_check_button")));
770 gtk_widget_destroy (ad);
771 g_object_unref (G_OBJECT (builder));
772 builder = NULL;
773} 1067}
774 1068
775/* end of gnunet-fs-gtk-edit_publish_dialog.c */ 1069/* end of gnunet-fs-gtk-edit_publish_dialog.c */
diff --git a/src/fs/gnunet-fs-gtk-edit_publish_dialog.h b/src/fs/gnunet-fs-gtk-edit_publish_dialog.h
index 63635212..5473cb42 100644
--- a/src/fs/gnunet-fs-gtk-edit_publish_dialog.h
+++ b/src/fs/gnunet-fs-gtk-edit_publish_dialog.h
@@ -30,10 +30,20 @@
30#include <gnunet/gnunet_fs_service.h> 30#include <gnunet/gnunet_fs_service.h>
31 31
32 32
33typedef void
34(*GNUNET_FS_GTK_edit_publish_dialog_cb) (gpointer cls, int *do_index, char **short_fn,
35 guint * anonymity_level, guint * priority, gchar *root,
36 struct GNUNET_FS_FileInformation *fip, gint ret);
37
38
39/**
40 * Open the dialog to edit file information data.
41 */
33void 42void
34GNUNET_FS_GTK_edit_publish_dialog (int *do_index, char **short_fn, 43GNUNET_FS_GTK_edit_publish_dialog (GtkBuilder *builder, GtkWindow *parent, int *do_index,
35 guint * anonymity_level, guint * priority, 44 char **short_fn, guint * anonymity_level, guint * priority,
36 struct GNUNET_FS_FileInformation *fip); 45 struct GNUNET_FS_FileInformation *fip, gboolean allow_no_keywords,
46 GNUNET_FS_GTK_edit_publish_dialog_cb cb, gpointer cls);
37 47
38#endif 48#endif
39/* end of gnunet-fs-gtk-edit_publish_dialog.h */ 49/* end of gnunet-fs-gtk-edit_publish_dialog.h */
diff --git a/src/fs/gnunet-fs-gtk-main_window_adv_pseudonym.c b/src/fs/gnunet-fs-gtk-main_window_adv_pseudonym.c
index bb3265e0..9b76f2ab 100644
--- a/src/fs/gnunet-fs-gtk-main_window_adv_pseudonym.c
+++ b/src/fs/gnunet-fs-gtk-main_window_adv_pseudonym.c
@@ -24,343 +24,7 @@
24 */ 24 */
25#include "gnunet-fs-gtk-common.h" 25#include "gnunet-fs-gtk-common.h"
26#include "gnunet-fs-gtk.h" 26#include "gnunet-fs-gtk.h"
27 27#include "gnunet-fs-gtk-edit_publish_dialog.h"
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
48 (builder,
49 "GNUNET_GTK_advertise_pseudonym_keyword_list_tree_view"));
50 sel = gtk_tree_view_get_selection (tv);
51 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
52 {
53 GNUNET_break (0);
54 return;
55 }
56 gtk_tree_model_get (tm, &iter, 0, &value, -1);
57 emsg = NULL;
58 uri = GNUNET_FS_uri_ksk_create (value, &emsg);
59 if (uri == NULL)
60 {
61 GNUNET_break (0);
62 GNUNET_free (emsg);
63 g_free (value);
64 return;
65 }
66 nuri = GNUNET_FS_uri_ksk_canonicalize (uri);
67 nvalue = GNUNET_FS_uri_ksk_to_string_fancy (nuri);
68 gtk_list_store_set (GTK_LIST_STORE (tm), &iter, 0, nvalue, -1);
69 GNUNET_FS_uri_destroy (nuri);
70 GNUNET_FS_uri_destroy (uri);
71 GNUNET_free (nvalue);
72 g_free (value);
73}
74
75
76/**
77 * Remove the currently selected keyword from the list.
78 */
79void
80GNUNET_GTK_advertise_pseudonym_keyword_list_del_button_clicked_cb ()
81{
82 GtkTreeView *tv;
83 GtkTreeSelection *sel;
84 GtkTreeModel *tm;
85 GtkTreeIter iter;
86 GtkWidget *w;
87
88 tv = GTK_TREE_VIEW (gtk_builder_get_object
89 (builder,
90 "GNUNET_GTK_advertise_pseudonym_keyword_list_tree_view"));
91 sel = gtk_tree_view_get_selection (tv);
92 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
93 {
94 GNUNET_break (0);
95 return;
96 }
97 gtk_list_store_remove (GTK_LIST_STORE (tm), &iter);
98 if (TRUE != gtk_tree_model_get_iter_first (tm, &iter))
99 {
100 /* keyword list now empty, disable 'Ok' button! */
101 w = GTK_WIDGET (gtk_builder_get_object (builder,
102 "GNUNET_GTK_advertise_pseudonym_confirm_button"));
103 gtk_widget_set_sensitive (w, FALSE);
104 }
105}
106
107
108/**
109 * Add keyword from entry line to keyword list.
110 */
111void
112GNUNET_GTK_advertise_pseudonym_keyword_list_add_button_clicked_cb ()
113{
114 const char *keyword;
115 GtkEntry *entry;
116 GtkListStore *ls;
117 GtkTreeIter iter;
118 GtkWidget *w;
119
120 ls = GTK_LIST_STORE (gtk_builder_get_object
121 (builder, "GNUNET_GTK_keyword_list_store"));
122 entry =
123 GTK_ENTRY (gtk_builder_get_object
124 (builder, "GNUNET_GTK_advertise_pseudonym_keyword_entry"));
125 keyword = gtk_entry_get_text (entry);
126 if (strlen (keyword) > 0)
127 {
128 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, keyword, -1);
129 /* enable OK button */
130 w = GTK_WIDGET (gtk_builder_get_object (builder, "GNUNET_GTK_advertise_pseudonym_confirm_button"));
131 gtk_widget_set_sensitive (w, TRUE);
132 }
133 gtk_entry_set_text (entry, "");
134}
135
136
137/**
138 * Update sensitivity of keyword add button.
139 */
140void
141GNUNET_GTK_advertise_pseudonym_keyword_entry_changed_cb ()
142{
143 const char *keyword;
144 GtkEntry *entry;
145 GtkWidget *button;
146
147 button =
148 GTK_WIDGET (gtk_builder_get_object
149 (builder,
150 "GNUNET_GTK_advertise_pseudonym_keyword_list_add_button"));
151 entry =
152 GTK_ENTRY (gtk_builder_get_object
153 (builder, "GNUNET_GTK_advertise_pseudonym_keyword_entry"));
154 keyword = gtk_entry_get_text (entry);
155 gtk_widget_set_sensitive (button, (strlen (keyword) > 0) ? TRUE : FALSE);
156}
157
158/**
159 * Update sensitivity of metadata delete button.
160 */
161static void
162metadata_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
163{
164 GtkTreeView *tv;
165 GtkTreeSelection *sel;
166 GtkWidget *button;
167
168 tv = GTK_TREE_VIEW (gtk_builder_get_object
169 (builder,
170 "GNUNET_GTK_advertise_pseudonym_metadata_tree_view"));
171 sel = gtk_tree_view_get_selection (tv);
172 button =
173 GTK_WIDGET (gtk_builder_get_object
174 (builder,
175 "GNUNET_GTK_advertise_pseudonym_metadata_delete_button"));
176 gtk_widget_set_sensitive (button,
177 gtk_tree_selection_get_selected (sel, NULL, NULL));
178}
179
180
181/**
182 * Update sensitivity of keyword delete and normalize button.
183 */
184static void
185keyword_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
186{
187 GtkTreeView *tv;
188 GtkTreeSelection *sel;
189 GtkWidget *button;
190
191 tv = GTK_TREE_VIEW (gtk_builder_get_object
192 (builder,
193 "GNUNET_GTK_advertise_pseudonym_keyword_list_tree_view"));
194 sel = gtk_tree_view_get_selection (tv);
195 button =
196 GTK_WIDGET (gtk_builder_get_object
197 (builder,
198 "GNUNET_GTK_advertise_pseudonym_keyword_list_del_button"));
199
200 gtk_widget_set_sensitive (button,
201 gtk_tree_selection_get_selected (sel, NULL, NULL));
202 button =
203 GTK_WIDGET (gtk_builder_get_object
204 (builder,
205 "GNUNET_GTK_advertise_pseudonym_keyword_list_normalize_button"));
206 gtk_widget_set_sensitive (button,
207 gtk_tree_selection_get_selected (sel, NULL, NULL));
208}
209
210
211/**
212 * Update sensitivity of metadata add button.
213 */
214void
215GNUNET_GTK_advertise_pseudonym_metadata_value_entry_changed_cb ()
216{
217 GtkTreeView *tv;
218 GtkTreeSelection *sel;
219 const char *value;
220 GtkEntry *entry;
221 GtkWidget *button;
222
223 entry =
224 GTK_ENTRY (gtk_builder_get_object
225 (builder,
226 "GNUNET_GTK_advertise_pseudonym_metadata_value_entry"));
227 value = gtk_entry_get_text (entry);
228 tv = GTK_TREE_VIEW (gtk_builder_get_object
229 (builder,
230 "GNUNET_GTK_advertise_pseudonym_metadata_type_tree_view"));
231 sel = gtk_tree_view_get_selection (tv);
232 button =
233 GTK_WIDGET (gtk_builder_get_object
234 (builder,
235 "GNUNET_GTK_advertise_pseudonym_metadata_add_button"));
236 gtk_widget_set_sensitive (button,
237 (strlen (value) >
238 0) ? gtk_tree_selection_get_selected (sel, NULL,
239 NULL) :
240 FALSE);
241}
242
243
244/**
245 * Add keyword to keyword list.
246 */
247void
248GNUNET_GTK_advertise_pseudonym_keyword_entry_activate_cb ()
249{
250 GNUNET_GTK_advertise_pseudonym_keyword_list_add_button_clicked_cb ();
251}
252
253
254void
255GNUNET_GTK_advertise_pseudonym_metadata_preview_file_chooser_button_file_set_cb
256 ()
257{
258 GNUNET_break (0);
259}
260
261/**
262 * Delete currently selected item from meta data list.
263 */
264void
265GNUNET_GTK_advertise_pseudonym_metadata_delete_button_clicked_cb ()
266{
267 GtkTreeView *tv;
268 GtkTreeSelection *sel;
269 GtkTreeModel *tm;
270 GtkTreeIter iter;
271
272 tv = GTK_TREE_VIEW (gtk_builder_get_object
273 (builder,
274 "GNUNET_GTK_advertise_pseudonym_metadata_tree_view"));
275 sel = gtk_tree_view_get_selection (tv);
276 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
277 {
278 GNUNET_break (0);
279 return;
280 }
281 gtk_list_store_remove (GTK_LIST_STORE (tm), &iter);
282}
283
284
285/**
286 * Add metadata to metadata list.
287 */
288void
289GNUNET_GTK_advertise_pseudonym_metadata_add_button_clicked_cb ()
290{
291 const char *value;
292 char *avalue;
293 const char *ivalue;
294 GtkEntry *entry;
295 GtkListStore *ls;
296 GtkTreeModel *tm;
297 GtkTreeView *tv;
298 GtkTreeSelection *sel;
299 GtkTreeIter iter;
300 guint type;
301 size_t slen;
302 char *pos;
303
304 entry =
305 GTK_ENTRY (gtk_builder_get_object
306 (builder,
307 "GNUNET_GTK_advertise_pseudonym_metadata_value_entry"));
308 value = gtk_entry_get_text (entry);
309 if ((value == NULL) || (strlen (value) == 0))
310 {
311 GNUNET_break (0);
312 return;
313 }
314 tv = GTK_TREE_VIEW (gtk_builder_get_object
315 (builder,
316 "GNUNET_GTK_advertise_pseudonym_metadata_type_tree_view"));
317 tm = gtk_tree_view_get_model (tv);
318 sel = gtk_tree_view_get_selection (tv);
319 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
320 {
321 GNUNET_break (0);
322 return;
323 }
324 gtk_tree_model_get (tm, &iter, 1, &type, -1);
325 ls = GTK_LIST_STORE (gtk_builder_get_object
326 (builder, "GNUNET_GTK_meta_data_list_store"));
327 if ((type == EXTRACTOR_METATYPE_FILENAME) &&
328 (value[strlen (value) - 1] != '/'))
329 {
330 GNUNET_asprintf (&avalue, "%s/", value);
331 /* if user typed '\' instead of '/', change it! */
332 slen = strlen (avalue);
333 while ((slen > 1) && (avalue[slen - 2] == '\\'))
334 {
335 avalue[slen - 2] = '/';
336 avalue[slen - 1] = '\0';
337 slen--;
338 }
339 while (NULL != (pos = strstr (avalue, "\\")))
340 *pos = '/';
341 /* remove '../' everywhere */
342 while (NULL != (pos = strstr (avalue, "../")))
343 {
344 pos[0] = '_';
345 pos[1] = '_';
346 pos[2] = '_';
347 }
348 ivalue = avalue;
349 }
350 else
351 {
352 ivalue = value;
353 avalue = NULL;
354 }
355
356 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, type, 1,
357 (guint) EXTRACTOR_METAFORMAT_UTF8, 2,
358 EXTRACTOR_metatype_to_string (type), 3,
359 ivalue, -1);
360 GNUNET_free_non_null (avalue);
361 gtk_entry_set_text (GTK_ENTRY (entry), "");
362}
363
364 28
365/** 29/**
366 * Callback with information about local (!) namespaces. 30 * Callback with information about local (!) namespaces.
@@ -390,6 +54,8 @@ selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
390{ 54{
391 GtkTreeIter iter; 55 GtkTreeIter iter;
392 GtkWidget *ok_button; 56 GtkWidget *ok_button;
57 GtkBuilder *builder;
58 builder = GTK_BUILDER (user_data);
393 59
394 ok_button = 60 ok_button =
395 GTK_WIDGET (gtk_builder_get_object 61 GTK_WIDGET (gtk_builder_get_object
@@ -400,60 +66,100 @@ selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
400 gtk_widget_set_sensitive (ok_button, FALSE); 66 gtk_widget_set_sensitive (ok_button, FALSE);
401} 67}
402 68
69struct namespace_data_struct
70{
71 struct GNUNET_FS_Namespace *ns;
72 int do_index;
73 char *short_fn;
74 guint anonymity_level;
75 guint priority;
76 gchar *root;
77};
403 78
404/** 79/**
405 * Advertise pseudonym selected. 80 * Function called on entries in a GNUNET_FS_FileInformation publish-structure.
81 *
82 * @param cls closure
83 * @param fi the entry in the publish-structure
84 * @param length length of the file or directory
85 * @param meta metadata for the file or directory (can be modified)
86 * @param uri pointer to the keywords that will be used for this entry (can be modified)
87 * @param bo block options (can be modified)
88 * @param do_index should we index (can be modified)
89 * @param client_info pointer to client context set upon creation (can be modified)
90 * @return GNUNET_OK to continue, GNUNET_NO to remove
91 * this entry from the directory, GNUNET_SYSERR
92 * to abort the iteration
406 */ 93 */
94int
95advertise_namespace (void *cls, struct GNUNET_FS_FileInformation *fi,
96 uint64_t length, struct GNUNET_CONTAINER_MetaData *meta,
97 struct GNUNET_FS_Uri **uri, struct GNUNET_FS_BlockOptions *bo,
98 int *do_index, void **client_info)
99{
100 struct namespace_data_struct *nds;
101 nds = (struct namespace_data_struct *) cls;
102 GNUNET_FS_namespace_advertise (GNUNET_FS_GTK_get_fs_handle (), *uri,
103 nds->ns, meta, bo, nds->root, NULL, NULL);
104 return GNUNET_SYSERR;
105}
106
407void 107void
408GNUNET_GTK_main_menu_file_advertise_pseudonym_activate_cb (GtkWidget * dummy, 108adv_pseudonym_edit_publish_dialog_cb (gpointer cls, int *do_index, char **short_fn,
409 gpointer data) 109 guint * anonymity_level, guint * priority, gchar *root,
110 struct GNUNET_FS_FileInformation *fip, gint ret)
111{
112 struct namespace_data_struct *nds;
113 nds = (struct namespace_data_struct *) cls;
114
115 if (ret == GTK_RESPONSE_OK)
116 {
117 nds->do_index = *do_index;
118 nds->short_fn = *short_fn;
119 nds->anonymity_level = *anonymity_level;
120 nds->priority = *priority;
121 nds->root = root;
122 GNUNET_FS_file_information_inspect (fip,
123 advertise_namespace, nds);
124 }
125 g_free (nds->root);
126 GNUNET_FS_namespace_delete (nds->ns, GNUNET_NO);
127 g_free (nds);
128 GNUNET_FS_file_information_destroy (fip, NULL, NULL);
129}
130
131void
132GNUNET_GTK_select_pseudonym_dialog_response_cb (GtkDialog *dialog,
133 gint response_id, gpointer user_data)
410{ 134{
135 GtkBuilder *builder;
411 GtkWidget *ad; 136 GtkWidget *ad;
412 struct GNUNET_FS_Namespace *ns;
413 struct GNUNET_FS_Namespace *nso;
414 GtkListStore *ls;
415 GtkTreeView *tv; 137 GtkTreeView *tv;
416 GtkTreeIter iter;
417 GtkTreeSelection *sel; 138 GtkTreeSelection *sel;
418 GtkTreeModel *tm; 139 GtkTreeModel *tm;
419 GtkSpinButton *sb; 140 GtkTreeIter iter;
141 struct GNUNET_FS_Namespace *ns;
142 struct GNUNET_FS_Namespace *nso;
143 GtkWindow *transient;
144 struct namespace_data_struct *nds;
145 struct GNUNET_FS_FileInformation *fip;
146 struct GNUNET_CONTAINER_MetaData *meta;
147 builder = GTK_BUILDER (user_data);
420 struct GNUNET_FS_BlockOptions bo; 148 struct GNUNET_FS_BlockOptions bo;
421 struct GNUNET_FS_Uri *nxt;
422 struct GNUNET_FS_Uri *mrg;
423 struct GNUNET_FS_Uri *uri;
424 struct GNUNET_CONTAINER_MetaData *nm;
425 const char *root;
426 char *value;
427 guint ntype;
428 guint nformat;
429 guint type;
430 guint max_type;
431 149
432 builder =
433 GNUNET_GTK_get_new_builder
434 ("gnunet_fs_gtk_select_pseudonym_dialog.glade");
435 if (builder == NULL)
436 {
437 GNUNET_break (0);
438 return;
439 }
440 ad = GTK_WIDGET (gtk_builder_get_object 150 ad = GTK_WIDGET (gtk_builder_get_object
441 (builder, "GNUNET_GTK_select_pseudonym_dialog")); 151 (builder, "GNUNET_GTK_select_pseudonym_dialog"));
442 ls = GTK_LIST_STORE (gtk_builder_get_object 152
443 (builder, "GNUNET_GTK_select_pseudonym_liststore")); 153 if (response_id != -5)
444 GNUNET_FS_namespace_list (GNUNET_FS_GTK_get_fs_handle (), &add_to_list, ls);
445 tv = GTK_TREE_VIEW (gtk_builder_get_object
446 (builder, "GNUNET_GTK_select_pseudonym_tree_view"));
447 sel = gtk_tree_view_get_selection (tv);
448 g_signal_connect (G_OBJECT (sel), "changed",
449 G_CALLBACK (selection_changed_cb), NULL);
450 if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
451 { 154 {
452 gtk_widget_destroy (ad); 155 gtk_widget_hide (ad);
453 g_object_unref (G_OBJECT (builder));
454 builder = NULL;
455 return; 156 return;
456 } 157 }
158 tv = GTK_TREE_VIEW (gtk_builder_get_object
159 (builder,
160 "GNUNET_GTK_select_pseudonym_tree_view"));
161 sel = gtk_tree_view_get_selection (tv);
162
457 GNUNET_assert (TRUE == gtk_tree_selection_get_selected (sel, &tm, &iter)); 163 GNUNET_assert (TRUE == gtk_tree_selection_get_selected (sel, &tm, &iter));
458 gtk_tree_model_get (tm, &iter, 1, &ns, -1); 164 gtk_tree_model_get (tm, &iter, 1, &ns, -1);
459 /* free all namespaces from list store except "ns" */ 165 /* free all namespaces from list store except "ns" */
@@ -467,129 +173,72 @@ GNUNET_GTK_main_menu_file_advertise_pseudonym_activate_cb (GtkWidget * dummy,
467 } 173 }
468 while (TRUE == gtk_tree_model_iter_next (tm, &iter)); 174 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
469 } 175 }
470 gtk_widget_destroy (ad); 176 transient = gtk_window_get_transient_for (GTK_WINDOW (ad));
471 g_object_unref (G_OBJECT (builder)); 177 gtk_widget_hide (ad);
472 builder = NULL; 178
179 meta = GNUNET_CONTAINER_meta_data_create ();
180
181 nds = g_new0 (struct namespace_data_struct, 1);
182 nds->ns = ns;
183 nds->do_index = FALSE;
184 nds->short_fn = NULL;
185 nds->anonymity_level = 1;
186 nds->priority = 1000;
187 nds->root = NULL;
188 /* This is a bogus fileinfo. It's needed because edit_publish_dialog
189 * was written to work with fileinfo, and return a fileinfo.
190 */
191 memset (&bo, 0, sizeof (bo));
192 fip = GNUNET_FS_file_information_create_empty_directory (NULL, NULL,
193 NULL, meta, &bo);
194 GNUNET_CONTAINER_meta_data_destroy (meta);
195
196 GNUNET_FS_GTK_edit_publish_dialog (builder, transient, &nds->do_index,
197 &nds->short_fn, &nds->anonymity_level, &nds->priority,
198 fip, FALSE, &adv_pseudonym_edit_publish_dialog_cb, nds);
199}
473 200
201void
202GNUNET_GTK_select_pseudonym_dialog_realize_cb (GtkWidget *widget,
203 gpointer user_data)
204{
205 GtkTreeView *tv;
206 GtkTreeSelection *sel;
207 GtkBuilder *builder;
474 208
475 builder = 209 builder = GTK_BUILDER (user_data);
476 GNUNET_GTK_get_new_builder
477 ("gnunet_fs_gtk_advertise_pseudonym_dialog.glade");
478 if (builder == NULL)
479 {
480 GNUNET_break (0);
481 return;
482 }
483 GNUNET_FS_GTK_setup_expiration_year_adjustment (builder);
484 ad = GTK_WIDGET (gtk_builder_get_object
485 (builder, "GNUNET_GTK_advertise_pseudonym_dialog"));
486 ls = GTK_LIST_STORE (gtk_builder_get_object
487 (builder, "GNUNET_GTK_metatype_list_store"));
488 max_type = EXTRACTOR_metatype_get_max ();
489 type = 1;
490 while (type < max_type - 1)
491 {
492 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0,
493 EXTRACTOR_metatype_to_string (type), 1,
494 type, 2,
495 EXTRACTOR_metatype_to_description (type),
496 -1);
497 type++;
498 }
499 tv = GTK_TREE_VIEW (gtk_builder_get_object
500 (builder,
501 "GNUNET_GTK_advertise_pseudonym_metadata_type_tree_view"));
502 sel = gtk_tree_view_get_selection (tv);
503 g_signal_connect (G_OBJECT (sel), "changed",
504 G_CALLBACK
505 (GNUNET_GTK_advertise_pseudonym_metadata_value_entry_changed_cb),
506 NULL);
507 210
508 tv = GTK_TREE_VIEW (gtk_builder_get_object 211 tv = GTK_TREE_VIEW (gtk_builder_get_object
509 (builder, 212 (builder, "GNUNET_GTK_select_pseudonym_tree_view"));
510 "GNUNET_GTK_advertise_pseudonym_metadata_tree_view"));
511 sel = gtk_tree_view_get_selection (tv); 213 sel = gtk_tree_view_get_selection (tv);
512 g_signal_connect (G_OBJECT (sel), "changed", 214 g_signal_connect (G_OBJECT (sel), "changed",
513 G_CALLBACK (metadata_selection_changed_cb), NULL); 215 G_CALLBACK (selection_changed_cb), user_data);
216}
514 217
515 tv = GTK_TREE_VIEW (gtk_builder_get_object 218/**
516 (builder, 219 * Advertise pseudonym selected.
517 "GNUNET_GTK_advertise_pseudonym_keyword_list_tree_view")); 220 */
518 sel = gtk_tree_view_get_selection (tv); 221void
519 g_signal_connect (G_OBJECT (sel), "changed", 222GNUNET_GTK_main_menu_file_advertise_pseudonym_activate_cb (GtkWidget * dummy,
520 G_CALLBACK (keyword_selection_changed_cb), NULL); 223 gpointer data)
521 if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad))) 224{
522 { 225 GtkWidget *ad;
523 gtk_widget_destroy (ad); 226 GtkListStore *ls;
524 g_object_unref (G_OBJECT (builder)); 227 GtkWidget *toplevel;
525 builder = NULL; 228 GtkBuilder *builder;
526 return; 229
527 } 230 builder = GTK_BUILDER (data);
528 /* get keywords from list store */ 231
529 nxt = NULL; 232 ad = GTK_WIDGET (gtk_builder_get_object
530 mrg = NULL; 233 (builder, "GNUNET_GTK_select_pseudonym_dialog"));
531 uri = NULL; 234 ls = GTK_LIST_STORE (gtk_builder_get_object
532 tm = GTK_TREE_MODEL (gtk_builder_get_object 235 (builder, "GNUNET_GTK_select_pseudonym_liststore"));
533 (builder, "GNUNET_GTK_keyword_list_store")); 236 gtk_list_store_clear (ls);
534 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter)) 237 GNUNET_FS_namespace_list (GNUNET_FS_GTK_get_fs_handle (), &add_to_list, ls);
535 { 238 toplevel = gtk_widget_get_toplevel (dummy);
536 do 239 if (GTK_IS_WINDOW (toplevel))
537 { 240 gtk_window_set_transient_for (GTK_WINDOW (ad), GTK_WINDOW (toplevel));
538 gtk_tree_model_get (tm, &iter, 0, &value, -1); 241 gtk_window_present (GTK_WINDOW (ad));
539 nxt = GNUNET_FS_uri_ksk_create_from_args (1, (const char **) &value);
540 mrg = GNUNET_FS_uri_ksk_merge (nxt, uri);
541 GNUNET_FS_uri_destroy (nxt);
542 if (NULL != uri)
543 GNUNET_FS_uri_destroy (uri);
544 uri = mrg;
545 g_free (value);
546 }
547 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
548 }
549 /* get meta */
550 nm = GNUNET_CONTAINER_meta_data_create ();
551 tm = GTK_TREE_MODEL (gtk_builder_get_object
552 (builder, "GNUNET_GTK_meta_data_list_store"));
553 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
554 {
555 do
556 {
557 gtk_tree_model_get (tm, &iter, 0, &ntype, 1, &nformat, 3, &value, -1);
558 GNUNET_CONTAINER_meta_data_insert (nm, "<user>", ntype, nformat,
559 "text/plain", value,
560 strlen (value) + 1);
561 g_free (value);
562 }
563 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
564 }
565 bo.anonymity_level =
566 gtk_spin_button_get_value (GTK_SPIN_BUTTON
567 (gtk_builder_get_object
568 (builder,
569 "GNUNET_GTK_advertise_pseudonym_anonymity_spin_button")));
570 bo.content_priority =
571 gtk_spin_button_get_value (GTK_SPIN_BUTTON
572 (gtk_builder_get_object
573 (builder,
574 "GNUNET_GTK_advertise_pseudonym_priority_spin_button")));
575 sb = GTK_SPIN_BUTTON (gtk_builder_get_object
576 (builder,
577 "GNUNET_GTK_advertise_pseudonym_expiration_year_spin_button"));
578 bo.expiration_time = GNUNET_FS_GTK_get_expiration_time (sb);
579 root =
580 gtk_entry_get_text (GTK_ENTRY
581 (gtk_builder_get_object
582 (builder,
583 "GNUNET_GTK_advertise_pseudonym_root_entry")));
584 GNUNET_FS_namespace_advertise (GNUNET_FS_GTK_get_fs_handle (), uri, ns, nm,
585 &bo, root, NULL, NULL);
586 GNUNET_FS_namespace_delete (ns, GNUNET_NO);
587 GNUNET_CONTAINER_meta_data_destroy (nm);
588 if (NULL != uri)
589 GNUNET_FS_uri_destroy (uri);
590 gtk_widget_destroy (ad);
591 g_object_unref (G_OBJECT (builder));
592 builder = NULL;
593} 242}
594 243
595 244
diff --git a/src/fs/gnunet-fs-gtk-main_window_create_pseudonym.c b/src/fs/gnunet-fs-gtk-main_window_create_pseudonym.c
index 05094a12..e0a8b0e4 100644
--- a/src/fs/gnunet-fs-gtk-main_window_create_pseudonym.c
+++ b/src/fs/gnunet-fs-gtk-main_window_create_pseudonym.c
@@ -26,28 +26,20 @@
26#include "gnunet-fs-gtk-common.h" 26#include "gnunet-fs-gtk-common.h"
27#include "gnunet-fs-gtk.h" 27#include "gnunet-fs-gtk.h"
28 28
29/**
30 */
31void 29void
32GNUNET_GTK_main_menu_create_pseudonym_activate_cb (GtkWidget * dummy, 30GNUNET_GTK_create_namespace_dialog_response_cb (GtkDialog *dialog,
33 gpointer data) 31 gint response_id, gpointer user_data)
34{ 32{
35 GtkWidget *ad;
36 GtkBuilder *builder;
37 const char *name; 33 const char *name;
38 struct GNUNET_FS_Namespace *ns; 34 struct GNUNET_FS_Namespace *ns;
35 GtkWidget *ad;
36 GtkBuilder *builder;
39 37
40 builder = 38 builder = GTK_BUILDER (user_data);
41 GNUNET_GTK_get_new_builder
42 ("gnunet_fs_gtk_create_namespace_dialog.glade");
43 if (builder == NULL)
44 {
45 GNUNET_break (0);
46 return;
47 }
48 ad = GTK_WIDGET (gtk_builder_get_object 39 ad = GTK_WIDGET (gtk_builder_get_object
49 (builder, "GNUNET_GTK_create_namespace_dialog")); 40 (builder, "GNUNET_GTK_create_namespace_dialog"));
50 if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad))) 41
42 if (response_id != -5)
51 { 43 {
52 gtk_widget_destroy (ad); 44 gtk_widget_destroy (ad);
53 g_object_unref (G_OBJECT (builder)); 45 g_object_unref (G_OBJECT (builder));
@@ -65,5 +57,32 @@ GNUNET_GTK_main_menu_create_pseudonym_activate_cb (GtkWidget * dummy,
65 g_object_unref (G_OBJECT (builder)); 57 g_object_unref (G_OBJECT (builder));
66} 58}
67 59
60/**
61 */
62void
63GNUNET_GTK_main_menu_create_pseudonym_activate_cb (GtkWidget * dummy,
64 gpointer data)
65{
66 GtkWidget *ad;
67 GtkWidget *toplevel;
68 GtkBuilder *builder;
69
70 builder =
71 GNUNET_GTK_get_new_builder
72 ("gnunet_fs_gtk_create_namespace_dialog.glade");
73 if (builder == NULL)
74 {
75 GNUNET_break (0);
76 return;
77 }
78 ad = GTK_WIDGET (gtk_builder_get_object
79 (builder, "GNUNET_GTK_create_namespace_dialog"));
80
81 toplevel = gtk_widget_get_toplevel (dummy);
82 if (GTK_IS_WINDOW (toplevel))
83 gtk_window_set_transient_for (GTK_WINDOW (ad), GTK_WINDOW (toplevel));
84 gtk_window_present (GTK_WINDOW (ad));
85}
86
68 87
69/* end of gnunet-fs-gtk-main_window_create_pseudonym.c */ 88/* end of gnunet-fs-gtk-main_window_create_pseudonym.c */
diff --git a/src/fs/gnunet-fs-gtk-main_window_file_publish.c b/src/fs/gnunet-fs-gtk-main_window_file_publish.c
index c4ad5117..72915041 100644
--- a/src/fs/gnunet-fs-gtk-main_window_file_publish.c
+++ b/src/fs/gnunet-fs-gtk-main_window_file_publish.c
@@ -26,16 +26,11 @@
26#include "gnunet-fs-gtk.h" 26#include "gnunet-fs-gtk.h"
27#include "gnunet-fs-gtk-edit_publish_dialog.h" 27#include "gnunet-fs-gtk-edit_publish_dialog.h"
28#include <gnunet/gnunet_util_lib.h> 28#include <gnunet/gnunet_util_lib.h>
29#include <gnunet/gnunet_fs_service.h>
29 30
30#define MARKER_DIR_FILE_SIZE "-" 31#define MARKER_DIR_FILE_SIZE "-"
31 32
32/** 33/**
33 * Builder used for the master publish dialog.
34 */
35static GtkBuilder *master_builder;
36
37
38/**
39 * Check if two GtkTreeIters refer to the same element. 34 * Check if two GtkTreeIters refer to the same element.
40 * 35 *
41 * @param tm tree model of the iterators 36 * @param tm tree model of the iterators
@@ -63,7 +58,7 @@ gtk_tree_iter_equals (GtkTreeModel * tm, GtkTreeIter * i1, GtkTreeIter * i2)
63 * Update selectivity in the master dialog. 58 * Update selectivity in the master dialog.
64 */ 59 */
65static void 60static void
66update_selectivity () 61update_selectivity (gpointer data)
67{ 62{
68 GtkTreeView *tv; 63 GtkTreeView *tv;
69 GtkTreeModel *tm; 64 GtkTreeModel *tm;
@@ -83,12 +78,15 @@ update_selectivity ()
83 struct GNUNET_FS_FileInformation *fip; 78 struct GNUNET_FS_FileInformation *fip;
84 int ns_ok; 79 int ns_ok;
85 gchar *namespace_id; 80 gchar *namespace_id;
81 GtkBuilder *builder;
82
83 builder = GTK_BUILDER (data);
86 84
87 tm = GTK_TREE_MODEL (gtk_builder_get_object 85 tm = GTK_TREE_MODEL (gtk_builder_get_object
88 (master_builder, 86 (builder,
89 "GNUNET_GTK_file_sharing_publishing_tree_store")); 87 "GNUNET_GTK_file_sharing_publishing_tree_store"));
90 tv = GTK_TREE_VIEW (gtk_builder_get_object 88 tv = GTK_TREE_VIEW (gtk_builder_get_object
91 (master_builder, 89 (builder,
92 "GNUNET_GTK_master_publish_dialog_pseudonym_tree_view")); 90 "GNUNET_GTK_master_publish_dialog_pseudonym_tree_view"));
93 sel = gtk_tree_view_get_selection (tv); 91 sel = gtk_tree_view_get_selection (tv);
94 ns_ok = GNUNET_YES; 92 ns_ok = GNUNET_YES;
@@ -102,34 +100,34 @@ update_selectivity ()
102 } 100 }
103 up_button = 101 up_button =
104 GTK_WIDGET (gtk_builder_get_object 102 GTK_WIDGET (gtk_builder_get_object
105 (master_builder, 103 (builder,
106 "GNUNET_GTK_master_publish_dialog_up_button")); 104 "GNUNET_GTK_master_publish_dialog_up_button"));
107 down_button = 105 down_button =
108 GTK_WIDGET (gtk_builder_get_object 106 GTK_WIDGET (gtk_builder_get_object
109 (master_builder, 107 (builder,
110 "GNUNET_GTK_master_publish_dialog_down_button")); 108 "GNUNET_GTK_master_publish_dialog_down_button"));
111 left_button = 109 left_button =
112 GTK_WIDGET (gtk_builder_get_object 110 GTK_WIDGET (gtk_builder_get_object
113 (master_builder, 111 (builder,
114 "GNUNET_GTK_master_publish_dialog_left_button")); 112 "GNUNET_GTK_master_publish_dialog_left_button"));
115 right_button = 113 right_button =
116 GTK_WIDGET (gtk_builder_get_object 114 GTK_WIDGET (gtk_builder_get_object
117 (master_builder, 115 (builder,
118 "GNUNET_GTK_master_publish_dialog_right_button")); 116 "GNUNET_GTK_master_publish_dialog_right_button"));
119 delete_button = 117 delete_button =
120 GTK_WIDGET (gtk_builder_get_object 118 GTK_WIDGET (gtk_builder_get_object
121 (master_builder, 119 (builder,
122 "GNUNET_GTK_master_publish_dialog_delete_button")); 120 "GNUNET_GTK_master_publish_dialog_delete_button"));
123 edit_button = 121 edit_button =
124 GTK_WIDGET (gtk_builder_get_object 122 GTK_WIDGET (gtk_builder_get_object
125 (master_builder, 123 (builder,
126 "GNUNET_GTK_master_publish_dialog_edit_button")); 124 "GNUNET_GTK_master_publish_dialog_edit_button"));
127 execute_button = 125 execute_button =
128 GTK_WIDGET (gtk_builder_get_object 126 GTK_WIDGET (gtk_builder_get_object
129 (master_builder, 127 (builder,
130 "GNUNET_GTK_master_publish_dialog_execute_button")); 128 "GNUNET_GTK_master_publish_dialog_execute_button"));
131 tv = GTK_TREE_VIEW (gtk_builder_get_object 129 tv = GTK_TREE_VIEW (gtk_builder_get_object
132 (master_builder, 130 (builder,
133 "GNUNET_GTK_master_publish_dialog_file_information_tree_view")); 131 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
134 sel = gtk_tree_view_get_selection (tv); 132 sel = gtk_tree_view_get_selection (tv);
135 tm = gtk_tree_view_get_model (tv); 133 tm = gtk_tree_view_get_model (tv);
@@ -208,7 +206,7 @@ update_selectivity ()
208 * @param iter parent entry, or NULL for top-level addition 206 * @param iter parent entry, or NULL for top-level addition
209 */ 207 */
210static void 208static void
211add_file_at_iter (const char *filename, const struct GNUNET_FS_BlockOptions *bo, 209add_file_at_iter (gpointer data, const char *filename, const struct GNUNET_FS_BlockOptions *bo,
212 int do_index, GtkTreeIter * iter) 210 int do_index, GtkTreeIter * iter)
213{ 211{
214 struct GNUNET_FS_FileInformation *fi; 212 struct GNUNET_FS_FileInformation *fi;
@@ -223,6 +221,9 @@ add_file_at_iter (const char *filename, const struct GNUNET_FS_BlockOptions *bo,
223 char *file_size_fancy; 221 char *file_size_fancy;
224 const char *ss; 222 const char *ss;
225 struct stat sbuf; 223 struct stat sbuf;
224 GtkBuilder *builder;
225
226 builder = GTK_BUILDER (data);
226 227
227 if (0 != STAT (filename, &sbuf)) 228 if (0 != STAT (filename, &sbuf))
228 return; 229 return;
@@ -239,7 +240,7 @@ add_file_at_iter (const char *filename, const struct GNUNET_FS_BlockOptions *bo,
239 } 240 }
240 } 241 }
241 ts = GTK_TREE_STORE (gtk_builder_get_object 242 ts = GTK_TREE_STORE (gtk_builder_get_object
242 (master_builder, 243 (builder,
243 "GNUNET_GTK_file_sharing_publishing_tree_store")); 244 "GNUNET_GTK_file_sharing_publishing_tree_store"));
244 245
245 meta = GNUNET_CONTAINER_meta_data_create (); 246 meta = GNUNET_CONTAINER_meta_data_create ();
@@ -273,7 +274,7 @@ add_file_at_iter (const char *filename, const struct GNUNET_FS_BlockOptions *bo,
273 short_fn, 3, (guint) bo->anonymity_level, 4, 274 short_fn, 3, (guint) bo->anonymity_level, 4,
274 (guint) bo->content_priority, 5, fi, -1); 275 (guint) bo->content_priority, 5, fi, -1);
275 GNUNET_free (file_size_fancy); 276 GNUNET_free (file_size_fancy);
276 update_selectivity (); 277 update_selectivity (data);
277} 278}
278 279
279 280
@@ -287,7 +288,7 @@ add_file_at_iter (const char *filename, const struct GNUNET_FS_BlockOptions *bo,
287 * @param pos iterator to set to the location of the new element 288 * @param pos iterator to set to the location of the new element
288 */ 289 */
289static void 290static void
290create_dir_at_iter (const char *name, const struct GNUNET_FS_BlockOptions *bo, 291create_dir_at_iter (gpointer data, const char *name, const struct GNUNET_FS_BlockOptions *bo,
291 GtkTreeIter * iter, GtkTreeIter * pos) 292 GtkTreeIter * iter, GtkTreeIter * pos)
292{ 293{
293 struct GNUNET_FS_FileInformation *fi; 294 struct GNUNET_FS_FileInformation *fi;
@@ -295,9 +296,12 @@ create_dir_at_iter (const char *name, const struct GNUNET_FS_BlockOptions *bo,
295 GtkTreePath *path; 296 GtkTreePath *path;
296 struct GNUNET_CONTAINER_MetaData *meta; 297 struct GNUNET_CONTAINER_MetaData *meta;
297 GtkTreeStore *ts; 298 GtkTreeStore *ts;
299 GtkBuilder *builder;
300
301 builder = GTK_BUILDER (data);
298 302
299 ts = GTK_TREE_STORE (gtk_builder_get_object 303 ts = GTK_TREE_STORE (gtk_builder_get_object
300 (master_builder, 304 (builder,
301 "GNUNET_GTK_file_sharing_publishing_tree_store")); 305 "GNUNET_GTK_file_sharing_publishing_tree_store"));
302 meta = GNUNET_CONTAINER_meta_data_create (); 306 meta = GNUNET_CONTAINER_meta_data_create ();
303 GNUNET_FS_meta_data_make_directory (meta); 307 GNUNET_FS_meta_data_make_directory (meta);
@@ -315,7 +319,7 @@ create_dir_at_iter (const char *name, const struct GNUNET_FS_BlockOptions *bo,
315 gtk_tree_store_set (ts, pos, 0, MARKER_DIR_FILE_SIZE, 1, (gboolean) GNUNET_NO, 319 gtk_tree_store_set (ts, pos, 0, MARKER_DIR_FILE_SIZE, 1, (gboolean) GNUNET_NO,
316 2, name, 3, (guint) bo->anonymity_level, 4, 320 2, name, 3, (guint) bo->anonymity_level, 4,
317 (guint) bo->content_priority, 5, fi, -1); 321 (guint) bo->content_priority, 5, fi, -1);
318 update_selectivity (); 322 update_selectivity (data);
319} 323}
320 324
321 325
@@ -797,11 +801,14 @@ scan_directory (void *cls, const char *filename)
797 * @param do_index should we index? 801 * @param do_index should we index?
798 */ 802 */
799static void 803static void
800add_dir (const char *filename, const struct GNUNET_FS_BlockOptions *bo, 804add_dir (gpointer data, const char *filename, const struct GNUNET_FS_BlockOptions *bo,
801 int do_index) 805 int do_index)
802{ 806{
803 struct stat sbuf; 807 struct stat sbuf;
804 struct AddDirContext scan_ctx; 808 struct AddDirContext scan_ctx;
809 GtkBuilder *builder;
810
811 builder = GTK_BUILDER (data);
805 812
806 if (0 != STAT (filename, &sbuf)) 813 if (0 != STAT (filename, &sbuf))
807 return; 814 return;
@@ -815,7 +822,7 @@ add_dir (const char *filename, const struct GNUNET_FS_BlockOptions *bo,
815 scan_ctx.do_index = do_index; 822 scan_ctx.do_index = do_index;
816 scan_ctx.ts = 823 scan_ctx.ts =
817 GTK_TREE_STORE (gtk_builder_get_object 824 GTK_TREE_STORE (gtk_builder_get_object
818 (master_builder, 825 (builder,
819 "GNUNET_GTK_file_sharing_publishing_tree_store")); 826 "GNUNET_GTK_file_sharing_publishing_tree_store"));
820 scan_directory (&scan_ctx, filename); 827 scan_directory (&scan_ctx, filename);
821} 828}
@@ -827,7 +834,7 @@ add_dir (const char *filename, const struct GNUNET_FS_BlockOptions *bo,
827static void 834static void
828selection_changed_cb (GtkTreeSelection * ts, gpointer user_data) 835selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
829{ 836{
830 update_selectivity (); 837 update_selectivity (user_data);
831} 838}
832 839
833 840
@@ -847,7 +854,7 @@ remove_old_entry (GtkTreeStore * ts, GtkTreeIter * root)
847 * Move an entry in the tree. 854 * Move an entry in the tree.
848 */ 855 */
849static void 856static void
850move_entry (GtkTreeModel * tm, GtkTreeIter * old, GtkTreeIter * newpos, 857move_entry (gpointer data, GtkTreeModel * tm, GtkTreeIter * old, GtkTreeIter * newpos,
851 int dsel) 858 int dsel)
852{ 859{
853 struct GNUNET_FS_FileInformation *fip; 860 struct GNUNET_FS_FileInformation *fip;
@@ -863,6 +870,9 @@ move_entry (GtkTreeModel * tm, GtkTreeIter * old, GtkTreeIter * newpos,
863 GtkTreeIter cnewpos; 870 GtkTreeIter cnewpos;
864 GtkTreeRowReference *rr; 871 GtkTreeRowReference *rr;
865 GtkTreeRowReference *rr2; 872 GtkTreeRowReference *rr2;
873 GtkBuilder *builder;
874
875 builder = GTK_BUILDER (data);
866 876
867 gtk_tree_model_get (tm, old, 0, &fsf, 1, &do_index, 2, &short_fn, 3, 877 gtk_tree_model_get (tm, old, 0, &fsf, 1, &do_index, 2, &short_fn, 3,
868 &anonymity_level, 4, &priority, 5, &fip, -1); 878 &anonymity_level, 4, &priority, 5, &fip, -1);
@@ -874,7 +884,7 @@ move_entry (GtkTreeModel * tm, GtkTreeIter * old, GtkTreeIter * newpos,
874 if (dsel == GNUNET_YES) 884 if (dsel == GNUNET_YES)
875 { 885 {
876 tv = GTK_TREE_VIEW (gtk_builder_get_object 886 tv = GTK_TREE_VIEW (gtk_builder_get_object
877 (master_builder, 887 (builder,
878 "GNUNET_GTK_master_publish_dialog_file_information_tree_view")); 888 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
879 sel = gtk_tree_view_get_selection (tv); 889 sel = gtk_tree_view_get_selection (tv);
880 path = gtk_tree_model_get_path (tm, newpos); 890 path = gtk_tree_model_get_path (tm, newpos);
@@ -894,7 +904,7 @@ move_entry (GtkTreeModel * tm, GtkTreeIter * old, GtkTreeIter * newpos,
894 gtk_tree_path_free (path); 904 gtk_tree_path_free (path);
895 gtk_tree_store_insert_before (GTK_TREE_STORE (tm), &cnewpos, newpos, 905 gtk_tree_store_insert_before (GTK_TREE_STORE (tm), &cnewpos, newpos,
896 NULL); 906 NULL);
897 move_entry (tm, &child, &cnewpos, GNUNET_NO); 907 move_entry (data, tm, &child, &cnewpos, GNUNET_NO);
898 path = gtk_tree_row_reference_get_path (rr2); 908 path = gtk_tree_row_reference_get_path (rr2);
899 gtk_tree_row_reference_free (rr2); 909 gtk_tree_row_reference_free (rr2);
900 GNUNET_assert (TRUE == gtk_tree_model_get_iter (tm, &child, path)); 910 GNUNET_assert (TRUE == gtk_tree_model_get_iter (tm, &child, path));
@@ -913,7 +923,7 @@ move_entry (GtkTreeModel * tm, GtkTreeIter * old, GtkTreeIter * newpos,
913 gtk_tree_path_free (path); 923 gtk_tree_path_free (path);
914 gtk_tree_selection_select_iter (sel, newpos); 924 gtk_tree_selection_select_iter (sel, newpos);
915 } 925 }
916 update_selectivity (); 926 update_selectivity (data);
917} 927}
918 928
919/** 929/**
@@ -926,9 +936,12 @@ void GNUNET_GTK_master_publish_dialog_pseudonym_updates_renderer_edited_cb
926{ 936{
927 GtkTreeIter iter; 937 GtkTreeIter iter;
928 GtkTreeStore *ts; 938 GtkTreeStore *ts;
939 GtkBuilder *builder;
940
941 builder = GTK_BUILDER (user_data);
929 942
930 ts = GTK_TREE_STORE (gtk_builder_get_object 943 ts = GTK_TREE_STORE (gtk_builder_get_object
931 (master_builder, "GNUNET_GTK_pseudonym_tree_store")); 944 (builder, "GNUNET_GTK_pseudonym_tree_store"));
932 945
933 if (TRUE != 946 if (TRUE !=
934 gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (ts), &iter, cpath)) 947 gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (ts), &iter, cpath))
@@ -937,7 +950,7 @@ void GNUNET_GTK_master_publish_dialog_pseudonym_updates_renderer_edited_cb
937 return; 950 return;
938 } 951 }
939 gtk_tree_store_set (ts, &iter, 5, new_text, -1); 952 gtk_tree_store_set (ts, &iter, 5, new_text, -1);
940 update_selectivity (); 953 update_selectivity (user_data);
941} 954}
942 955
943 956
@@ -951,9 +964,12 @@ void GNUNET_GTK_master_publish_dialog_pseudonym_identifier_renderer_edited_cb
951{ 964{
952 GtkTreeIter iter; 965 GtkTreeIter iter;
953 GtkTreeStore *ts; 966 GtkTreeStore *ts;
967 GtkBuilder *builder;
968
969 builder = GTK_BUILDER (user_data);
954 970
955 ts = GTK_TREE_STORE (gtk_builder_get_object 971 ts = GTK_TREE_STORE (gtk_builder_get_object
956 (master_builder, "GNUNET_GTK_pseudonym_tree_store")); 972 (builder, "GNUNET_GTK_pseudonym_tree_store"));
957 973
958 if (TRUE != 974 if (TRUE !=
959 gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (ts), &iter, cpath)) 975 gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (ts), &iter, cpath))
@@ -962,7 +978,7 @@ void GNUNET_GTK_master_publish_dialog_pseudonym_identifier_renderer_edited_cb
962 return; 978 return;
963 } 979 }
964 gtk_tree_store_set (ts, &iter, 2, new_text, -1); 980 gtk_tree_store_set (ts, &iter, 2, new_text, -1);
965 update_selectivity (); 981 update_selectivity (user_data);
966} 982}
967 983
968 984
@@ -978,9 +994,12 @@ GNUNET_GTK_master_publish_dialog_right_button_clicked_cb (GtkWidget * dummy,
978 GtkTreeIter pred; 994 GtkTreeIter pred;
979 GtkTreeIter prev; 995 GtkTreeIter prev;
980 GtkTreeIter pos; 996 GtkTreeIter pos;
997 GtkBuilder *builder;
998
999 builder = GTK_BUILDER (data);
981 1000
982 tv = GTK_TREE_VIEW (gtk_builder_get_object 1001 tv = GTK_TREE_VIEW (gtk_builder_get_object
983 (master_builder, 1002 (builder,
984 "GNUNET_GTK_master_publish_dialog_file_information_tree_view")); 1003 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
985 sel = gtk_tree_view_get_selection (tv); 1004 sel = gtk_tree_view_get_selection (tv);
986 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter)) 1005 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
@@ -1010,7 +1029,7 @@ GNUNET_GTK_master_publish_dialog_right_button_clicked_cb (GtkWidget * dummy,
1010 GNUNET_break (0); 1029 GNUNET_break (0);
1011 return; 1030 return;
1012 } 1031 }
1013 move_entry (tm, &iter, &pos, GNUNET_YES); 1032 move_entry (data, tm, &iter, &pos, GNUNET_YES);
1014 remove_old_entry (GTK_TREE_STORE (tm), &iter); 1033 remove_old_entry (GTK_TREE_STORE (tm), &iter);
1015} 1034}
1016 1035
@@ -1025,9 +1044,12 @@ GNUNET_GTK_master_publish_dialog_left_button_clicked_cb (GtkWidget * dummy,
1025 GtkTreeIter iter; 1044 GtkTreeIter iter;
1026 GtkTreeIter parent; 1045 GtkTreeIter parent;
1027 GtkTreeIter pos; 1046 GtkTreeIter pos;
1047 GtkBuilder *builder;
1048
1049 builder = GTK_BUILDER (data);
1028 1050
1029 tv = GTK_TREE_VIEW (gtk_builder_get_object 1051 tv = GTK_TREE_VIEW (gtk_builder_get_object
1030 (master_builder, 1052 (builder,
1031 "GNUNET_GTK_master_publish_dialog_file_information_tree_view")); 1053 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
1032 sel = gtk_tree_view_get_selection (tv); 1054 sel = gtk_tree_view_get_selection (tv);
1033 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter)) 1055 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
@@ -1046,7 +1068,7 @@ GNUNET_GTK_master_publish_dialog_left_button_clicked_cb (GtkWidget * dummy,
1046 GNUNET_break (0); 1068 GNUNET_break (0);
1047 return; 1069 return;
1048 } 1070 }
1049 move_entry (tm, &iter, &pos, GNUNET_YES); 1071 move_entry (data, tm, &iter, &pos, GNUNET_YES);
1050 remove_old_entry (GTK_TREE_STORE (tm), &iter); 1072 remove_old_entry (GTK_TREE_STORE (tm), &iter);
1051} 1073}
1052 1074
@@ -1064,9 +1086,12 @@ GNUNET_GTK_master_publish_dialog_up_button_clicked_cb (GtkWidget * dummy,
1064 GtkTreeIter prev; 1086 GtkTreeIter prev;
1065 GtkTreeIter *pprev; 1087 GtkTreeIter *pprev;
1066 GtkTreeIter pos; 1088 GtkTreeIter pos;
1089 GtkBuilder *builder;
1090
1091 builder = GTK_BUILDER (data);
1067 1092
1068 tv = GTK_TREE_VIEW (gtk_builder_get_object 1093 tv = GTK_TREE_VIEW (gtk_builder_get_object
1069 (master_builder, 1094 (builder,
1070 "GNUNET_GTK_master_publish_dialog_file_information_tree_view")); 1095 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
1071 sel = gtk_tree_view_get_selection (tv); 1096 sel = gtk_tree_view_get_selection (tv);
1072 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter)) 1097 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
@@ -1101,7 +1126,7 @@ GNUNET_GTK_master_publish_dialog_up_button_clicked_cb (GtkWidget * dummy,
1101 GNUNET_break (0); 1126 GNUNET_break (0);
1102 return; 1127 return;
1103 } 1128 }
1104 move_entry (tm, &iter, &pos, GNUNET_YES); 1129 move_entry (data, tm, &iter, &pos, GNUNET_YES);
1105 remove_old_entry (GTK_TREE_STORE (tm), &iter); 1130 remove_old_entry (GTK_TREE_STORE (tm), &iter);
1106} 1131}
1107 1132
@@ -1116,9 +1141,12 @@ GNUNET_GTK_master_publish_dialog_down_button_clicked_cb (GtkWidget * dummy,
1116 GtkTreeIter iter; 1141 GtkTreeIter iter;
1117 GtkTreeIter next; 1142 GtkTreeIter next;
1118 GtkTreeIter pos; 1143 GtkTreeIter pos;
1144 GtkBuilder *builder;
1145
1146 builder = GTK_BUILDER (data);
1119 1147
1120 tv = GTK_TREE_VIEW (gtk_builder_get_object 1148 tv = GTK_TREE_VIEW (gtk_builder_get_object
1121 (master_builder, 1149 (builder,
1122 "GNUNET_GTK_master_publish_dialog_file_information_tree_view")); 1150 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
1123 sel = gtk_tree_view_get_selection (tv); 1151 sel = gtk_tree_view_get_selection (tv);
1124 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter)) 1152 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
@@ -1138,7 +1166,7 @@ GNUNET_GTK_master_publish_dialog_down_button_clicked_cb (GtkWidget * dummy,
1138 GNUNET_break (0); 1166 GNUNET_break (0);
1139 return; 1167 return;
1140 } 1168 }
1141 move_entry (tm, &iter, &pos, GNUNET_YES); 1169 move_entry (data, tm, &iter, &pos, GNUNET_YES);
1142 remove_old_entry (GTK_TREE_STORE (tm), &iter); 1170 remove_old_entry (GTK_TREE_STORE (tm), &iter);
1143} 1171}
1144 1172
@@ -1152,9 +1180,12 @@ GNUNET_GTK_master_publish_dialog_new_button_clicked_cb (GtkWidget * dummy,
1152 GtkTreeIter iter; 1180 GtkTreeIter iter;
1153 GtkTreeIter pos; 1181 GtkTreeIter pos;
1154 struct GNUNET_FS_BlockOptions bo; 1182 struct GNUNET_FS_BlockOptions bo;
1183 GtkBuilder *builder;
1184
1185 builder = GTK_BUILDER (data);
1155 1186
1156 tv = GTK_TREE_VIEW (gtk_builder_get_object 1187 tv = GTK_TREE_VIEW (gtk_builder_get_object
1157 (master_builder, 1188 (builder,
1158 "GNUNET_GTK_master_publish_dialog_file_information_tree_view")); 1189 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
1159 sel = gtk_tree_view_get_selection (tv); 1190 sel = gtk_tree_view_get_selection (tv);
1160 /* FIXME: consider opening a dialog to get 1191 /* FIXME: consider opening a dialog to get
@@ -1169,10 +1200,10 @@ GNUNET_GTK_master_publish_dialog_new_button_clicked_cb (GtkWidget * dummy,
1169 bo.replication_level = 1; 1200 bo.replication_level = 1;
1170 if (TRUE != gtk_tree_selection_get_selected (sel, NULL, &iter)) 1201 if (TRUE != gtk_tree_selection_get_selected (sel, NULL, &iter))
1171 { 1202 {
1172 create_dir_at_iter ("unnamed/", &bo, NULL, &pos); 1203 create_dir_at_iter (data, "unnamed/", &bo, NULL, &pos);
1173 return; 1204 return;
1174 } 1205 }
1175 create_dir_at_iter ("unnamed/", &bo, &iter, &pos); 1206 create_dir_at_iter (data, "unnamed/", &bo, &iter, &pos);
1176} 1207}
1177 1208
1178 1209
@@ -1182,55 +1213,49 @@ GNUNET_GTK_master_publish_dialog_add_button_clicked_cb (GtkWidget * dummy,
1182{ 1213{
1183 GtkWidget *ad; 1214 GtkWidget *ad;
1184 GtkBuilder *builder; 1215 GtkBuilder *builder;
1185 char *filename; 1216 GtkWindow *master_pubdialog;
1186 struct GNUNET_FS_BlockOptions bo; 1217
1187 int do_index; 1218 builder = GTK_BUILDER (data);
1188 GtkSpinButton *sb;
1189 1219
1190 builder =
1191 GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_publish_file_dialog.glade");
1192 if (builder == NULL)
1193 {
1194 GNUNET_break (0);
1195 return;
1196 }
1197 ad = GTK_WIDGET (gtk_builder_get_object 1220 ad = GTK_WIDGET (gtk_builder_get_object
1198 (builder, "GNUNET_GTK_publish_file_dialog")); 1221 (builder, "GNUNET_GTK_publish_file_dialog"));
1199 GNUNET_FS_GTK_setup_expiration_year_adjustment (builder); 1222 GNUNET_FS_GTK_setup_expiration_year_adjustment (builder);
1200 if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad))) 1223
1201 { 1224 master_pubdialog = GTK_WINDOW (gtk_builder_get_object (builder,
1202 gtk_widget_destroy (ad); 1225 "GNUNET_GTK_master_publish_dialog"));
1203 g_object_unref (G_OBJECT (builder)); 1226 gtk_window_set_transient_for (GTK_WINDOW (ad), master_pubdialog);
1204 return; 1227
1205 } 1228 gtk_window_present (GTK_WINDOW (ad));
1206 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
1207 sb = GTK_SPIN_BUTTON (gtk_builder_get_object
1208 (builder,
1209 "GNUNET_GTK_publish_file_dialog_expiration_year_spin_button"));
1210 bo.anonymity_level =
1211 gtk_spin_button_get_value (GTK_SPIN_BUTTON
1212 (gtk_builder_get_object
1213 (builder,
1214 "GNUNET_GTK_publish_file_dialog_anonymity_spin_button")));
1215 bo.content_priority =
1216 gtk_spin_button_get_value (GTK_SPIN_BUTTON
1217 (gtk_builder_get_object
1218 (builder,
1219 "GNUNET_GTK_publish_file_dialog_priority_spin_button")));
1220 bo.expiration_time = GNUNET_FS_GTK_get_expiration_time (sb);
1221 bo.replication_level = 1; /* FIXME... */
1222 do_index =
1223 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
1224 (gtk_builder_get_object
1225 (builder,
1226 "GNUNET_GTK_publish_file_dialog_do_index_checkbutton")));
1227 add_file_at_iter (filename, &bo, do_index, NULL);
1228 gtk_widget_destroy (ad);
1229 g_object_unref (G_OBJECT (builder));
1230 g_free (filename);
1231 update_selectivity ();
1232} 1229}
1233 1230
1231struct edit_pub_cb_args
1232{
1233 GtkTreeModel *tm;
1234 GtkTreeIter iter;
1235 /* FIXME: this indirection madness is not really required any longer.
1236 * we only need to pass over *tm and iter, everything else can be
1237 * copied.
1238 */
1239 gchar *short_fn;
1240 struct GNUNET_FS_FileInformation *fip;
1241 int do_index;
1242 guint anonymity_level;
1243 guint priority;
1244};
1245
1246void
1247master_publish_edit_publish_dialog_cb (gpointer cls, int *do_index, char **short_fn,
1248 guint * anonymity_level, guint * priority, gchar *root,
1249 struct GNUNET_FS_FileInformation *fip, gint ret)
1250{
1251 struct edit_pub_cb_args *cbargs = (struct edit_pub_cb_args *) cls;
1252 if (ret == GTK_RESPONSE_OK)
1253 gtk_tree_store_set (GTK_TREE_STORE (cbargs->tm), &cbargs->iter,
1254 1, *do_index, 2, *short_fn, 3, *anonymity_level, 4, *priority, -1);
1255 g_free (root);
1256 g_free (short_fn);
1257 g_free (cbargs);
1258}
1234 1259
1235void 1260void
1236GNUNET_GTK_master_publish_dialog_edit_button_clicked_cb (GtkWidget * dummy, 1261GNUNET_GTK_master_publish_dialog_edit_button_clicked_cb (GtkWidget * dummy,
@@ -1239,29 +1264,36 @@ GNUNET_GTK_master_publish_dialog_edit_button_clicked_cb (GtkWidget * dummy,
1239 GtkTreeView *tv; 1264 GtkTreeView *tv;
1240 GtkTreeModel *tm; 1265 GtkTreeModel *tm;
1241 GtkTreeSelection *sel; 1266 GtkTreeSelection *sel;
1242 GtkTreeIter iter; 1267 struct edit_pub_cb_args *cbargs;
1243 int do_index; 1268 GtkBuilder *builder;
1244 guint anonymity_level; 1269 GtkWindow *master_pubdialog;
1245 guint priority; 1270
1246 gchar *short_fn; 1271 builder = GTK_BUILDER (data);
1247 struct GNUNET_FS_FileInformation *fip;
1248 1272
1249 tv = GTK_TREE_VIEW (gtk_builder_get_object 1273 tv = GTK_TREE_VIEW (gtk_builder_get_object
1250 (master_builder, 1274 (builder,
1251 "GNUNET_GTK_master_publish_dialog_file_information_tree_view")); 1275 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
1276
1277 cbargs = g_new0 (struct edit_pub_cb_args, 1);
1278 cbargs->tm = gtk_tree_view_get_model (tv);
1279
1280 master_pubdialog = GTK_WINDOW (gtk_builder_get_object (builder,
1281 "GNUNET_GTK_master_publish_dialog"));
1252 sel = gtk_tree_view_get_selection (tv); 1282 sel = gtk_tree_view_get_selection (tv);
1253 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter)) 1283 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &cbargs->iter))
1254 { 1284 {
1255 GNUNET_break (0); 1285 GNUNET_break (0);
1286 g_free (cbargs);
1256 return; 1287 return;
1257 } 1288 }
1258 gtk_tree_model_get (tm, &iter, 1, &do_index, 2, &short_fn, 3, 1289
1259 &anonymity_level, 4, &priority, 5, &fip, -1); 1290 gtk_tree_model_get (tm, &cbargs->iter, 1, &cbargs->do_index, 2,
1260 GNUNET_FS_GTK_edit_publish_dialog (&do_index, &short_fn, &anonymity_level, 1291 &cbargs->short_fn, 3, &cbargs->anonymity_level, 4, &cbargs->priority,
1261 &priority, fip); 1292 5, &cbargs->fip, -1);
1262 gtk_tree_store_set (GTK_TREE_STORE (tm), &iter, 1, do_index, 2, short_fn, 3, 1293
1263 anonymity_level, 4, priority, -1); 1294 GNUNET_FS_GTK_edit_publish_dialog (builder, master_pubdialog, &cbargs->do_index,
1264 g_free (short_fn); 1295 &cbargs->short_fn, &cbargs->anonymity_level, &cbargs->priority,
1296 cbargs->fip, TRUE, &master_publish_edit_publish_dialog_cb, cbargs);
1265} 1297}
1266 1298
1267 1299
@@ -1298,9 +1330,12 @@ GNUNET_GTK_master_publish_dialog_delete_button_clicked_cb (GtkWidget * dummy,
1298 GtkTreeSelection *sel; 1330 GtkTreeSelection *sel;
1299 GtkTreeIter iter; 1331 GtkTreeIter iter;
1300 struct GNUNET_FS_FileInformation *fip; 1332 struct GNUNET_FS_FileInformation *fip;
1333 GtkBuilder *builder;
1334
1335 builder = GTK_BUILDER (data);
1301 1336
1302 tv = GTK_TREE_VIEW (gtk_builder_get_object 1337 tv = GTK_TREE_VIEW (gtk_builder_get_object
1303 (master_builder, 1338 (builder,
1304 "GNUNET_GTK_master_publish_dialog_file_information_tree_view")); 1339 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
1305 sel = gtk_tree_view_get_selection (tv); 1340 sel = gtk_tree_view_get_selection (tv);
1306 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter)) 1341 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
@@ -1311,65 +1346,69 @@ GNUNET_GTK_master_publish_dialog_delete_button_clicked_cb (GtkWidget * dummy,
1311 gtk_tree_model_get (tm, &iter, 5, &fip, -1); 1346 gtk_tree_model_get (tm, &iter, 5, &fip, -1);
1312 GNUNET_FS_file_information_destroy (fip, &free_fi_row_reference, NULL); 1347 GNUNET_FS_file_information_destroy (fip, &free_fi_row_reference, NULL);
1313 gtk_tree_store_remove (GTK_TREE_STORE (tm), &iter); 1348 gtk_tree_store_remove (GTK_TREE_STORE (tm), &iter);
1314 update_selectivity (); 1349 update_selectivity (data);
1315} 1350}
1316 1351
1317
1318void 1352void
1319GNUNET_GTK_master_publish_dialog_open_button_clicked_cb (GtkWidget * dummy, 1353GNUNET_GTK_publish_directory_dialog_response_cb (GtkDialog *dialog,
1320 gpointer data) 1354 gint response_id, gpointer user_data)
1321{ 1355{
1322 GtkWidget *ad;
1323 GtkBuilder *builder;
1324 char *filename; 1356 char *filename;
1325 int do_index; 1357 int do_index;
1326 GtkSpinButton *sb; 1358 GtkSpinButton *sb;
1327 struct GNUNET_FS_BlockOptions bo; 1359 struct GNUNET_FS_BlockOptions bo;
1360 GtkWidget *ad;
1361 GtkBuilder *builder;
1362
1363 builder = GTK_BUILDER (user_data);
1328 1364
1329 builder = 1365 ad = GTK_WIDGET (gtk_builder_get_object (builder,
1330 GNUNET_GTK_get_new_builder 1366 "GNUNET_GTK_publish_directory_dialog"));
1331 ("gnunet_fs_gtk_publish_directory_dialog.glade"); 1367
1332 if (builder == NULL) 1368 if (response_id == -5)
1333 { 1369 {
1334 GNUNET_break (0); 1370 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
1335 return; 1371 sb = GTK_SPIN_BUTTON (gtk_builder_get_object (builder,
1372 "GNUNET_GTK_publish_directory_dialog_expiration_year_spin_button"));
1373 if (!GNUNET_GTK_get_selected_anonymity_level (builder,
1374 "GNUNET_GTK_publish_directory_dialog_anonymity_combobox",
1375 &bo.anonymity_level))
1376 bo.anonymity_level = 1;
1377 bo.content_priority = gtk_spin_button_get_value (GTK_SPIN_BUTTON (
1378 gtk_builder_get_object (builder,
1379 "GNUNET_GTK_publish_directory_dialog_priority_spin_button")));
1380 bo.expiration_time = GNUNET_FS_GTK_get_expiration_time (sb);
1381 do_index = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
1382 gtk_builder_get_object (builder,
1383 "GNUNET_GTK_publish_directory_dialog_do_index_checkbutton")));
1384
1385 /* FIXME: open progress dialog here... */
1386 add_dir (user_data, filename, &bo, do_index);
1387 g_free (filename);
1388 update_selectivity (user_data);
1336 } 1389 }
1390 gtk_widget_hide (ad);
1391}
1392
1393
1394void
1395GNUNET_GTK_master_publish_dialog_open_button_clicked_cb (GtkWidget * dummy,
1396 gpointer data)
1397{
1398 GtkWidget *ad;
1399 GtkBuilder *builder;
1400 GtkWindow *master_pubdialog;
1401
1402 builder = GTK_BUILDER (data);
1337 GNUNET_FS_GTK_setup_expiration_year_adjustment (builder); 1403 GNUNET_FS_GTK_setup_expiration_year_adjustment (builder);
1338 ad = GTK_WIDGET (gtk_builder_get_object 1404 ad = GTK_WIDGET (gtk_builder_get_object
1339 (builder, "GNUNET_GTK_publish_directory_dialog")); 1405 (builder, "GNUNET_GTK_publish_directory_dialog"));
1340 if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad))) 1406
1341 { 1407 master_pubdialog = GTK_WINDOW (gtk_builder_get_object (builder,
1342 gtk_widget_destroy (ad); 1408 "GNUNET_GTK_master_publish_dialog"));
1343 g_object_unref (G_OBJECT (builder)); 1409 gtk_window_set_transient_for (GTK_WINDOW (ad), master_pubdialog);
1344 return; 1410
1345 } 1411 gtk_window_present (GTK_WINDOW (ad));
1346 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
1347 sb = GTK_SPIN_BUTTON (gtk_builder_get_object
1348 (builder,
1349 "GNUNET_GTK_publish_directory_dialog_expiration_year_spin_button"));
1350 bo.anonymity_level =
1351 gtk_spin_button_get_value (GTK_SPIN_BUTTON
1352 (gtk_builder_get_object
1353 (builder,
1354 "GNUNET_GTK_publish_directory_dialog_anonymity_spin_button")));
1355 bo.content_priority =
1356 gtk_spin_button_get_value (GTK_SPIN_BUTTON
1357 (gtk_builder_get_object
1358 (builder,
1359 "GNUNET_GTK_publish_directory_dialog_priority_spin_button")));
1360 bo.expiration_time = GNUNET_FS_GTK_get_expiration_time (sb);
1361 do_index =
1362 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
1363 (gtk_builder_get_object
1364 (builder,
1365 "GNUNET_GTK_publish_directory_dialog_do_index_checkbutton")));
1366
1367 gtk_widget_destroy (ad);
1368 g_object_unref (G_OBJECT (builder));
1369 /* FIXME: open progress dialog here... */
1370 add_dir (filename, &bo, do_index);
1371 g_free (filename);
1372 update_selectivity ();
1373} 1412}
1374 1413
1375 1414
@@ -1598,52 +1637,58 @@ free_file_information_tree_store (GtkTreeModel * tm, GtkTreeIter * iter)
1598 } 1637 }
1599} 1638}
1600 1639
1601
1602/**
1603 */
1604void 1640void
1605GNUNET_GTK_main_menu_file_publish_activate_cb (GtkWidget * dummy, gpointer data) 1641GNUNET_GTK_master_publish_dialog_realize_cb (GtkWidget *widget,
1642 gpointer user_data)
1606{ 1643{
1607 GtkWidget *ad;
1608 GtkTreeStore *ts;
1609 gint ret;
1610 GtkTreeView *tv; 1644 GtkTreeView *tv;
1611 GtkTreeSelection *sel; 1645 GtkTreeSelection *sel;
1612 GtkTreeIter iter; 1646 GtkBuilder *builder;
1613 struct GNUNET_FS_FileInformation *fi; 1647
1614 GtkTreeModel *tm; 1648 builder = GTK_BUILDER (user_data);
1615 GtkTreeModel *ptm;
1616 struct GNUNET_FS_Namespace *namespace;
1617 gchar *namespace_id;
1618 gchar *namespace_uid;
1619 1649
1620 GNUNET_assert (master_builder == NULL);
1621 master_builder =
1622 GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_publish_dialog.glade");
1623 if (master_builder == NULL)
1624 return;
1625 tv = GTK_TREE_VIEW (gtk_builder_get_object 1650 tv = GTK_TREE_VIEW (gtk_builder_get_object
1626 (master_builder, 1651 (builder,
1627 "GNUNET_GTK_master_publish_dialog_file_information_tree_view")); 1652 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
1628 sel = gtk_tree_view_get_selection (tv); 1653 sel = gtk_tree_view_get_selection (tv);
1629 g_signal_connect (G_OBJECT (sel), "changed", 1654 g_signal_connect (G_OBJECT (sel), "changed",
1630 G_CALLBACK (selection_changed_cb), NULL); 1655 G_CALLBACK (selection_changed_cb), user_data);
1631 ad = GTK_WIDGET (gtk_builder_get_object
1632 (master_builder, "GNUNET_GTK_master_publish_dialog"));
1633 ts = GTK_TREE_STORE (gtk_builder_get_object
1634 (master_builder, "GNUNET_GTK_pseudonym_tree_store"));
1635 GNUNET_FS_namespace_list (GNUNET_FS_GTK_get_fs_handle (),
1636 &add_namespace_to_ts, ts);
1637 tm = GTK_TREE_MODEL (gtk_builder_get_object
1638 (master_builder,
1639 "GNUNET_GTK_file_sharing_publishing_tree_store"));
1640 tv = GTK_TREE_VIEW (gtk_builder_get_object 1656 tv = GTK_TREE_VIEW (gtk_builder_get_object
1641 (master_builder, 1657 (builder,
1642 "GNUNET_GTK_master_publish_dialog_pseudonym_tree_view")); 1658 "GNUNET_GTK_master_publish_dialog_pseudonym_tree_view"));
1643 sel = gtk_tree_view_get_selection (tv); 1659 sel = gtk_tree_view_get_selection (tv);
1644 g_signal_connect (G_OBJECT (sel), "changed", 1660 g_signal_connect (G_OBJECT (sel), "changed",
1645 G_CALLBACK (selection_changed_cb), NULL); 1661 G_CALLBACK (selection_changed_cb), user_data);
1646 ret = gtk_dialog_run (GTK_DIALOG (ad)); 1662}
1663
1664void
1665hide_master_publish_dialog (gpointer user_data, gint ret)
1666{
1667 GtkTreeView *tv, *ptv;
1668 GtkTreeSelection *sel;
1669 GtkTreeModel *tm, *ptm;
1670 GtkTreeIter iter;
1671 gpointer namespace;
1672 gchar *namespace_id;
1673 gchar *namespace_uid;
1674 struct GNUNET_FS_FileInformation *fi;
1675 GtkWidget *ad;
1676 GtkBuilder *builder = GTK_BUILDER (user_data);
1677
1678 ad = GTK_WIDGET (gtk_builder_get_object
1679 (builder, "GNUNET_GTK_master_publish_dialog"));
1680
1681 ptv = GTK_TREE_VIEW (gtk_builder_get_object
1682 (builder,
1683 "GNUNET_GTK_master_publish_dialog_pseudonym_tree_view"));
1684 sel = gtk_tree_view_get_selection (ptv);
1685 ptm = gtk_tree_view_get_model (ptv);
1686
1687 tv = GTK_TREE_VIEW (gtk_builder_get_object
1688 (builder,
1689 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
1690 tm = gtk_tree_view_get_model (tv);
1691
1647 if (ret == GTK_RESPONSE_OK) 1692 if (ret == GTK_RESPONSE_OK)
1648 { 1693 {
1649 if (TRUE == gtk_tree_selection_get_selected (sel, &ptm, &iter)) 1694 if (TRUE == gtk_tree_selection_get_selected (sel, &ptm, &iter))
@@ -1666,14 +1711,10 @@ GNUNET_GTK_main_menu_file_publish_activate_cb (GtkWidget * dummy, gpointer data)
1666 GNUNET_FS_PUBLISH_OPTION_NONE); 1711 GNUNET_FS_PUBLISH_OPTION_NONE);
1667 } 1712 }
1668 while (gtk_tree_model_iter_next (tm, &iter)); 1713 while (gtk_tree_model_iter_next (tm, &iter));
1669 if (namespace_id != NULL) 1714 g_free (namespace_id);
1670 g_free (namespace_id); 1715 g_free (namespace_uid);
1671 if (namespace_uid != NULL)
1672 g_free (namespace_uid);
1673 } 1716 }
1674 ptm = 1717
1675 GTK_TREE_MODEL (gtk_builder_get_object
1676 (master_builder, "GNUNET_GTK_pseudonym_tree_store"));
1677 /* free state from 'ptm' */ 1718 /* free state from 'ptm' */
1678 if (TRUE == gtk_tree_model_get_iter_first (ptm, &iter)) 1719 if (TRUE == gtk_tree_model_get_iter_first (ptm, &iter))
1679 do 1720 do
@@ -1681,6 +1722,7 @@ GNUNET_GTK_main_menu_file_publish_activate_cb (GtkWidget * dummy, gpointer data)
1681 free_pseudonym_tree_store (ptm, &iter); 1722 free_pseudonym_tree_store (ptm, &iter);
1682 } 1723 }
1683 while (TRUE == gtk_tree_model_iter_next (ptm, &iter)); 1724 while (TRUE == gtk_tree_model_iter_next (ptm, &iter));
1725 gtk_tree_store_clear (GTK_TREE_STORE (ptm));
1684 1726
1685 /* free state from 'tm' */ 1727 /* free state from 'tm' */
1686 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter)) 1728 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
@@ -1689,10 +1731,100 @@ GNUNET_GTK_main_menu_file_publish_activate_cb (GtkWidget * dummy, gpointer data)
1689 free_file_information_tree_store (tm, &iter); 1731 free_file_information_tree_store (tm, &iter);
1690 } 1732 }
1691 while (TRUE == gtk_tree_model_iter_next (tm, &iter)); 1733 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
1734 gtk_tree_store_clear (GTK_TREE_STORE (tm));
1735
1736 gtk_widget_hide (ad);
1737}
1738
1739void
1740GNUNET_GTK_master_publish_dialog_execute_button_clicked_cb (GtkButton *button,
1741 gpointer user_data)
1742{
1743 hide_master_publish_dialog (user_data, GTK_RESPONSE_OK);
1744}
1745
1746void
1747GNUNET_GTK_master_publish_dialog_cancel_button_clicked_cb (GtkButton *button,
1748 gpointer user_data)
1749{
1750 hide_master_publish_dialog (user_data, GTK_RESPONSE_CANCEL);
1751}
1752
1753gboolean
1754GNUNET_GTK_master_publish_dialog_delete_event_cb (GtkWidget *widget,
1755 GdkEvent *event, gpointer user_data)
1756{
1757 hide_master_publish_dialog (user_data, GTK_RESPONSE_CANCEL);
1758 return TRUE;
1759}
1760
1761void
1762GNUNET_GTK_publish_file_dialog_response_cb (GtkDialog *dialog,
1763 gint response_id, gpointer user_data)
1764{
1765 char *filename;
1766 struct GNUNET_FS_BlockOptions bo;
1767 int do_index;
1768 GtkSpinButton *sb;
1769 GtkWidget *ad;
1770
1771 GtkBuilder *builder = GTK_BUILDER (user_data);
1772
1773 ad = GTK_WIDGET (gtk_builder_get_object (builder,
1774 "GNUNET_GTK_publish_file_dialog"));
1775
1776 if (response_id == -5)
1777 {
1778 /* OK */
1779 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
1780 sb = GTK_SPIN_BUTTON (gtk_builder_get_object (builder,
1781 "GNUNET_GTK_publish_file_dialog_expiration_year_spin_button"));
1782
1783 if (!GNUNET_GTK_get_selected_anonymity_level (builder,
1784 "GNUNET_GTK_publish_file_dialog_anonymity_combobox", &bo.anonymity_level))
1785 bo.anonymity_level = 1;
1786 bo.content_priority = gtk_spin_button_get_value (GTK_SPIN_BUTTON (
1787 gtk_builder_get_object (builder,
1788 "GNUNET_GTK_publish_file_dialog_priority_spin_button")));
1789 bo.expiration_time = GNUNET_FS_GTK_get_expiration_time (sb);
1790 bo.replication_level = 1; /* FIXME... */
1791 do_index = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
1792 gtk_builder_get_object (builder,
1793 "GNUNET_GTK_publish_file_dialog_do_index_checkbutton")));
1794 add_file_at_iter (user_data, filename, &bo, do_index, NULL);
1795 g_free (filename);
1796 update_selectivity (user_data);
1797 }
1798 else
1799 {
1800 /* Cancel/Escape/close/etc */
1801 }
1802 gtk_widget_hide (ad);
1803}
1804
1805/**
1806 */
1807void
1808GNUNET_GTK_main_menu_file_publish_activate_cb (GtkWidget * dummy, gpointer data)
1809{
1810 GtkWidget *ad;
1811 GtkTreeStore *ts;
1812 GtkBuilder *builder;
1813
1814 builder = GTK_BUILDER (data);
1815
1816 ad = GTK_WIDGET (gtk_builder_get_object
1817 (builder, "GNUNET_GTK_master_publish_dialog"));
1818
1819 if (!gtk_widget_get_visible (ad))
1820 {
1821 ts = GTK_TREE_STORE (gtk_builder_get_object (builder,
1822 "GNUNET_GTK_pseudonym_tree_store"));
1823 GNUNET_FS_namespace_list (GNUNET_FS_GTK_get_fs_handle (),
1824 &add_namespace_to_ts, ts);
1825 }
1692 1826
1693 gtk_widget_destroy (ad); 1827 gtk_window_present (GTK_WINDOW (ad));
1694 g_object_unref (G_OBJECT (master_builder));
1695 master_builder = NULL;
1696} 1828}
1697 1829
1698 1830
diff --git a/src/fs/gnunet-fs-gtk-main_window_open_directory.c b/src/fs/gnunet-fs-gtk-main_window_open_directory.c
index ae3b7d0b..23e71fc6 100644
--- a/src/fs/gnunet-fs-gtk-main_window_open_directory.c
+++ b/src/fs/gnunet-fs-gtk-main_window_open_directory.c
@@ -85,6 +85,34 @@ add_child (void *cls, const char *filename, const struct GNUNET_FS_Uri *uri,
85 meta, NULL, 0)); 85 meta, NULL, 0));
86} 86}
87 87
88void
89GNUNET_GTK_open_directory_dialog_response_cb (GtkDialog *dialog,
90 gint response_id, gpointer user_data)
91{
92 GtkBuilder *builder;
93 GtkWidget *ad;
94 char *filename;
95 struct AddChildContext acc;
96
97 builder = GTK_BUILDER (user_data);
98 ad = GTK_WIDGET (gtk_builder_get_object
99 (builder, "GNUNET_GTK_open_directory_dialog"));
100
101 if (response_id != -5)
102 {
103 gtk_widget_destroy (ad);
104 g_object_unref (G_OBJECT (builder));
105 return;
106 }
107
108 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
109 gtk_widget_destroy (ad);
110 g_object_unref (G_OBJECT (builder));
111 acc.filename = filename;
112 acc.ts = NULL;
113 GNUNET_FS_GTK_mmap_and_scan (filename, &add_child, &acc);
114 g_free (filename);
115}
88 116
89/** 117/**
90 * User selected "Open directory" in menu. Display dialog, open 118 * User selected "Open directory" in menu. Display dialog, open
@@ -94,12 +122,12 @@ void
94GNUNET_GTK_main_menu_file_open_gnunet_directory_activate_cb (GtkWidget * dummy, 122GNUNET_GTK_main_menu_file_open_gnunet_directory_activate_cb (GtkWidget * dummy,
95 gpointer data) 123 gpointer data)
96{ 124{
97 struct AddChildContext acc;
98 GtkWidget *ad; 125 GtkWidget *ad;
99 GtkBuilder *builder; 126 GtkBuilder *builder;
100 char *filename; 127 GtkWidget *toplevel;
101 GtkFileFilter *ff; 128 GtkFileFilter *ff;
102 129
130
103 builder = 131 builder =
104 GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_open_directory_dialog.glade"); 132 GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_open_directory_dialog.glade");
105 if (builder == NULL) 133 if (builder == NULL)
@@ -113,19 +141,11 @@ GNUNET_GTK_main_menu_file_open_gnunet_directory_activate_cb (GtkWidget * dummy,
113 (builder, "gnunet_directory_filter")); 141 (builder, "gnunet_directory_filter"));
114 /* FIXME: some day, write a custom file filter for gnunet-directories... */ 142 /* FIXME: some day, write a custom file filter for gnunet-directories... */
115 gtk_file_filter_add_pattern (ff, "*" GNUNET_FS_DIRECTORY_EXT); 143 gtk_file_filter_add_pattern (ff, "*" GNUNET_FS_DIRECTORY_EXT);
116 if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad))) 144
117 { 145 toplevel = gtk_widget_get_toplevel (dummy);
118 gtk_widget_destroy (ad); 146 if (GTK_IS_WINDOW (toplevel))
119 g_object_unref (G_OBJECT (builder)); 147 gtk_window_set_transient_for (GTK_WINDOW (ad), GTK_WINDOW (toplevel));
120 return; 148 gtk_window_present (GTK_WINDOW (ad));
121 }
122 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
123 gtk_widget_destroy (ad);
124 g_object_unref (G_OBJECT (builder));
125 acc.filename = filename;
126 acc.ts = NULL;
127 GNUNET_FS_GTK_mmap_and_scan (filename, &add_child, &acc);
128 g_free (filename);
129} 149}
130 150
131/* end of gnunet-fs-gtk-main_window_open_directory.c */ 151/* end of gnunet-fs-gtk-main_window_open_directory.c */
diff --git a/src/fs/gnunet-fs-gtk.c b/src/fs/gnunet-fs-gtk.c
index 2e0f2999..3c485126 100644
--- a/src/fs/gnunet-fs-gtk.c
+++ b/src/fs/gnunet-fs-gtk.c
@@ -247,7 +247,7 @@ GNUNET_GTK_get_selected_anonymity_level (GtkBuilder *builder, gchar *combo_name,
247 GtkTreeModel *model; 247 GtkTreeModel *model;
248 guint level; 248 guint level;
249 249
250 combo = GTK_COMBO_BOX(gtk_builder_get_object (builder, combo_name)); 250 combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, combo_name));
251 if (!combo) 251 if (!combo)
252 return FALSE; 252 return FALSE;
253 253
@@ -265,6 +265,38 @@ GNUNET_GTK_get_selected_anonymity_level (GtkBuilder *builder, gchar *combo_name,
265} 265}
266 266
267gboolean 267gboolean
268GNUNET_GTK_select_anonymity_level (GtkBuilder *builder, gchar *combo_name, guint sel_level)
269{
270 GtkComboBox *combo;
271 GtkTreeIter iter;
272 GtkTreeModel *model;
273 guint level;
274 gboolean go_on;
275
276 combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, combo_name));
277 if (!combo)
278 return FALSE;
279
280 model = gtk_combo_box_get_model (combo);
281 if (!model)
282 return FALSE;
283
284 for (go_on = gtk_tree_model_get_iter_first (model, &iter);
285 go_on;
286 go_on = gtk_tree_model_iter_next (model, &iter))
287 {
288 gboolean is_it = FALSE;
289 gtk_tree_model_get (model, &iter, 1, &level, -1);
290 if (level == sel_level)
291 {
292 gtk_combo_box_set_active_iter (combo, &iter);
293 return TRUE;
294 }
295 }
296 return FALSE;
297}
298
299gboolean
268get_selected_namespace_treepath_iter_model_widget (GtkBuilder *builder, 300get_selected_namespace_treepath_iter_model_widget (GtkBuilder *builder,
269 GtkTreePath **p_treepath, GtkTreeIter *p_iter, GtkTreeModel **p_model, 301 GtkTreePath **p_treepath, GtkTreeIter *p_iter, GtkTreeModel **p_model,
270 GtkWidget **p_widget) 302 GtkWidget **p_widget)
diff --git a/src/fs/gnunet-fs-gtk.h b/src/fs/gnunet-fs-gtk.h
index 4cd76de6..114be040 100644
--- a/src/fs/gnunet-fs-gtk.h
+++ b/src/fs/gnunet-fs-gtk.h
@@ -76,5 +76,18 @@ GNUNET_GTK_get_selected_anonymity_level (GtkBuilder *builder,
76 gchar *combo_name, guint *p_level); 76 gchar *combo_name, guint *p_level);
77 77
78 78
79/**
80 * Set the selected anonymity level.
81 * For dialogue initialization.
82 *
83 * @param builder builder object for the window
84 * @param combo_name name of the combobox widget to get anonymity from
85 * @param sel_level the level value to select
86 * @return TRUE on success, FALSE on error (no item with such level)
87 */
88gboolean
89GNUNET_GTK_select_anonymity_level (GtkBuilder *builder,
90 gchar *combo_name, guint sel_level);
91
79#endif 92#endif
80/* end of gnunet-fs-gtk.h */ 93/* end of gnunet-fs-gtk.h */