diff options
Diffstat (limited to 'src/main_window_file_publish.c')
-rw-r--r-- | src/main_window_file_publish.c | 900 |
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 | */ | ||
32 | static 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 | */ | ||
43 | static int | ||
44 | gtk_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 | */ | ||
64 | static void | ||
65 | update_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 | */ | ||
178 | static void | ||
179 | add_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 | */ | ||
271 | static void | ||
272 | create_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 | */ | ||
327 | static void | ||
328 | add_dir_at_iter (const char *filename, | ||
329 | GtkTreeIter *iter) | ||
330 | { | ||
331 | GNUNET_break (0); | ||
332 | update_selectivity (); | ||
333 | } | ||
334 | |||
335 | |||
336 | static void | ||
337 | selection_changed_cb (GtkTreeSelection *ts, | ||
338 | gpointer user_data) | ||
339 | { | ||
340 | update_selectivity (); | ||
341 | } | ||
342 | |||
343 | |||
344 | static void | ||
345 | remove_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 | */ | ||
360 | static void | ||
361 | move_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 | |||
449 | void | ||
450 | GNUNET_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 | |||
502 | void | ||
503 | GNUNET_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 | |||
542 | void | ||
543 | GNUNET_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 | |||
601 | void | ||
602 | GNUNET_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 | |||
644 | void | ||
645 | GNUNET_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 | |||
666 | struct ListValue | ||
667 | { | ||
668 | const char *text; | ||
669 | uint64_t value; | ||
670 | }; | ||
671 | |||
672 | |||
673 | void | ||
674 | GNUNET_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 | |||
746 | void | ||
747 | GNUNET_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 | |||
794 | void | ||
795 | GNUNET_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 | |||
824 | void | ||
825 | GNUNET_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 | */ | ||
858 | void | ||
859 | GNUNET_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 */ | ||