aboutsummaryrefslogtreecommitdiff
path: root/src/fs/gnunet-fs-gtk-edit_publish_dialog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fs/gnunet-fs-gtk-edit_publish_dialog.c')
-rw-r--r--src/fs/gnunet-fs-gtk-edit_publish_dialog.c902
1 files changed, 320 insertions, 582 deletions
diff --git a/src/fs/gnunet-fs-gtk-edit_publish_dialog.c b/src/fs/gnunet-fs-gtk-edit_publish_dialog.c
index 2c51c377..ea3cc6b5 100644
--- a/src/fs/gnunet-fs-gtk-edit_publish_dialog.c
+++ b/src/fs/gnunet-fs-gtk-edit_publish_dialog.c
@@ -27,26 +27,76 @@
27#include "gnunet-fs-gtk.h" 27#include "gnunet-fs-gtk.h"
28#include <gnunet/gnunet_util_lib.h> 28#include <gnunet/gnunet_util_lib.h>
29 29
30#include "metatypes.c"
30 31
31#define PUBSTATE "edit-publication-state" 32struct EditPublicationDialogContext
33{
34 GtkBuilder *builder;
32 35
33#include "metatypes.c" 36 GtkListStore *metatypes_liststore;
37
38 GtkListStore *meta_liststore;
39 GtkTreeView *meta_treeview;
40 GtkTreeSelection *meta_selection;
41 GtkButton *meta_add_button;
42 GtkWidget *meta_del_button;
43
44 GtkCellRendererCombo *meta_combo;
45
46 GtkListStore *pubtypes_liststore;
47 GtkComboBox *pubtypes_combo;
48
49 GtkListStore *keywords_liststore;
50 GtkTreeView *keywords_treeview;
51 GtkTreeSelection *keywords_selection;
52 GtkWidget *keyword_add_button;
53 GtkWidget *keyword_del_button;
54
55 GtkEntry *keyword_entry;
56
57 GObject *pubwindow;
58
59 GtkWidget *ok;
60 GtkButton *cancel;
61
62 GtkImage *image;
63
64 GtkToggleButton *index_checkbutton;
65 GtkLabel *index_label;
66 GtkEntry *root_entry;
67 GtkLabel *root_label;
68
69 GtkSpinButton *priority_spin;
70 GtkSpinButton *year_spin;
71 GtkSpinButton *replication_spin;
72
73 GtkComboBox *anonymity_combo;
74 GtkListStore *anonymity_liststore;
75
76 int do_index;
77 char *short_fn;
78 struct GNUNET_FS_BlockOptions bo;
79 struct GNUNET_FS_FileInformation *fip;
80 gint preview_changed;
81 gboolean allow_no_keywords;
82 gboolean is_directory;
83 GNUNET_FS_GTK_EditPublishDialogCallback cb;
84 gchar *root;
85 gpointer cls;
34 86
87 struct GNUNET_CONTAINER_MetaData *md;
88
89 GtkTreeIter *meta_combo_selected_iter;
90};
35 91
36static void 92static void
37change_metatypes (GtkBuilder * builder, gint code) 93change_metatypes (struct EditPublicationDialogContext *ctx, gint code)
38{ 94{
39 GtkListStore *metatypes_list;
40 gint pub_type = 0, i; 95 gint pub_type = 0, i;
41 gint pubtype_count = 0; 96 gint pubtype_count = 0;
42 gint max_type; 97 gint max_type;
43 GtkTreeIter iter; 98 GtkTreeIter iter;
44 99
45 metatypes_list =
46 GTK_LIST_STORE (gtk_builder_get_object
47 (builder,
48 "GNUNET_GTK_publication_metadata_types_liststore"));
49
50 for (pub_type = 0; types[pub_type] != NULL; pub_type++) 100 for (pub_type = 0; types[pub_type] != NULL; pub_type++)
51 pubtype_count += 1; 101 pubtype_count += 1;
52 102
@@ -55,12 +105,12 @@ change_metatypes (GtkBuilder * builder, gint code)
55 else 105 else
56 pub_type = 0; 106 pub_type = 0;
57 107
58 gtk_list_store_clear (metatypes_list); 108 gtk_list_store_clear (ctx->metatypes_liststore);
59 max_type = EXTRACTOR_metatype_get_max (); 109 max_type = EXTRACTOR_metatype_get_max ();
60 for (i = 0; types[pub_type][i] != EXTRACTOR_METATYPE_RESERVED; i++) 110 for (i = 0; types[pub_type][i] != EXTRACTOR_METATYPE_RESERVED; i++)
61 { 111 {
62 if (types[pub_type][i] < max_type && types[pub_type][i] > 0) 112 if (types[pub_type][i] < max_type && types[pub_type][i] > 0)
63 gtk_list_store_insert_with_values (metatypes_list, &iter, G_MAXINT, 0, 113 gtk_list_store_insert_with_values (ctx->metatypes_liststore, &iter, G_MAXINT, 0,
64 types[pub_type][i], 1, 114 types[pub_type][i], 1,
65 EXTRACTOR_METAFORMAT_UTF8, 2, 115 EXTRACTOR_METAFORMAT_UTF8, 2,
66 EXTRACTOR_metatype_to_string (types 116 EXTRACTOR_metatype_to_string (types
@@ -74,133 +124,45 @@ change_metatypes (GtkBuilder * builder, gint code)
74 124
75void 125void
76GNUNET_GTK_edit_publication_type_combo_changed_cb (GtkComboBox * widget, 126GNUNET_GTK_edit_publication_type_combo_changed_cb (GtkComboBox * widget,
77 gpointer user_data) 127 struct EditPublicationDialogContext *ctx)
78{ 128{
79 GtkTreeIter iter; 129 GtkTreeIter iter;
80 GtkBuilder *builder;
81 GtkListStore *pubtypes_list;
82 gint code; 130 gint code;
83 131
84 if (!gtk_combo_box_get_active_iter (widget, &iter)) 132 if (!gtk_combo_box_get_active_iter (widget, &iter))
85 return; 133 return;
86 builder = GTK_BUILDER (user_data);
87
88 pubtypes_list =
89 GTK_LIST_STORE (gtk_builder_get_object
90 (builder, "GNUNET_GTK_publication_types_liststore"));
91 134
92 gtk_tree_model_get (GTK_TREE_MODEL (pubtypes_list), &iter, 0, &code, -1); 135 gtk_tree_model_get (GTK_TREE_MODEL (ctx->pubtypes_liststore), &iter, 0, &code, -1);
93 136
94 change_metatypes (builder, code); 137 change_metatypes (ctx, code);
95} 138}
96 139
97struct EditPublicationState
98{
99 int do_index;
100 char *short_fn;
101 struct GNUNET_FS_BlockOptions bo;
102 struct GNUNET_FS_FileInformation *fip;
103 gint preview_changed;
104 gboolean allow_no_keywords;
105 gboolean is_directory;
106 GNUNET_FS_GTK_EditPublishDialogCallback cb;
107 gchar *root;
108 gpointer cls;
109};
110
111 140
112static void 141static void
113metadata_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data) 142metadata_selection_changed_cb (GtkTreeSelection *ts, struct EditPublicationDialogContext *ctx)
114{ 143{
115 GtkTreeView *tv; 144 gtk_widget_set_sensitive (ctx->meta_del_button,
116 GtkTreeSelection *sel; 145 gtk_tree_selection_get_selected (ts, NULL, NULL));
117 GtkWidget *button;
118 GtkBuilder *builder;
119
120 builder = GTK_BUILDER (user_data);
121
122 tv = GTK_TREE_VIEW (gtk_builder_get_object
123 (builder,
124 "GNUNET_GTK_edit_publication_metadata_tree_view"));
125 sel = gtk_tree_view_get_selection (tv);
126 button =
127 GTK_WIDGET (gtk_builder_get_object
128 (builder, "GNUNET_GTK_edit_publication_delete_button"));
129 gtk_widget_set_sensitive (button,
130 gtk_tree_selection_get_selected (sel, NULL, NULL));
131} 146}
132 147
133 148
134static void 149static void
135keywords_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data) 150keywords_selection_changed_cb (GtkTreeSelection *ts, struct EditPublicationDialogContext *ctx)
136{
137 GtkTreeView *tv;
138 GtkTreeSelection *sel;
139 GtkWidget *button;
140 GtkBuilder *builder;
141
142 builder = GTK_BUILDER (user_data);
143
144
145 tv = GTK_TREE_VIEW (gtk_builder_get_object
146 (builder,
147 "GNUNET_GTK_edit_publication_keyword_list_tree_view"));
148 sel = gtk_tree_view_get_selection (tv);
149 button =
150 GTK_WIDGET (gtk_builder_get_object
151 (builder,
152 "GNUNET_GTK_edit_publication_keyword_list_del_button"));
153
154 gtk_widget_set_sensitive (button,
155 gtk_tree_selection_get_selected (sel, NULL, NULL));
156}
157
158
159void
160GNUNET_GTK_edit_publication_window_realize_cb (GtkWidget * widget,
161 gpointer user_data)
162{ 151{
163 GtkBuilder *builder; 152 gtk_widget_set_sensitive (ctx->keyword_del_button,
164 GtkTreeView *tv; 153 gtk_tree_selection_get_selected (ts, NULL, NULL));
165 GtkTreeSelection *sel;
166
167 builder = GTK_BUILDER (user_data);
168
169 tv = GTK_TREE_VIEW (gtk_builder_get_object
170 (builder,
171 "GNUNET_GTK_edit_publication_metadata_tree_view"));
172 sel = gtk_tree_view_get_selection (tv);
173 g_signal_connect (G_OBJECT (sel), "changed",
174 G_CALLBACK (metadata_selection_changed_cb), builder);
175
176 tv = GTK_TREE_VIEW (gtk_builder_get_object
177 (builder,
178 "GNUNET_GTK_edit_publication_keyword_list_tree_view"));
179 sel = gtk_tree_view_get_selection (tv);
180 g_signal_connect (G_OBJECT (sel), "changed",
181 G_CALLBACK (keywords_selection_changed_cb), builder);
182} 154}
183 155
184 156
185void 157void
186GNUNET_GTK_edit_publication_add_button_clicked_cb (GtkButton * button, 158GNUNET_GTK_edit_publication_add_button_clicked_cb (GtkButton * button,
187 gpointer user_data) 159 struct EditPublicationDialogContext *ctx)
188{ 160{
189 GtkBuilder *builder;
190 GtkTreeView *meta_tree;
191 GtkListStore *meta_list;
192 GtkTreeIter iter; 161 GtkTreeIter iter;
193 162
194 builder = GTK_BUILDER (user_data); 163 gtk_list_store_insert (ctx->meta_liststore, &iter, 0);
195 meta_tree =
196 GTK_TREE_VIEW (gtk_builder_get_object
197 (builder,
198 "GNUNET_GTK_edit_publication_metadata_tree_view"));
199 meta_list = GTK_LIST_STORE (gtk_tree_view_get_model (meta_tree));
200
201 gtk_list_store_insert (meta_list, &iter, 0);
202 /* type == 0 means "not set" */ 164 /* type == 0 means "not set" */
203 gtk_list_store_set (meta_list, &iter, 0, 0, 1, EXTRACTOR_METAFORMAT_UTF8, 2, 165 gtk_list_store_set (ctx->meta_liststore, &iter, 0, 0, 1, EXTRACTOR_METAFORMAT_UTF8, 2,
204 _("Select a type"), 3, _("Specify a value"), 4, NULL, -1); 166 _("Select a type"), 3, _("Specify a value"), 4, NULL, -1);
205} 167}
206 168
@@ -210,20 +172,11 @@ GNUNET_GTK_edit_publication_keyword_entry_key_press_event_cb (GtkWidget *
210 widget, 172 widget,
211 GdkEventKey * 173 GdkEventKey *
212 event, 174 event,
213 gpointer 175 struct EditPublicationDialogContext *ctx)
214 user_data)
215{ 176{
216 GtkBuilder *builder;
217 GtkButton *add_button;
218
219 builder = GTK_BUILDER (user_data);
220
221 if (event->keyval == GDK_KEY_Return) 177 if (event->keyval == GDK_KEY_Return)
222 { 178 {
223 add_button = 179 GNUNET_GTK_edit_publication_add_button_clicked_cb (GTK_BUTTON (ctx->keyword_add_button), ctx);
224 GTK_BUTTON (gtk_builder_get_object
225 (builder, "GNUNET_GTK_edit_publication_add_button"));
226 GNUNET_GTK_edit_publication_add_button_clicked_cb (add_button, user_data);
227 return TRUE; 180 return TRUE;
228 } 181 }
229 return FALSE; 182 return FALSE;
@@ -232,43 +185,26 @@ GNUNET_GTK_edit_publication_keyword_entry_key_press_event_cb (GtkWidget *
232 185
233void GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer_edited_cb 186void GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer_edited_cb
234 (GtkCellRendererText * renderer, gchar * path, gchar * new_text, 187 (GtkCellRendererText * renderer, gchar * path, gchar * new_text,
235 gpointer user_data) 188 struct EditPublicationDialogContext *ctx)
236{ 189{
237 GtkBuilder *builder;
238 GtkTreeView *meta_tree;
239 GtkListStore *meta_list;
240 GtkCellRendererCombo *combo;
241 GtkTreeModel *combo_model; 190 GtkTreeModel *combo_model;
242 GtkTreeIter iter; 191 GtkTreeIter iter;
243 gint type_id; 192 gint type_id;
244 gchar *description = NULL; 193 gchar *description = NULL;
245 GtkTreeIter *pass_data = NULL; 194
246
247 builder = GTK_BUILDER (user_data);
248 meta_tree =
249 GTK_TREE_VIEW (gtk_builder_get_object
250 (builder,
251 "GNUNET_GTK_edit_publication_metadata_tree_view"));
252 meta_list = GTK_LIST_STORE (gtk_tree_view_get_model (meta_tree));
253 if (!gtk_tree_model_get_iter_from_string 195 if (!gtk_tree_model_get_iter_from_string
254 (GTK_TREE_MODEL (meta_list), &iter, path)) 196 (GTK_TREE_MODEL (ctx->meta_liststore), &iter, path))
255 return; 197 return;
256 198
257 combo = 199 if (!ctx->meta_combo_selected_iter)
258 GTK_CELL_RENDERER_COMBO (gtk_builder_get_object
259 (builder,
260 "GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer"));
261
262 pass_data = g_object_get_data (G_OBJECT (combo), "selected-type");
263 if (!pass_data)
264 return; 200 return;
265 g_object_get (combo, "model", &combo_model, NULL); 201 g_object_get (ctx->meta_combo, "model", &combo_model, NULL);
266 gtk_tree_model_get (combo_model, pass_data, 0, &type_id, 2, &description, -1); 202 gtk_tree_model_get (combo_model, ctx->meta_combo_selected_iter, 0, &type_id, 2, &description, -1);
267 g_object_unref (combo_model); 203 g_object_unref (combo_model);
268 g_free (pass_data); 204 g_free (ctx->meta_combo_selected_iter);
269 g_object_set_data (G_OBJECT (combo), "selected-type", NULL); 205 ctx->meta_combo_selected_iter = NULL;
270 206
271 gtk_list_store_set (meta_list, &iter, 0, type_id, 1, 207 gtk_list_store_set (ctx->meta_liststore, &iter, 0, type_id, 1,
272 EXTRACTOR_METAFORMAT_UTF8, 2, new_text, 4, description, 208 EXTRACTOR_METAFORMAT_UTF8, 2, new_text, 4, description,
273 -1); 209 -1);
274 g_free (description); 210 g_free (description);
@@ -277,26 +213,19 @@ void GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer_edited_cb
277 213
278void GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer_changed_cb 214void GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer_changed_cb
279 (GtkCellRendererCombo * combo, gchar * path_string, GtkTreeIter * new_iter, 215 (GtkCellRendererCombo * combo, gchar * path_string, GtkTreeIter * new_iter,
280 gpointer user_data) 216 struct EditPublicationDialogContext *ctx)
281{ 217{
282 GtkTreeIter *pass_data; 218 if (ctx->meta_combo_selected_iter)
283 219 g_free (ctx->meta_combo_selected_iter);
284 pass_data = g_object_get_data (G_OBJECT (combo), "selected-type"); 220 ctx->meta_combo_selected_iter = g_new0 (GtkTreeIter, 1);
285 if (pass_data) 221 *ctx->meta_combo_selected_iter = *new_iter;
286 g_free (pass_data);
287 pass_data = g_new0 (GtkTreeIter, 1);
288 *pass_data = *new_iter;
289 g_object_set_data (G_OBJECT (combo), "selected-type", pass_data);
290} 222}
291 223
292 224
293void GNUNET_GTK_edit_publication_metadata_tree_view_value_renderer_edited_cb 225void GNUNET_GTK_edit_publication_metadata_tree_view_value_renderer_edited_cb
294 (GtkCellRendererText * renderer, gchar * path, gchar * new_text, 226 (GtkCellRendererText * renderer, gchar * path, gchar * new_text,
295 gpointer user_data) 227 struct EditPublicationDialogContext *ctx)
296{ 228{
297 GtkBuilder *builder;
298 GtkTreeView *meta_tree;
299 GtkListStore *meta_list;
300 GtkTreeIter iter; 229 GtkTreeIter iter;
301 gint metatype; 230 gint metatype;
302 char *avalue; 231 char *avalue;
@@ -304,31 +233,13 @@ void GNUNET_GTK_edit_publication_metadata_tree_view_value_renderer_edited_cb
304 size_t slen; 233 size_t slen;
305 char *pos; 234 char *pos;
306 235
307 GObject *pubwindow;
308 struct EditPublicationState *state = NULL;
309
310 builder = GTK_BUILDER (user_data);
311 meta_tree =
312 GTK_TREE_VIEW (gtk_builder_get_object
313 (builder,
314 "GNUNET_GTK_edit_publication_metadata_tree_view"));
315 meta_list = GTK_LIST_STORE (gtk_tree_view_get_model (meta_tree));
316 if (!gtk_tree_model_get_iter_from_string 236 if (!gtk_tree_model_get_iter_from_string
317 (GTK_TREE_MODEL (meta_list), &iter, path)) 237 (GTK_TREE_MODEL (ctx->meta_liststore), &iter, path))
318 return;
319
320 pubwindow =
321 gtk_builder_get_object (builder, "GNUNET_GTK_edit_publication_window");
322 state = g_object_get_data (pubwindow, PUBSTATE);
323 if (!state)
324 {
325 GNUNET_break (0);
326 return; 238 return;
327 }
328 239
329 gtk_tree_model_get (GTK_TREE_MODEL (meta_list), &iter, 0, &metatype, -1); 240 gtk_tree_model_get (GTK_TREE_MODEL (ctx->meta_liststore), &iter, 0, &metatype, -1);
330 if (metatype == EXTRACTOR_METATYPE_FILENAME && 241 if (metatype == EXTRACTOR_METATYPE_FILENAME &&
331 new_text[strlen (new_text) - 1] != '/' && state->is_directory) 242 new_text[strlen (new_text) - 1] != '/' && ctx->is_directory)
332 { 243 {
333 GNUNET_asprintf (&avalue, "%s/", new_text); 244 GNUNET_asprintf (&avalue, "%s/", new_text);
334 /* if user typed '\' instead of '/', change it! */ 245 /* if user typed '\' instead of '/', change it! */
@@ -356,65 +267,43 @@ void GNUNET_GTK_edit_publication_metadata_tree_view_value_renderer_edited_cb
356 avalue = NULL; 267 avalue = NULL;
357 } 268 }
358 269
359 gtk_list_store_set (meta_list, &iter, 3, ivalue, -1); 270 gtk_list_store_set (ctx->meta_liststore, &iter, 3, ivalue, -1);
360 GNUNET_free_non_null (avalue); 271 GNUNET_free_non_null (avalue);
361} 272}
362 273
363 274
364void 275void
365GNUNET_GTK_edit_publication_delete_button_clicked_cb (GtkButton * button, 276GNUNET_GTK_edit_publication_delete_button_clicked_cb (GtkButton * button,
366 gpointer user_data) 277 struct EditPublicationDialogContext *ctx)
367{ 278{
368 GtkTreeView *tv;
369 GtkTreeSelection *sel;
370 GtkTreeModel *tm;
371 GtkTreeIter iter; 279 GtkTreeIter iter;
372 GtkBuilder *builder = GTK_BUILDER (user_data);
373 280
374 tv = GTK_TREE_VIEW (gtk_builder_get_object 281 if (TRUE != gtk_tree_selection_get_selected (ctx->meta_selection, NULL, &iter))
375 (builder,
376 "GNUNET_GTK_edit_publication_metadata_tree_view"));
377 sel = gtk_tree_view_get_selection (tv);
378 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
379 { 282 {
380 GNUNET_break (0); 283 GNUNET_break (0);
381 return; 284 return;
382 } 285 }
383 if (gtk_list_store_remove (GTK_LIST_STORE (tm), &iter)) 286 if (gtk_list_store_remove (ctx->meta_liststore, &iter))
384 gtk_tree_selection_select_iter (sel, &iter); 287 gtk_tree_selection_select_iter (ctx->meta_selection, &iter);
385} 288}
386 289
387 290
388void 291void
389GNUNET_GTK_edit_publication_keyword_list_add_button_clicked_cb (GtkButton * 292GNUNET_GTK_edit_publication_keyword_list_add_button_clicked_cb (GtkButton *
390 button, 293 button,
391 gpointer 294 struct EditPublicationDialogContext *ctx)
392 user_data)
393{ 295{
394 const char *keyword; 296 const char *keyword;
395 GtkEntry *entry;
396 GtkListStore *ls;
397 GtkTreeIter iter; 297 GtkTreeIter iter;
398 GtkBuilder *builder;
399 GtkWidget *ok;
400 298
401 builder = GTK_BUILDER (user_data); 299 keyword = gtk_entry_get_text (ctx->keyword_entry);
402
403 ls = GTK_LIST_STORE (gtk_builder_get_object
404 (builder, "GNUNET_GTK_publication_keywords_liststore"));
405 entry =
406 GTK_ENTRY (gtk_builder_get_object
407 (builder, "GNUNET_GTK_edit_publication_keyword_entry"));
408 keyword = gtk_entry_get_text (entry);
409 if (strlen (keyword) > 0) 300 if (strlen (keyword) > 0)
410 { 301 {
411 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, keyword, 1, TRUE, 302 gtk_list_store_insert_with_values (ctx->keywords_liststore, &iter, G_MAXINT, 0, keyword, 1, TRUE,
412 -1); 303 -1);
413 ok = GTK_WIDGET (gtk_builder_get_object 304 gtk_widget_set_sensitive (ctx->ok, TRUE);
414 (builder, "GNUNET_GTK_edit_publication_confirm_button"));
415 gtk_widget_set_sensitive (ok, TRUE);
416 } 305 }
417 gtk_entry_set_text (entry, ""); 306 gtk_entry_set_text (ctx->keyword_entry, "");
418} 307}
419 308
420 309
@@ -441,112 +330,47 @@ gtk_tree_model_has_items (GtkTreeModel * model)
441 330
442void 331void
443GNUNET_GTK_edit_publication_keyword_entry_changed_cb (GtkEditable * editable, 332GNUNET_GTK_edit_publication_keyword_entry_changed_cb (GtkEditable * editable,
444 gpointer user_data) 333 struct EditPublicationDialogContext *ctx)
445{ 334{
446 const char *keyword; 335 const char *keyword;
447 GtkEntry *entry;
448 GtkWidget *button;
449 GtkBuilder *builder;
450
451 builder = GTK_BUILDER (user_data);
452 336
453 button = 337 keyword = gtk_entry_get_text (ctx->keyword_entry);
454 GTK_WIDGET (gtk_builder_get_object 338 gtk_widget_set_sensitive (ctx->keyword_add_button, (strlen (keyword) > 0) ? TRUE : FALSE);
455 (builder,
456 "GNUNET_GTK_edit_publication_keyword_list_add_button"));
457 entry =
458 GTK_ENTRY (gtk_builder_get_object
459 (builder, "GNUNET_GTK_edit_publication_keyword_entry"));
460 keyword = gtk_entry_get_text (entry);
461 gtk_widget_set_sensitive (button, (strlen (keyword) > 0) ? TRUE : FALSE);
462} 339}
463 340
464 341
465void 342void
466GNUNET_GTK_edit_publication_keyword_list_del_button_clicked_cb (GtkButton * 343GNUNET_GTK_edit_publication_keyword_list_del_button_clicked_cb (GtkButton *
467 button, 344 button,
468 gpointer 345 struct EditPublicationDialogContext *ctx)
469 user_data)
470{ 346{
471 GtkTreeView *tv;
472 GtkTreeSelection *sel;
473 GtkTreeModel *tm;
474 GtkTreeIter iter; 347 GtkTreeIter iter;
475 GtkBuilder *builder;
476 GtkWidget *ok;
477 GObject *pubwindow;
478 struct EditPublicationState *state = NULL;
479
480 builder = GTK_BUILDER (user_data);
481
482 tv = GTK_TREE_VIEW (gtk_builder_get_object
483 (builder,
484 "GNUNET_GTK_edit_publication_keyword_list_tree_view"));
485 348
486 sel = gtk_tree_view_get_selection (tv); 349 if (TRUE != gtk_tree_selection_get_selected (ctx->keywords_selection, NULL, &iter))
487 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
488 { 350 {
489 GNUNET_break (0); 351 GNUNET_break (0);
490 return; 352 return;
491 } 353 }
492 if (gtk_list_store_remove (GTK_LIST_STORE (tm), &iter)) 354 if (gtk_list_store_remove (GTK_LIST_STORE (ctx->keywords_liststore), &iter))
493 gtk_tree_selection_select_iter (sel, &iter); 355 gtk_tree_selection_select_iter (ctx->keywords_selection, &iter);
494 356
495 ok = GTK_WIDGET (gtk_builder_get_object 357 if (!ctx->allow_no_keywords && !gtk_tree_model_has_items (GTK_TREE_MODEL (ctx->keywords_liststore)))
496 (builder, "GNUNET_GTK_edit_publication_confirm_button")); 358 gtk_widget_set_sensitive (ctx->ok, FALSE);
497
498 pubwindow =
499 gtk_builder_get_object (builder, "GNUNET_GTK_edit_publication_window");
500 state = g_object_get_data (pubwindow, PUBSTATE);
501 if (!state)
502 {
503 GNUNET_break (0);
504 return;
505 }
506
507 if (!state->allow_no_keywords && !gtk_tree_model_has_items (tm))
508 gtk_widget_set_sensitive (ok, FALSE);
509} 359}
510 360
511 361
512void GNUNET_GTK_edit_publication_metadata_preview_file_chooser_button_file_set_cb (GtkFileChooserButton * widget, gpointer user_data) 362void GNUNET_GTK_edit_publication_metadata_preview_file_chooser_button_file_set_cb (
363 GtkFileChooserButton * widget, struct EditPublicationDialogContext *ctx)
513{ 364{
514 gchar *fn; 365 gchar *fn;
515 GtkImage *image;
516 GObject *pubwindow;
517 GtkBuilder *builder = GTK_BUILDER (user_data);
518 struct EditPublicationState *state = NULL;
519
520 pubwindow =
521 gtk_builder_get_object (builder, "GNUNET_GTK_edit_publication_window");
522 state = g_object_get_data (pubwindow, PUBSTATE);
523 if (!state)
524 {
525 GNUNET_break (0);
526 return;
527 }
528 366
529 fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget)); 367 fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
530 image = 368 gtk_image_set_from_file (ctx->image, fn);
531 GTK_IMAGE (gtk_builder_get_object
532 (builder,
533 "GNUNET_GTK_edit_publication_metadata_preview_image"));
534 gtk_image_set_from_file (image, fn);
535 g_free (fn); 369 g_free (fn);
536 state->preview_changed = GNUNET_YES; 370 ctx->preview_changed = GNUNET_YES;
537} 371}
538 372
539 373
540struct FileInformationUpdateContext
541{
542 GtkBuilder *builder;
543 char *short_fn;
544 gchar *root;
545 struct GNUNET_CONTAINER_MetaData *md;
546 gboolean allow_no_keywords;
547};
548
549
550/** 374/**
551 * Copy binary meta data from to the new container and also 375 * Copy binary meta data from to the new container and also
552 * preserve all entries that were not changed. 376 * preserve all entries that were not changed.
@@ -571,58 +395,41 @@ preserve_meta_items (void *cls, const char *plugin_name,
571 const char *data_mime_type, const char *data, 395 const char *data_mime_type, const char *data,
572 size_t data_len) 396 size_t data_len)
573{ 397{
574 struct FileInformationUpdateContext *context = cls; 398 struct EditPublicationDialogContext *ctx = cls;
575 GtkBuilder *builder = context->builder;
576 struct GNUNET_CONTAINER_MetaData *md = context->md;
577 GtkTreeModel *tm;
578 GtkTreeIter iter; 399 GtkTreeIter iter;
579 gchar *value; 400 gchar *value;
580 guint ntype; 401 guint ntype;
581 guint nformat; 402 guint nformat;
582 int keep; 403 int keep;
583 404
584 GObject *pubwindow;
585 struct EditPublicationState *state = NULL;
586
587 pubwindow =
588 gtk_builder_get_object (builder, "GNUNET_GTK_edit_publication_window");
589 state = g_object_get_data (pubwindow, PUBSTATE);
590 if (!state)
591 {
592 GNUNET_break (0);
593 return 0;
594 }
595 /* FIXME: make sure this is all correct UTF-8-wise */ 405 /* FIXME: make sure this is all correct UTF-8-wise */
596 keep = GNUNET_NO; 406 keep = GNUNET_NO;
597 switch (format) 407 switch (format)
598 { 408 {
599 case EXTRACTOR_METAFORMAT_UTF8: 409 case EXTRACTOR_METAFORMAT_UTF8:
600 case EXTRACTOR_METAFORMAT_C_STRING: 410 case EXTRACTOR_METAFORMAT_C_STRING:
601 tm = GTK_TREE_MODEL (gtk_builder_get_object 411 if (TRUE == gtk_tree_model_get_iter_first (GTK_TREE_MODEL (ctx->meta_liststore), &iter))
602 (builder,
603 "GNUNET_GTK_publication_metadata_liststore"));
604 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
605 { 412 {
606 do 413 do
607 { 414 {
608 gtk_tree_model_get (tm, &iter, 0, &ntype, 1, &nformat, 3, &value, -1); 415 gtk_tree_model_get (GTK_TREE_MODEL (ctx->meta_liststore), &iter, 0, &ntype, 1, &nformat, 3, &value, -1);
609 if ((ntype == type) && (nformat == format) && 416 if ((ntype == type) && (nformat == format) &&
610 (0 == strcmp (value, data))) 417 (0 == strcmp (value, data)))
611 { 418 {
612 gtk_list_store_remove (GTK_LIST_STORE (tm), &iter); 419 gtk_list_store_remove (ctx->meta_liststore, &iter);
613 keep = GNUNET_YES; 420 keep = GNUNET_YES;
614 g_free (value); 421 g_free (value);
615 break; 422 break;
616 } 423 }
617 g_free (value); 424 g_free (value);
618 } 425 }
619 while (TRUE == gtk_tree_model_iter_next (tm, &iter)); 426 while (TRUE == gtk_tree_model_iter_next (GTK_TREE_MODEL (ctx->meta_liststore), &iter));
620 } 427 }
621 break; 428 break;
622 case EXTRACTOR_METAFORMAT_UNKNOWN: 429 case EXTRACTOR_METAFORMAT_UNKNOWN:
623 break; 430 break;
624 case EXTRACTOR_METAFORMAT_BINARY: 431 case EXTRACTOR_METAFORMAT_BINARY:
625 if (state->preview_changed == GNUNET_NO) 432 if (ctx->preview_changed == GNUNET_NO)
626 keep = GNUNET_YES; 433 keep = GNUNET_YES;
627 break; 434 break;
628 default: 435 default:
@@ -631,7 +438,7 @@ preserve_meta_items (void *cls, const char *plugin_name,
631 } 438 }
632 if (GNUNET_YES == keep) 439 if (GNUNET_YES == keep)
633 GNUNET_break (GNUNET_OK == 440 GNUNET_break (GNUNET_OK ==
634 GNUNET_CONTAINER_meta_data_insert (md, plugin_name, type, 441 GNUNET_CONTAINER_meta_data_insert (ctx->md, plugin_name, type,
635 format, data_mime_type, 442 format, data_mime_type,
636 data, data_len)); 443 data, data_len));
637 return 0; 444 return 0;
@@ -659,68 +466,32 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
659 struct GNUNET_FS_BlockOptions *bo, int *do_index, 466 struct GNUNET_FS_BlockOptions *bo, int *do_index,
660 void **client_info) 467 void **client_info)
661{ 468{
662 struct FileInformationUpdateContext *context = cls; 469 struct EditPublicationDialogContext *ctx = cls;
663 char **short_fn = &context->short_fn;
664 GtkBuilder *builder = context->builder;
665 struct GNUNET_CONTAINER_MetaData *nm;
666 GtkTreeModel *tm;
667 GtkTreeIter iter; 470 GtkTreeIter iter;
668 struct GNUNET_FS_Uri *nxt; 471 struct GNUNET_FS_Uri *nxt;
669 struct GNUNET_FS_Uri *mrg; 472 struct GNUNET_FS_Uri *mrg;
670 gchar *value; 473 gchar *value;
671 guint ntype; 474 guint ntype;
672 guint nformat; 475 guint nformat;
673 GtkSpinButton *sb;
674 gchar *fn; 476 gchar *fn;
675 char *data; 477 char *data;
676 gsize data_size; 478 gsize data_size;
677 const char *mime; 479 const char *mime;
678 GFile *f; 480 GFile *f;
679 GFileInfo *finfo; 481 GFileInfo *finfo;
680 GObject *pubwindow;
681 struct EditPublicationState *state = NULL;
682 482
683 pubwindow = 483 if (!GNUNET_GTK_get_selected_anonymity_combo_level
684 gtk_builder_get_object (builder, "GNUNET_GTK_edit_publication_window"); 484 (ctx->anonymity_combo, &ctx->bo.anonymity_level))
685 state = g_object_get_data (pubwindow, PUBSTATE);
686 if (!state)
687 {
688 GNUNET_break (0);
689 return GNUNET_SYSERR; 485 return GNUNET_SYSERR;
690 } 486 ctx->bo.content_priority = gtk_spin_button_get_value (ctx->priority_spin);
487 ctx->bo.replication_level = gtk_spin_button_get_value (ctx->replication_spin);
488 *do_index = gtk_toggle_button_get_active (ctx->index_checkbutton);
489 ctx->bo.expiration_time = GNUNET_FS_GTK_get_expiration_time (ctx->year_spin);
691 490
692 if (!GNUNET_GTK_get_selected_anonymity_level 491 if (!ctx->allow_no_keywords)
693 (builder, "GNUNET_GTK_edit_publication_anonymity_combobox",
694 &bo->anonymity_level))
695 return GNUNET_SYSERR;
696 bo->content_priority =
697 gtk_spin_button_get_value (GTK_SPIN_BUTTON
698 (gtk_builder_get_object
699 (builder,
700 "GNUNET_GTK_edit_publication_priority_spin_button")));
701 bo->replication_level =
702 gtk_spin_button_get_value (GTK_SPIN_BUTTON
703 (gtk_builder_get_object
704 (builder,
705 "GNUNET_GTK_edit_publication_replication_spin_button")));
706 *do_index =
707 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
708 (gtk_builder_get_object
709 (builder,
710 "GNUNET_GTK_edit_publication_index_checkbutton")));
711 sb = GTK_SPIN_BUTTON (gtk_builder_get_object
712 (builder,
713 "GNUNET_GTK_edit_publication_expiration_year_spin_button"));
714 bo->expiration_time = GNUNET_FS_GTK_get_expiration_time (sb);
715
716 if (!context->allow_no_keywords)
717 { 492 {
718 g_free (context->root); 493 g_free (ctx->root);
719 context->root = 494 ctx->root = g_strdup (gtk_entry_get_text (ctx->root_entry));
720 g_strdup (gtk_entry_get_text
721 (GTK_ENTRY
722 (gtk_builder_get_object
723 (builder, "GNUNET_GTK_edit_publication_root_entry"))));
724 } 495 }
725 /* update URI */ 496 /* update URI */
726 if (NULL != (*uri)) 497 if (NULL != (*uri))
@@ -729,13 +500,11 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
729 nxt = NULL; 500 nxt = NULL;
730 mrg = NULL; 501 mrg = NULL;
731 502
732 tm = GTK_TREE_MODEL (gtk_builder_get_object 503 if (TRUE == gtk_tree_model_get_iter_first (GTK_TREE_MODEL (ctx->keywords_liststore), &iter))
733 (builder, "GNUNET_GTK_publication_keywords_liststore"));
734 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
735 { 504 {
736 do 505 do
737 { 506 {
738 gtk_tree_model_get (tm, &iter, 0, &value, -1); 507 gtk_tree_model_get (GTK_TREE_MODEL (ctx->keywords_liststore), &iter, 0, &value, -1);
739 nxt = GNUNET_FS_uri_ksk_create_from_args (1, (const char **) &value); 508 nxt = GNUNET_FS_uri_ksk_create_from_args (1, (const char **) &value);
740 mrg = GNUNET_FS_uri_ksk_merge (nxt, *uri); 509 mrg = GNUNET_FS_uri_ksk_merge (nxt, *uri);
741 GNUNET_FS_uri_destroy (nxt); 510 GNUNET_FS_uri_destroy (nxt);
@@ -744,36 +513,33 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
744 *uri = mrg; 513 *uri = mrg;
745 g_free (value); 514 g_free (value);
746 } 515 }
747 while (TRUE == gtk_tree_model_iter_next (tm, &iter)); 516 while (TRUE == gtk_tree_model_iter_next (GTK_TREE_MODEL (ctx->keywords_liststore), &iter));
748 } 517 }
749 518
750 /* update meta */ 519 /* update meta */
751 nm = GNUNET_CONTAINER_meta_data_create (); 520 ctx->md = GNUNET_CONTAINER_meta_data_create ();
752 context->md = nm; 521 GNUNET_CONTAINER_meta_data_iterate (meta, &preserve_meta_items, ctx);
753 GNUNET_CONTAINER_meta_data_iterate (meta, &preserve_meta_items, context);
754 522
755 GNUNET_CONTAINER_meta_data_clear (meta); 523 GNUNET_CONTAINER_meta_data_clear (meta);
756 tm = GTK_TREE_MODEL (gtk_builder_get_object 524 if (TRUE == gtk_tree_model_get_iter_first (GTK_TREE_MODEL (ctx->meta_liststore), &iter))
757 (builder, "GNUNET_GTK_publication_metadata_liststore"));
758 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
759 { 525 {
760 do 526 do
761 { 527 {
762 gtk_tree_model_get (tm, &iter, 0, &ntype, 1, &nformat, 3, &value, -1); 528 gtk_tree_model_get (GTK_TREE_MODEL (ctx->meta_liststore), &iter, 0, &ntype, 1, &nformat, 3, &value, -1);
763 if (ntype > 0) 529 if (ntype > 0)
764 GNUNET_CONTAINER_meta_data_insert (nm, "<user>", ntype, nformat, 530 GNUNET_CONTAINER_meta_data_insert (ctx->md, "<user>", ntype, nformat,
765 "text/plain", value, 531 "text/plain", value,
766 strlen (value) + 1); 532 strlen (value) + 1);
767 g_free (value); 533 g_free (value);
768 } 534 }
769 while (TRUE == gtk_tree_model_iter_next (tm, &iter)); 535 while (TRUE == gtk_tree_model_iter_next (GTK_TREE_MODEL (ctx->meta_liststore), &iter));
770 } 536 }
771 GNUNET_CONTAINER_meta_data_merge (meta, nm); 537 GNUNET_CONTAINER_meta_data_merge (meta, ctx->md);
772 if (state->preview_changed == GNUNET_YES) 538 if (ctx->preview_changed == GNUNET_YES)
773 { 539 {
774 fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER 540 fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER
775 (gtk_builder_get_object 541 (gtk_builder_get_object
776 (builder, 542 (ctx->builder,
777 "GNUNET_GTK_edit_publication_metadata_preview_file_chooser_button"))); 543 "GNUNET_GTK_edit_publication_metadata_preview_file_chooser_button")));
778 f = g_file_new_for_path (fn); 544 f = g_file_new_for_path (fn);
779 finfo = 545 finfo =
@@ -798,11 +564,11 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
798 g_object_unref (f); 564 g_object_unref (f);
799 g_free (fn); 565 g_free (fn);
800 } 566 }
801 GNUNET_CONTAINER_meta_data_destroy (nm); 567 GNUNET_CONTAINER_meta_data_destroy (ctx->md);
802 568
803 /* update short_fn */ 569 /* update short_fn */
804 GNUNET_free_non_null (*short_fn); 570 GNUNET_free_non_null (ctx->short_fn);
805 *short_fn = 571 ctx->short_fn =
806 GNUNET_CONTAINER_meta_data_get_first_by_types (meta, 572 GNUNET_CONTAINER_meta_data_get_first_by_types (meta,
807 EXTRACTOR_METATYPE_FILENAME, 573 EXTRACTOR_METATYPE_FILENAME,
808 -1); 574 -1);
@@ -813,110 +579,42 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
813 579
814void 580void
815GNUNET_GTK_edit_publication_cancel_button_clicked_cb (GtkButton * button, 581GNUNET_GTK_edit_publication_cancel_button_clicked_cb (GtkButton * button,
816 gpointer user_data) 582 struct EditPublicationDialogContext *ctx)
817{ 583{
818 GtkBuilder *builder; 584 ctx->cb (ctx->cls, ctx->do_index, ctx->short_fn,
819 GObject *pubwindow; 585 &ctx->bo, NULL, GTK_RESPONSE_CANCEL);
820 struct EditPublicationState *state = NULL; 586 gtk_widget_destroy (GTK_WIDGET (ctx->pubwindow));
821
822 builder = GTK_BUILDER (user_data);
823
824 pubwindow =
825 gtk_builder_get_object (builder, "GNUNET_GTK_edit_publication_window");
826 state = g_object_get_data (pubwindow, PUBSTATE);
827 if (!state)
828 {
829 GNUNET_break (0);
830 return;
831 }
832
833 state->cb (state->cls, state->do_index, state->short_fn,
834 &state->bo, NULL,
835 GTK_RESPONSE_CANCEL);
836 g_free (state);
837 g_object_set_data (pubwindow, PUBSTATE, NULL);
838 gtk_widget_hide (GTK_WIDGET (pubwindow));
839} 587}
840 588
841 589
842void 590void
843GNUNET_GTK_edit_publication_confirm_button_clicked_cb (GtkButton * button, 591GNUNET_GTK_edit_publication_confirm_button_clicked_cb (GtkButton * button,
844 gpointer user_data) 592 struct EditPublicationDialogContext *ctx)
845{ 593{
846 GtkBuilder *builder;
847 GObject *pubwindow;
848 struct EditPublicationState *state;
849 struct FileInformationUpdateContext ctx;
850 gint year; 594 gint year;
851 builder = GTK_BUILDER (user_data);
852 595
853 pubwindow = 596 GNUNET_FS_file_information_inspect (ctx->fip, &file_information_update, ctx);
854 gtk_builder_get_object (builder, "GNUNET_GTK_edit_publication_window"); 597 if (!GNUNET_GTK_get_selected_anonymity_combo_level (ctx->anonymity_combo,
855 state = g_object_get_data (pubwindow, PUBSTATE); 598 &ctx->bo.anonymity_level))
856 if (!state) 599 ctx->bo.content_priority = gtk_spin_button_get_value (ctx->priority_spin);
857 { 600 ctx->bo.replication_level = gtk_spin_button_get_value (ctx->replication_spin);
858 GNUNET_break (0); 601
859 return; 602 ctx->do_index = gtk_toggle_button_get_active (ctx->index_checkbutton);
860 } 603 year = gtk_spin_button_get_value (ctx->year_spin);
861 604 ctx->bo.expiration_time = GNUNET_FS_year_to_time (year);
862 ctx.builder = builder; 605 ctx->cb (ctx->cls, ctx->do_index, ctx->short_fn,
863 ctx.short_fn = state->short_fn; 606 &ctx->bo, ctx->root, GTK_RESPONSE_OK);
864 ctx.root = NULL; 607 GNUNET_free_non_null (ctx->short_fn);
865 ctx.md = NULL; 608 gtk_widget_destroy (GTK_WIDGET (ctx->pubwindow));
866 ctx.allow_no_keywords = state->allow_no_keywords;
867
868 GNUNET_FS_file_information_inspect (state->fip, &file_information_update,
869 &ctx);
870 state->short_fn = ctx.short_fn;
871 if (!GNUNET_GTK_get_selected_anonymity_level
872 (builder, "GNUNET_GTK_edit_publication_anonymity_combobox",
873 &state->bo.anonymity_level))
874 state->bo.content_priority =
875 gtk_spin_button_get_value (GTK_SPIN_BUTTON
876 (gtk_builder_get_object
877 (builder,
878 "GNUNET_GTK_edit_publication_priority_spin_button")));
879 state->bo.replication_level =
880 gtk_spin_button_get_value (GTK_SPIN_BUTTON
881 (gtk_builder_get_object
882 (builder,
883 "GNUNET_GTK_edit_publication_replication_spin_button")));
884
885 state->do_index =
886 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
887 (gtk_builder_get_object
888 (builder,
889 "GNUNET_GTK_edit_publication_index_checkbutton")));
890 year = gtk_spin_button_get_value (GTK_SPIN_BUTTON
891 (gtk_builder_get_object
892 (builder,
893 "GNUNET_GTK_edit_publication_expiration_year_spin_button")));
894 state->bo.expiration_time = GNUNET_FS_year_to_time (year);
895 state->cb (state->cls, state->do_index, state->short_fn,
896 &state->bo, ctx.root,
897 GTK_RESPONSE_OK);
898 GNUNET_free_non_null (state->short_fn);
899 GNUNET_free (state);
900 g_object_set_data (pubwindow, PUBSTATE, NULL);
901 gtk_widget_hide (GTK_WIDGET (pubwindow));
902} 609}
903 610
904 611
905gboolean 612gboolean
906GNUNET_GTK_edit_publication_window_delete_event_cb (GtkWidget * widget, 613GNUNET_GTK_edit_publication_window_delete_event_cb (GtkWidget * widget,
907 GdkEvent * event, 614 GdkEvent * event,
908 gpointer user_data) 615 struct EditPublicationDialogContext *ctx)
909{ 616{
910 GtkBuilder *builder; 617 GNUNET_GTK_edit_publication_cancel_button_clicked_cb (ctx->cancel, ctx);
911 GtkButton *button;
912
913 builder = GTK_BUILDER (user_data);
914
915 button =
916 GTK_BUTTON (gtk_builder_get_object
917 (builder, "GNUNET_GTK_edit_publication_cancel_button"));
918
919 GNUNET_GTK_edit_publication_cancel_button_clicked_cb (button, user_data);
920 return TRUE; 618 return TRUE;
921} 619}
922 620
@@ -962,162 +660,202 @@ file_information_extract (void *cls, struct GNUNET_FS_FileInformation *fi,
962 struct GNUNET_FS_BlockOptions *bo, int *do_index, 660 struct GNUNET_FS_BlockOptions *bo, int *do_index,
963 void **client_info) 661 void **client_info)
964{ 662{
965 GtkBuilder *builder = GTK_BUILDER (cls); 663 struct EditPublicationDialogContext *ctx = cls;
966 GtkImage *img;
967 GdkPixbuf *pixbuf; 664 GdkPixbuf *pixbuf;
968 int year; 665 int year;
969 GtkListStore *ls;
970
971 ls = GTK_LIST_STORE (gtk_builder_get_object
972 (builder, "GNUNET_GTK_publication_keywords_liststore"));
973 666
974 if (NULL != *uri) 667 if (NULL != *uri)
975 GNUNET_FS_uri_ksk_get_keywords (*uri, &add_keyword, ls); 668 GNUNET_FS_uri_ksk_get_keywords (*uri, &add_keyword, ctx->keywords_liststore);
976 if (NULL != meta) 669 if (NULL != meta)
977 { 670 {
978 ls = GTK_LIST_STORE (gtk_builder_get_object
979 (builder,
980 "GNUNET_GTK_publication_metadata_liststore"));
981 GNUNET_CONTAINER_meta_data_iterate (meta, 671 GNUNET_CONTAINER_meta_data_iterate (meta,
982 &GNUNET_FS_GTK_add_meta_data_to_list_store, 672 &GNUNET_FS_GTK_add_meta_data_to_list_store,
983 ls); 673 ctx->meta_liststore);
984 pixbuf = GNUNET_FS_GTK_get_thumbnail_from_meta_data (meta); 674 pixbuf = GNUNET_FS_GTK_get_thumbnail_from_meta_data (meta);
985 if (pixbuf != NULL) 675 if (pixbuf != NULL)
986 { 676 {
987 img = 677 gtk_image_set_from_pixbuf (ctx->image, pixbuf);
988 GTK_IMAGE (gtk_builder_get_object
989 (builder,
990 "GNUNET_GTK_edit_publication_metadata_preview_image"));
991 gtk_image_set_from_pixbuf (img, pixbuf);
992 } 678 }
993 } 679 }
994 year = (int) GNUNET_FS_time_to_year (bo->expiration_time); 680 year = (int) GNUNET_FS_time_to_year (ctx->bo.expiration_time);
995 gtk_spin_button_set_value (GTK_SPIN_BUTTON 681 gtk_spin_button_set_value (ctx->year_spin, year);
996 (gtk_builder_get_object 682 GNUNET_GTK_select_anonymity_combo_level (ctx->anonymity_combo,
997 (builder, 683 ctx->bo.anonymity_level);
998 "GNUNET_GTK_edit_publication_expiration_year_spin_button")), 684 gtk_spin_button_set_value (ctx->priority_spin, ctx->bo.content_priority);
999 year); 685 gtk_spin_button_set_value (ctx->replication_spin, ctx->bo.replication_level);
1000 GNUNET_GTK_select_anonymity_level (builder, 686 gtk_toggle_button_set_active (ctx->index_checkbutton, *do_index);
1001 "GNUNET_GTK_edit_publication_anonymity_combobox",
1002 bo->anonymity_level);
1003 gtk_spin_button_set_value (GTK_SPIN_BUTTON
1004 (gtk_builder_get_object
1005 (builder,
1006 "GNUNET_GTK_edit_publication_priority_spin_button")),
1007 bo->content_priority);
1008 gtk_spin_button_set_value (GTK_SPIN_BUTTON
1009 (gtk_builder_get_object
1010 (builder,
1011 "GNUNET_GTK_edit_publication_replication_spin_button")),
1012 bo->replication_level);
1013 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
1014 (gtk_builder_get_object
1015 (builder,
1016 "GNUNET_GTK_edit_publication_index_checkbutton")),
1017 *do_index);
1018 return GNUNET_SYSERR; /* only visit top-level item */ 687 return GNUNET_SYSERR; /* only visit top-level item */
1019} 688}
1020 689
1021 690
691void
692GNUNET_GTK_edit_publication_window_realize_cb (GtkWidget *widget, struct EditPublicationDialogContext *ctx)
693{
694 ctx->keywords_selection = gtk_tree_view_get_selection (ctx->keywords_treeview);
695 ctx->meta_selection = gtk_tree_view_get_selection (ctx->meta_treeview);
696
697 g_signal_connect (G_OBJECT (ctx->keywords_selection), "changed",
698 G_CALLBACK (keywords_selection_changed_cb), ctx);
699
700 g_signal_connect (G_OBJECT (ctx->meta_selection), "changed",
701 G_CALLBACK (metadata_selection_changed_cb), ctx);
702}
703
1022/** 704/**
1023 * Open the dialog to edit file information data. 705 * Open the dialog to edit file information data.
1024 * short_fn MUST be UTF-8-encoded 706 * short_fn MUST be UTF-8-encoded
1025 */ 707 */
1026void 708void
1027GNUNET_FS_GTK_edit_publish_dialog (GtkBuilder * builder, GtkWindow * parent, 709GNUNET_FS_GTK_edit_publish_dialog (GtkWindow * parent,
1028 int do_index, const char *short_fn, 710 int do_index, const char *short_fn,
1029 const struct GNUNET_FS_BlockOptions *bo, 711 const struct GNUNET_FS_BlockOptions bo,
1030 struct GNUNET_FS_FileInformation *fip, 712 struct GNUNET_FS_FileInformation *fip,
1031 gboolean allow_no_keywords, 713 gboolean allow_no_keywords,
714 GtkListStore *anon_liststore,
1032 GNUNET_FS_GTK_EditPublishDialogCallback cb, 715 GNUNET_FS_GTK_EditPublishDialogCallback cb,
1033 gpointer cls) 716 gpointer cls)
1034{ 717{
1035 GtkWidget *dialog;
1036 GObject *pubwindow;
1037 GtkEntry *entry;
1038 GtkWidget *ok;
1039 struct EditPublicationState *state;
1040 GtkListStore *pubtypes_list;
1041 GtkComboBox *pubtypes_combo;
1042 GtkTreeIter iter; 718 GtkTreeIter iter;
1043 gint code; 719 gint code;
1044 720
1045 GNUNET_FS_GTK_setup_expiration_year_adjustment (builder); 721 struct EditPublicationDialogContext *ctx;
722
723 ctx = GNUNET_malloc (sizeof (struct EditPublicationDialogContext));
724 ctx->builder = GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_edit_publication.glade", ctx);
725
726 if (ctx->builder == NULL)
727 {
728 GNUNET_free (ctx);
729 return;
730 }
731
732 ctx->pubtypes_liststore =
733 GTK_LIST_STORE (gtk_builder_get_object
734 (ctx->builder, "GNUNET_GTK_publication_types_liststore"));
735 ctx->metatypes_liststore =
736 GTK_LIST_STORE (gtk_builder_get_object
737 (ctx->builder,
738 "GNUNET_GTK_publication_metadata_types_liststore"));
739 ctx->meta_treeview = GTK_TREE_VIEW (gtk_builder_get_object
740 (ctx->builder,
741 "GNUNET_GTK_edit_publication_metadata_tree_view"));
742 ctx->meta_del_button =
743 GTK_WIDGET (gtk_builder_get_object
744 (ctx->builder, "GNUNET_GTK_edit_publication_delete_button"));
745 ctx->keywords_treeview = GTK_TREE_VIEW (gtk_builder_get_object
746 (ctx->builder,
747 "GNUNET_GTK_edit_publication_keyword_list_tree_view"));
748 ctx->keyword_del_button =
749 GTK_WIDGET (gtk_builder_get_object
750 (ctx->builder,
751 "GNUNET_GTK_edit_publication_keyword_list_del_button"));
752 ctx->meta_add_button =
753 GTK_BUTTON (gtk_builder_get_object
754 (ctx->builder, "GNUNET_GTK_edit_publication_add_button"));
755 ctx->meta_combo =
756 GTK_CELL_RENDERER_COMBO (gtk_builder_get_object
757 (ctx->builder,
758 "GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer"));
759 ctx->pubwindow =
760 gtk_builder_get_object (ctx->builder, "GNUNET_GTK_edit_publication_window");
761 ctx->keywords_liststore = GTK_LIST_STORE (gtk_builder_get_object
762 (ctx->builder, "GNUNET_GTK_publication_keywords_liststore"));
763 ctx->keyword_entry =
764 GTK_ENTRY (gtk_builder_get_object
765 (ctx->builder, "GNUNET_GTK_edit_publication_keyword_entry"));
766 ctx->ok = GTK_WIDGET (gtk_builder_get_object
767 (ctx->builder, "GNUNET_GTK_edit_publication_confirm_button"));
768 ctx->keyword_add_button =
769 GTK_WIDGET (gtk_builder_get_object
770 (ctx->builder,
771 "GNUNET_GTK_edit_publication_keyword_list_add_button"));
772 ctx->image =
773 GTK_IMAGE (gtk_builder_get_object
774 (ctx->builder,
775 "GNUNET_GTK_edit_publication_metadata_preview_image"));
776 ctx->meta_liststore = GTK_LIST_STORE (gtk_builder_get_object
777 (ctx->builder,
778 "GNUNET_GTK_publication_metadata_liststore"));
779 ctx->cancel =
780 GTK_BUTTON (gtk_builder_get_object
781 (ctx->builder, "GNUNET_GTK_edit_publication_cancel_button"));
782
783 ctx->index_label = GTK_LABEL (gtk_builder_get_object
784 (ctx->builder, "GNUNET_GTK_edit_publication_index_label"));
785 ctx->root_entry = GTK_ENTRY (gtk_builder_get_object
786 (ctx->builder, "GNUNET_GTK_edit_publication_root_entry"));
787 ctx->root_label = GTK_LABEL (gtk_builder_get_object
788 (ctx->builder, "GNUNET_GTK_edit_publication_root_label"));
789
790 ctx->pubtypes_combo =
791 GTK_COMBO_BOX (gtk_builder_get_object
792 (ctx->builder, "GNUNET_GTK_edit_publication_type_combo"));
793
794 ctx->year_spin = GTK_SPIN_BUTTON
795 (gtk_builder_get_object
796 (ctx->builder,
797 "GNUNET_GTK_edit_publication_expiration_year_spin_button"));
798 ctx->priority_spin = GTK_SPIN_BUTTON
799 (gtk_builder_get_object
800 (ctx->builder,
801 "GNUNET_GTK_edit_publication_priority_spin_button"));
802 ctx->replication_spin = GTK_SPIN_BUTTON
803 (gtk_builder_get_object
804 (ctx->builder,
805 "GNUNET_GTK_edit_publication_replication_spin_button"));
806 ctx->index_checkbutton = GTK_TOGGLE_BUTTON
807 (gtk_builder_get_object
808 (ctx->builder,
809 "GNUNET_GTK_edit_publication_index_checkbutton"));
810 ctx->anonymity_combo = GTK_COMBO_BOX (gtk_builder_get_object (ctx->builder,
811 "GNUNET_GTK_edit_publication_anonymity_combobox"));
812 gtk_combo_box_set_model (ctx->anonymity_combo, GTK_TREE_MODEL (anon_liststore));
813 ctx->anonymity_liststore = anon_liststore;
814
815 GNUNET_FS_GTK_setup_expiration_year_adjustment (ctx->builder);
1046 /* indexing does not apply to directories */ 816 /* indexing does not apply to directories */
1047 gtk_widget_set_visible (GTK_WIDGET 817 gtk_widget_set_visible (GTK_WIDGET (ctx->index_checkbutton),
1048 (gtk_builder_get_object
1049 (builder,
1050 "GNUNET_GTK_edit_publication_index_checkbutton")),
1051 !GNUNET_FS_file_information_is_directory (fip)); 818 !GNUNET_FS_file_information_is_directory (fip));
1052 gtk_widget_set_visible (GTK_WIDGET 819 gtk_widget_set_visible (GTK_WIDGET (ctx->index_label),
1053 (gtk_builder_get_object
1054 (builder, "GNUNET_GTK_edit_publication_index_label")),
1055 !GNUNET_FS_file_information_is_directory (fip)); 820 !GNUNET_FS_file_information_is_directory (fip));
1056 gtk_widget_set_visible (GTK_WIDGET 821 gtk_widget_set_visible (GTK_WIDGET (ctx->root_entry),
1057 (gtk_builder_get_object
1058 (builder, "GNUNET_GTK_edit_publication_root_entry")),
1059 !allow_no_keywords); 822 !allow_no_keywords);
1060 gtk_widget_set_visible (GTK_WIDGET 823 gtk_widget_set_visible (GTK_WIDGET (ctx->root_label),
1061 (gtk_builder_get_object
1062 (builder, "GNUNET_GTK_edit_publication_root_label")),
1063 !allow_no_keywords); 824 !allow_no_keywords);
1064 825
1065 gtk_list_store_clear (GTK_LIST_STORE 826 gtk_list_store_clear (ctx->keywords_liststore);
1066 (gtk_builder_get_object 827 gtk_list_store_clear (ctx->meta_liststore);
1067 (builder, 828
1068 "GNUNET_GTK_publication_keywords_liststore")));
1069 gtk_list_store_clear (GTK_LIST_STORE
1070 (gtk_builder_get_object
1071 (builder,
1072 "GNUNET_GTK_publication_metadata_liststore")));
1073
1074 GNUNET_FS_file_information_inspect (fip, &file_information_extract, builder);
1075 dialog =
1076 GTK_WIDGET (gtk_builder_get_object
1077 (builder, "GNUNET_GTK_edit_publication_window"));
1078 if (NULL != short_fn) 829 if (NULL != short_fn)
1079 gtk_window_set_title (GTK_WINDOW (dialog), short_fn); 830 gtk_window_set_title (GTK_WINDOW (ctx->pubwindow), short_fn);
1080 else 831 else
1081 gtk_window_set_title (GTK_WINDOW (dialog), _("<unnamed>")); 832 gtk_window_set_title (GTK_WINDOW (ctx->pubwindow), _("<unnamed>"));
1082 pubtypes_list =
1083 GTK_LIST_STORE (gtk_builder_get_object
1084 (builder, "GNUNET_GTK_publication_types_liststore"));
1085 pubtypes_combo =
1086 GTK_COMBO_BOX (gtk_builder_get_object
1087 (builder, "GNUNET_GTK_edit_publication_type_combo"));
1088 833
1089 if (gtk_combo_box_get_active_iter (pubtypes_combo, &iter)) 834 if (gtk_combo_box_get_active_iter (ctx->pubtypes_combo, &iter))
1090 { 835 {
1091 gtk_tree_model_get (GTK_TREE_MODEL (pubtypes_list), &iter, 0, &code, -1); 836 gtk_tree_model_get (GTK_TREE_MODEL (ctx->pubtypes_liststore), &iter, 0, &code, -1);
1092 change_metatypes (builder, 0); 837 change_metatypes (ctx, 0);
1093 } 838 }
1094 else 839 else
1095 gtk_combo_box_set_active (pubtypes_combo, 0); 840 gtk_combo_box_set_active (ctx->pubtypes_combo, 0);
1096 841
1097 state = GNUNET_malloc (sizeof (struct EditPublicationState)); 842 ctx->do_index = do_index;
1098 state->do_index = do_index;
1099 if (NULL != short_fn) 843 if (NULL != short_fn)
1100 state->short_fn = GNUNET_strdup (short_fn); 844 ctx->short_fn = GNUNET_strdup (short_fn);
1101 state->bo = *bo; 845 ctx->bo = bo;
1102 state->fip = fip; 846 ctx->fip = fip;
1103 state->preview_changed = GNUNET_NO; 847 ctx->preview_changed = GNUNET_NO;
1104 state->allow_no_keywords = allow_no_keywords; 848 ctx->allow_no_keywords = allow_no_keywords;
1105 state->is_directory = GNUNET_FS_file_information_is_directory (fip); 849 ctx->is_directory = GNUNET_FS_file_information_is_directory (fip);
1106 state->cb = cb; 850 ctx->cb = cb;
1107 state->cls = cls; 851 ctx->cls = cls;
1108 852
1109 entry = 853 GNUNET_FS_file_information_inspect (fip, &file_information_extract, ctx);
1110 GTK_ENTRY (gtk_builder_get_object 854
1111 (builder, "GNUNET_GTK_edit_publication_keyword_entry")); 855 gtk_entry_set_text (ctx->keyword_entry, "");
1112 gtk_entry_set_text (entry, ""); 856 gtk_widget_set_sensitive (ctx->ok, allow_no_keywords ? TRUE : FALSE);
1113 pubwindow = 857 gtk_window_set_transient_for (GTK_WINDOW (ctx->pubwindow), parent);
1114 gtk_builder_get_object (builder, "GNUNET_GTK_edit_publication_window"); 858 gtk_window_present (GTK_WINDOW (ctx->pubwindow));
1115 g_object_set_data (pubwindow, PUBSTATE, state);
1116 ok = GTK_WIDGET (gtk_builder_get_object
1117 (builder, "GNUNET_GTK_edit_publication_confirm_button"));
1118 gtk_widget_set_sensitive (ok, allow_no_keywords ? TRUE : FALSE);
1119 gtk_window_set_transient_for (GTK_WINDOW (pubwindow), parent);
1120 gtk_window_present (GTK_WINDOW (dialog));
1121} 859}
1122 860
1123 861