aboutsummaryrefslogtreecommitdiff
path: root/src/main_window_file_publish.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main_window_file_publish.c')
-rw-r--r--src/main_window_file_publish.c900
1 files changed, 900 insertions, 0 deletions
diff --git a/src/main_window_file_publish.c b/src/main_window_file_publish.c
new file mode 100644
index 00000000..cd831e41
--- /dev/null
+++ b/src/main_window_file_publish.c
@@ -0,0 +1,900 @@
1/*
2 This file is part of GNUnet
3 (C) 2005, 2006, 2010 Christian Grothoff (and other contributing authors)
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 2, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
19*/
20
21/**
22 * @file src/main_window_file_publish.c
23 * @author Christian Grothoff
24 */
25#include "common.h"
26#include "edit_publish_dialog.h"
27#include <gnunet/gnunet_util_lib.h>
28
29/**
30 * Builder used for the master publish dialog.
31 */
32static GtkBuilder *master_builder;
33
34
35/**
36 * Check if two GtkTreeIters refer to the same element.
37 *
38 * @param tm tree model of the iterators
39 * @param i1 first iterator
40 * @param i2 second iterator
41 * @return GNUNET_YES if they are equal
42 */
43static int
44gtk_tree_iter_equals (GtkTreeModel *tm,
45 GtkTreeIter *i1,
46 GtkTreeIter *i2)
47{
48 GtkTreePath *p1;
49 GtkTreePath *p2;
50 int ret;
51
52 p1 = gtk_tree_model_get_path (tm, i1);
53 p2 = gtk_tree_model_get_path (tm, i2);
54 ret = gtk_tree_path_compare (p1, p2);
55 gtk_tree_path_free (p1);
56 gtk_tree_path_free (p2);
57 return (0 == ret) ? GNUNET_YES : GNUNET_NO;
58}
59
60
61/**
62 * Update selectivity in the master dialog.
63 */
64static void
65update_selectivity ()
66{
67 GtkTreeView *tv;
68 GtkTreeModel *tm;
69 GtkTreeSelection *sel;
70 GtkTreeIter iter;
71 GtkTreeIter parent;
72 GtkTreeIter pred;
73 GtkWidget *up_button;
74 GtkWidget *down_button;
75 GtkWidget *left_button;
76 GtkWidget *right_button;
77 GtkWidget *delete_button;
78 GtkWidget *edit_button;
79 GtkWidget *execute_button;
80 int is_dir;
81 struct GNUNET_FS_FileInformation *fip;
82
83 up_button = GTK_WIDGET (gtk_builder_get_object (master_builder,
84 "GNUNET_GTK_master_publish_dialog_up_button"));
85 down_button = GTK_WIDGET (gtk_builder_get_object (master_builder,
86 "GNUNET_GTK_master_publish_dialog_down_button"));
87 left_button = GTK_WIDGET (gtk_builder_get_object (master_builder,
88 "GNUNET_GTK_master_publish_dialog_left_button"));
89 right_button = GTK_WIDGET (gtk_builder_get_object (master_builder,
90 "GNUNET_GTK_master_publish_dialog_right_button"));
91 delete_button = GTK_WIDGET (gtk_builder_get_object (master_builder,
92 "GNUNET_GTK_master_publish_dialog_delete_button"));
93 edit_button = GTK_WIDGET (gtk_builder_get_object (master_builder,
94 "GNUNET_GTK_master_publish_dialog_edit_button"));
95 execute_button = GTK_WIDGET (gtk_builder_get_object (master_builder,
96 "GNUNET_GTK_master_publish_dialog_execute_button"));
97 tv = GTK_TREE_VIEW (gtk_builder_get_object (master_builder,
98 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
99 sel = gtk_tree_view_get_selection (tv);
100 tm = gtk_tree_view_get_model (tv);
101 if (gtk_tree_model_get_iter_first (tm, &iter))
102 gtk_widget_set_sensitive (execute_button, TRUE);
103 else
104 gtk_widget_set_sensitive (execute_button, FALSE);
105 if (TRUE != gtk_tree_selection_get_selected (sel,
106 &tm,
107 &iter))
108 {
109 gtk_widget_set_sensitive (up_button, FALSE);
110 gtk_widget_set_sensitive (down_button, FALSE);
111 gtk_widget_set_sensitive (left_button, FALSE);
112 gtk_widget_set_sensitive (right_button, FALSE);
113 gtk_widget_set_sensitive (delete_button, FALSE);
114 gtk_widget_set_sensitive (edit_button, FALSE);
115 return;
116 }
117 gtk_widget_set_sensitive (delete_button, TRUE);
118 gtk_widget_set_sensitive (edit_button, TRUE);
119
120 /* now figure out which move operations are currently legal */
121 GNUNET_assert (TRUE == gtk_tree_selection_get_selected (sel, NULL, &iter));
122 if (TRUE == gtk_tree_model_iter_next (tm, &iter))
123 {
124 gtk_widget_set_sensitive (down_button, TRUE);
125 }
126 else
127 {
128 gtk_widget_set_sensitive (down_button, FALSE);
129 }
130 GNUNET_assert (TRUE == gtk_tree_selection_get_selected (sel, NULL, &iter));
131 if (TRUE == gtk_tree_model_iter_parent (tm, &parent, &iter))
132 {
133 gtk_widget_set_sensitive (left_button, TRUE);
134 GNUNET_assert (TRUE ==
135 gtk_tree_model_iter_children (tm, &pred, &parent));
136 }
137 else
138 {
139 gtk_widget_set_sensitive (left_button, FALSE);
140 GNUNET_assert (TRUE ==
141 gtk_tree_model_get_iter_first (tm, &pred));
142 }
143 /* iterate over 'next' of pred to find out if our
144 predecessor is a directory! */
145 is_dir = GNUNET_SYSERR;
146 while (GNUNET_YES != gtk_tree_iter_equals (tm, &pred, &iter))
147 {
148 gtk_tree_model_get (tm, &pred,
149 5, &fip, -1);
150 is_dir = GNUNET_FS_file_information_is_directory (fip);
151 GNUNET_assert (TRUE == gtk_tree_model_iter_next (tm, &pred));
152 }
153 if (GNUNET_YES == is_dir)
154 {
155 gtk_widget_set_sensitive (right_button, TRUE);
156 }
157 else
158 {
159 gtk_widget_set_sensitive (right_button, FALSE);
160 }
161 if (GNUNET_SYSERR != is_dir)
162 {
163 gtk_widget_set_sensitive (up_button, TRUE);
164 }
165 else
166 {
167 gtk_widget_set_sensitive (up_button, FALSE);
168 }
169}
170
171
172/**
173 * Add a file to the tree model.
174 *
175 * @param filename file to add
176 * @param iter parent entry, or NULL for top-level addition
177 */
178static void
179add_file_at_iter (const char *filename,
180 uint32_t anonymity_level,
181 uint32_t priority,
182 struct GNUNET_TIME_Relative expiration,
183 int do_index,
184 GtkTreeIter *iter)
185{
186 struct GNUNET_FS_FileInformation *fi;
187 GtkTreeRowReference *row_reference;
188 GtkTreePath *path;
189 uint64_t file_size;
190 const char *short_fn;
191 struct GNUNET_CONTAINER_MetaData *meta;
192 struct GNUNET_FS_Uri *ksk_uri;
193 GtkTreeStore *ts;
194 GtkTreeIter pos;
195 char *file_size_fancy;
196
197 if (GNUNET_OK !=
198 GNUNET_DISK_file_size (filename,
199 &file_size,
200 GNUNET_YES))
201 {
202 GNUNET_break (0);
203 return;
204 }
205 ts = GTK_TREE_STORE (gtk_builder_get_object (master_builder,
206 "GNUNET_GTK_file_sharing_publishing_tree_store"));
207
208 meta = GNUNET_CONTAINER_meta_data_create ();
209 GNUNET_FS_meta_data_extract_from_file (meta,
210 filename,
211 GNUNET_GTK_get_le_plugins());
212 GNUNET_CONTAINER_meta_data_delete (meta,
213 EXTRACTOR_METATYPE_FILENAME,
214 NULL, 0);
215 short_fn = filename;
216 while (NULL != strstr (short_fn, DIR_SEPARATOR_STR))
217 short_fn = 1 + strstr (short_fn, DIR_SEPARATOR_STR);
218 GNUNET_CONTAINER_meta_data_insert (meta,
219 "<gnunet-gtk>",
220 EXTRACTOR_METATYPE_FILENAME,
221 EXTRACTOR_METAFORMAT_UTF8,
222 "text/plain",
223 short_fn,
224 strlen(short_fn)+1);
225 ksk_uri = GNUNET_FS_uri_ksk_create_from_meta_data (meta);
226 gtk_tree_store_insert_before (ts,
227 &pos,
228 iter,
229 NULL);
230 path = gtk_tree_model_get_path (GTK_TREE_MODEL (ts),
231 &pos);
232 row_reference = gtk_tree_row_reference_new (GTK_TREE_MODEL (ts),
233 path);
234 gtk_tree_path_free (path);
235 fi = GNUNET_FS_file_information_create_from_file (GNUNET_GTK_get_fs_handle (),
236 row_reference,
237 filename,
238 ksk_uri,
239 meta,
240 do_index,
241 anonymity_level,
242 priority,
243 GNUNET_TIME_relative_to_absolute (expiration));
244 GNUNET_CONTAINER_meta_data_destroy (meta);
245 GNUNET_FS_uri_destroy (ksk_uri);
246 file_size_fancy = GNUNET_STRINGS_byte_size_fancy (file_size);
247 gtk_tree_store_set (ts, &pos,
248 0, file_size_fancy,
249 1, (gboolean) do_index,
250 2, short_fn,
251 3, (guint)anonymity_level,
252 4, (guint) priority,
253 5, fi,
254 -1);
255 GNUNET_free (file_size_fancy);
256 update_selectivity ();
257}
258
259
260
261/**
262 * Add an empty directory to the tree model.
263 * FIXME: consider opening a dialog to get
264 * anonymity, priority and expiration prior
265 * to calling this function (currently we
266 * use default values for those).
267 *
268 * @param name name for the directory
269 * @param iter parent entry, or NULL for top-level addition
270 */
271static void
272create_dir_at_iter (const char *name,
273 GtkTreeIter *iter)
274{
275 struct GNUNET_FS_FileInformation *fi;
276 GtkTreeRowReference *row_reference;
277 GtkTreePath *path;
278 struct GNUNET_CONTAINER_MetaData *meta;
279 GtkTreeStore *ts;
280 GtkTreeIter pos;
281
282 ts = GTK_TREE_STORE (gtk_builder_get_object (master_builder,
283 "GNUNET_GTK_file_sharing_publishing_tree_store"));
284 meta = GNUNET_CONTAINER_meta_data_create ();
285 GNUNET_FS_meta_data_make_directory (meta);
286 GNUNET_CONTAINER_meta_data_insert (meta,
287 "<gnunet-gtk>",
288 EXTRACTOR_METATYPE_FILENAME,
289 EXTRACTOR_METAFORMAT_UTF8,
290 "text/plain",
291 name,
292 strlen(name)+1);
293 gtk_tree_store_insert_before (ts,
294 &pos,
295 iter,
296 NULL);
297 path = gtk_tree_model_get_path (GTK_TREE_MODEL (ts),
298 &pos);
299 row_reference = gtk_tree_row_reference_new (GTK_TREE_MODEL (ts),
300 path);
301 gtk_tree_path_free (path);
302 fi = GNUNET_FS_file_information_create_empty_directory (GNUNET_GTK_get_fs_handle (),
303 row_reference,
304 NULL,
305 meta,
306 1 /* anonymity */, 1000 /* priority */,
307 GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_YEARS));
308 GNUNET_CONTAINER_meta_data_destroy (meta);
309 gtk_tree_store_set (ts, &pos,
310 0, "0",
311 1, (gboolean) GNUNET_NO,
312 2, name,
313 3, (guint) 1 /* anonymity */,
314 4, (guint) 1000 /* priority */,
315 5, fi,
316 -1);
317 update_selectivity ();
318}
319
320
321/**
322 * Add a directory to the tree model.
323 *
324 * @param filename directory name to add
325 * @param iter parent entry, or NULL for top-level addition
326 */
327static void
328add_dir_at_iter (const char *filename,
329 GtkTreeIter *iter)
330{
331 GNUNET_break (0);
332 update_selectivity ();
333}
334
335
336static void
337selection_changed_cb (GtkTreeSelection *ts,
338 gpointer user_data)
339{
340 update_selectivity ();
341}
342
343
344static void
345remove_old_entry (GtkTreeStore *ts,
346 GtkTreeIter *root)
347{
348 GtkTreeIter child;
349
350 while (TRUE == gtk_tree_model_iter_children (GTK_TREE_MODEL (ts),
351 &child, root))
352 remove_old_entry (ts, &child);
353 gtk_tree_store_remove (ts, root);
354}
355
356
357/**
358 * Move an entry in the tree.
359 */
360static void
361move_entry (GtkTreeModel *tm,
362 GtkTreeIter *old,
363 GtkTreeIter *newpos,
364 int dsel)
365{
366 struct GNUNET_FS_FileInformation *fip;
367 GtkTreeView *tv;
368 gint do_index;
369 char *short_fn;
370 guint anonymity_level;
371 guint priority;
372 char *fsf;
373 GtkTreePath *path;
374 GtkTreeSelection *sel;
375 GtkTreeIter child;
376 GtkTreeIter cnewpos;
377 GtkTreeRowReference *rr;
378 GtkTreeRowReference *rr2;
379
380 gtk_tree_model_get (tm,
381 old,
382 0, &fsf,
383 1, &do_index,
384 2, &short_fn,
385 3, &anonymity_level,
386 4, &priority,
387 5, &fip,
388 -1);
389 gtk_tree_store_set (GTK_TREE_STORE (tm), newpos,
390 0, fsf,
391 1, do_index,
392 2, short_fn,
393 3, (guint)anonymity_level,
394 4, (guint) priority,
395 5, fip,
396 -1);
397 if (dsel == GNUNET_YES)
398 {
399 tv = GTK_TREE_VIEW (gtk_builder_get_object (master_builder,
400 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
401 sel = gtk_tree_view_get_selection (tv);
402 path = gtk_tree_model_get_path (tm, newpos);
403 rr = gtk_tree_row_reference_new (tm, path);
404 gtk_tree_path_free (path);
405 }
406 else
407 {
408 rr = NULL;
409 }
410 if (TRUE == gtk_tree_model_iter_children (tm, &child, old))
411 {
412 do
413 {
414 path = gtk_tree_model_get_path (tm, &child);
415 rr2 = gtk_tree_row_reference_new (tm, path);
416 gtk_tree_path_free (path);
417 gtk_tree_store_insert_before (GTK_TREE_STORE (tm),
418 &cnewpos, newpos, NULL);
419 move_entry (tm, &child, &cnewpos, GNUNET_NO);
420 path = gtk_tree_row_reference_get_path (rr2);
421 gtk_tree_row_reference_free (rr2);
422 GNUNET_assert (TRUE == gtk_tree_model_get_iter (tm,
423 &child,
424 path));
425 gtk_tree_path_free (path);
426 }
427 while (TRUE == gtk_tree_model_iter_next (tm, &child));
428 }
429 /* FIXME: move subtree starting at old
430 into subtree starting at newpos first! */
431 g_free (short_fn);
432 g_free (fsf);
433 if (dsel == GNUNET_YES)
434 {
435 path = gtk_tree_row_reference_get_path (rr);
436 gtk_tree_row_reference_free (rr);
437 gtk_tree_view_expand_to_path (tv, path);
438 GNUNET_assert (TRUE == gtk_tree_model_get_iter (tm,
439 newpos,
440 path));
441 gtk_tree_path_free (path);
442 gtk_tree_selection_select_iter (sel,
443 newpos);
444 }
445 update_selectivity ();
446}
447
448
449void
450GNUNET_GTK_master_publish_dialog_right_button_clicked_cb (GtkWidget * dummy,
451 gpointer data)
452{
453 GtkTreeView *tv;
454 GtkTreeModel *tm;
455 GtkTreeSelection *sel;
456 GtkTreeIter iter;
457 GtkTreeIter parent;
458 GtkTreeIter pred;
459 GtkTreeIter prev;
460 GtkTreeIter pos;
461
462 tv = GTK_TREE_VIEW (gtk_builder_get_object (master_builder,
463 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
464 sel = gtk_tree_view_get_selection (tv);
465 if (TRUE != gtk_tree_selection_get_selected (sel,
466 &tm,
467 &iter))
468 {
469 GNUNET_break (0);
470 return;
471 }
472 if (TRUE == gtk_tree_model_iter_parent (tm, &parent, &iter))
473 {
474 GNUNET_assert (TRUE == gtk_tree_model_iter_children (tm, &pred, &parent));
475 }
476 else if (TRUE != gtk_tree_model_get_iter_first (tm, &pred))
477 {
478 GNUNET_break (0);
479 return;
480 }
481 /* iterate over 'next' of pred to find out who our predecessor is! */
482 memset (&prev, 0, sizeof (GtkTreeIter));
483 while (GNUNET_YES != gtk_tree_iter_equals (tm, &pred, &iter))
484 {
485 prev = pred;
486 GNUNET_assert (TRUE == gtk_tree_model_iter_next (tm, &pred));
487 }
488 gtk_tree_store_insert_before (GTK_TREE_STORE (tm),
489 &pos, &prev, NULL);
490 if (TRUE != gtk_tree_selection_get_selected (sel,
491 &tm,
492 &iter))
493 {
494 GNUNET_break (0);
495 return;
496 }
497 move_entry (tm, &iter, &pos, GNUNET_YES);
498 remove_old_entry (GTK_TREE_STORE (tm), &iter);
499}
500
501
502void
503GNUNET_GTK_master_publish_dialog_left_button_clicked_cb (GtkWidget * dummy,
504 gpointer data)
505{
506 GtkTreeView *tv;
507 GtkTreeModel *tm;
508 GtkTreeSelection *sel;
509 GtkTreeIter iter;
510 GtkTreeIter parent;
511 GtkTreeIter pos;
512
513 tv = GTK_TREE_VIEW (gtk_builder_get_object (master_builder,
514 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
515 sel = gtk_tree_view_get_selection (tv);
516 if (TRUE != gtk_tree_selection_get_selected (sel,
517 &tm,
518 &iter))
519 {
520 GNUNET_break (0);
521 return;
522 }
523 if (TRUE != gtk_tree_model_iter_parent (tm, &parent, &iter))
524 {
525 GNUNET_break (0);
526 return;
527 }
528 gtk_tree_store_insert_after (GTK_TREE_STORE (tm),
529 &pos, NULL, &parent);
530 if (TRUE != gtk_tree_selection_get_selected (sel,
531 &tm,
532 &iter))
533 {
534 GNUNET_break (0);
535 return;
536 }
537 move_entry (tm, &iter, &pos, GNUNET_YES);
538 remove_old_entry (GTK_TREE_STORE (tm), &iter);
539}
540
541
542void
543GNUNET_GTK_master_publish_dialog_up_button_clicked_cb (GtkWidget * dummy,
544 gpointer data)
545{
546 GtkTreeView *tv;
547 GtkTreeModel *tm;
548 GtkTreeSelection *sel;
549 GtkTreeIter iter;
550 GtkTreeIter parent;
551 GtkTreeIter pred;
552 GtkTreeIter prev;
553 GtkTreeIter *pprev;
554 GtkTreeIter pos;
555
556 tv = GTK_TREE_VIEW (gtk_builder_get_object (master_builder,
557 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
558 sel = gtk_tree_view_get_selection (tv);
559 if (TRUE != gtk_tree_selection_get_selected (sel,
560 &tm,
561 &iter))
562 {
563 GNUNET_break (0);
564 return;
565 }
566 if (TRUE == gtk_tree_model_iter_parent (tm, &parent, &iter))
567 {
568 GNUNET_assert (TRUE == gtk_tree_model_iter_children (tm, &pred, &parent));
569 pprev = &parent;
570 }
571 else if (TRUE == gtk_tree_model_get_iter_first (tm, &pred))
572 {
573 pprev = NULL;
574 }
575 else
576 {
577 GNUNET_break (0);
578 return;
579 }
580 /* iterate over 'next' of pred to find out who our predecessor is! */
581 while (GNUNET_YES != gtk_tree_iter_equals (tm, &pred, &iter))
582 {
583 prev = pred;
584 pprev = &prev;
585 GNUNET_assert (TRUE == gtk_tree_model_iter_next (tm, &pred));
586 }
587 gtk_tree_store_insert_before (GTK_TREE_STORE (tm),
588 &pos, NULL, pprev);
589 if (TRUE != gtk_tree_selection_get_selected (sel,
590 &tm,
591 &iter))
592 {
593 GNUNET_break (0);
594 return;
595 }
596 move_entry (tm, &iter, &pos, GNUNET_YES);
597 remove_old_entry (GTK_TREE_STORE (tm), &iter);
598}
599
600
601void
602GNUNET_GTK_master_publish_dialog_down_button_clicked_cb (GtkWidget * dummy,
603 gpointer data)
604{
605 GtkTreeView *tv;
606 GtkTreeModel *tm;
607 GtkTreeSelection *sel;
608 GtkTreeIter iter;
609 GtkTreeIter next;
610 GtkTreeIter pos;
611
612 tv = GTK_TREE_VIEW (gtk_builder_get_object (master_builder,
613 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
614 sel = gtk_tree_view_get_selection (tv);
615 if (TRUE != gtk_tree_selection_get_selected (sel,
616 &tm,
617 &iter))
618 {
619 GNUNET_break (0);
620 return;
621 }
622 if (TRUE != gtk_tree_selection_get_selected (sel,
623 &tm,
624 &next))
625 {
626 GNUNET_break (0);
627 return;
628 }
629 GNUNET_assert (TRUE == gtk_tree_model_iter_next (tm, &next));
630 gtk_tree_store_insert_after (GTK_TREE_STORE (tm),
631 &pos, NULL, &next);
632 if (TRUE != gtk_tree_selection_get_selected (sel,
633 &tm,
634 &iter))
635 {
636 GNUNET_break (0);
637 return;
638 }
639 move_entry (tm, &iter, &pos, GNUNET_YES);
640 remove_old_entry (GTK_TREE_STORE (tm), &iter);
641}
642
643
644void
645GNUNET_GTK_master_publish_dialog_new_button_clicked_cb (GtkWidget * dummy,
646 gpointer data)
647{
648 GtkTreeView *tv;
649 GtkTreeSelection *sel;
650 GtkTreeIter iter;
651
652 tv = GTK_TREE_VIEW (gtk_builder_get_object (master_builder,
653 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
654 sel = gtk_tree_view_get_selection (tv);
655 if (TRUE != gtk_tree_selection_get_selected (sel,
656 NULL,
657 &iter))
658 {
659 create_dir_at_iter ("unnamed/", NULL);
660 return;
661 }
662 create_dir_at_iter ("unnamed/", &iter);
663}
664
665
666struct ListValue
667{
668 const char *text;
669 uint64_t value;
670};
671
672
673void
674GNUNET_GTK_master_publish_dialog_add_button_clicked_cb (GtkWidget * dummy,
675 gpointer data)
676{
677 static struct ListValue list_values[] =
678 {
679 { gettext_noop ("1 year"), 1000LL * 60 * 60 * 24 * 365 },
680 { gettext_noop ("1 month"), 1000LL * 60 * 60 * 24 * 30 },
681 { gettext_noop ("1 day"), 1000LL * 60 * 60 * 24 },
682 { gettext_noop ("1 hour"), 1000LL * 60 * 60 },
683 { gettext_noop ("1 minute"), 1000LL * 60 },
684 { NULL, 0}
685 };
686 GtkWidget *ad;
687 GtkBuilder *builder;
688 char *filename;
689 uint32_t anonymity;
690 uint32_t priority;
691 struct GNUNET_TIME_Relative exp;
692 int do_index;
693 GtkComboBox *cb;
694 GtkListStore *ls;
695 GtkTreeIter iter;
696 int i;
697
698 builder = GNUNET_GTK_get_new_builder ("publish-file-dialog.glade");
699 if (builder == NULL)
700 {
701 GNUNET_break (0);
702 return;
703 }
704 ad = GTK_WIDGET (gtk_builder_get_object (builder,
705 "GNUNET_GTK_publish_file_dialog"));
706 cb = GTK_COMBO_BOX (gtk_builder_get_object (builder,
707 "GNUNET_GTK_publish_file_dialog_expiration_combo_box"));
708
709 ls = GTK_LIST_STORE (gtk_builder_get_object (builder,
710 "GNUNET_GTK_publish_file_dialog_expiration_list_store"));
711 i = 0;
712 while (list_values[i].text != NULL)
713 {
714 gtk_list_store_insert_before (ls, &iter, NULL);
715 gtk_list_store_set (ls, &iter,
716 0, gettext (list_values[i].text),
717 1, list_values[i].value,
718 -1);
719 i++;
720 }
721 if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
722 {
723 gtk_widget_destroy (ad);
724 g_object_unref (G_OBJECT (builder));
725 return;
726 }
727 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(ad));
728 anonymity = gtk_spin_button_get_value (GTK_SPIN_BUTTON (gtk_builder_get_object (builder,
729 "GNUNET_GTK_publish_file_dialog_anonymity_spin_button")));
730 priority = gtk_spin_button_get_value (GTK_SPIN_BUTTON (gtk_builder_get_object (builder,
731 "GNUNET_GTK_publish_file_dialog_priority_spin_button")));
732 do_index = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder,
733 "GNUNET_GTK_publish_file_dialog_do_index_checkbutton")));
734 gtk_combo_box_get_active_iter (cb, &iter);
735 gtk_tree_model_get (GTK_TREE_MODEL (ls), &iter, 1, &exp.value, -1);
736 add_file_at_iter (filename, anonymity,
737 priority, exp, do_index,
738 NULL);
739 gtk_widget_destroy (ad);
740 g_object_unref (G_OBJECT (builder));
741 g_free (filename);
742 update_selectivity ();
743}
744
745
746void
747GNUNET_GTK_master_publish_dialog_edit_button_clicked_cb (GtkWidget * dummy,
748 gpointer data)
749{
750 GtkTreeView *tv;
751 GtkTreeModel *tm;
752 GtkTreeSelection *sel;
753 GtkTreeIter iter;
754 int do_index;
755 guint anonymity_level;
756 guint priority;
757 char *short_fn;
758 struct GNUNET_FS_FileInformation *fip;
759
760 tv = GTK_TREE_VIEW (gtk_builder_get_object (master_builder,
761 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
762 sel = gtk_tree_view_get_selection (tv);
763 if (TRUE != gtk_tree_selection_get_selected (sel,
764 &tm,
765 &iter))
766 {
767 GNUNET_break (0);
768 return;
769 }
770 gtk_tree_model_get (tm,
771 &iter,
772 1, &do_index,
773 2, &short_fn,
774 3, &anonymity_level,
775 4, &priority,
776 5, &fip,
777 -1);
778 GNUNET_GTK_edit_publish_dialog (&do_index,
779 &short_fn,
780 &anonymity_level,
781 &priority,
782 fip);
783 gtk_tree_store_set (GTK_TREE_STORE (tm),
784 &iter,
785 1, do_index,
786 2, short_fn,
787 3, anonymity_level,
788 4, priority,
789 -1);
790 g_free (short_fn);
791}
792
793
794void
795GNUNET_GTK_master_publish_dialog_delete_button_clicked_cb (GtkWidget * dummy,
796 gpointer data)
797{
798 GtkTreeView *tv;
799 GtkTreeModel *tm;
800 GtkTreeSelection *sel;
801 GtkTreeIter iter;
802
803 tv = GTK_TREE_VIEW (gtk_builder_get_object (master_builder,
804 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
805 sel = gtk_tree_view_get_selection (tv);
806 if (TRUE != gtk_tree_selection_get_selected (sel,
807 &tm,
808 &iter))
809 {
810 GNUNET_break (0);
811 return;
812 }
813 gtk_tree_model_get (tm,
814 &iter,
815 /* FIXME */
816 -1);
817 /* FIXME: free stuff */
818 gtk_tree_store_remove (GTK_TREE_STORE (tm),
819 &iter);
820 update_selectivity ();
821}
822
823
824void
825GNUNET_GTK_master_publish_dialog_open_button_clicked_cb (GtkWidget * dummy,
826 gpointer data)
827{
828 GtkWidget *ad;
829 GtkBuilder *builder;
830 char *filename;
831
832 builder = GNUNET_GTK_get_new_builder ("publish-directory-dialog.glade");
833 if (builder == NULL)
834 {
835 GNUNET_break (0);
836 return;
837 }
838 ad = GTK_WIDGET (gtk_builder_get_object (builder,
839 "GNUNET_GTK_publish_directory_dialog"));
840 if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
841 {
842 gtk_widget_destroy (ad);
843 g_object_unref (G_OBJECT (builder));
844 return;
845 }
846 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(ad));
847 add_dir_at_iter (filename, NULL);
848 GNUNET_break (0);
849 gtk_widget_destroy (ad);
850 g_object_unref (G_OBJECT (builder));
851 g_free (filename);
852 update_selectivity ();
853}
854
855
856/**
857 */
858void
859GNUNET_GTK_main_menu_file_publish_activate_cb (GtkWidget * dummy,
860 gpointer data)
861{
862 GtkWidget *ad;
863 GtkTreeStore *ls;
864 gint ret;
865 GtkTreeView *tv;
866 GtkTreeSelection *sel;
867
868 GNUNET_assert (master_builder == NULL);
869 master_builder = GNUNET_GTK_get_new_builder ("publish_dialog.glade");
870 if (master_builder == NULL)
871 return;
872 tv = GTK_TREE_VIEW (gtk_builder_get_object (master_builder,
873 "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
874 sel = gtk_tree_view_get_selection (tv);
875 g_signal_connect(G_OBJECT(sel), "changed",
876 G_CALLBACK(selection_changed_cb), NULL);
877 ad = GTK_WIDGET (gtk_builder_get_object (master_builder,
878 "GNUNET_GTK_master_publish_dialog"));
879 ls = GTK_TREE_STORE (gtk_builder_get_object (master_builder,
880 "GNUNET_GTK_pseudonym_tree_store"));
881 /* FIXME: populate 'ls' */
882#if WTF
883 GtkTreeStore *pts;
884 pts = GTK_TREE_STORE (gtk_builder_get_object (master_builder,
885 "GNUNET_GTK_file_sharing_publishing_tree_store"));
886#endif
887 ret = gtk_dialog_run (GTK_DIALOG (ad));
888 if (ret == GTK_RESPONSE_OK)
889 {
890 /* FIXME: trigger publication! */
891 GNUNET_break (0);
892 }
893 /* FIXME: free state from 'ls' and pts */
894 gtk_widget_destroy (ad);
895 g_object_unref (G_OBJECT (master_builder));
896 master_builder = NULL;
897}
898
899
900/* end of main_window_file_publish.c */