aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2011-08-15 22:37:19 +0000
committerChristian Grothoff <christian@grothoff.org>2011-08-15 22:37:19 +0000
commit4bd2dd5f82dceecd597b5829bf43b2dda9ebb505 (patch)
treeeefec7343dcafac33c1f5bd36cef628229211741
parent91e7c712a11e09ad4849f6272fd79abe3505dec2 (diff)
downloadgnunet-gtk-4bd2dd5f82dceecd597b5829bf43b2dda9ebb505.tar.gz
gnunet-gtk-4bd2dd5f82dceecd597b5829bf43b2dda9ebb505.zip
indent
-rw-r--r--.indent.pro632
-rwxr-xr-xpre-commit8
-rw-r--r--src/fs/gnunet-fs-gtk-about.c2
-rw-r--r--src/fs/gnunet-fs-gtk-anonymity_spin_buttons.c43
-rw-r--r--src/fs/gnunet-fs-gtk-common.c116
-rw-r--r--src/fs/gnunet-fs-gtk-download.c138
-rw-r--r--src/fs/gnunet-fs-gtk-edit_publish_dialog.c788
-rw-r--r--src/fs/gnunet-fs-gtk-event_handler.c1988
-rw-r--r--src/fs/gnunet-fs-gtk-main_window_adv_pseudonym.c554
-rw-r--r--src/fs/gnunet-fs-gtk-main_window_create_pseudonym.c40
-rw-r--r--src/fs/gnunet-fs-gtk-main_window_file_download.c119
-rw-r--r--src/fs/gnunet-fs-gtk-main_window_file_publish.c1688
-rw-r--r--src/fs/gnunet-fs-gtk-main_window_file_search.c210
-rw-r--r--src/fs/gnunet-fs-gtk-main_window_open_directory.c100
-rw-r--r--src/fs/gnunet-fs-gtk-main_window_view_toggles.c21
-rw-r--r--src/fs/gnunet-fs-gtk.c134
-rw-r--r--src/lib/about.c6
-rw-r--r--src/lib/eventloop.c792
-rw-r--r--src/lib/glade.c21
-rw-r--r--src/lib/nls.c8
-rw-r--r--src/lib/os_installation.c209
-rw-r--r--src/lib/trayicon.c69
-rw-r--r--src/peerinfo/gnunet-peerinfo-gtk.c22
-rw-r--r--src/peerinfo/peerinfo.c58
-rw-r--r--src/setup/gnunet-setup-datacache-config.c64
-rw-r--r--src/setup/gnunet-setup-datacache-plugins.c36
-rw-r--r--src/setup/gnunet-setup-datastore-config.c56
-rw-r--r--src/setup/gnunet-setup-datastore-plugins.c36
-rw-r--r--src/setup/gnunet-setup-hostlist-editing.c41
-rw-r--r--src/setup/gnunet-setup-options.c2854
-rw-r--r--src/setup/gnunet-setup-transport-http.c7
-rw-r--r--src/setup/gnunet-setup-transport-https.c7
-rw-r--r--src/setup/gnunet-setup-transport-plugins.c48
-rw-r--r--src/setup/gnunet-setup-transport-tcp.c7
-rw-r--r--src/setup/gnunet-setup-transport-test.c109
-rw-r--r--src/setup/gnunet-setup-transport-udp.c7
-rw-r--r--src/setup/gnunet-setup-transport.c231
-rw-r--r--src/setup/gnunet-setup.c311
38 files changed, 5707 insertions, 5873 deletions
<
diff --git a/.indent.pro b/.indent.pro
new file mode 100644
index 00000000..7009a914
--- /dev/null
+++ b/.indent.pro
@@ -0,0 +1,632 @@
1//GNU (default) style:
2//
3//-nbad -bap -nbc -bbo -bl -bli2 -bls -ncdb -nce -cp1 -cs -di2
4//-ndj -nfc1 -nfca -hnl -i2 -ip5 -lp -pcs -nprs -psl -saf -sai
5//-saw -nsc -nsob
6//
7// -------
8// int foo;
9// char *bar;
10// bar = strdup ("whe-e-e");
11// -------
12// int foo;
13// char *bar;
14//
15// bar = strdup ("whe-e-e");
16// -------
17// Broken in indent-2.2.10
18--blank-lines-after-declarations
19//--no-blank-lines-after-declarations
20//
21// -------
22// int foo (...) {
23// ...
24// }
25// void bar (...) {
26// ...
27// }
28// -------
29// int foo (...) {
30// ...
31// }
32//
33// void bar (...) {
34// ...
35// }
36// -------
37--blank-lines-after-procedures
38//
39// -------
40// /*
41// blah
42// */
43// -------
44// /*
45// * blah
46// */
47// -------
48// WARNING: tends to turn commented-out code chunks into star-walled comment blocks
49--start-left-side-of-comments
50//
51// -------
52// if (foo) { bar }
53// -------
54// if (foo)
55// {
56// bar
57// }
58// -------
59--braces-after-if-line
60//
61// -------
62// if (foo)
63// {
64// bar
65// } else {
66// baz
67// }
68// -------
69// if (foo)
70// {
71// bar
72// }
73// else
74// {
75// baz
76// }
77// -------
78--dont-cuddle-else
79//
80// -------
81// do
82// {
83// foo
84// }
85// while (bar)
86// -------
87// do
88// {
89// foo
90// } while (bar)
91// -------
92--dont-cuddle-do-while
93//
94// -------
95// switch (foo)
96// {
97// case bar:
98// baz
99// }
100// -------
101// switch (foo)
102// {
103// case bar:
104// baz
105// }
106// -------
107--case-indentation0
108//
109// -------
110// switch (foo)
111// {
112// case bar:
113// {
114// baz
115// }
116// }
117// -------
118// switch (foo)
119// {
120// case bar:
121// {
122// baz
123// }
124// }
125// -------
126// Yes, it looks wrong. However, braces inside cases should not be used like this anyway.
127--case-brace-indentation0
128//
129// -------
130// for (i = 0; foobar(i); i++);
131// -------
132// for (i = 0; foobar(i); i++) ;
133// -------
134--space-special-semicolon
135//
136// -------
137// foo(bar)
138// -------
139// foo (bar)
140// -------
141--space-after-procedure-calls
142//
143// -------
144// (int *)foo;
145// (my_custom_type_that_was_not_passed_with_T_argument_see_below *)bar;
146// -------
147// (int *) foo;
148// (my_custom_type_that_was_not_passed_with_T_argument_see_below *)bar;
149// -------
150--space-after-cast
151//
152// -------
153// sizeof(foobar)
154// -------
155// sizeof (foobar)
156// -------
157-bs
158//
159// -------
160// for(foo;bar;baz)
161// -------
162// for (foo;bar;baz)
163// -------
164--space-after-for
165//
166// -------
167// if(foo)
168// -------
169// if (foo)
170// -------
171--space-after-if
172//
173// -------
174// while(foo)
175// -------
176// while (foo)
177// -------
178--space-after-while
179//
180// -------
181// if ( foo ( a > b ) | ( bar ( baz ) ) )
182// -------
183// if (foo (a > b) | (bar (baz)))
184// -------
185--no-space-after-parentheses
186//
187// -------
188// int a;
189// char b;
190// -------
191// int a;
192// char b;
193// -------
194--declaration-indentation0
195//
196// -------
197// int a,
198// b,
199// c;
200// -------
201// int a, b, c;
202// -------
203--no-blank-lines-after-commas
204//
205// -------
206// int foo (int bar, char *baz, long wheee, intptr_t zool);
207// -------
208// int foo (
209// int bar,
210// char *baz,
211// long wheee,
212// intptr_t zool);
213// -------
214--break-function-decl-args
215//
216// -------
217// int foo (
218// int bar,
219// char *baz,
220// long wheee,
221// intptr_t zool
222// );
223// -------
224// int foo (
225// int bar,
226// char *baz,
227// long wheee,
228// intptr_t zool);
229// -------
230--dont-break-function-decl-args-end
231//
232// -------
233// int foo (bar);
234// -------
235// int
236// foo (bar);
237// -------
238--procnames-start-lines
239//
240// -------
241// struct foo { int a; };
242// -------
243// struct foo
244// {
245// int a;
246// };
247// -------
248--braces-after-struct-decl-line
249//
250// -------
251// int foo (bar) {
252// baz
253// }
254// -------
255// int foo (bar)
256// {
257// baz
258// }
259// -------
260--braces-after-func-def-line
261//
262// -------
263// if (foo)
264// {
265// while (bar)
266// {
267// baz;
268// }
269// }
270// -------
271// if (foo)
272// {
273// while (bar)
274// {
275// baz;
276// }
277// }
278// -------
279--indent-level2
280//
281// -------
282// if (foo)
283// {
284// bar;
285// }
286// -------
287// if (foo)
288// {
289// bar;
290// }
291// -------
292--brace-indent0
293//
294// -------
295// boom = foo (bar) - baz +
296// whee (zool);
297// rules = power (mono, mwahahahahahahahaahahahahahahahahahahhahahahahaha,
298// stereo);
299// -------
300// boom = foo (bar) - baz +
301// whee (zool);
302// rules = power (mono, mwahahahahahahahaahahahahahahahahahahhahahahahaha,
303// stereo);
304// -------
305--continuation-indentation4
306//
307// -------
308// rules = power (mono, mwahahahahahahahaahahahahahahahahahahhahahahahaha,
309// stereo);
310// -------
311// rules = power (mono, mwahahahahahahahaahahahahahahahahahahhahahahahaha,
312// stereo);
313// -------
314--continue-at-parentheses
315//--dont-line-up-parentheses
316//
317// -------
318// while ((((i < 2 &&
319// k > 0) || p == 0) &&
320// q == 1) ||
321// n = 0)
322// -------
323// while ((((i < 2 &&
324// k > 0) || p == 0) &&
325// q == 1) ||
326// n = 0)
327// -------
328--paren-indentation2
329//
330// -------
331// char *
332// create_world (x, y, scale)
333// int x;
334// int y;
335// float scale;
336// {
337// ...
338// }
339// -------
340// char *
341// create_world (x, y, scale)
342// int x;
343// int y;
344// float scale;
345// {
346// ...
347// }
348// -------
349--parameter-indentation2
350//
351// -------
352// if (longlonglonglonglonglonglong
353// <tab character>short)
354// -------
355// if (longlonglonglonglonglonglong
356// short)
357// -------
358--no-tabs
359//
360// -------
361// #if WINDOWS
362// #if ZOOL
363// #define WHEE GNUNET_NO
364// #else
365// #define WHEE GNUNET_YES
366// #endif
367// #endif
368// -------
369// #if WINDOWS
370// # if ZOOL
371// # define WHEE GNUNET_NO
372// # else
373// # define WHEE GNUNET_YES
374// # endif
375// #endif
376// -------
377--preprocessor-indentation0
378//
379// -------
380// int foo (bar)
381// {
382// if (c)
383// goto end;
384// if (a > 0)
385// {
386// begin:
387// a = 0;
388// if (b != 0)
389// goto begin;
390// }
391// end:
392// return 0;
393// }
394// -------
395// int foo (bar)
396// {
397// if (c)
398// goto end;
399// if (a > 0)
400// {
401// begin:
402// a = 0;
403// if (b != 0)
404// goto begin;
405// }
406// end:
407// return 0;
408// }
409// -------
410--indent-label0
411//
412// -------
413// line-longer-than-80-chars /* some comment, not counted */
414// -------
415// 80-chars-long-line /* some comment, not counted */
416// rest-of-the-line
417// -------
418--line-length80
419//
420// -------
421// /* comment-line-longer-than-80-chars */
422// -------
423// /* 80-chars-long-comment-line
424// rest-of-the-line */
425// -------
426--comment-line-length80
427//
428// -------
429// if (mask
430// && ((mask[0] == '\0')
431// || (mask[1] == '\0'
432// && ((mask[0] == '0') || (mask[0] == '*')))))
433// -------
434// if (mask &&
435// ((mask[0] == '\0') ||
436// (mask[1] == '\0' &&
437// ((mask[0] == '0') || (mask[0] == '*')))))
438// -------
439--break-after-boolean-operator
440//
441// -------
442// if (mask
443// && ((mask[0] == '\0')
444// || (mask[1] == '\0' && ((mask[0] == '0') || (mask[0] == '*')))))
445// -------
446// if (mask /* this newline is preserved, override it with --ignore-newlines */
447// && ((mask[0] == '\0')
448// || (mask[1] == '\0' &&
449// ((mask[0] == '0') || (mask[0] == '*')))))
450// -------
451// For now just keep ignoring. After everything settles down, we might want to start putting custom newlines where it is appropriate
452// --honour-newlines
453--ignore-newlines
454//
455//
456//
457// Also add a list of typedefed types here, like this:
458// -T <typedefedtype1>
459// -T <typedefedtype2>
460// for this:
461// typedef int typedefedtype1;
462// typedef char *typedefedtype2;
463// The following is obtained by running a Python script i wrote on src subdir:
464-T GNUNET_MysqlDataProcessor
465-T GNUNET_DHT_MessageReceivedHandler
466-T DHTLOG_MESSAGE_TYPES
467-T GNUNET_MysqlDataProcessor
468-T GNUNET_DV_MessageReceivedHandler
469-T p2p_dv_MESSAGE_NeighborInfo
470-T p2p_dv_MESSAGE_Data
471-T p2p_dv_MESSAGE_Disconnect
472-T GNUNET_FS_QueueStart
473-T GNUNET_FS_QueueStop
474-T SuspendSignalFunction
475-T GNUNET_FS_TEST_UriContinuation
476-T GNUNET_FS_TreeBlockProcessor
477-T GNUNET_FS_TreeProgressCallback
478-T GSF_ConnectedPeerIterator
479-T GSF_GetMessageCallback
480-T GSF_PeerReserveCallback
481-T GSF_PendingRequestReplyHandler
482-T GSF_PendingRequestIterator
483-T GSF_LocalLookupContinuation
484-T GNUNET_ARM_Callback
485-T GNUNET_TRANSPORT_ATS_AllocationNotification
486-T GNUNET_ATS_AddressSuggestionCallback
487-T GNUNET_BLOCK_GetKeyFunction
488-T GNUNET_CHAT_JoinCallback
489-T GNUNET_CHAT_MessageCallback
490-T GNUNET_CHAT_MemberListCallback
491-T GNUNET_CHAT_MessageConfirmation
492-T GNUNET_CHAT_RoomIterator
493-T GNUNET_CLIENT_MessageHandler
494-T GNUNET_CLIENT_ShutdownTask
495-T GNUNET_FileNameCallback
496-T GNUNET_CONFIGURATION_Iterator
497-T GNUNET_CONFIGURATION_Section_Iterator
498-T GNUNET_CONNECTION_AccessCheck
499-T GNUNET_CONNECTION_Receiver
500-T GNUNET_CONNECTION_TransmitReadyNotify
501-T GNUNET_HashCodeIterator
502-T GNUNET_CONTAINER_HashMapIterator
503-T GNUNET_CONTAINER_HeapCostType
504-T GNUNET_CONTAINER_HeapIterator
505-T GNUNET_CORE_ConnectEventHandler
506-T GNUNET_CORE_PeerStatusEventHandler
507-T GNUNET_CORE_DisconnectEventHandler
508-T GNUNET_CORE_MessageCallback
509-T GNUNET_CORE_StartupCallback
510-T GNUNET_CORE_ControlContinuation
511-T GNUNET_CORE_PeerConfigurationInfoCallback
512-T GNUNET_CRYPTO_HashCompletedCallback
513-T GNUNET_DATACACHE_Iterator
514-T GNUNET_DATACACHE_DeleteNotifyCallback
515-T DiskUtilizationChange
516-T PluginDatumProcessor
517-T PluginGetRandom
518-T GNUNET_DATASTORE_ContinuationWithStatus
519-T GNUNET_DATASTORE_DatumProcessor
520-T GNUNET_DHT_GetIterator
521-T GNUNET_DHT_FindPeerProcessor
522-T GNUNET_DHT_ReplyProcessor
523-T GNUNET_DISK_DirectoryIteratorCallback
524-T GNUNET_FRAGMENT_MessageProcessor
525-T GNUNET_DEFRAGMENT_AckProcessor
526-T GNUNET_FS_KeywordIterator
527-T GNUNET_FS_ProgressCallback
528-T GNUNET_FS_FileInformationProcessor
529-T GNUNET_FS_DataReader
530-T GNUNET_FS_FileProcessor
531-T GNUNET_FS_DirectoryScanner
532-T GNUNET_FS_PublishContinuation
533-T GNUNET_FS_IndexedFileProcessor
534-T GNUNET_FS_NamespaceInfoProcessor
535-T GNUNET_FS_IdentifierProcessor
536-T GNUNET_FS_DirectoryEntryProcessor
537-T GNUNET_HELLO_GenerateAddressListCallback
538-T GNUNET_HELLO_AddressIterator
539-T GNUNET_MESH_MessageCallback
540-T GNUNET_MESH_TunnelEndHandler
541-T GNUNET_MESH_ApplicationType
542-T GNUNET_MESH_TunnelDisconnectHandler
543-T GNUNET_MESH_TunnelConnectHandler
544-T GNUNET_MESH_MessageCallback
545-T GNUNET_MESH_TunnelEndHandler
546-T GNUNET_MESH_ApplicationType
547-T GNUNET_MESH_TunnelDisconnectHandler
548-T GNUNET_MESH_TunnelConnectHandler
549-T GNUNET_NAT_AddressCallback
550-T GNUNET_NAT_ReversalCallback
551-T GNUNET_NAT_TestCallback
552-T GNUNET_NSE_Callback
553-T GNUNET_OS_NetworkInterfaceProcessor
554-T GNUNET_OS_LineProcessor
555-T GNUNET_PEERINFO_Processor
556-T GNUNET_PEER_Id
557-T GNUNET_PLUGIN_Callback
558-T GNUNET_PROGRAM_Main
559-T GNUNET_PSEUDONYM_Iterator
560-T GNUNET_RESOLVER_AddressCallback
561-T GNUNET_RESOLVER_HostnameCallback
562-T GNUNET_SCHEDULER_TaskIdentifier
563-T GNUNET_SCHEDULER_Task
564-T GNUNET_SCHEDULER_select
565-T GNUNET_SERVER_MessageCallback
566-T GNUNET_SERVER_DisconnectCallback
567-T GNUNET_SERVER_MessageTokenizerCallback
568-T GNUNET_SERVICE_Main
569-T GNUNET_SIGNAL_Handler
570-T GNUNET_STATISTICS_Iterator
571-T GNUNET_STATISTICS_Callback
572-T GNUNET_TESTING_NotifyHostkeyCreated
573-T GNUNET_TESTING_NotifyDaemonRunning
574-T GNUNET_TESTING_NotifyCompletion
575-T GNUNET_TESTING_NotifyConnections
576-T GNUNET_TESTING_NotifyConnection
577-T GNUNET_TESTING_NotifyTopology
578-T GNUNET_TESTING_STATISTICS_Iterator
579-T GNUNET_TRANSPORT_SessionEnd
580-T GNUNET_TRANSPORT_AddressNotification
581-T GNUNET_TRANSPORT_TransmitContinuation
582-T GNUNET_TRANSPORT_TransmitFunction
583-T GNUNET_TRANSPORT_DisconnectFunction
584-T GNUNET_TRANSPORT_AddressStringCallback
585-T GNUNET_TRANSPORT_AddressPrettyPrinter
586-T GNUNET_TRANSPORT_CheckAddress
587-T GNUNET_TRANSPORT_AddressToString
588-T GNUNET_TRANSPORT_ReceiveCallback
589-T GNUNET_TRANSPORT_NotifyConnect
590-T GNUNET_TRANSPORT_NotifyDisconnect
591-T GNUNET_TRANSPORT_AddressLookUpCallback
592-T GNUNET_TRANSPORT_HelloUpdateCallback
593-T GNUNET_TRANSPORT_BlacklistCallback
594-T sa_family_t
595-T SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
596-T PLIBC_SEARCH__compar_fn_t
597-T _win_comparison_fn_t
598-T PLIBC_SEARCH_ACTION
599-T PLIBC_SEARCH_VISIT
600-T PLIBC_SEARCH__action_fn_t
601-T PLIBC_SEARCH__free_fn_t
602-T MESH_TunnelNumber
603-T TransmissionContinuation
604-T GNUNET_TESTING_ConnectionProcessor
605-T SetupContinuation
606-T glp_prob
607-T glp_iocp
608-T glp_smcp
609-T GNUNET_TRANSPORT_ATS_AddressNotification
610-T GNUNET_TRANSPORT_ATS_ResultCallback
611-T GST_BlacklistTestContinuation
612-T GST_HelloCallback
613-T GST_NeighbourSendContinuation
614-T GST_NeighbourIterator
615-T GST_ValidationAddressCallback
616-T u32
617-T u16
618-T u8
619-T __le32
620-T EmailAddress
621-T SMTPMessage
622-T GNUNET_TRANSPORT_TESTING_connect_cb
623-T ieee80211_mgt_beacon_t
624-T ieee80211_mgt_auth_t
625-T u64
626-T u32
627-T u16
628-T u8
629-T uLong
630-T uLong
631-T KBlock_secret_key
632-T MyNSGetExecutablePathProto
diff --git a/pre-commit b/pre-commit
new file mode 100755
index 00000000..2fc55423
--- /dev/null
+++ b/pre-commit
@@ -0,0 +1,8 @@
1#!/bin/sh
2find src/ -name "*.c" -exec indent {} \;
3find src/ -name "*.c" -exec indent {} \;
4if test -x "`which 'dos2unix'`"
5then
6 find src/ -name "*.c" -exec dos2unix {} \;
7 find src/ -name "*.c" -exec dos2unix {} \;
8fi
diff --git a/src/fs/gnunet-fs-gtk-about.c b/src/fs/gnunet-fs-gtk-about.c
index 297ce718..4829db47 100644
--- a/src/fs/gnunet-fs-gtk-about.c
+++ b/src/fs/gnunet-fs-gtk-about.c
@@ -35,7 +35,7 @@ void
35GNUNET_GTK_main_menu_help_about_activate_cb (GtkWidget * dummy, gpointer data) 35GNUNET_GTK_main_menu_help_about_activate_cb (GtkWidget * dummy, gpointer data)
36{ 36{
37 GNUNET_GTK_display_about ("gnunet_fs_gtk_about_dialog.glade", 37 GNUNET_GTK_display_about ("gnunet_fs_gtk_about_dialog.glade",
38 "GNUNET_GKT_about_dialog"); 38 "GNUNET_GKT_about_dialog");
39} 39}
40 40
41 41
diff --git a/src/fs/gnunet-fs-gtk-anonymity_spin_buttons.c b/src/fs/gnunet-fs-gtk-anonymity_spin_buttons.c
index a8dd7b04..7a658f3f 100644
--- a/src/fs/gnunet-fs-gtk-anonymity_spin_buttons.c
+++ b/src/fs/gnunet-fs-gtk-anonymity_spin_buttons.c
@@ -32,8 +32,7 @@
32 * Spin button is changed, update its colour. 32 * Spin button is changed, update its colour.
33 */ 33 */
34void 34void
35GNUNET_GTK_anonymity_spin_button_value_changed_cb (GtkWidget *w, 35GNUNET_GTK_anonymity_spin_button_value_changed_cb (GtkWidget * w, gpointer data)
36 gpointer data)
37{ 36{
38 GtkSpinButton *spin; 37 GtkSpinButton *spin;
39 gint val; 38 gint val;
@@ -42,31 +41,31 @@ GNUNET_GTK_anonymity_spin_button_value_changed_cb (GtkWidget *w,
42 41
43 spin = GTK_SPIN_BUTTON (w); 42 spin = GTK_SPIN_BUTTON (w);
44 if (spin == NULL) 43 if (spin == NULL)
45 { 44 {
46 GNUNET_break (0); 45 GNUNET_break (0);
47 return; 46 return;
48 } 47 }
49 val = gtk_spin_button_get_value_as_int (spin); 48 val = gtk_spin_button_get_value_as_int (spin);
50 if (val == 0) 49 if (val == 0)
50 {
51 if ((TRUE == gdk_color_parse ("red", &bcolor)) &&
52 (TRUE ==
53 gdk_colormap_alloc_color (gdk_colormap_get_system (), &bcolor, FALSE,
54 TRUE)) &&
55 (TRUE == gdk_color_parse ("black", &fcolor)) &&
56 (TRUE ==
57 gdk_colormap_alloc_color (gdk_colormap_get_system (), &fcolor, FALSE,
58 TRUE)))
51 { 59 {
52 if ((TRUE == gdk_color_parse ("red", 60 gtk_widget_modify_base (w, GTK_STATE_NORMAL, &bcolor);
53 &bcolor)) && 61 gtk_widget_modify_text (w, GTK_STATE_NORMAL, &fcolor);
54 (TRUE == gdk_colormap_alloc_color (gdk_colormap_get_system (),
55 &bcolor, FALSE, TRUE)) &&
56 (TRUE == gdk_color_parse ("black",
57 &fcolor)) &&
58 (TRUE == gdk_colormap_alloc_color (gdk_colormap_get_system (),
59 &fcolor, FALSE, TRUE)))
60 {
61 gtk_widget_modify_base (w, GTK_STATE_NORMAL, &bcolor);
62 gtk_widget_modify_text (w, GTK_STATE_NORMAL, &fcolor);
63 }
64 } 62 }
63 }
65 else 64 else
66 { 65 {
67 gtk_widget_modify_base (w, GTK_STATE_NORMAL, NULL); 66 gtk_widget_modify_base (w, GTK_STATE_NORMAL, NULL);
68 gtk_widget_modify_text (w, GTK_STATE_NORMAL, NULL); 67 gtk_widget_modify_text (w, GTK_STATE_NORMAL, NULL);
69 } 68 }
70} 69}
71 70
72 71
diff --git a/src/fs/gnunet-fs-gtk-common.c b/src/fs/gnunet-fs-gtk-common.c
index 55318f01..4f7b0112 100644
--- a/src/fs/gnunet-fs-gtk-common.c
+++ b/src/fs/gnunet-fs-gtk-common.c
@@ -40,28 +40,21 @@
40 * @param data actual meta-data found 40 * @param data actual meta-data found
41 * @param data_len number of bytes in data 41 * @param data_len number of bytes in data
42 * @return 0 to continue (always) 42 * @return 0 to continue (always)
43 */ 43 */
44int 44int
45GNUNET_FS_GTK_add_meta_data_to_list_store (void *cls, 45GNUNET_FS_GTK_add_meta_data_to_list_store (void *cls, const char *plugin_name,
46 const char *plugin_name, 46 enum EXTRACTOR_MetaType type,
47 enum EXTRACTOR_MetaType type, 47 enum EXTRACTOR_MetaFormat format,
48 enum EXTRACTOR_MetaFormat format, 48 const char *data_mime_type,
49 const char *data_mime_type, 49 const char *data, size_t data_len)
50 const char *data,
51 size_t data_len)
52{ 50{
53 GtkListStore *ls = GTK_LIST_STORE (cls); 51 GtkListStore *ls = GTK_LIST_STORE (cls);
54 52
55 if ( (format == EXTRACTOR_METAFORMAT_UTF8) || 53 if ((format == EXTRACTOR_METAFORMAT_UTF8) ||
56 (format == EXTRACTOR_METAFORMAT_C_STRING) ) 54 (format == EXTRACTOR_METAFORMAT_C_STRING))
57 gtk_list_store_insert_with_values (ls, 55 gtk_list_store_insert_with_values (ls, NULL, G_MAXINT, 0, type, 1, format,
58 NULL, 56 2, EXTRACTOR_metatype_to_string (type),
59 G_MAXINT, 57 3, data, -1);
60 0, type,
61 1, format,
62 2, EXTRACTOR_metatype_to_string (type),
63 3, data,
64 -1);
65 return 0; 58 return 0;
66} 59}
67 60
@@ -70,36 +63,37 @@ GNUNET_FS_GTK_add_meta_data_to_list_store (void *cls,
70 * Convert the year from the spin button to an expiration 63 * Convert the year from the spin button to an expiration
71 * time (on midnight, January 1st of that year). 64 * time (on midnight, January 1st of that year).
72 */ 65 */
73struct GNUNET_TIME_Absolute 66struct GNUNET_TIME_Absolute
74GNUNET_FS_GTK_get_expiration_time (GtkSpinButton *spin) 67GNUNET_FS_GTK_get_expiration_time (GtkSpinButton * spin)
75{ 68{
76 struct GNUNET_TIME_Absolute ret; 69 struct GNUNET_TIME_Absolute ret;
77 int year; 70 int year;
78 71
79 year = gtk_spin_button_get_value_as_int (spin); 72 year = gtk_spin_button_get_value_as_int (spin);
80 GNUNET_assert (year >= 0); 73 GNUNET_assert (year >= 0);
81 ret = GNUNET_FS_year_to_time ( (unsigned int) year); 74 ret = GNUNET_FS_year_to_time ((unsigned int) year);
82 GNUNET_break (GNUNET_TIME_absolute_get ().abs_value < ret.abs_value); 75 GNUNET_break (GNUNET_TIME_absolute_get ().abs_value < ret.abs_value);
83 return ret; 76 return ret;
84} 77}
85 78
86 79
87void 80void
88GNUNET_FS_GTK_setup_expiration_year_adjustment (GtkBuilder *builder) 81GNUNET_FS_GTK_setup_expiration_year_adjustment (GtkBuilder * builder)
89{ 82{
90 GtkAdjustment *aj; 83 GtkAdjustment *aj;
91 unsigned int year; 84 unsigned int year;
92 85
93 year = GNUNET_FS_get_current_year (); 86 year = GNUNET_FS_get_current_year ();
94 aj = GTK_ADJUSTMENT (gtk_builder_get_object (builder, 87 aj = GTK_ADJUSTMENT (gtk_builder_get_object
95 "expiration_year_adjustment")); 88 (builder, "expiration_year_adjustment"));
96 gtk_adjustment_set_value (aj, year + 2); 89 gtk_adjustment_set_value (aj, year + 2);
97 gtk_adjustment_set_lower (aj, year + 1); 90 gtk_adjustment_set_lower (aj, year + 1);
98} 91}
99 92
100 93
101GdkPixbuf * 94GdkPixbuf *
102GNUNET_FS_GTK_get_thumbnail_from_meta_data (const struct GNUNET_CONTAINER_MetaData *meta) 95GNUNET_FS_GTK_get_thumbnail_from_meta_data (const struct
96 GNUNET_CONTAINER_MetaData *meta)
103{ 97{
104 GdkPixbuf *pixbuf; 98 GdkPixbuf *pixbuf;
105 GdkPixbufLoader *loader; 99 GdkPixbufLoader *loader;
@@ -128,55 +122,43 @@ GNUNET_FS_GTK_get_thumbnail_from_meta_data (const struct GNUNET_CONTAINER_MetaDa
128 */ 122 */
129void 123void
130GNUNET_FS_GTK_mmap_and_scan (const char *filename, 124GNUNET_FS_GTK_mmap_and_scan (const char *filename,
131 GNUNET_FS_DirectoryEntryProcessor dep, 125 GNUNET_FS_DirectoryEntryProcessor dep,
132 void *dep_cls) 126 void *dep_cls)
133{ 127{
134 struct GNUNET_DISK_FileHandle *fh; 128 struct GNUNET_DISK_FileHandle *fh;
135 struct GNUNET_DISK_MapHandle *mh; 129 struct GNUNET_DISK_MapHandle *mh;
136 uint64_t fsize; 130 uint64_t fsize;
137 void * ddata; 131 void *ddata;
138 132
139 if (GNUNET_OK != 133 if (GNUNET_OK != GNUNET_DISK_file_size (filename, &fsize, GNUNET_YES))
140 GNUNET_DISK_file_size (filename, 134 {
141 &fsize, 135 GNUNET_break (0);
142 GNUNET_YES)) 136 return;
143 { 137 }
144 GNUNET_break (0); 138 fh = GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_READ,
145 return; 139 GNUNET_DISK_PERM_NONE);
146 }
147 fh = GNUNET_DISK_file_open (filename,
148 GNUNET_DISK_OPEN_READ,
149 GNUNET_DISK_PERM_NONE);
150 if (fh == NULL) 140 if (fh == NULL)
151 { 141 {
152 GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "open", filename); 142 GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "open", filename);
153 return; 143 return;
154 } 144 }
155 ddata = GNUNET_DISK_file_map (fh, 145 ddata =
156 &mh, 146 GNUNET_DISK_file_map (fh, &mh, GNUNET_DISK_MAP_TYPE_READ, (size_t) fsize);
157 GNUNET_DISK_MAP_TYPE_READ,
158 (size_t) fsize);
159 if (ddata == NULL) 147 if (ddata == NULL)
160 { 148 {
161 GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "mmap", filename); 149 GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "mmap", filename);
162 GNUNET_break (GNUNET_OK == 150 GNUNET_break (GNUNET_OK == GNUNET_DISK_file_close (fh));
163 GNUNET_DISK_file_close (fh)); 151 return;
164 return; 152 }
165 }
166 if (GNUNET_SYSERR == 153 if (GNUNET_SYSERR ==
167 GNUNET_FS_directory_list_contents ((size_t) fsize, 154 GNUNET_FS_directory_list_contents ((size_t) fsize, ddata, 0, dep,
168 ddata, 155 dep_cls))
169 0, 156 {
170 dep, dep_cls)) 157 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
171 { 158 _("Selected file `%s' is not a GNUnet directory!\n"), filename);
172 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 159 }
173 _("Selected file `%s' is not a GNUnet directory!\n"), 160 GNUNET_break (GNUNET_OK == GNUNET_DISK_file_unmap (mh));
174 filename); 161 GNUNET_break (GNUNET_OK == GNUNET_DISK_file_close (fh));
175 }
176 GNUNET_break (GNUNET_OK ==
177 GNUNET_DISK_file_unmap (mh));
178 GNUNET_break (GNUNET_OK ==
179 GNUNET_DISK_file_close (fh));
180} 162}
181 163
182 164
diff --git a/src/fs/gnunet-fs-gtk-download.c b/src/fs/gnunet-fs-gtk-download.c
index 180a48ec..fe239e5a 100644
--- a/src/fs/gnunet-fs-gtk-download.c
+++ b/src/fs/gnunet-fs-gtk-download.c
@@ -40,58 +40,65 @@ GNUNET_FS_GTK_open_download_as_dialog (struct DownloadContext *dc)
40 struct DownloadEntry *de; 40 struct DownloadEntry *de;
41 GtkWidget *cb; 41 GtkWidget *cb;
42 42
43 builder = GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_download_as_dialog.glade"); 43 builder =
44 GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_download_as_dialog.glade");
44 if (builder == NULL) 45 if (builder == NULL)
45 { 46 {
46 if (dc->rr != NULL) 47 if (dc->rr != NULL)
47 gtk_tree_row_reference_free (dc->rr); 48 gtk_tree_row_reference_free (dc->rr);
48 GNUNET_free_non_null (dc->mime); 49 GNUNET_free_non_null (dc->mime);
49 GNUNET_free_non_null (dc->filename); 50 GNUNET_free_non_null (dc->filename);
50 GNUNET_FS_uri_destroy (dc->uri); 51 GNUNET_FS_uri_destroy (dc->uri);
51 GNUNET_free (dc); 52 GNUNET_free (dc);
52 return; 53 return;
53 } 54 }
54 cb = GTK_WIDGET (gtk_builder_get_object (builder, 55 cb = GTK_WIDGET (gtk_builder_get_object
55 "GNUNET_GTK_save_as_recursive_check_button")); 56 (builder, "GNUNET_GTK_save_as_recursive_check_button"));
56 if (GNUNET_FS_meta_data_test_for_directory (dc->meta)) 57 if (GNUNET_FS_meta_data_test_for_directory (dc->meta))
57 gtk_widget_set_sensitive (cb, TRUE); 58 gtk_widget_set_sensitive (cb, TRUE);
58 ad = GTK_WIDGET (gtk_builder_get_object (builder, 59 ad = GTK_WIDGET (gtk_builder_get_object
59 "GNUNET_GTK_save_as_dialog")); 60 (builder, "GNUNET_GTK_save_as_dialog"));
60 if (dc->filename != NULL) 61 if (dc->filename != NULL)
62 {
63 char buf[1024];
64
65 if (NULL != getcwd (buf, sizeof (buf)))
61 { 66 {
62 char buf[1024]; 67 if (strlen (buf) + strlen (dc->filename) + 2 < sizeof (buf))
63 if (NULL != getcwd (buf, sizeof(buf))) 68 {
64 { 69 strcat (buf, DIR_SEPARATOR_STR);
65 if (strlen (buf) + strlen (dc->filename) + 2 < sizeof(buf)) 70 strcat (buf, dc->filename);
66 { 71 }
67 strcat (buf, DIR_SEPARATOR_STR); 72 gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (ad), buf);
68 strcat (buf, dc->filename);
69 }
70 gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (ad),
71 buf);
72 }
73 } 73 }
74 }
74 if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad))) 75 if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
75 { 76 {
76 gtk_widget_destroy (ad); 77 gtk_widget_destroy (ad);
77 g_object_unref (G_OBJECT (builder)); 78 g_object_unref (G_OBJECT (builder));
78 if (dc->rr != NULL) 79 if (dc->rr != NULL)
79 gtk_tree_row_reference_free (dc->rr); 80 gtk_tree_row_reference_free (dc->rr);
80 GNUNET_free_non_null (dc->mime); 81 GNUNET_free_non_null (dc->mime);
81 GNUNET_free_non_null (dc->filename); 82 GNUNET_free_non_null (dc->filename);
82 GNUNET_FS_uri_destroy (dc->uri); 83 GNUNET_FS_uri_destroy (dc->uri);
83 GNUNET_free (dc); 84 GNUNET_free (dc);
84 return; 85 return;
85 } 86 }
86 GNUNET_free_non_null (dc->filename); 87 GNUNET_free_non_null (dc->filename);
87 dc->filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(ad)); 88 dc->filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
88 dc->is_recursive = (TRUE == gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cb))) ? GNUNET_YES : GNUNET_NO; 89 dc->is_recursive =
90 (TRUE ==
91 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cb))) ? GNUNET_YES :
92 GNUNET_NO;
89 fs = GNUNET_FS_GTK_get_fs_handle (); 93 fs = GNUNET_FS_GTK_get_fs_handle ();
90 opt = GNUNET_FS_DOWNLOAD_OPTION_NONE; 94 opt = GNUNET_FS_DOWNLOAD_OPTION_NONE;
91 if (dc->is_recursive) 95 if (dc->is_recursive)
92 opt |= GNUNET_FS_DOWNLOAD_OPTION_RECURSIVE; 96 opt |= GNUNET_FS_DOWNLOAD_OPTION_RECURSIVE;
93 anonymity = gtk_spin_button_get_value (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, 97 anonymity =
94 "GNUNET_GTK_save_as_dialog_anonymity_spin_button"))); 98 gtk_spin_button_get_value (GTK_SPIN_BUTTON
99 (gtk_builder_get_object
100 (builder,
101 "GNUNET_GTK_save_as_dialog_anonymity_spin_button")));
95 len = GNUNET_FS_uri_chk_get_file_size (dc->uri); 102 len = GNUNET_FS_uri_chk_get_file_size (dc->uri);
96 gtk_widget_destroy (ad); 103 gtk_widget_destroy (ad);
97 g_object_unref (G_OBJECT (builder)); 104 g_object_unref (G_OBJECT (builder));
@@ -99,38 +106,29 @@ GNUNET_FS_GTK_open_download_as_dialog (struct DownloadContext *dc)
99 de->uri = dc->uri; 106 de->uri = dc->uri;
100 de->meta = dc->meta; 107 de->meta = dc->meta;
101 if (dc->rr != NULL) 108 if (dc->rr != NULL)
102 { 109 {
103 de->rr = dc->rr; 110 de->rr = dc->rr;
104 de->ts = GTK_TREE_STORE (gtk_tree_row_reference_get_model (dc->rr)); 111 de->ts = GTK_TREE_STORE (gtk_tree_row_reference_get_model (dc->rr));
105 } 112 }
106 if (dc->sr != NULL) 113 if (dc->sr != NULL)
107 { 114 {
108 GNUNET_break (NULL != 115 GNUNET_break (NULL !=
109 GNUNET_FS_download_start_from_search (fs, 116 GNUNET_FS_download_start_from_search (fs, dc->sr,
110 dc->sr, 117 dc->filename,
111 dc->filename, 118 NULL /* tempname */ ,
112 NULL /* tempname */, 119 0 /* offset */ ,
113 0 /* offset */, 120 len, anonymity, opt,
114 len, 121 de));
115 anonymity, 122 }
116 opt,
117 de));
118 }
119 else 123 else
120 { 124 {
121 GNUNET_break (NULL != 125 GNUNET_break (NULL !=
122 GNUNET_FS_download_start (fs, 126 GNUNET_FS_download_start (fs, dc->uri, NULL /* meta */ ,
123 dc->uri, 127 dc->filename, NULL /* tempname */ ,
124 NULL /* meta */, 128 0 /* offset */ ,
125 dc->filename, 129 len, anonymity, opt, de,
126 NULL /* tempname */, 130 NULL /* parent download ctx */ ));
127 0 /* offset */, 131 }
128 len,
129 anonymity,
130 opt,
131 de,
132 NULL /* parent download ctx */));
133 }
134 GNUNET_free (dc); 132 GNUNET_free (dc);
135} 133}
136 134
diff --git a/src/fs/gnunet-fs-gtk-edit_publish_dialog.c b/src/fs/gnunet-fs-gtk-edit_publish_dialog.c
index 3e960cf4..e6cbd105 100644
--- a/src/fs/gnunet-fs-gtk-edit_publish_dialog.c
+++ b/src/fs/gnunet-fs-gtk-edit_publish_dialog.c
@@ -55,16 +55,16 @@ GNUNET_GTK_edit_file_information_keyword_list_del_button_clicked_cb ()
55 GtkTreeModel *tm; 55 GtkTreeModel *tm;
56 GtkTreeIter iter; 56 GtkTreeIter iter;
57 57
58 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder, 58 tv = GTK_TREE_VIEW (gtk_builder_get_object
59 "GNUNET_GTK_edit_file_information_keyword_list_tree_view")); 59 (builder,
60 "GNUNET_GTK_edit_file_information_keyword_list_tree_view"));
60 sel = gtk_tree_view_get_selection (tv); 61 sel = gtk_tree_view_get_selection (tv);
61 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter)) 62 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
62 { 63 {
63 GNUNET_break (0); 64 GNUNET_break (0);
64 return; 65 return;
65 } 66 }
66 gtk_list_store_remove (GTK_LIST_STORE (tm), 67 gtk_list_store_remove (GTK_LIST_STORE (tm), &iter);
67 &iter);
68} 68}
69 69
70void 70void
@@ -75,10 +75,11 @@ GNUNET_GTK_edit_file_information_keyword_list_add_button_clicked_cb ()
75 GtkListStore *ls; 75 GtkListStore *ls;
76 GtkTreeIter iter; 76 GtkTreeIter iter;
77 77
78 ls = GTK_LIST_STORE (gtk_builder_get_object (builder, 78 ls = GTK_LIST_STORE (gtk_builder_get_object
79 "GNUNET_GTK_keyword_list_store")); 79 (builder, "GNUNET_GTK_keyword_list_store"));
80 entry = GTK_ENTRY (gtk_builder_get_object (builder, 80 entry =
81 "GNUNET_GTK_edit_file_information_keyword_entry")); 81 GTK_ENTRY (gtk_builder_get_object
82 (builder, "GNUNET_GTK_edit_file_information_keyword_entry"));
82 keyword = gtk_entry_get_text (entry); 83 keyword = gtk_entry_get_text (entry);
83 if (strlen (keyword) > 0) 84 if (strlen (keyword) > 0)
84 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, keyword, -1); 85 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, keyword, -1);
@@ -93,78 +94,92 @@ GNUNET_GTK_edit_file_information_keyword_entry_changed_cb ()
93 GtkEntry *entry; 94 GtkEntry *entry;
94 GtkWidget *button; 95 GtkWidget *button;
95 96
96 button = GTK_WIDGET (gtk_builder_get_object (builder, 97 button =
97 "GNUNET_GTK_edit_file_information_keyword_list_add_button")); 98 GTK_WIDGET (gtk_builder_get_object
98 entry = GTK_ENTRY (gtk_builder_get_object (builder, 99 (builder,
99 "GNUNET_GTK_edit_file_information_keyword_entry")); 100 "GNUNET_GTK_edit_file_information_keyword_list_add_button"));
101 entry =
102 GTK_ENTRY (gtk_builder_get_object
103 (builder, "GNUNET_GTK_edit_file_information_keyword_entry"));
100 keyword = gtk_entry_get_text (entry); 104 keyword = gtk_entry_get_text (entry);
101 gtk_widget_set_sensitive (button, 105 gtk_widget_set_sensitive (button, (strlen (keyword) > 0) ? TRUE : FALSE);
102 (strlen (keyword) > 0) ? TRUE : FALSE);
103} 106}
104 107
105 108
106static void 109static void
107metadata_selection_changed_cb (GtkTreeSelection *ts, 110metadata_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
108 gpointer user_data)
109{ 111{
110 GtkTreeView *tv; 112 GtkTreeView *tv;
111 GtkTreeSelection *sel; 113 GtkTreeSelection *sel;
112 GtkWidget *button; 114 GtkWidget *button;
113 115
114 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder, 116 tv = GTK_TREE_VIEW (gtk_builder_get_object
115 "GNUNET_GTK_edit_file_information_metadata_tree_view")); 117 (builder,
118 "GNUNET_GTK_edit_file_information_metadata_tree_view"));
116 sel = gtk_tree_view_get_selection (tv); 119 sel = gtk_tree_view_get_selection (tv);
117 button = GTK_WIDGET (gtk_builder_get_object (builder, 120 button =
118 "GNUNET_GTK_edit_file_information_metadata_delete_button")); 121 GTK_WIDGET (gtk_builder_get_object
122 (builder,
123 "GNUNET_GTK_edit_file_information_metadata_delete_button"));
119 gtk_widget_set_sensitive (button, 124 gtk_widget_set_sensitive (button,
120 gtk_tree_selection_get_selected (sel, NULL, NULL)); 125 gtk_tree_selection_get_selected (sel, NULL, NULL));
121} 126}
122 127
123 128
124static void 129static void
125keyword_selection_changed_cb (GtkTreeSelection *ts, 130keyword_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
126 gpointer user_data)
127{ 131{
128 GtkTreeView *tv; 132 GtkTreeView *tv;
129 GtkTreeSelection *sel; 133 GtkTreeSelection *sel;
130 GtkWidget *button; 134 GtkWidget *button;
131 135
132 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder, 136 tv = GTK_TREE_VIEW (gtk_builder_get_object
133 "GNUNET_GTK_edit_file_information_keyword_list_tree_view")); 137 (builder,
138 "GNUNET_GTK_edit_file_information_keyword_list_tree_view"));
134 sel = gtk_tree_view_get_selection (tv); 139 sel = gtk_tree_view_get_selection (tv);
135 button = GTK_WIDGET (gtk_builder_get_object (builder, 140 button =
136 "GNUNET_GTK_edit_file_information_keyword_list_del_button")); 141 GTK_WIDGET (gtk_builder_get_object
142 (builder,
143 "GNUNET_GTK_edit_file_information_keyword_list_del_button"));
137 144
138 gtk_widget_set_sensitive (button, 145 gtk_widget_set_sensitive (button,
139 gtk_tree_selection_get_selected (sel, NULL, NULL)); 146 gtk_tree_selection_get_selected (sel, NULL, NULL));
140 button = GTK_WIDGET (gtk_builder_get_object (builder, 147 button =
141 "GNUNET_GTK_edit_file_information_keyword_list_normalize_button")); 148 GTK_WIDGET (gtk_builder_get_object
149 (builder,
150 "GNUNET_GTK_edit_file_information_keyword_list_normalize_button"));
142 gtk_widget_set_sensitive (button, 151 gtk_widget_set_sensitive (button,
143 gtk_tree_selection_get_selected (sel, NULL, NULL)); 152 gtk_tree_selection_get_selected (sel, NULL, NULL));
144} 153}
145 154
146 155
147void 156void
148GNUNET_GTK_edit_file_information_metadata_value_entry_changed_cb () 157GNUNET_GTK_edit_file_information_metadata_value_entry_changed_cb ()
149{ 158{
150 GtkTreeView *tv; 159 GtkTreeView *tv;
151 GtkTreeSelection *sel; 160 GtkTreeSelection *sel;
152 const char *value; 161 const char *value;
153 GtkEntry *entry; 162 GtkEntry *entry;
154 GtkWidget *button; 163 GtkWidget *button;
155 164
156 entry = GTK_ENTRY (gtk_builder_get_object (builder, 165 entry =
157 "GNUNET_GTK_edit_file_information_metadata_value_entry")); 166 GTK_ENTRY (gtk_builder_get_object
167 (builder,
168 "GNUNET_GTK_edit_file_information_metadata_value_entry"));
158 value = gtk_entry_get_text (entry); 169 value = gtk_entry_get_text (entry);
159 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder, 170 tv = GTK_TREE_VIEW (gtk_builder_get_object
160 "GNUNET_GTK_edit_file_information_metadata_type_tree_view")); 171 (builder,
172 "GNUNET_GTK_edit_file_information_metadata_type_tree_view"));
161 sel = gtk_tree_view_get_selection (tv); 173 sel = gtk_tree_view_get_selection (tv);
162 button = GTK_WIDGET (gtk_builder_get_object (builder, 174 button =
163 "GNUNET_GTK_edit_file_information_metadata_add_button")); 175 GTK_WIDGET (gtk_builder_get_object
176 (builder,
177 "GNUNET_GTK_edit_file_information_metadata_add_button"));
164 gtk_widget_set_sensitive (button, 178 gtk_widget_set_sensitive (button,
165 (strlen (value) > 0) 179 (strlen (value) >
166 ? gtk_tree_selection_get_selected (sel, NULL, NULL) 180 0) ? gtk_tree_selection_get_selected (sel, NULL,
167 : FALSE); 181 NULL) :
182 FALSE);
168} 183}
169 184
170 185
@@ -175,39 +190,39 @@ GNUNET_GTK_edit_file_information_keyword_entry_activate_cb ()
175} 190}
176 191
177 192
178void 193void GNUNET_GTK_edit_file_information_metadata_preview_file_chooser_button_file_set_cb (GtkFileChooserButton * widget, gpointer user_data)
179GNUNET_GTK_edit_file_information_metadata_preview_file_chooser_button_file_set_cb (GtkFileChooserButton *widget,
180 gpointer user_data)
181{ 194{
182 gchar *fn; 195 gchar *fn;
183 GtkImage *image; 196 GtkImage *image;
184 197
185 fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget)); 198 fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
186 image = GTK_IMAGE (gtk_builder_get_object (builder, 199 image =
187 "GNUNET_GTK_edit_file_information_metadata_preview_image")); 200 GTK_IMAGE (gtk_builder_get_object
201 (builder,
202 "GNUNET_GTK_edit_file_information_metadata_preview_image"));
188 gtk_image_set_from_file (image, fn); 203 gtk_image_set_from_file (image, fn);
189 preview_changed = GNUNET_YES; 204 preview_changed = GNUNET_YES;
190} 205}
191 206
192 207
193void 208void
194GNUNET_GTK_edit_file_information_metadata_delete_button_clicked_cb() 209GNUNET_GTK_edit_file_information_metadata_delete_button_clicked_cb ()
195{ 210{
196 GtkTreeView *tv; 211 GtkTreeView *tv;
197 GtkTreeSelection *sel; 212 GtkTreeSelection *sel;
198 GtkTreeModel *tm; 213 GtkTreeModel *tm;
199 GtkTreeIter iter; 214 GtkTreeIter iter;
200 215
201 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder, 216 tv = GTK_TREE_VIEW (gtk_builder_get_object
202 "GNUNET_GTK_edit_file_information_metadata_tree_view")); 217 (builder,
218 "GNUNET_GTK_edit_file_information_metadata_tree_view"));
203 sel = gtk_tree_view_get_selection (tv); 219 sel = gtk_tree_view_get_selection (tv);
204 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter)) 220 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
205 { 221 {
206 GNUNET_break (0); 222 GNUNET_break (0);
207 return; 223 return;
208 } 224 }
209 gtk_list_store_remove (GTK_LIST_STORE (tm), 225 gtk_list_store_remove (GTK_LIST_STORE (tm), &iter);
210 &iter);
211} 226}
212 227
213 228
@@ -227,70 +242,63 @@ GNUNET_GTK_edit_file_information_metadata_add_button_clicked_cb ()
227 size_t slen; 242 size_t slen;
228 char *pos; 243 char *pos;
229 244
230 entry = GTK_ENTRY (gtk_builder_get_object (builder, 245 entry =
231 "GNUNET_GTK_edit_file_information_metadata_value_entry")); 246 GTK_ENTRY (gtk_builder_get_object
247 (builder,
248 "GNUNET_GTK_edit_file_information_metadata_value_entry"));
232 value = gtk_entry_get_text (entry); 249 value = gtk_entry_get_text (entry);
233 if ((value == NULL) || (strlen (value) == 0)) 250 if ((value == NULL) || (strlen (value) == 0))
234 { 251 {
235 GNUNET_break (0); 252 GNUNET_break (0);
236 return; 253 return;
237 } 254 }
238 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder, 255 tv = GTK_TREE_VIEW (gtk_builder_get_object
239 "GNUNET_GTK_edit_file_information_metadata_type_tree_view")); 256 (builder,
257 "GNUNET_GTK_edit_file_information_metadata_type_tree_view"));
240 tm = gtk_tree_view_get_model (tv); 258 tm = gtk_tree_view_get_model (tv);
241 sel = gtk_tree_view_get_selection (tv); 259 sel = gtk_tree_view_get_selection (tv);
242 if (TRUE != gtk_tree_selection_get_selected (sel, 260 if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
243 &tm, 261 {
244 &iter)) 262 GNUNET_break (0);
263 return;
264 }
265 gtk_tree_model_get (tm, &iter, 1, &type, -1);
266 ls = GTK_LIST_STORE (gtk_builder_get_object
267 (builder, "GNUNET_GTK_meta_data_list_store"));
268 if ((type == EXTRACTOR_METATYPE_FILENAME) &&
269 (value[strlen (value) - 1] != '/') && (is_directory))
270 {
271 GNUNET_asprintf (&avalue, "%s/", value);
272 /* if user typed '\' instead of '/', change it! */
273 slen = strlen (avalue);
274 while ((slen > 1) && (avalue[slen - 2] == '\\'))
245 { 275 {
246 GNUNET_break (0); 276 avalue[slen - 2] = '/';
247 return; 277 avalue[slen - 1] = '\0';
248 } 278 slen--;
249 gtk_tree_model_get (tm,
250 &iter,
251 1, &type, -1);
252 ls = GTK_LIST_STORE (gtk_builder_get_object (builder,
253 "GNUNET_GTK_meta_data_list_store"));
254 if ( (type == EXTRACTOR_METATYPE_FILENAME) &&
255 (value[strlen(value)-1] != '/') &&
256 (is_directory) )
257 {
258 GNUNET_asprintf (&avalue,
259 "%s/",
260 value);
261 /* if user typed '\' instead of '/', change it! */
262 slen = strlen (avalue);
263 while ( (slen > 1) &&
264 (avalue[slen-2] == '\\') )
265 {
266 avalue[slen-2] = '/';
267 avalue[slen-1] = '\0';
268 slen--;
269 }
270 while (NULL != (pos = strstr (avalue, "\\")))
271 *pos = '/';
272 /* remove '../' everywhere */
273 while (NULL != (pos = strstr (avalue, "../")))
274 {
275 pos[0] = '_';
276 pos[1] = '_';
277 pos[2] = '_';
278 }
279 ivalue = avalue;
280 } 279 }
281 else 280 while (NULL != (pos = strstr (avalue, "\\")))
281 *pos = '/';
282 /* remove '../' everywhere */
283 while (NULL != (pos = strstr (avalue, "../")))
282 { 284 {
283 ivalue = value; 285 pos[0] = '_';
284 avalue = NULL; 286 pos[1] = '_';
287 pos[2] = '_';
285 } 288 }
286 289 ivalue = avalue;
287 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 290 }
288 0, type, 291 else
289 1, (guint) EXTRACTOR_METAFORMAT_UTF8, 292 {
290 2, EXTRACTOR_metatype_to_string (type), 293 ivalue = value;
291 3, ivalue, 294 avalue = NULL;
292 -1); 295 }
293 GNUNET_free_non_null (avalue); 296
297 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, type, 1,
298 (guint) EXTRACTOR_METAFORMAT_UTF8, 2,
299 EXTRACTOR_metatype_to_string (type), 3,
300 ivalue, -1);
301 GNUNET_free_non_null (avalue);
294 gtk_entry_set_text (GTK_ENTRY (entry), ""); 302 gtk_entry_set_text (GTK_ENTRY (entry), "");
295} 303}
296 304
@@ -304,19 +312,14 @@ GNUNET_GTK_edit_file_information_metadata_add_button_clicked_cb ()
304 * @return GNUNET_OK to continue to iterate 312 * @return GNUNET_OK to continue to iterate
305 */ 313 */
306static int 314static int
307add_keyword (void *cls, 315add_keyword (void *cls, const char *keyword, int is_mandatory)
308 const char *keyword,
309 int is_mandatory)
310{ 316{
311 GtkListStore *ls; 317 GtkListStore *ls;
312 GtkTreeIter iter; 318 GtkTreeIter iter;
313 319
314 ls = GTK_LIST_STORE (gtk_builder_get_object (builder, 320 ls = GTK_LIST_STORE (gtk_builder_get_object
315 "GNUNET_GTK_keyword_list_store")); 321 (builder, "GNUNET_GTK_keyword_list_store"));
316 gtk_list_store_insert_with_values (ls, &iter, 322 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, keyword, -1);
317 G_MAXINT,
318 0, keyword,
319 -1);
320 return GNUNET_OK; 323 return GNUNET_OK;
321} 324}
322 325
@@ -337,40 +340,33 @@ add_keyword (void *cls,
337 * @param data actual meta-data found 340 * @param data actual meta-data found
338 * @param data_len number of bytes in data 341 * @param data_len number of bytes in data
339 * @return 0 to continue extracting 342 * @return 0 to continue extracting
340 */ 343 */
341static int 344static int
342add_meta_item (void *cls, 345add_meta_item (void *cls, const char *plugin_name, enum EXTRACTOR_MetaType type,
343 const char *plugin_name, 346 enum EXTRACTOR_MetaFormat format, const char *data_mime_type,
344 enum EXTRACTOR_MetaType type, 347 const char *data, size_t data_len)
345 enum EXTRACTOR_MetaFormat format,
346 const char *data_mime_type,
347 const char *data,
348 size_t data_len)
349{ 348{
350 GtkListStore *ls; 349 GtkListStore *ls;
351 GtkTreeIter iter; 350 GtkTreeIter iter;
352 351
353 switch (format) 352 switch (format)
354 { 353 {
355 case EXTRACTOR_METAFORMAT_UTF8: 354 case EXTRACTOR_METAFORMAT_UTF8:
356 case EXTRACTOR_METAFORMAT_C_STRING: 355 case EXTRACTOR_METAFORMAT_C_STRING:
357 ls = GTK_LIST_STORE (gtk_builder_get_object (builder, 356 ls = GTK_LIST_STORE (gtk_builder_get_object
358 "GNUNET_GTK_meta_data_list_store")); 357 (builder, "GNUNET_GTK_meta_data_list_store"));
359 gtk_list_store_insert_with_values (ls, &iter, 358 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, (guint) type, 1,
360 G_MAXINT, 359 (guint) format, 2,
361 0, (guint) type, 360 EXTRACTOR_metatype_to_string (type), 3,
362 1, (guint) format, 361 data, -1);
363 2, EXTRACTOR_metatype_to_string (type), 362 break;
364 3, data, 363 case EXTRACTOR_METAFORMAT_UNKNOWN:
365 -1); 364 break;
366 break; 365 case EXTRACTOR_METAFORMAT_BINARY:
367 case EXTRACTOR_METAFORMAT_UNKNOWN: 366 break;
368 break; 367 default:
369 case EXTRACTOR_METAFORMAT_BINARY: 368 GNUNET_break (0);
370 break; 369 }
371 default:
372 GNUNET_break (0);
373 }
374 return 0; 370 return 0;
375} 371}
376 372
@@ -388,15 +384,13 @@ add_meta_item (void *cls,
388 * @param client_info pointer to client context set upon creation (can be modified) 384 * @param client_info pointer to client context set upon creation (can be modified)
389 * @return GNUNET_SYSERR (aborts after first call) 385 * @return GNUNET_SYSERR (aborts after first call)
390 */ 386 */
391static int 387static int
392file_information_extract (void *cls, 388file_information_extract (void *cls, struct GNUNET_FS_FileInformation *fi,
393 struct GNUNET_FS_FileInformation *fi, 389 uint64_t length,
394 uint64_t length, 390 struct GNUNET_CONTAINER_MetaData *meta,
395 struct GNUNET_CONTAINER_MetaData *meta, 391 struct GNUNET_FS_Uri **uri,
396 struct GNUNET_FS_Uri **uri, 392 struct GNUNET_FS_BlockOptions *bo, int *do_index,
397 struct GNUNET_FS_BlockOptions *bo, 393 void **client_info)
398 int *do_index,
399 void **client_info)
400{ 394{
401 GtkImage *img; 395 GtkImage *img;
402 GdkPixbuf *pixbuf; 396 GdkPixbuf *pixbuf;
@@ -407,38 +401,45 @@ file_information_extract (void *cls,
407 if (NULL != *uri) 401 if (NULL != *uri)
408 GNUNET_FS_uri_ksk_get_keywords (*uri, &add_keyword, NULL); 402 GNUNET_FS_uri_ksk_get_keywords (*uri, &add_keyword, NULL);
409 if (NULL != meta) 403 if (NULL != meta)
404 {
405 GNUNET_CONTAINER_meta_data_iterate (meta, &add_meta_item, NULL);
406 pixbuf = GNUNET_FS_GTK_get_thumbnail_from_meta_data (meta);
407 if (pixbuf != NULL)
410 { 408 {
411 GNUNET_CONTAINER_meta_data_iterate (meta, 409 img =
412 &add_meta_item, 410 GTK_IMAGE (gtk_builder_get_object
413 NULL); 411 (builder,
414 pixbuf = GNUNET_FS_GTK_get_thumbnail_from_meta_data (meta); 412 "GNUNET_GTK_edit_file_information_metadata_preview_image"));
415 if (pixbuf != NULL) 413 gtk_image_set_from_pixbuf (img, pixbuf);
416 {
417 img = GTK_IMAGE (gtk_builder_get_object (builder,
418 "GNUNET_GTK_edit_file_information_metadata_preview_image"));
419 gtk_image_set_from_pixbuf (img,
420 pixbuf);
421 }
422 } 414 }
423 tp = bo->expiration_time.abs_value / 1000; /* ms to seconds */ 415 }
416 tp = bo->expiration_time.abs_value / 1000; /* ms to seconds */
424 t = gmtime (&tp); 417 t = gmtime (&tp);
425 if (t == NULL) 418 if (t == NULL)
426 year = 0; 419 year = 0;
427 else 420 else
428 year = t->tm_year + 1900; 421 year = t->tm_year + 1900;
429 gtk_spin_button_set_value (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, 422 gtk_spin_button_set_value (GTK_SPIN_BUTTON
430 "GNUNET_GTK_edit_file_information_expiration_year_spin_button")), 423 (gtk_builder_get_object
431 year); 424 (builder,
432 gtk_spin_button_set_value (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, 425 "GNUNET_GTK_edit_file_information_expiration_year_spin_button")),
433 "GNUNET_GTK_edit_file_information_anonymity_spin_button")), 426 year);
434 bo->anonymity_level); 427 gtk_spin_button_set_value (GTK_SPIN_BUTTON
435 gtk_spin_button_set_value (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, 428 (gtk_builder_get_object
436 "GNUNET_GTK_edit_file_information_priority_spin_button")), 429 (builder,
437 bo->content_priority); 430 "GNUNET_GTK_edit_file_information_anonymity_spin_button")),
438 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, 431 bo->anonymity_level);
439 "GNUNET_GTK_edit_file_information_index_check_button")), 432 gtk_spin_button_set_value (GTK_SPIN_BUTTON
440 *do_index); 433 (gtk_builder_get_object
441 return GNUNET_SYSERR; /* only visit top-level item */ 434 (builder,
435 "GNUNET_GTK_edit_file_information_priority_spin_button")),
436 bo->content_priority);
437 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
438 (gtk_builder_get_object
439 (builder,
440 "GNUNET_GTK_edit_file_information_index_check_button")),
441 *do_index);
442 return GNUNET_SYSERR; /* only visit top-level item */
442} 443}
443 444
444 445
@@ -458,70 +459,62 @@ file_information_extract (void *cls,
458 * @param data actual meta-data found 459 * @param data actual meta-data found
459 * @param data_len number of bytes in data 460 * @param data_len number of bytes in data
460 * @return 0 to continue extracting 461 * @return 0 to continue extracting
461 */ 462 */
462static int 463static int
463preserve_meta_items (void *cls, 464preserve_meta_items (void *cls, const char *plugin_name,
464 const char *plugin_name, 465 enum EXTRACTOR_MetaType type,
465 enum EXTRACTOR_MetaType type, 466 enum EXTRACTOR_MetaFormat format,
466 enum EXTRACTOR_MetaFormat format, 467 const char *data_mime_type, const char *data,
467 const char *data_mime_type, 468 size_t data_len)
468 const char *data,
469 size_t data_len)
470{ 469{
471 struct GNUNET_CONTAINER_MetaData *md = cls; 470 struct GNUNET_CONTAINER_MetaData *md = cls;
472 GtkTreeModel *tm; 471 GtkTreeModel *tm;
473 GtkTreeIter iter; 472 GtkTreeIter iter;
474 gchar *value; 473 gchar *value;
475 guint ntype; 474 guint ntype;
476 guint nformat; 475 guint nformat;
477 int keep; 476 int keep;
478 477
479 keep = GNUNET_NO; 478 keep = GNUNET_NO;
480 switch (format) 479 switch (format)
480 {
481 case EXTRACTOR_METAFORMAT_UTF8:
482 case EXTRACTOR_METAFORMAT_C_STRING:
483 tm = GTK_TREE_MODEL (gtk_builder_get_object
484 (builder, "GNUNET_GTK_meta_data_list_store"));
485 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
481 { 486 {
482 case EXTRACTOR_METAFORMAT_UTF8: 487 do
483 case EXTRACTOR_METAFORMAT_C_STRING: 488 {
484 tm = GTK_TREE_MODEL (gtk_builder_get_object (builder, 489 gtk_tree_model_get (tm, &iter, 0, &ntype, 1, &nformat, 3, &value, -1);
485 "GNUNET_GTK_meta_data_list_store")); 490 if ((ntype == type) && (nformat == format) &&
486 if (TRUE == 491 (0 == strcmp (value, data)))
487 gtk_tree_model_get_iter_first (tm, &iter)) 492 {
488 { 493 gtk_list_store_remove (GTK_LIST_STORE (tm), &iter);
489 do 494 keep = GNUNET_YES;
490 { 495 g_free (value);
491 gtk_tree_model_get (tm, &iter, 496 break;
492 0, &ntype, 497 }
493 1, &nformat, 498 g_free (value);
494 3, &value, 499 }
495 -1); 500 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
496 if ( (ntype == type) &&
497 (nformat == format) &&
498 (0 == strcmp (value, data)) )
499 {
500 gtk_list_store_remove (GTK_LIST_STORE (tm), &iter);
501 keep = GNUNET_YES;
502 g_free (value);
503 break;
504 }
505 g_free (value);
506 }
507 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
508 }
509 break;
510 case EXTRACTOR_METAFORMAT_UNKNOWN:
511 break;
512 case EXTRACTOR_METAFORMAT_BINARY:
513 if (preview_changed == GNUNET_NO)
514 keep = GNUNET_YES;
515 break;
516 default:
517 GNUNET_break (0);
518 break;
519 } 501 }
502 break;
503 case EXTRACTOR_METAFORMAT_UNKNOWN:
504 break;
505 case EXTRACTOR_METAFORMAT_BINARY:
506 if (preview_changed == GNUNET_NO)
507 keep = GNUNET_YES;
508 break;
509 default:
510 GNUNET_break (0);
511 break;
512 }
520 if (GNUNET_YES == keep) 513 if (GNUNET_YES == keep)
521 GNUNET_break (GNUNET_OK == 514 GNUNET_break (GNUNET_OK ==
522 GNUNET_CONTAINER_meta_data_insert (md, 515 GNUNET_CONTAINER_meta_data_insert (md, plugin_name, type,
523 plugin_name, type, format, 516 format, data_mime_type,
524 data_mime_type, data, data_len)); 517 data, data_len));
525 return 0; 518 return 0;
526} 519}
527 520
@@ -539,15 +532,13 @@ preserve_meta_items (void *cls,
539 * @param client_info pointer to client context set upon creation (can be modified) 532 * @param client_info pointer to client context set upon creation (can be modified)
540 * @return GNUNET_SYSERR (aborts after first call) 533 * @return GNUNET_SYSERR (aborts after first call)
541 */ 534 */
542static int 535static int
543file_information_update (void *cls, 536file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
544 struct GNUNET_FS_FileInformation *fi, 537 uint64_t length,
545 uint64_t length, 538 struct GNUNET_CONTAINER_MetaData *meta,
546 struct GNUNET_CONTAINER_MetaData *meta, 539 struct GNUNET_FS_Uri **uri,
547 struct GNUNET_FS_Uri **uri, 540 struct GNUNET_FS_BlockOptions *bo, int *do_index,
548 struct GNUNET_FS_BlockOptions *bo, 541 void **client_info)
549 int *do_index,
550 void **client_info)
551{ 542{
552 char **short_fn = cls; 543 char **short_fn = cls;
553 struct GNUNET_CONTAINER_MetaData *nm; 544 struct GNUNET_CONTAINER_MetaData *nm;
@@ -556,7 +547,7 @@ file_information_update (void *cls,
556 struct GNUNET_FS_Uri *nxt; 547 struct GNUNET_FS_Uri *nxt;
557 struct GNUNET_FS_Uri *mrg; 548 struct GNUNET_FS_Uri *mrg;
558 gchar *value; 549 gchar *value;
559 guint ntype; 550 guint ntype;
560 guint nformat; 551 guint nformat;
561 GtkSpinButton *sb; 552 GtkSpinButton *sb;
562 gchar *fn; 553 gchar *fn;
@@ -565,15 +556,25 @@ file_information_update (void *cls,
565 const char *mime; 556 const char *mime;
566 GFile *f; 557 GFile *f;
567 GFileInfo *finfo; 558 GFileInfo *finfo;
568 559
569 bo->anonymity_level = gtk_spin_button_get_value (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, 560 bo->anonymity_level =
570 "GNUNET_GTK_edit_file_information_anonymity_spin_button"))); 561 gtk_spin_button_get_value (GTK_SPIN_BUTTON
571 bo->content_priority = gtk_spin_button_get_value (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, 562 (gtk_builder_get_object
572 "GNUNET_GTK_edit_file_information_priority_spin_button"))); 563 (builder,
573 *do_index = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, 564 "GNUNET_GTK_edit_file_information_anonymity_spin_button")));
574 "GNUNET_GTK_edit_file_information_index_check_button"))); 565 bo->content_priority =
575 sb =GTK_SPIN_BUTTON (gtk_builder_get_object (builder, 566 gtk_spin_button_get_value (GTK_SPIN_BUTTON
576 "GNUNET_GTK_edit_file_information_expiration_year_spin_button")); 567 (gtk_builder_get_object
568 (builder,
569 "GNUNET_GTK_edit_file_information_priority_spin_button")));
570 *do_index =
571 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
572 (gtk_builder_get_object
573 (builder,
574 "GNUNET_GTK_edit_file_information_index_check_button")));
575 sb = GTK_SPIN_BUTTON (gtk_builder_get_object
576 (builder,
577 "GNUNET_GTK_edit_file_information_expiration_year_spin_button"));
577 bo->expiration_time = GNUNET_FS_GTK_get_expiration_time (sb); 578 bo->expiration_time = GNUNET_FS_GTK_get_expiration_time (sb);
578 /* update URI */ 579 /* update URI */
579 if (NULL != (*uri)) 580 if (NULL != (*uri))
@@ -581,95 +582,83 @@ file_information_update (void *cls,
581 *uri = NULL; 582 *uri = NULL;
582 nxt = NULL; 583 nxt = NULL;
583 mrg = NULL; 584 mrg = NULL;
584 585
585 tm = GTK_TREE_MODEL (gtk_builder_get_object (builder, 586 tm = GTK_TREE_MODEL (gtk_builder_get_object
586 "GNUNET_GTK_keyword_list_store")); 587 (builder, "GNUNET_GTK_keyword_list_store"));
587 if (TRUE == 588 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
588 gtk_tree_model_get_iter_first (tm, &iter)) 589 {
590 do
589 { 591 {
590 do 592 gtk_tree_model_get (tm, &iter, 0, &value, -1);
591 { 593 nxt = GNUNET_FS_uri_ksk_create_from_args (1, (const char **) &value);
592 gtk_tree_model_get (tm, &iter, 594 mrg = GNUNET_FS_uri_ksk_merge (nxt, *uri);
593 0, &value, 595 GNUNET_FS_uri_destroy (nxt);
594 -1); 596 if (NULL != *uri)
595 nxt = GNUNET_FS_uri_ksk_create_from_args (1, (const char**) &value); 597 GNUNET_FS_uri_destroy (*uri);
596 mrg = GNUNET_FS_uri_ksk_merge (nxt, *uri); 598 *uri = mrg;
597 GNUNET_FS_uri_destroy (nxt); 599 g_free (value);
598 if (NULL != *uri)
599 GNUNET_FS_uri_destroy (*uri);
600 *uri = mrg;
601 g_free (value);
602 }
603 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
604 } 600 }
601 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
602 }
605 603
606 /* update meta */ 604 /* update meta */
607 nm = GNUNET_CONTAINER_meta_data_create (); 605 nm = GNUNET_CONTAINER_meta_data_create ();
608 GNUNET_CONTAINER_meta_data_iterate (meta, 606 GNUNET_CONTAINER_meta_data_iterate (meta, &preserve_meta_items, nm);
609 &preserve_meta_items,
610 nm);
611 607
612 GNUNET_CONTAINER_meta_data_clear (meta); 608 GNUNET_CONTAINER_meta_data_clear (meta);
613 tm = GTK_TREE_MODEL (gtk_builder_get_object (builder, 609 tm = GTK_TREE_MODEL (gtk_builder_get_object
614 "GNUNET_GTK_meta_data_list_store")); 610 (builder, "GNUNET_GTK_meta_data_list_store"));
615 if (TRUE == 611 if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
616 gtk_tree_model_get_iter_first (tm, &iter)) 612 {
613 do
617 { 614 {
618 do 615 gtk_tree_model_get (tm, &iter, 0, &ntype, 1, &nformat, 3, &value, -1);
619 { 616 GNUNET_CONTAINER_meta_data_insert (nm, "<user>", ntype, nformat,
620 gtk_tree_model_get (tm, &iter, 617 "text/plain", value,
621 0, &ntype, 618 strlen (value) + 1);
622 1, &nformat, 619 g_free (value);
623 3, &value,
624 -1);
625 GNUNET_CONTAINER_meta_data_insert (nm,
626 "<user>",
627 ntype,
628 nformat,
629 "text/plain",
630 value,
631 strlen (value)+1);
632 g_free (value);
633 }
634 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
635 } 620 }
621 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
622 }
636 GNUNET_CONTAINER_meta_data_merge (meta, nm); 623 GNUNET_CONTAINER_meta_data_merge (meta, nm);
637 if (preview_changed == GNUNET_YES) 624 if (preview_changed == GNUNET_YES)
625 {
626 fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER
627 (gtk_builder_get_object
628 (builder,
629 "GNUNET_GTK_edit_file_information_metadata_preview_file_chooser_button")));
630 f = g_file_new_for_path (fn);
631 finfo =
632 g_file_query_info (f, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, 0, NULL,
633 NULL);
634 if (FALSE == g_file_load_contents (f, NULL, &data, &data_size, NULL, NULL))
638 { 635 {
639 fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (gtk_builder_get_object (builder, 636 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
640 "GNUNET_GTK_edit_file_information_metadata_preview_file_chooser_button"))); 637 _("Could not load preview `%s' into memory\n"), fn);
641 f = g_file_new_for_path (fn);
642 finfo = g_file_query_info (f, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, 0, NULL, NULL);
643 if (FALSE == g_file_load_contents (f, NULL, &data, &data_size, NULL, NULL))
644 {
645 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
646 _("Could not load preview `%s' into memory\n"),
647 fn);
648 }
649 else
650 {
651 mime = g_file_info_get_attribute_string (finfo,
652 G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE);
653 GNUNET_CONTAINER_meta_data_insert (meta,
654 "<user>",
655 EXTRACTOR_METATYPE_THUMBNAIL,
656 EXTRACTOR_METAFORMAT_BINARY,
657 mime,
658 data,
659 data_size);
660 }
661 g_object_unref (finfo);
662 g_object_unref (f);
663 } 638 }
639 else
640 {
641 mime =
642 g_file_info_get_attribute_string (finfo,
643 G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE);
644 GNUNET_CONTAINER_meta_data_insert (meta, "<user>",
645 EXTRACTOR_METATYPE_THUMBNAIL,
646 EXTRACTOR_METAFORMAT_BINARY, mime,
647 data, data_size);
648 }
649 g_object_unref (finfo);
650 g_object_unref (f);
651 }
664 GNUNET_CONTAINER_meta_data_destroy (nm); 652 GNUNET_CONTAINER_meta_data_destroy (nm);
665 653
666 /* update short_fn */ 654 /* update short_fn */
667 GNUNET_free_non_null (*short_fn); 655 GNUNET_free_non_null (*short_fn);
668 *short_fn = GNUNET_CONTAINER_meta_data_get_first_by_types (meta, 656 *short_fn =
669 EXTRACTOR_METATYPE_FILENAME, 657 GNUNET_CONTAINER_meta_data_get_first_by_types (meta,
670 -1); 658 EXTRACTOR_METATYPE_FILENAME,
659 -1);
671 /* FIXME: update expiration time? (not yet in dialog!) */ 660 /* FIXME: update expiration time? (not yet in dialog!) */
672 return GNUNET_SYSERR; /* only visit top-level item */ 661 return GNUNET_SYSERR; /* only visit top-level item */
673} 662}
674 663
675 664
@@ -677,11 +666,9 @@ file_information_update (void *cls,
677 * Open the dialog to edit file information data. 666 * Open the dialog to edit file information data.
678 */ 667 */
679void 668void
680GNUNET_FS_GTK_edit_publish_dialog (int *do_index, 669GNUNET_FS_GTK_edit_publish_dialog (int *do_index, char **short_fn,
681 char **short_fn, 670 guint * anonymity_level, guint * priority,
682 guint *anonymity_level, 671 struct GNUNET_FS_FileInformation *fip)
683 guint *priority,
684 struct GNUNET_FS_FileInformation *fip)
685{ 672{
686 GtkWidget *ad; 673 GtkWidget *ad;
687 GtkListStore *ls; 674 GtkListStore *ls;
@@ -692,77 +679,92 @@ GNUNET_FS_GTK_edit_publish_dialog (int *do_index,
692 GtkTreeSelection *sel; 679 GtkTreeSelection *sel;
693 680
694 GNUNET_assert (builder == NULL); 681 GNUNET_assert (builder == NULL);
695 builder = GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_publish_edit_dialog.glade"); 682 builder =
683 GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_publish_edit_dialog.glade");
696 if (builder == NULL) 684 if (builder == NULL)
697 { 685 {
698 GNUNET_break (0); 686 GNUNET_break (0);
699 return; 687 return;
700 } 688 }
701 preview_changed = GNUNET_NO; 689 preview_changed = GNUNET_NO;
702 GNUNET_FS_GTK_setup_expiration_year_adjustment (builder); 690 GNUNET_FS_GTK_setup_expiration_year_adjustment (builder);
703 if (GNUNET_FS_file_information_is_directory (fip)) 691 if (GNUNET_FS_file_information_is_directory (fip))
704 { 692 {
705 /* indexing does not apply to directories */ 693 /* indexing does not apply to directories */
706 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, 694 gtk_widget_hide (GTK_WIDGET
707 "GNUNET_GTK_edit_file_information_index_check_button"))); 695 (gtk_builder_get_object
708 gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, 696 (builder,
709 "GNUNET_GTK_edit_file_information_index_label"))); 697 "GNUNET_GTK_edit_file_information_index_check_button")));
710 698 gtk_widget_hide (GTK_WIDGET
711 } 699 (gtk_builder_get_object
712 700 (builder,
713 ad = GTK_WIDGET (gtk_builder_get_object (builder, 701 "GNUNET_GTK_edit_file_information_index_label")));
714 "GNUNET_GTK_edit_file_information_dialog")); 702
715 ls = GTK_LIST_STORE (gtk_builder_get_object (builder, 703 }
716 "GNUNET_GTK_metatype_list_store")); 704
705 ad = GTK_WIDGET (gtk_builder_get_object
706 (builder, "GNUNET_GTK_edit_file_information_dialog"));
707 ls = GTK_LIST_STORE (gtk_builder_get_object
708 (builder, "GNUNET_GTK_metatype_list_store"));
717 max_type = EXTRACTOR_metatype_get_max (); 709 max_type = EXTRACTOR_metatype_get_max ();
718 type = 1; 710 type = 1;
719 while (type < max_type - 1) 711 while (type < max_type - 1)
720 { 712 {
721 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 713 gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0,
722 0, EXTRACTOR_metatype_to_string (type), 714 EXTRACTOR_metatype_to_string (type), 1,
723 1, type, 715 type, 2,
724 2, EXTRACTOR_metatype_to_description (type), 716 EXTRACTOR_metatype_to_description (type),
725 -1); 717 -1);
726 type++; 718 type++;
727 } 719 }
728 720
729 GNUNET_FS_file_information_inspect (fip, 721 GNUNET_FS_file_information_inspect (fip, &file_information_extract, NULL);
730 &file_information_extract, 722 tv = GTK_TREE_VIEW (gtk_builder_get_object
731 NULL); 723 (builder,
732 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder, 724 "GNUNET_GTK_edit_file_information_metadata_type_tree_view"));
733 "GNUNET_GTK_edit_file_information_metadata_type_tree_view"));
734 sel = gtk_tree_view_get_selection (tv); 725 sel = gtk_tree_view_get_selection (tv);
735 g_signal_connect(G_OBJECT(sel), "changed", 726 g_signal_connect (G_OBJECT (sel), "changed",
736 G_CALLBACK(GNUNET_GTK_edit_file_information_metadata_value_entry_changed_cb), NULL); 727 G_CALLBACK
737 728 (GNUNET_GTK_edit_file_information_metadata_value_entry_changed_cb),
738 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder, 729 NULL);
739 "GNUNET_GTK_edit_file_information_metadata_tree_view")); 730
731 tv = GTK_TREE_VIEW (gtk_builder_get_object
732 (builder,
733 "GNUNET_GTK_edit_file_information_metadata_tree_view"));
740 sel = gtk_tree_view_get_selection (tv); 734 sel = gtk_tree_view_get_selection (tv);
741 g_signal_connect(G_OBJECT(sel), "changed", 735 g_signal_connect (G_OBJECT (sel), "changed",
742 G_CALLBACK(metadata_selection_changed_cb), NULL); 736 G_CALLBACK (metadata_selection_changed_cb), NULL);
743 737
744 tv = GTK_TREE_VIEW (gtk_builder_get_object (builder, 738 tv = GTK_TREE_VIEW (gtk_builder_get_object
745 "GNUNET_GTK_edit_file_information_keyword_list_tree_view")); 739 (builder,
740 "GNUNET_GTK_edit_file_information_keyword_list_tree_view"));
746 sel = gtk_tree_view_get_selection (tv); 741 sel = gtk_tree_view_get_selection (tv);
747 g_signal_connect(G_OBJECT(sel), "changed", 742 g_signal_connect (G_OBJECT (sel), "changed",
748 G_CALLBACK(keyword_selection_changed_cb), NULL); 743 G_CALLBACK (keyword_selection_changed_cb), NULL);
749 gtk_window_set_title (GTK_WINDOW (ad), *short_fn); 744 gtk_window_set_title (GTK_WINDOW (ad), *short_fn);
750 if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad))) 745 if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
751 { 746 {
752 gtk_widget_destroy (ad); 747 gtk_widget_destroy (ad);
753 g_object_unref (G_OBJECT (builder)); 748 g_object_unref (G_OBJECT (builder));
754 builder = NULL; 749 builder = NULL;
755 return; 750 return;
756 } 751 }
757 GNUNET_FS_file_information_inspect (fip, 752 GNUNET_FS_file_information_inspect (fip, &file_information_update, short_fn);
758 &file_information_update, 753 *anonymity_level =
759 short_fn); 754 gtk_spin_button_get_value (GTK_SPIN_BUTTON
760 *anonymity_level = gtk_spin_button_get_value (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, 755 (gtk_builder_get_object
761 "GNUNET_GTK_edit_file_information_anonymity_spin_button"))); 756 (builder,
762 *priority = gtk_spin_button_get_value (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, 757 "GNUNET_GTK_edit_file_information_anonymity_spin_button")));
763 "GNUNET_GTK_edit_file_information_priority_spin_button"))); 758 *priority =
764 *do_index = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, 759 gtk_spin_button_get_value (GTK_SPIN_BUTTON
765 "GNUNET_GTK_edit_file_information_index_check_button"))); 760 (gtk_builder_get_object
761 (builder,
762 "GNUNET_GTK_edit_file_information_priority_spin_button")));
763 *do_index =
764 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
765 (gtk_builder_get_object
766 (builder,
767 "GNUNET_GTK_edit_file_information_index_check_button")));
766 gtk_widget_destroy (ad); 768 gtk_widget_destroy (ad);
767 g_object_unref (G_OBJECT (builder)); 769 g_object_unref (G_OBJECT (builder));
768 builder = NULL; 770 builder = NULL;
diff --git a/src/fs/gnunet-fs-gtk-event_handler.c b/src/fs/gnunet-fs-gtk-event_handler.c
index 3b53fca5..569462ed 100644
--- a/src/fs/gnunet-fs-gtk-event_handler.c
+++ b/src/fs/gnunet-fs-gtk-event_handler.c
@@ -66,19 +66,19 @@ struct PublishEntry
66 66
67 /** 67 /**
68 * Tab storing this entry. 68 * Tab storing this entry.
69 */ 69 */
70 struct PublishTab *tab; 70 struct PublishTab *tab;
71 71
72 /** 72 /**
73 * Where in the tab is this entry? 73 * Where in the tab is this entry?
74 */ 74 */
75 GtkTreeRowReference *rr; 75 GtkTreeRowReference *rr;
76 76
77 /** 77 /**
78 * URI of the file (set after completion). 78 * URI of the file (set after completion).
79 */ 79 */
80 struct GNUNET_FS_Uri *uri; 80 struct GNUNET_FS_Uri *uri;
81 81
82 int is_top; 82 int is_top;
83}; 83};
84 84
@@ -87,12 +87,12 @@ struct SearchResult
87{ 87{
88 /** 88 /**
89 * Where in the tab is this result? 89 * Where in the tab is this result?
90 */ 90 */
91 GtkTreeRowReference *rr; 91 GtkTreeRowReference *rr;
92 92
93 /** 93 /**
94 * Tab storing this result. 94 * Tab storing this result.
95 */ 95 */
96 struct SearchTab *tab; 96 struct SearchTab *tab;
97 97
98 /** 98 /**
@@ -115,59 +115,51 @@ static struct PublishTab *publish_tab_tail;
115 115
116 116
117static struct DownloadEntry * 117static struct DownloadEntry *
118change_download_colour (struct DownloadEntry *de, 118change_download_colour (struct DownloadEntry *de, const char *colour)
119 const char *colour)
120{ 119{
121 GtkTreeIter iter; 120 GtkTreeIter iter;
122 GtkTreePath *path; 121 GtkTreePath *path;
123 122
124 path = gtk_tree_row_reference_get_path (de->rr); 123 path = gtk_tree_row_reference_get_path (de->rr);
125 if (TRUE != gtk_tree_model_get_iter (GTK_TREE_MODEL (de->ts), 124 if (TRUE != gtk_tree_model_get_iter (GTK_TREE_MODEL (de->ts), &iter, path))
126 &iter, path)) 125 {
127 { 126 GNUNET_break (0);
128 GNUNET_break (0); 127 gtk_tree_path_free (path);
129 gtk_tree_path_free (path); 128 return de;
130 return de; 129 }
131 }
132 gtk_tree_path_free (path); 130 gtk_tree_path_free (path);
133 gtk_tree_store_set (de->ts, &iter, 131 gtk_tree_store_set (de->ts, &iter, 8, colour, -1);
134 8, colour,
135 -1);
136 return de; 132 return de;
137} 133}
138 134
139 135
140static struct PublishEntry * 136static struct PublishEntry *
141change_publish_colour (struct PublishEntry *pe, 137change_publish_colour (struct PublishEntry *pe, const char *colour)
142 const char *colour)
143{ 138{
144 GtkTreeIter iter; 139 GtkTreeIter iter;
145 GtkTreePath *path; 140 GtkTreePath *path;
146 141
147 if (pe == NULL) 142 if (pe == NULL)
148 { 143 {
149 GNUNET_break (0); 144 GNUNET_break (0);
150 return NULL; 145 return NULL;
151 } 146 }
152 path = gtk_tree_row_reference_get_path (pe->rr); 147 path = gtk_tree_row_reference_get_path (pe->rr);
153 if (TRUE != gtk_tree_model_get_iter (GTK_TREE_MODEL (pe->tab->ts), 148 if (TRUE !=
154 &iter, path)) 149 gtk_tree_model_get_iter (GTK_TREE_MODEL (pe->tab->ts), &iter, path))
155 { 150 {
156 GNUNET_break (0); 151 GNUNET_break (0);
157 gtk_tree_path_free (path); 152 gtk_tree_path_free (path);
158 return pe; 153 return pe;
159 } 154 }
160 gtk_tree_path_free (path); 155 gtk_tree_path_free (path);
161 gtk_tree_store_set (pe->tab->ts, &iter, 156 gtk_tree_store_set (pe->tab->ts, &iter, 2, colour, -1);
162 2, colour,
163 -1);
164 return pe; 157 return pe;
165} 158}
166 159
167 160
168static void 161static void
169stop_download (struct DownloadEntry *de, 162stop_download (struct DownloadEntry *de, int is_suspend)
170 int is_suspend)
171{ 163{
172 change_download_colour (de, "white"); 164 change_download_colour (de, "white");
173 gtk_tree_row_reference_free (de->rr); 165 gtk_tree_row_reference_free (de->rr);
@@ -187,7 +179,7 @@ struct AddDirectoryEntryContext
187 179
188 /** 180 /**
189 * Row reference of parent (the directory). 181 * Row reference of parent (the directory).
190 */ 182 */
191 GtkTreeRowReference *prr; 183 GtkTreeRowReference *prr;
192 184
193 int check_duplicates; 185 int check_duplicates;
@@ -210,13 +202,11 @@ struct AddDirectoryEntryContext
210 * embedded with the directory itself). 202 * embedded with the directory itself).
211 * @param data data available for the file (length bytes) 203 * @param data data available for the file (length bytes)
212 */ 204 */
213static void 205static void
214add_directory_entry (void *cls, 206add_directory_entry (void *cls, const char *filename,
215 const char *filename, 207 const struct GNUNET_FS_Uri *uri,
216 const struct GNUNET_FS_Uri *uri, 208 const struct GNUNET_CONTAINER_MetaData *meta,
217 const struct GNUNET_CONTAINER_MetaData *meta, 209 size_t length, const void *data)
218 size_t length,
219 const void *data)
220{ 210{
221 struct AddDirectoryEntryContext *ade = cls; 211 struct AddDirectoryEntryContext *ade = cls;
222 GtkTreeIter iter; 212 GtkTreeIter iter;
@@ -226,168 +216,144 @@ add_directory_entry (void *cls,
226 struct GNUNET_FS_Uri *xuri; 216 struct GNUNET_FS_Uri *xuri;
227 217
228 if (uri == NULL) 218 if (uri == NULL)
219 {
220 /* directory meta data itself */
221 /* FIXME: consider merging it in... */
222 return;
223 }
224 if (ade->check_duplicates == GNUNET_YES)
225 {
226 path = gtk_tree_row_reference_get_path (ade->prr);
227 tm = gtk_tree_row_reference_get_model (ade->prr);
228 if (TRUE != gtk_tree_model_get_iter (tm, &piter, path))
229 { 229 {
230 /* directory meta data itself */ 230 GNUNET_break (0);
231 /* FIXME: consider merging it in... */ 231 gtk_tree_path_free (path);
232 return; 232 return;
233 } 233 }
234 if (ade->check_duplicates == GNUNET_YES) 234 gtk_tree_path_free (path);
235 if (TRUE == gtk_tree_model_iter_children (tm, &iter, &piter))
235 { 236 {
236 path = gtk_tree_row_reference_get_path (ade->prr); 237 do
237 tm = gtk_tree_row_reference_get_model (ade->prr); 238 {
238 if (TRUE != gtk_tree_model_get_iter (tm, 239 gtk_tree_model_get (tm, &iter, 1, &xuri, -1);
239 &piter, path)) 240 if (GNUNET_YES == GNUNET_FS_uri_test_equal (xuri, uri))
240 { 241 return; /* already present */
241 GNUNET_break (0); 242 }
242 gtk_tree_path_free (path); 243 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
243 return;
244 }
245 gtk_tree_path_free (path);
246 if (TRUE == gtk_tree_model_iter_children (tm,
247 &iter,
248 &piter))
249 {
250 do
251 {
252 gtk_tree_model_get (tm,
253 &iter,
254 1, &xuri,
255 -1);
256 if (GNUNET_YES ==
257 GNUNET_FS_uri_test_equal (xuri, uri))
258 return; /* already present */
259 }
260 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
261 }
262 } 244 }
263 GNUNET_GTK_add_search_result (ade->de->tab, 245 }
264 &iter, 246 GNUNET_GTK_add_search_result (ade->de->tab, &iter, ade->prr, uri, meta, NULL,
265 ade->prr, 247 0);
266 uri,
267 meta,
268 NULL,
269 0);
270} 248}
271 249
272 250
273static struct DownloadEntry * 251static struct DownloadEntry *
274mark_download_progress (struct DownloadEntry *de, 252mark_download_progress (struct DownloadEntry *de, uint64_t size,
275 uint64_t size, 253 uint64_t completed, const void *block_data,
276 uint64_t completed, 254 uint64_t offset, uint64_t block_size,
277 const void *block_data, 255 unsigned int depth)
278 uint64_t offset,
279 uint64_t block_size,
280 unsigned int depth)
281{ 256{
282 struct AddDirectoryEntryContext ade; 257 struct AddDirectoryEntryContext ade;
283 GtkTreeIter iter; 258 GtkTreeIter iter;
284 GtkTreePath *path; 259 GtkTreePath *path;
285 260
286 path = gtk_tree_row_reference_get_path (de->rr); 261 path = gtk_tree_row_reference_get_path (de->rr);
287 if (TRUE != gtk_tree_model_get_iter (GTK_TREE_MODEL (de->ts), 262 if (TRUE != gtk_tree_model_get_iter (GTK_TREE_MODEL (de->ts), &iter, path))
288 &iter, path)) 263 {
289 { 264 GNUNET_break (0);
290 GNUNET_break (0); 265 gtk_tree_path_free (path);
291 gtk_tree_path_free (path); 266 return de;
292 return de; 267 }
293 }
294 gtk_tree_path_free (path); 268 gtk_tree_path_free (path);
295 gtk_tree_store_set (de->ts, &iter, 269 gtk_tree_store_set (de->ts, &iter, 4,
296 4, (guint) ((size > 0) ? (100 * completed / size) : 100) /* progress */, 270 (guint) ((size >
297 -1); 271 0) ? (100 * completed /
298 if ( (depth == 0) && 272 size) : 100) /* progress */ ,
299 (block_size > 0) && 273 -1);
300 (GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (de->meta)) ) 274 if ((depth == 0) && (block_size > 0) &&
275 (GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (de->meta)))
276 {
277 ade.de = de;
278 ade.prr = de->rr;
279 ade.check_duplicates = GNUNET_NO;
280 if (GNUNET_SYSERR ==
281 GNUNET_FS_directory_list_contents ((size_t) block_size, block_data,
282 offset, &add_directory_entry, &ade))
301 { 283 {
302 ade.de = de; 284 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
303 ade.prr = de->rr; 285 _
304 ade.check_duplicates = GNUNET_NO; 286 ("Metadata wrongly claims that this is a GNUnet directory!\n"));
305 if (GNUNET_SYSERR ==
306 GNUNET_FS_directory_list_contents ((size_t) block_size,
307 block_data,
308 offset,
309 &add_directory_entry,
310 &ade))
311 {
312 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
313 _("Metadata wrongly claims that this is a GNUnet directory!\n"));
314 }
315 } 287 }
288 }
316 return de; 289 return de;
317} 290}
318 291
319 292
320static struct DownloadEntry * 293static struct DownloadEntry *
321mark_download_error (struct DownloadEntry *de, 294mark_download_error (struct DownloadEntry *de, const char *emsg)
322 const char *emsg)
323{ 295{
324 GtkTreeIter iter; 296 GtkTreeIter iter;
325 GtkTreePath *path; 297 GtkTreePath *path;
326 298
327 de = change_download_colour (de, 299 de = change_download_colour (de, "red");
328 "red"); 300 de->is_done = GNUNET_YES;
329 de->is_done = GNUNET_YES;
330 path = gtk_tree_row_reference_get_path (de->rr); 301 path = gtk_tree_row_reference_get_path (de->rr);
331 if (TRUE != gtk_tree_model_get_iter (GTK_TREE_MODEL (de->tab->ts), 302 if (TRUE !=
332 &iter, path)) 303 gtk_tree_model_get_iter (GTK_TREE_MODEL (de->tab->ts), &iter, path))
333 { 304 {
334 GNUNET_break (0); 305 GNUNET_break (0);
335 gtk_tree_path_free (path); 306 gtk_tree_path_free (path);
336 return de; 307 return de;
337 } 308 }
338 gtk_tree_path_free (path); 309 gtk_tree_path_free (path);
339 gtk_tree_store_set (de->tab->ts, &iter, 310 gtk_tree_store_set (de->tab->ts, &iter, 4, 0, 7, emsg, -1);
340 4, 0,
341 7, emsg,
342 -1);
343 return de; 311 return de;
344} 312}
345 313
346 314
347static struct DownloadEntry * 315static struct DownloadEntry *
348mark_download_completed (struct DownloadEntry *de, 316mark_download_completed (struct DownloadEntry *de, uint64_t size,
349 uint64_t size, 317 const char *filename)
350 const char *filename)
351{ 318{
352 struct AddDirectoryEntryContext ade; 319 struct AddDirectoryEntryContext ade;
353 320
354 de->is_done = GNUNET_YES; 321 de->is_done = GNUNET_YES;
355 (void) mark_download_progress (de, size, size, NULL, 0, 0, 0); 322 (void) mark_download_progress (de, size, size, NULL, 0, 0, 0);
356 if ( (GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (de->meta)) && 323 if ((GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (de->meta)) &&
357 (filename != NULL) ) 324 (filename != NULL))
358 { 325 {
359 ade.de = de; 326 ade.de = de;
360 ade.prr = de->rr; 327 ade.prr = de->rr;
361 ade.check_duplicates = GNUNET_NO; 328 ade.check_duplicates = GNUNET_NO;
362 GNUNET_FS_GTK_mmap_and_scan (filename, 329 GNUNET_FS_GTK_mmap_and_scan (filename, &add_directory_entry, &ade);
363 &add_directory_entry, 330 }
364 &ade);
365 }
366 (void) change_download_colour (de, "green"); 331 (void) change_download_colour (de, "green");
367 return de; 332 return de;
368} 333}
369 334
370 335
371static struct PublishEntry * 336static struct PublishEntry *
372mark_publish_progress (struct PublishEntry *pe, 337mark_publish_progress (struct PublishEntry *pe, uint64_t size,
373 uint64_t size, 338 uint64_t completed)
374 uint64_t completed)
375{ 339{
376 GtkTreeIter iter; 340 GtkTreeIter iter;
377 GtkTreePath *path; 341 GtkTreePath *path;
378 342
379 path = gtk_tree_row_reference_get_path (pe->rr); 343 path = gtk_tree_row_reference_get_path (pe->rr);
380 if (TRUE != gtk_tree_model_get_iter (GTK_TREE_MODEL (pe->tab->ts), 344 if (TRUE !=
381 &iter, path)) 345 gtk_tree_model_get_iter (GTK_TREE_MODEL (pe->tab->ts), &iter, path))
382 { 346 {
383 GNUNET_break (0); 347 GNUNET_break (0);
384 gtk_tree_path_free (path); 348 gtk_tree_path_free (path);
385 return pe; 349 return pe;
386 } 350 }
387 gtk_tree_path_free (path); 351 gtk_tree_path_free (path);
388 gtk_tree_store_set (pe->tab->ts, &iter, 352 gtk_tree_store_set (pe->tab->ts, &iter, 3,
389 3, (guint) ((size > 0) ? (100 * completed / size) : 100) /* progress */, 353 (guint) ((size >
390 -1); 354 0) ? (100 * completed /
355 size) : 100) /* progress */ ,
356 -1);
391 return pe; 357 return pe;
392} 358}
393 359
@@ -403,10 +369,8 @@ mark_publish_progress (struct PublishEntry *pe,
403 * to refer to the new model. 369 * to refer to the new model.
404 */ 370 */
405static void 371static void
406move_children (GtkTreeModel *src_model, 372move_children (GtkTreeModel * src_model, GtkTreeIter * src_iter,
407 GtkTreeIter *src_iter, 373 GtkTreeModel * dst_model, GtkTreeIter * dst_iter)
408 GtkTreeModel *dst_model,
409 GtkTreeIter *dst_iter)
410{ 374{
411 GtkTreeIter src_child; 375 GtkTreeIter src_child;
412 GtkTreeIter dst_child; 376 GtkTreeIter dst_child;
@@ -424,76 +388,49 @@ move_children (GtkTreeModel *src_model,
424 gchar *mimetype; 388 gchar *mimetype;
425 guint applicability_rank; 389 guint applicability_rank;
426 guint availability_certainty; 390 guint availability_certainty;
427 gint availability_rank; 391 gint availability_rank;
428 392
429 if (TRUE == gtk_tree_model_iter_children (src_model, 393 if (TRUE == gtk_tree_model_iter_children (src_model, &src_child, src_iter))
430 &src_child, 394 {
431 src_iter)) 395 do
432 { 396 {
433 do 397 gtk_tree_model_get (src_model, &src_child, 0, &meta, 1, &uri, 2,
434 { 398 &filesize, 3, &preview, 4, &percent_progress, 5,
435 gtk_tree_model_get (src_model, 399 &percent_availability, 6, &filename, 7,
436 &src_child, 400 &uri_as_string, 8, &status_colour, 9, &search_result,
437 0, &meta, 401 10, &mimetype, 11, &applicability_rank, 12,
438 1, &uri, 402 &availability_certainty, 13, &availability_rank, -1);
439 2, &filesize, 403 gtk_tree_store_insert_with_values (GTK_TREE_STORE (dst_model), &dst_child,
440 3, &preview, 404 dst_iter, G_MAXINT, 0, meta, 1, uri, 2,
441 4, &percent_progress, 405 filesize, 3, preview, 4,
442 5, &percent_availability, 406 percent_progress, 5,
443 6, &filename, 407 percent_availability, 6, filename, 7,
444 7, &uri_as_string, 408 uri_as_string, 8, status_colour, 9,
445 8, &status_colour, 409 search_result, 10, mimetype, 11,
446 9, &search_result, 410 applicability_rank, 12,
447 10, &mimetype, 411 availability_certainty, 13,
448 11, &applicability_rank, 412 availability_rank, -1);
449 12, &availability_certainty, 413 g_free (filename);
450 13, &availability_rank, 414 g_free (uri_as_string);
451 -1); 415 g_free (status_colour);
452 gtk_tree_store_insert_with_values (GTK_TREE_STORE (dst_model), 416 g_free (mimetype);
453 &dst_child, 417 if (preview != NULL)
454 dst_iter, 418 g_object_unref (preview);
455 G_MAXINT, 419 gtk_tree_row_reference_free (search_result->rr);
456 0, meta, 420 path = gtk_tree_model_get_path (dst_model, &dst_child);
457 1, uri, 421 search_result->rr = gtk_tree_row_reference_new (dst_model, path);
458 2, filesize, 422 gtk_tree_path_free (path);
459 3, preview, 423 if (search_result->download != NULL)
460 4, percent_progress, 424 {
461 5, percent_availability, 425 search_result->download->ts = GTK_TREE_STORE (dst_model);
462 6, filename, 426 gtk_tree_row_reference_free (search_result->download->rr);
463 7, uri_as_string, 427 search_result->download->rr =
464 8, status_colour, 428 gtk_tree_row_reference_copy (search_result->rr);
465 9, search_result, 429 }
466 10, mimetype, 430 move_children (src_model, &src_child, dst_model, &dst_child);
467 11, applicability_rank,
468 12, availability_certainty,
469 13, availability_rank,
470 -1);
471 g_free (filename);
472 g_free (uri_as_string);
473 g_free (status_colour);
474 g_free (mimetype);
475 if (preview != NULL)
476 g_object_unref (preview);
477 gtk_tree_row_reference_free (search_result->rr);
478 path = gtk_tree_model_get_path (dst_model,
479 &dst_child);
480 search_result->rr = gtk_tree_row_reference_new (dst_model,
481 path);
482 gtk_tree_path_free (path);
483 if (search_result->download != NULL)
484 {
485 search_result->download->ts = GTK_TREE_STORE (dst_model);
486 gtk_tree_row_reference_free (search_result->download->rr);
487 search_result->download->rr = gtk_tree_row_reference_copy (search_result->rr);
488 }
489 move_children (src_model,
490 &src_child,
491 dst_model,
492 &dst_child);
493 }
494 while (TRUE == gtk_tree_model_iter_next (src_model,
495 &src_child));
496 } 431 }
432 while (TRUE == gtk_tree_model_iter_next (src_model, &src_child));
433 }
497} 434}
498 435
499 436
@@ -503,17 +440,13 @@ move_children (GtkTreeModel *src_model,
503 * model's fields (since they have been moved). 440 * model's fields (since they have been moved).
504 */ 441 */
505static void 442static void
506delete_stale_subtree (GtkTreeModel *model, 443delete_stale_subtree (GtkTreeModel * model, GtkTreeIter * iter)
507 GtkTreeIter *iter)
508{ 444{
509 GtkTreeIter child; 445 GtkTreeIter child;
510 446
511 while (TRUE == gtk_tree_model_iter_children (model, 447 while (TRUE == gtk_tree_model_iter_children (model, &child, iter))
512 &child,
513 iter))
514 delete_stale_subtree (model, &child); 448 delete_stale_subtree (model, &child);
515 gtk_tree_store_remove (GTK_TREE_STORE (model), 449 gtk_tree_store_remove (GTK_TREE_STORE (model), iter);
516 iter);
517} 450}
518 451
519 452
@@ -522,10 +455,8 @@ delete_stale_subtree (GtkTreeModel *model,
522 * search parent by moving it to the URI tab. 455 * search parent by moving it to the URI tab.
523 */ 456 */
524static struct DownloadEntry * 457static struct DownloadEntry *
525download_lost_parent (struct DownloadEntry *de, 458download_lost_parent (struct DownloadEntry *de, uint64_t size,
526 uint64_t size, 459 uint64_t completed, int is_active)
527 uint64_t completed,
528 int is_active)
529{ 460{
530 GtkTreeIter iter; 461 GtkTreeIter iter;
531 GtkTreePath *path; 462 GtkTreePath *path;
@@ -536,42 +467,30 @@ download_lost_parent (struct DownloadEntry *de,
536 467
537 rr_old = de->rr; 468 rr_old = de->rr;
538 de->sr = NULL; 469 de->sr = NULL;
539 tab = GNUNET_GTK_add_to_uri_tab (&iter, 470 tab = GNUNET_GTK_add_to_uri_tab (&iter, NULL, de->meta, de->uri);
540 NULL,
541 de->meta,
542 de->uri);
543 de->ts = tab->ts; 471 de->ts = tab->ts;
544 path = gtk_tree_model_get_path (GTK_TREE_MODEL (de->ts), 472 path = gtk_tree_model_get_path (GTK_TREE_MODEL (de->ts), &iter);
545 &iter); 473 de->rr = gtk_tree_row_reference_new (GTK_TREE_MODEL (de->ts), path);
546 de->rr = gtk_tree_row_reference_new (GTK_TREE_MODEL (de->ts),
547 path);
548 gtk_tree_path_free (path); 474 gtk_tree_path_free (path);
549 mark_download_progress (de, size, completed, 475 mark_download_progress (de, size, completed, NULL, 0, 0, 0);
550 NULL, 0, 0, 0);
551 tm_old = gtk_tree_row_reference_get_model (rr_old); 476 tm_old = gtk_tree_row_reference_get_model (rr_old);
552 path = gtk_tree_row_reference_get_path (rr_old); 477 path = gtk_tree_row_reference_get_path (rr_old);
553 gtk_tree_row_reference_free (rr_old); 478 gtk_tree_row_reference_free (rr_old);
554 gtk_tree_model_get_iter (tm_old, 479 gtk_tree_model_get_iter (tm_old, &iter_old, path);
555 &iter_old,
556 path);
557 gtk_tree_path_free (path); 480 gtk_tree_path_free (path);
558 move_children (tm_old, 481 move_children (tm_old, &iter_old, GTK_TREE_MODEL (de->ts), &iter);
559 &iter_old, 482 delete_stale_subtree (tm_old, &iter_old);
560 GTK_TREE_MODEL (de->ts),
561 &iter);
562 delete_stale_subtree (tm_old,
563 &iter_old);
564 if (size > completed) 483 if (size > completed)
565 { 484 {
566 if (is_active) 485 if (is_active)
567 change_download_colour (de, "yellow"); 486 change_download_colour (de, "yellow");
568 else 487 else
569 change_download_colour (de, "blue"); 488 change_download_colour (de, "blue");
570 } 489 }
571 else 490 else
572 { 491 {
573 change_download_colour (de, "green"); 492 change_download_colour (de, "green");
574 } 493 }
575 return de; 494 return de;
576} 495}
577 496
@@ -589,63 +508,55 @@ download_lost_parent (struct DownloadEntry *de,
589 * @param completed current progress 508 * @param completed current progress
590 */ 509 */
591static struct DownloadEntry * 510static struct DownloadEntry *
592setup_download (struct DownloadEntry *de, 511setup_download (struct DownloadEntry *de, struct DownloadEntry *pde,
593 struct DownloadEntry *pde, 512 struct SearchResult *sr, struct GNUNET_FS_DownloadContext *dc,
594 struct SearchResult *sr, 513 const struct GNUNET_FS_Uri *uri,
595 struct GNUNET_FS_DownloadContext *dc, 514 const struct GNUNET_CONTAINER_MetaData *meta, uint64_t size,
596 const struct GNUNET_FS_Uri *uri, 515 uint64_t completed)
597 const struct GNUNET_CONTAINER_MetaData *meta,
598 uint64_t size,
599 uint64_t completed)
600{ 516{
601 GtkTreeIter iter; 517 GtkTreeIter iter;
602 GtkTreePath *path; 518 GtkTreePath *path;
603 519
604 if (de == NULL) 520 if (de == NULL)
605 { 521 {
606 de = GNUNET_malloc (sizeof (struct DownloadEntry)); 522 de = GNUNET_malloc (sizeof (struct DownloadEntry));
607 GNUNET_assert (sr->download == NULL); 523 GNUNET_assert (sr->download == NULL);
608 sr->download = de; 524 sr->download = de;
609 de->sr = sr; 525 de->sr = sr;
610 de->dc = dc; 526 de->dc = dc;
611 de->uri = GNUNET_FS_uri_dup (uri); 527 de->uri = GNUNET_FS_uri_dup (uri);
612 } 528 }
613 de->pde = pde; 529 de->pde = pde;
614 if ( (meta != NULL) && 530 if ((meta != NULL) && (de->meta == NULL))
615 (de->meta == NULL) )
616 de->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); 531 de->meta = GNUNET_CONTAINER_meta_data_duplicate (meta);
617 if (sr != NULL) 532 if (sr != NULL)
618 { 533 {
619 de->rr = gtk_tree_row_reference_copy (sr->rr); 534 de->rr = gtk_tree_row_reference_copy (sr->rr);
620 de->ts = sr->tab->ts; 535 de->ts = sr->tab->ts;
621 de->tab = sr->tab; 536 de->tab = sr->tab;
622 } 537 }
623 else if (de->rr == NULL) 538 else if (de->rr == NULL)
624 { 539 {
625 de->tab = GNUNET_GTK_add_to_uri_tab (&iter, 540 de->tab = GNUNET_GTK_add_to_uri_tab (&iter, NULL, meta, uri);
626 NULL, 541 de->ts = de->tab->ts;
627 meta, 542 path = gtk_tree_model_get_path (GTK_TREE_MODEL (de->ts), &iter);
628 uri); 543 de->rr = gtk_tree_row_reference_new (GTK_TREE_MODEL (de->ts), path);
629 de->ts = de->tab->ts; 544 gtk_tree_path_free (path);
630 path = gtk_tree_model_get_path (GTK_TREE_MODEL (de->ts), 545 }
631 &iter);
632 de->rr = gtk_tree_row_reference_new (GTK_TREE_MODEL (de->ts),
633 path);
634 gtk_tree_path_free (path);
635 }
636 path = gtk_tree_row_reference_get_path (de->rr); 546 path = gtk_tree_row_reference_get_path (de->rr);
637 if (TRUE != gtk_tree_model_get_iter (GTK_TREE_MODEL (de->ts), 547 if (TRUE != gtk_tree_model_get_iter (GTK_TREE_MODEL (de->ts), &iter, path))
638 &iter, path)) 548 {
639 { 549 GNUNET_break (0);
640 GNUNET_break (0); 550 gtk_tree_path_free (path);
641 gtk_tree_path_free (path); 551 return de;
642 return de; 552 }
643 }
644 gtk_tree_path_free (path); 553 gtk_tree_path_free (path);
645 gtk_tree_store_set (de->ts, &iter, 554 gtk_tree_store_set (de->ts, &iter, 4,
646 4, (guint) ((size > 0) ? (100 * completed / size) : 100) /* progress */, 555 (guint) ((size >
647 8, "blue" /* status colour: pending */, 556 0) ? (100 * completed /
648 -1); 557 size) : 100) /* progress */ ,
558 8, "blue" /* status colour: pending */ ,
559 -1);
649 return de; 560 return de;
650} 561}
651 562
@@ -655,10 +566,8 @@ setup_download (struct DownloadEntry *de,
655 * "save as" window. 566 * "save as" window.
656 */ 567 */
657static void 568static void
658start_download (GtkTreeView *tree_view, 569start_download (GtkTreeView * tree_view, GtkTreePath * path,
659 GtkTreePath *path, 570 GtkTreeViewColumn * column, gpointer user_data)
660 GtkTreeViewColumn *column,
661 gpointer user_data)
662{ 571{
663 struct SearchTab *tab = user_data; 572 struct SearchTab *tab = user_data;
664 GtkTreeModel *tm; 573 GtkTreeModel *tm;
@@ -672,16 +581,11 @@ start_download (GtkTreeView *tree_view,
672 GNUNET_assert (tab != NULL); 581 GNUNET_assert (tab != NULL);
673 tm = gtk_tree_view_get_model (tree_view); 582 tm = gtk_tree_view_get_model (tree_view);
674 if (TRUE != gtk_tree_model_get_iter (tm, &iter, path)) 583 if (TRUE != gtk_tree_model_get_iter (tm, &iter, path))
675 { 584 {
676 GNUNET_break (0); 585 GNUNET_break (0);
677 return; 586 return;
678 } 587 }
679 gtk_tree_model_get (tm, &iter, 588 gtk_tree_model_get (tm, &iter, 0, &meta, 1, &uri, 9, &sr, 10, &mime, -1);
680 0, &meta,
681 1, &uri,
682 9, &sr,
683 10, &mime,
684 -1);
685 dlc = GNUNET_malloc (sizeof (struct DownloadContext)); 589 dlc = GNUNET_malloc (sizeof (struct DownloadContext));
686 dlc->uri = GNUNET_FS_uri_dup (uri); 590 dlc->uri = GNUNET_FS_uri_dup (uri);
687 dlc->mime = (NULL != mime) ? GNUNET_strdup (mime) : NULL; 591 dlc->mime = (NULL != mime) ? GNUNET_strdup (mime) : NULL;
@@ -710,23 +614,22 @@ static struct SearchTab *current_context_search_tab;
710 * Download was selected in the current search context menu. 614 * Download was selected in the current search context menu.
711 */ 615 */
712static void 616static void
713start_download_ctx_menu (gpointer user_data, 617start_download_ctx_menu (gpointer user_data, guint unused, GtkWidget * widget)
714 guint unused,
715 GtkWidget *widget)
716{ 618{
717 GtkTreePath *path; 619 GtkTreePath *path;
718 GtkTreeView *tv; 620 GtkTreeView *tv;
719 621
720 if (current_context_row_reference == NULL) 622 if (current_context_row_reference == NULL)
721 { 623 {
722 GNUNET_break (0); 624 GNUNET_break (0);
723 return; 625 return;
724 } 626 }
725 path = gtk_tree_row_reference_get_path (current_context_row_reference); 627 path = gtk_tree_row_reference_get_path (current_context_row_reference);
726 gtk_tree_row_reference_free (current_context_row_reference); 628 gtk_tree_row_reference_free (current_context_row_reference);
727 current_context_row_reference = NULL; 629 current_context_row_reference = NULL;
728 tv = GTK_TREE_VIEW (gtk_builder_get_object (current_context_search_tab->builder, 630 tv = GTK_TREE_VIEW (gtk_builder_get_object
729 "_search_result_frame")); 631 (current_context_search_tab->builder,
632 "_search_result_frame"));
730 start_download (tv, path, NULL, current_context_search_tab); 633 start_download (tv, path, NULL, current_context_search_tab);
731 gtk_tree_path_free (path); 634 gtk_tree_path_free (path);
732 current_context_search_tab = NULL; 635 current_context_search_tab = NULL;
@@ -737,15 +640,12 @@ start_download_ctx_menu (gpointer user_data,
737 * Download was selected in the current search context menu. 640 * Download was selected in the current search context menu.
738 */ 641 */
739static void 642static void
740abort_download_ctx_menu (gpointer user_data, 643abort_download_ctx_menu (gpointer user_data, guint unused, GtkWidget * widget)
741 guint unused,
742 GtkWidget *widget)
743{ 644{
744 struct DownloadEntry *de = user_data; 645 struct DownloadEntry *de = user_data;
745 646
746 GNUNET_assert (de->dc != NULL); 647 GNUNET_assert (de->dc != NULL);
747 GNUNET_FS_download_stop (de->dc, 648 GNUNET_FS_download_stop (de->dc, GNUNET_YES);
748 GNUNET_YES);
749 current_context_search_tab = NULL; 649 current_context_search_tab = NULL;
750} 650}
751 651
@@ -754,9 +654,8 @@ abort_download_ctx_menu (gpointer user_data,
754 * Copy current URI to clipboard. 654 * Copy current URI to clipboard.
755 */ 655 */
756static void 656static void
757copy_uri_to_clipboard_ctx_menu (gpointer user_data, 657copy_uri_to_clipboard_ctx_menu (gpointer user_data, guint unused,
758 guint unused, 658 GtkWidget * widget)
759 GtkWidget *widget)
760{ 659{
761 GtkTreePath *path; 660 GtkTreePath *path;
762 GtkTreeView *tv; 661 GtkTreeView *tv;
@@ -767,36 +666,34 @@ copy_uri_to_clipboard_ctx_menu (gpointer user_data,
767 GtkClipboard *cb; 666 GtkClipboard *cb;
768 667
769 if (current_context_row_reference == NULL) 668 if (current_context_row_reference == NULL)
770 { 669 {
771 GNUNET_break (0); 670 GNUNET_break (0);
772 return; 671 return;
773 } 672 }
774 path = gtk_tree_row_reference_get_path (current_context_row_reference); 673 path = gtk_tree_row_reference_get_path (current_context_row_reference);
775 gtk_tree_row_reference_free (current_context_row_reference); 674 gtk_tree_row_reference_free (current_context_row_reference);
776 current_context_row_reference = NULL; 675 current_context_row_reference = NULL;
777 tv = GTK_TREE_VIEW (gtk_builder_get_object (current_context_search_tab->builder, 676 tv = GTK_TREE_VIEW (gtk_builder_get_object
778 "_search_result_frame")); 677 (current_context_search_tab->builder,
678 "_search_result_frame"));
779 tm = gtk_tree_view_get_model (tv); 679 tm = gtk_tree_view_get_model (tv);
780 if (TRUE != gtk_tree_model_get_iter (tm, &iter, path)) 680 if (TRUE != gtk_tree_model_get_iter (tm, &iter, path))
781 { 681 {
782 GNUNET_break (0); 682 GNUNET_break (0);
783 gtk_tree_path_free (path); 683 gtk_tree_path_free (path);
784 return; 684 return;
785 } 685 }
786 gtk_tree_model_get (tm, &iter, 686 gtk_tree_model_get (tm, &iter, 1, &uri, -1);
787 1, &uri, -1);
788 gtk_tree_path_free (path); 687 gtk_tree_path_free (path);
789 current_context_search_tab = NULL; 688 current_context_search_tab = NULL;
790 if (uri == NULL) 689 if (uri == NULL)
791 { 690 {
792 GNUNET_break (0); 691 GNUNET_break (0);
793 return; 692 return;
794 } 693 }
795 uris = GNUNET_FS_uri_to_string (uri); 694 uris = GNUNET_FS_uri_to_string (uri);
796 cb = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); 695 cb = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
797 gtk_clipboard_set_text (cb, 696 gtk_clipboard_set_text (cb, uris, -1);
798 uris,
799 -1);
800 gtk_clipboard_store (cb); 697 gtk_clipboard_store (cb);
801 GNUNET_free (uris); 698 GNUNET_free (uris);
802} 699}
@@ -806,10 +703,8 @@ copy_uri_to_clipboard_ctx_menu (gpointer user_data,
806 * We got a right-click on the search result list. Display the context 703 * We got a right-click on the search result list. Display the context
807 * menu. 704 * menu.
808 */ 705 */
809static int 706static int
810search_list_on_menu(GtkWidget *widget, 707search_list_on_menu (GtkWidget * widget, GdkEvent * event, gpointer user_data)
811 GdkEvent *event,
812 gpointer user_data)
813{ 708{
814 GdkEventButton *event_button; 709 GdkEventButton *event_button;
815 struct SearchTab *tab = user_data; 710 struct SearchTab *tab = user_data;
@@ -820,91 +715,79 @@ search_list_on_menu(GtkWidget *widget,
820 GtkTreeModel *tm; 715 GtkTreeModel *tm;
821 GtkTreeIter iter; 716 GtkTreeIter iter;
822 struct SearchResult *sr; 717 struct SearchResult *sr;
823 718
824 tv = GTK_TREE_VIEW (widget); 719 tv = GTK_TREE_VIEW (widget);
825 if (event->type == GDK_BUTTON_PRESS) 720 if (event->type == GDK_BUTTON_PRESS)
721 {
722 event_button = (GdkEventButton *) event;
723 if (event_button->button == 3)
826 { 724 {
827 event_button = (GdkEventButton *) event; 725 current_context_search_tab = tab;
828 if (event_button->button == 3) 726 if (current_context_row_reference != NULL)
829 { 727 {
830 current_context_search_tab = tab; 728 gtk_tree_row_reference_free (current_context_row_reference);
831 if (current_context_row_reference != NULL) 729 current_context_row_reference = NULL;
832 { 730 }
833 gtk_tree_row_reference_free (current_context_row_reference); 731 path = NULL;
834 current_context_row_reference = NULL; 732 if (FALSE ==
835 } 733 gtk_tree_view_get_path_at_pos (tv, event_button->x, event_button->y,
836 path = NULL; 734 &path, NULL, NULL, NULL))
837 if (FALSE == gtk_tree_view_get_path_at_pos (tv, 735 {
838 event_button->x, 736 /* nothing selected */
839 event_button->y, 737 current_context_search_tab = NULL;
840 &path, NULL, NULL, NULL)) 738 return FALSE;
841 { 739 }
842 /* nothing selected */ 740 tm = gtk_tree_view_get_model (tv);
843 current_context_search_tab = NULL; 741 gtk_tree_model_get_iter (tm, &iter, path);
844 return FALSE; 742 gtk_tree_model_get (tm, &iter, 9, &sr, -1);
845 } 743 current_context_row_reference = gtk_tree_row_reference_new (tm, path);
846 tm = gtk_tree_view_get_model (tv); 744 gtk_tree_path_free (path);
847 gtk_tree_model_get_iter (tm, &iter, path); 745
848 gtk_tree_model_get (tm, &iter, 746 /*
849 9, &sr, 747 * FIXME: have additional options, depending on status:
850 -1); 748 * - view full meta data (in new window)
851 current_context_row_reference = gtk_tree_row_reference_new (tm, 749 * - copy URI to clipboard
852 path); 750 * - start recursive download
853 gtk_tree_path_free (path); 751 * - abort active download (!)
854 752 * => need to know download status before creating menu!
855 /* 753 */
856 FIXME: have additional options, depending on status: 754 menu = GTK_MENU (gtk_menu_new ());
857 - view full meta data (in new window) 755 if (sr->download == NULL)
858 - copy URI to clipboard 756 {
859 - start recursive download 757 child = gtk_menu_item_new_with_label (_("_Download"));
860 - abort active download (!) 758 g_signal_connect (child, "activate",
861 => need to know download status before creating menu! 759 G_CALLBACK (start_download_ctx_menu), NULL);
862 */ 760 gtk_label_set_use_underline (GTK_LABEL
863 menu = GTK_MENU (gtk_menu_new ()); 761 (gtk_bin_get_child (GTK_BIN (child))),
864 if (sr->download == NULL) 762 TRUE);
865 { 763 gtk_widget_show (child);
866 child = gtk_menu_item_new_with_label (_("_Download")); 764 }
867 g_signal_connect (child, 765 else
868 "activate", 766 {
869 G_CALLBACK (start_download_ctx_menu), 767 child = gtk_menu_item_new_with_label (_("_Abort download"));
870 NULL); 768 g_signal_connect (child, "activate",
871 gtk_label_set_use_underline (GTK_LABEL 769 G_CALLBACK (abort_download_ctx_menu), sr->download);
872 (gtk_bin_get_child (GTK_BIN (child))), 770 gtk_label_set_use_underline (GTK_LABEL
873 TRUE); 771 (gtk_bin_get_child (GTK_BIN (child))),
874 gtk_widget_show (child); 772 TRUE);
875 } 773 gtk_widget_show (child);
876 else 774
877 { 775 }
878 child = gtk_menu_item_new_with_label (_("_Abort download")); 776
879 g_signal_connect (child, 777 child = gtk_menu_item_new_with_label (_("_Copy URI to Clipboard"));
880 "activate", 778 g_signal_connect (child, "activate",
881 G_CALLBACK (abort_download_ctx_menu), 779 G_CALLBACK (copy_uri_to_clipboard_ctx_menu), NULL);
882 sr->download); 780 gtk_label_set_use_underline (GTK_LABEL
883 gtk_label_set_use_underline (GTK_LABEL 781 (gtk_bin_get_child (GTK_BIN (child))), TRUE);
884 (gtk_bin_get_child (GTK_BIN (child))), 782 gtk_widget_show (child);
885 TRUE); 783
886 gtk_widget_show (child); 784
887 785
888 } 786 gtk_menu_shell_append (GTK_MENU_SHELL (menu), child);
889 787 gtk_menu_popup (menu, NULL, NULL, NULL, NULL, event_button->button,
890 child = gtk_menu_item_new_with_label (_("_Copy URI to Clipboard")); 788 event_button->time);
891 g_signal_connect (child,
892 "activate",
893 G_CALLBACK (copy_uri_to_clipboard_ctx_menu),
894 NULL);
895 gtk_label_set_use_underline (GTK_LABEL
896 (gtk_bin_get_child (GTK_BIN (child))),
897 TRUE);
898 gtk_widget_show (child);
899
900
901
902 gtk_menu_shell_append (GTK_MENU_SHELL (menu), child);
903 gtk_menu_popup (menu, NULL, NULL, NULL, NULL,
904 event_button->button,
905 event_button->time);
906 }
907 } 789 }
790 }
908 return FALSE; 791 return FALSE;
909} 792}
910 793
@@ -914,8 +797,7 @@ search_list_on_menu(GtkWidget *widget,
914 * areas. 797 * areas.
915 */ 798 */
916static void 799static void
917update_meta_data_views (GtkTreeView *tv, 800update_meta_data_views (GtkTreeView * tv, gpointer user_data)
918 gpointer user_data)
919{ 801{
920 struct SearchTab *tab = user_data; 802 struct SearchTab *tab = user_data;
921 GtkImage *image; 803 GtkImage *image;
@@ -927,36 +809,33 @@ update_meta_data_views (GtkTreeView *tv,
927 GdkPixbuf *pixbuf; 809 GdkPixbuf *pixbuf;
928 810
929 GNUNET_assert (tab->query_txt != NULL); 811 GNUNET_assert (tab->query_txt != NULL);
930 image = GTK_IMAGE (GNUNET_FS_GTK_get_main_window_object ("GNUNET_GTK_main_window_preview_image")); 812 image =
931 ms = GTK_LIST_STORE (GNUNET_FS_GTK_get_main_window_object ("GNUNET_GTK_meta_data_list_store")); 813 GTK_IMAGE (GNUNET_FS_GTK_get_main_window_object
814 ("GNUNET_GTK_main_window_preview_image"));
815 ms = GTK_LIST_STORE (GNUNET_FS_GTK_get_main_window_object
816 ("GNUNET_GTK_meta_data_list_store"));
932 817
933 sel = gtk_tree_view_get_selection (tv); 818 sel = gtk_tree_view_get_selection (tv);
934 gtk_list_store_clear (ms); 819 gtk_list_store_clear (ms);
935 if (TRUE != gtk_tree_selection_get_selected (sel, 820 if (TRUE != gtk_tree_selection_get_selected (sel, &model, &iter))
936 &model, 821 {
937 &iter)) 822 gtk_image_clear (image);
938 { 823 return;
939 gtk_image_clear (image); 824 }
940 return;
941 }
942 meta = NULL; 825 meta = NULL;
943 pixbuf = NULL; 826 pixbuf = NULL;
944 gtk_tree_model_get (model, 827 gtk_tree_model_get (model, &iter, 0, &meta, 3, &pixbuf, -1);
945 &iter,
946 0, &meta,
947 3, &pixbuf,
948 -1);
949 if (pixbuf != NULL) 828 if (pixbuf != NULL)
950 { 829 {
951 gtk_image_set_from_pixbuf (image, pixbuf); 830 gtk_image_set_from_pixbuf (image, pixbuf);
952 g_object_unref (G_OBJECT (pixbuf)); 831 g_object_unref (G_OBJECT (pixbuf));
953 } 832 }
954 if (meta != NULL) 833 if (meta != NULL)
955 { 834 {
956 GNUNET_CONTAINER_meta_data_iterate (meta, 835 GNUNET_CONTAINER_meta_data_iterate (meta,
957 &GNUNET_FS_GTK_add_meta_data_to_list_store, 836 &GNUNET_FS_GTK_add_meta_data_to_list_store,
958 ms); 837 ms);
959 } 838 }
960} 839}
961 840
962 841
@@ -967,22 +846,16 @@ static void
967update_search_label (struct SearchTab *tab) 846update_search_label (struct SearchTab *tab)
968{ 847{
969 char *name; 848 char *name;
970 849
971 while (tab->parent != NULL) 850 while (tab->parent != NULL)
972 tab = tab->parent->tab; 851 tab = tab->parent->tab;
973 if (tab->num_results > 0) 852 if (tab->num_results > 0)
974 GNUNET_asprintf (&name, 853 GNUNET_asprintf (&name, "%.*s%s (%u)", 20, tab->query_txt,
975 "%.*s%s (%u)", 854 strlen (tab->query_txt) > 20 ? "..." : "",
976 20, 855 tab->num_results);
977 tab->query_txt,
978 strlen (tab->query_txt) > 20 ? "..." : "",
979 tab->num_results);
980 else 856 else
981 GNUNET_asprintf (&name, 857 GNUNET_asprintf (&name, "%.*s%s", 20, tab->query_txt,
982 "%.*s%s", 858 strlen (tab->query_txt) > 20 ? "..." : "");
983 20,
984 tab->query_txt,
985 strlen (tab->query_txt) > 20 ? "..." : "");
986 gtk_label_set_text (tab->label, name); 859 gtk_label_set_text (tab->label, name);
987 GNUNET_free (name); 860 GNUNET_free (name);
988} 861}
@@ -997,15 +870,17 @@ close_search_tab (struct SearchTab *tab)
997 GtkNotebook *notebook; 870 GtkNotebook *notebook;
998 int index; 871 int index;
999 int i; 872 int i;
1000 873
1001 if (tab->parent != NULL) 874 if (tab->parent != NULL)
1002 { 875 {
1003 /* not a top-level search, do not close tab here! */ 876 /* not a top-level search, do not close tab here! */
1004 GNUNET_free (tab); 877 GNUNET_free (tab);
1005 return; 878 return;
1006 } 879 }
1007 880
1008 notebook = GTK_NOTEBOOK (GNUNET_FS_GTK_get_main_window_object ("GNUNET_GTK_main_window_notebook")); 881 notebook =
882 GTK_NOTEBOOK (GNUNET_FS_GTK_get_main_window_object
883 ("GNUNET_GTK_main_window_notebook"));
1009 index = -1; 884 index = -1;
1010 for (i = gtk_notebook_get_n_pages (notebook) - 1; i >= 0; i--) 885 for (i = gtk_notebook_get_n_pages (notebook) - 1; i >= 0; i--)
1011 if (tab->frame == gtk_notebook_get_nth_page (notebook, i)) 886 if (tab->frame == gtk_notebook_get_nth_page (notebook, i))
@@ -1013,9 +888,7 @@ close_search_tab (struct SearchTab *tab)
1013 gtk_notebook_remove_page (notebook, index); 888 gtk_notebook_remove_page (notebook, index);
1014 g_object_unref (tab->builder); 889 g_object_unref (tab->builder);
1015 GNUNET_free (tab->query_txt); 890 GNUNET_free (tab->query_txt);
1016 GNUNET_CONTAINER_DLL_remove (search_tab_head, 891 GNUNET_CONTAINER_DLL_remove (search_tab_head, search_tab_tail, tab);
1017 search_tab_tail,
1018 tab);
1019 GNUNET_free (tab); 892 GNUNET_free (tab);
1020} 893}
1021 894
@@ -1025,11 +898,10 @@ close_search_tab (struct SearchTab *tab)
1025 */ 898 */
1026static struct PublishEntry * 899static struct PublishEntry *
1027handle_publish_completed (struct PublishEntry *ent, 900handle_publish_completed (struct PublishEntry *ent,
1028 const struct GNUNET_FS_Uri *uri) 901 const struct GNUNET_FS_Uri *uri)
1029{ 902{
1030 ent->uri = GNUNET_FS_uri_dup (uri); 903 ent->uri = GNUNET_FS_uri_dup (uri);
1031 return change_publish_colour (ent, 904 return change_publish_colour (ent, "green");
1032 "green");
1033} 905}
1034 906
1035 907
@@ -1038,12 +910,10 @@ handle_publish_completed (struct PublishEntry *ent,
1038 * Handle error. 910 * Handle error.
1039 */ 911 */
1040static struct PublishEntry * 912static struct PublishEntry *
1041handle_publish_error (struct PublishEntry *ent, 913handle_publish_error (struct PublishEntry *ent, const char *emsg)
1042 const char *emsg)
1043{ 914{
1044 GNUNET_break (0); 915 GNUNET_break (0);
1045 return change_publish_colour (ent, 916 return change_publish_colour (ent, "red");
1046 "red");
1047} 917}
1048 918
1049 919
@@ -1059,30 +929,30 @@ close_publish_tab (struct PublishEntry *ent)
1059 int i; 929 int i;
1060 930
1061 if (ent == NULL) 931 if (ent == NULL)
1062 { 932 {
1063 GNUNET_break (0); 933 GNUNET_break (0);
1064 return; 934 return;
1065 } 935 }
1066 gtk_tree_row_reference_free (ent->rr); 936 gtk_tree_row_reference_free (ent->rr);
1067 if (GNUNET_YES != ent->is_top) 937 if (GNUNET_YES != ent->is_top)
1068 { 938 {
1069 GNUNET_free (ent); 939 GNUNET_free (ent);
1070 return; 940 return;
1071 } 941 }
1072 tab = ent->tab; 942 tab = ent->tab;
1073 if (ent->uri != NULL) 943 if (ent->uri != NULL)
1074 GNUNET_FS_uri_destroy (ent->uri); 944 GNUNET_FS_uri_destroy (ent->uri);
1075 GNUNET_free (ent); 945 GNUNET_free (ent);
1076 notebook = GTK_NOTEBOOK (GNUNET_FS_GTK_get_main_window_object ("GNUNET_GTK_main_window_notebook")); 946 notebook =
947 GTK_NOTEBOOK (GNUNET_FS_GTK_get_main_window_object
948 ("GNUNET_GTK_main_window_notebook"));
1077 index = -1; 949 index = -1;
1078 for (i = gtk_notebook_get_n_pages (notebook) - 1; i >= 0; i--) 950 for (i = gtk_notebook_get_n_pages (notebook) - 1; i >= 0; i--)
1079 if (tab->frame == gtk_notebook_get_nth_page (notebook, i)) 951 if (tab->frame == gtk_notebook_get_nth_page (notebook, i))
1080 index = i; 952 index = i;
1081 gtk_notebook_remove_page (notebook, index); 953 gtk_notebook_remove_page (notebook, index);
1082 g_object_unref (tab->builder); 954 g_object_unref (tab->builder);
1083 GNUNET_CONTAINER_DLL_remove (publish_tab_head, 955 GNUNET_CONTAINER_DLL_remove (publish_tab_head, publish_tab_tail, tab);
1084 publish_tab_tail,
1085 tab);
1086 GNUNET_free (tab); 956 GNUNET_free (tab);
1087} 957}
1088 958
@@ -1091,15 +961,15 @@ close_publish_tab (struct PublishEntry *ent)
1091 * Tell FS to stop a search. 961 * Tell FS to stop a search.
1092 */ 962 */
1093static void 963static void
1094stop_search (GtkButton *button, 964stop_search (GtkButton * button, gpointer user_data)
1095 gpointer user_data)
1096{ 965{
1097 struct SearchTab *tab = user_data; 966 struct SearchTab *tab = user_data;
967
1098 if (tab->sc != NULL) 968 if (tab->sc != NULL)
1099 { 969 {
1100 GNUNET_FS_search_stop (tab->sc); 970 GNUNET_FS_search_stop (tab->sc);
1101 tab->sc = NULL; 971 tab->sc = NULL;
1102 } 972 }
1103} 973}
1104 974
1105 975
@@ -1111,8 +981,7 @@ stop_search (GtkButton *button,
1111 * the tab should be closed. 981 * the tab should be closed.
1112 */ 982 */
1113static void 983static void
1114clear_downloads (GtkButton *button, 984clear_downloads (GtkButton * button, gpointer user_data)
1115 gpointer user_data)
1116{ 985{
1117 struct SearchTab *tab = user_data; 986 struct SearchTab *tab = user_data;
1118 struct SearchResult *sr; 987 struct SearchResult *sr;
@@ -1123,15 +992,11 @@ clear_downloads (GtkButton *button,
1123 if (TRUE != gtk_tree_model_get_iter_first (tm, &iter)) 992 if (TRUE != gtk_tree_model_get_iter_first (tm, &iter))
1124 return; 993 return;
1125 do 994 do
1126 { 995 {
1127 gtk_tree_model_get (tm, &iter, 996 gtk_tree_model_get (tm, &iter, 9, &sr, -1);
1128 9, &sr, 997 if ((sr->download != NULL) && (sr->download->is_done == GNUNET_YES))
1129 -1); 998 GNUNET_FS_download_stop (sr->download->dc, GNUNET_YES);
1130 if ( (sr->download != NULL) && 999 }
1131 (sr->download->is_done == GNUNET_YES) )
1132 GNUNET_FS_download_stop (sr->download->dc,
1133 GNUNET_YES);
1134 }
1135 while (TRUE == gtk_tree_model_iter_next (tm, &iter)); 1000 while (TRUE == gtk_tree_model_iter_next (tm, &iter));
1136} 1001}
1137 1002
@@ -1141,16 +1006,16 @@ clear_downloads (GtkButton *button,
1141 * Tell FS to pause a search. 1006 * Tell FS to pause a search.
1142 */ 1007 */
1143static void 1008static void
1144pause_search (GtkButton *button, 1009pause_search (GtkButton * button, gpointer user_data)
1145 gpointer user_data)
1146{ 1010{
1147 struct SearchTab *tab = user_data; 1011 struct SearchTab *tab = user_data;
1012
1148 if (tab->sc != NULL) 1013 if (tab->sc != NULL)
1149 { 1014 {
1150 GNUNET_FS_search_pause (tab->sc); 1015 GNUNET_FS_search_pause (tab->sc);
1151 gtk_widget_show (tab->play_button); 1016 gtk_widget_show (tab->play_button);
1152 gtk_widget_hide (tab->pause_button); 1017 gtk_widget_hide (tab->pause_button);
1153 } 1018 }
1154} 1019}
1155 1020
1156 1021
@@ -1158,16 +1023,16 @@ pause_search (GtkButton *button,
1158 * Tell FS to resume a search. 1023 * Tell FS to resume a search.
1159 */ 1024 */
1160static void 1025static void
1161continue_search (GtkButton *button, 1026continue_search (GtkButton * button, gpointer user_data)
1162 gpointer user_data)
1163{ 1027{
1164 struct SearchTab *tab = user_data; 1028 struct SearchTab *tab = user_data;
1029
1165 if (tab->sc != NULL) 1030 if (tab->sc != NULL)
1166 { 1031 {
1167 GNUNET_FS_search_continue (tab->sc); 1032 GNUNET_FS_search_continue (tab->sc);
1168 gtk_widget_show (tab->pause_button); 1033 gtk_widget_show (tab->pause_button);
1169 gtk_widget_hide (tab->play_button); 1034 gtk_widget_hide (tab->play_button);
1170 } 1035 }
1171} 1036}
1172 1037
1173 1038
@@ -1180,7 +1045,7 @@ continue_search (GtkButton *button,
1180 */ 1045 */
1181static struct SearchTab * 1046static struct SearchTab *
1182setup_search (struct GNUNET_FS_SearchContext *sc, 1047setup_search (struct GNUNET_FS_SearchContext *sc,
1183 const struct GNUNET_FS_Uri *query) 1048 const struct GNUNET_FS_Uri *query)
1184{ 1049{
1185 struct SearchTab *tab; 1050 struct SearchTab *tab;
1186 GtkTreeView *tv; 1051 GtkTreeView *tv;
@@ -1189,86 +1054,87 @@ setup_search (struct GNUNET_FS_SearchContext *sc,
1189 gint pages; 1054 gint pages;
1190 1055
1191 tab = GNUNET_malloc (sizeof (struct SearchTab)); 1056 tab = GNUNET_malloc (sizeof (struct SearchTab));
1192 GNUNET_CONTAINER_DLL_insert (search_tab_head, 1057 GNUNET_CONTAINER_DLL_insert (search_tab_head, search_tab_tail, tab);
1193 search_tab_tail,
1194 tab);
1195 tab->sc = sc; 1058 tab->sc = sc;
1196 if (query == NULL) 1059 if (query == NULL)
1197 { 1060 {
1198 tab->query_txt = GNUNET_strdup ("*"); 1061 tab->query_txt = GNUNET_strdup ("*");
1199 } 1062 }
1200 else 1063 else
1201 { 1064 {
1202 if (GNUNET_FS_uri_test_ksk (query)) 1065 if (GNUNET_FS_uri_test_ksk (query))
1203 tab->query_txt = GNUNET_FS_uri_ksk_to_string_fancy (query); 1066 tab->query_txt = GNUNET_FS_uri_ksk_to_string_fancy (query);
1204 else 1067 else
1205 tab->query_txt = GNUNET_FS_uri_to_string (query); 1068 tab->query_txt = GNUNET_FS_uri_to_string (query);
1206 } 1069 }
1207 tab->builder = GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_search_tab.glade"); 1070 tab->builder = GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_search_tab.glade");
1208 tab->ts = GTK_TREE_STORE (gtk_builder_get_object (tab->builder, 1071 tab->ts =
1209 "GNUNET_GTK_file_sharing_result_tree_store")); 1072 GTK_TREE_STORE (gtk_builder_get_object
1073 (tab->builder,
1074 "GNUNET_GTK_file_sharing_result_tree_store"));
1210 /* load frame */ 1075 /* load frame */
1211 sf = GTK_WINDOW (gtk_builder_get_object (tab->builder, 1076 sf = GTK_WINDOW (gtk_builder_get_object
1212 "_search_result_frame_window")); 1077 (tab->builder, "_search_result_frame_window"));
1213 tab->frame = gtk_bin_get_child (GTK_BIN (sf)); 1078 tab->frame = gtk_bin_get_child (GTK_BIN (sf));
1214 gtk_widget_ref (tab->frame); 1079 gtk_widget_ref (tab->frame);
1215 gtk_container_remove (GTK_CONTAINER (sf), tab->frame); 1080 gtk_container_remove (GTK_CONTAINER (sf), tab->frame);
1216 gtk_widget_destroy (GTK_WIDGET (sf)); 1081 gtk_widget_destroy (GTK_WIDGET (sf));
1217 1082
1218 /* load tab_label */ 1083 /* load tab_label */
1219 sf = GTK_WINDOW (gtk_builder_get_object (tab->builder, 1084 sf = GTK_WINDOW (gtk_builder_get_object
1220 "_search_result_label_window")); 1085 (tab->builder, "_search_result_label_window"));
1221 tab->tab_label = gtk_bin_get_child (GTK_BIN (sf)); 1086 tab->tab_label = gtk_bin_get_child (GTK_BIN (sf));
1222 gtk_widget_ref (tab->tab_label); 1087 gtk_widget_ref (tab->tab_label);
1223 gtk_container_remove (GTK_CONTAINER (sf), tab->tab_label); 1088 gtk_container_remove (GTK_CONTAINER (sf), tab->tab_label);
1224 gtk_widget_destroy (GTK_WIDGET (sf)); 1089 gtk_widget_destroy (GTK_WIDGET (sf));
1225 1090
1226 /* get refs to widgets */ 1091 /* get refs to widgets */
1227 tab->label = GTK_LABEL (gtk_builder_get_object (tab->builder, 1092 tab->label =
1228 "_search_result_label_window_label")); 1093 GTK_LABEL (gtk_builder_get_object
1229 1094 (tab->builder, "_search_result_label_window_label"));
1230 tab->close_button = GTK_WIDGET (gtk_builder_get_object (tab->builder, 1095
1231 "_search_result_label_close_button")); 1096 tab->close_button =
1232 g_signal_connect(G_OBJECT(tab->close_button), "clicked", 1097 GTK_WIDGET (gtk_builder_get_object
1233 G_CALLBACK(stop_search), tab); 1098 (tab->builder, "_search_result_label_close_button"));
1234 tab->clear_button = GTK_WIDGET (gtk_builder_get_object (tab->builder, 1099 g_signal_connect (G_OBJECT (tab->close_button), "clicked",
1235 "_search_result_label_clear_button")); 1100 G_CALLBACK (stop_search), tab);
1236 g_signal_connect(G_OBJECT(tab->clear_button), "clicked", 1101 tab->clear_button =
1237 G_CALLBACK(clear_downloads), tab); 1102 GTK_WIDGET (gtk_builder_get_object
1238 tab->play_button = GTK_WIDGET (gtk_builder_get_object (tab->builder, 1103 (tab->builder, "_search_result_label_clear_button"));
1239 "_search_result_label_play_button")); 1104 g_signal_connect (G_OBJECT (tab->clear_button), "clicked",
1240 g_signal_connect(G_OBJECT(tab->play_button), "clicked", 1105 G_CALLBACK (clear_downloads), tab);
1241 G_CALLBACK(continue_search), tab); 1106 tab->play_button =
1242 tab->pause_button = GTK_WIDGET (gtk_builder_get_object (tab->builder, 1107 GTK_WIDGET (gtk_builder_get_object
1243 "_search_result_label_pause_button")); 1108 (tab->builder, "_search_result_label_play_button"));
1244 g_signal_connect(G_OBJECT(tab->pause_button), "clicked", 1109 g_signal_connect (G_OBJECT (tab->play_button), "clicked",
1245 G_CALLBACK(pause_search), tab); 1110 G_CALLBACK (continue_search), tab);
1111 tab->pause_button =
1112 GTK_WIDGET (gtk_builder_get_object
1113 (tab->builder, "_search_result_label_pause_button"));
1114 g_signal_connect (G_OBJECT (tab->pause_button), "clicked",
1115 G_CALLBACK (pause_search), tab);
1246 /* patch text */ 1116 /* patch text */
1247 update_search_label (tab); 1117 update_search_label (tab);
1248 1118
1249 /* add signal handlers */ 1119 /* add signal handlers */
1250 tv = GTK_TREE_VIEW (gtk_builder_get_object (tab->builder, 1120 tv = GTK_TREE_VIEW (gtk_builder_get_object
1251 "_search_result_frame")); 1121 (tab->builder, "_search_result_frame"));
1252 g_signal_connect(G_OBJECT(tv), "row-activated", 1122 g_signal_connect (G_OBJECT (tv), "row-activated", G_CALLBACK (start_download),
1253 G_CALLBACK(start_download), tab); 1123 tab);
1254 g_signal_connect(G_OBJECT(tv), "cursor-changed", 1124 g_signal_connect (G_OBJECT (tv), "cursor-changed",
1255 G_CALLBACK(update_meta_data_views), tab); 1125 G_CALLBACK (update_meta_data_views), tab);
1256 g_signal_connect (G_OBJECT(tv), 1126 g_signal_connect (G_OBJECT (tv), "button_press_event",
1257 "button_press_event", 1127 G_CALLBACK (search_list_on_menu), tab);
1258 G_CALLBACK(search_list_on_menu), 1128
1259 tab);
1260
1261 1129
1262 /* make visible */ 1130 /* make visible */
1263 notebook = GTK_NOTEBOOK (GNUNET_FS_GTK_get_main_window_object ("GNUNET_GTK_main_window_notebook")); 1131 notebook =
1132 GTK_NOTEBOOK (GNUNET_FS_GTK_get_main_window_object
1133 ("GNUNET_GTK_main_window_notebook"));
1264 pages = gtk_notebook_get_n_pages (notebook); 1134 pages = gtk_notebook_get_n_pages (notebook);
1265 gtk_notebook_insert_page (notebook, 1135 gtk_notebook_insert_page (notebook, tab->frame, tab->tab_label, pages - 1);
1266 tab->frame, 1136 gtk_notebook_set_current_page (notebook, pages - 1);
1267 tab->tab_label, 1137 gtk_widget_show (GTK_WIDGET (notebook));
1268 pages - 1);
1269 gtk_notebook_set_current_page (notebook,
1270 pages - 1);
1271 gtk_widget_show (GTK_WIDGET (notebook));
1272 return tab; 1138 return tab;
1273} 1139}
1274 1140
@@ -1282,7 +1148,7 @@ setup_search (struct GNUNET_FS_SearchContext *sc,
1282 */ 1148 */
1283static struct SearchTab * 1149static struct SearchTab *
1284setup_inner_search (struct GNUNET_FS_SearchContext *sc, 1150setup_inner_search (struct GNUNET_FS_SearchContext *sc,
1285 struct SearchResult *parent) 1151 struct SearchResult *parent)
1286{ 1152{
1287 struct SearchTab *ret; 1153 struct SearchTab *ret;
1288 1154
@@ -1316,13 +1182,12 @@ setup_inner_search (struct GNUNET_FS_SearchContext *sc,
1316 * @return entry for the search result 1182 * @return entry for the search result
1317 */ 1183 */
1318struct SearchResult * 1184struct SearchResult *
1319GNUNET_GTK_add_search_result (struct SearchTab *tab, 1185GNUNET_GTK_add_search_result (struct SearchTab *tab, GtkTreeIter * iter,
1320 GtkTreeIter *iter, 1186 GtkTreeRowReference * parent_rr,
1321 GtkTreeRowReference *parent_rr, 1187 const struct GNUNET_FS_Uri *uri,
1322 const struct GNUNET_FS_Uri *uri, 1188 const struct GNUNET_CONTAINER_MetaData *meta,
1323 const struct GNUNET_CONTAINER_MetaData *meta, 1189 struct GNUNET_FS_SearchResult *result,
1324 struct GNUNET_FS_SearchResult *result, 1190 uint32_t applicability_rank)
1325 uint32_t applicability_rank)
1326{ 1191{
1327 struct SearchResult *sr; 1192 struct SearchResult *sr;
1328 GtkTreePath *tp; 1193 GtkTreePath *tp;
@@ -1334,45 +1199,46 @@ GNUNET_GTK_add_search_result (struct SearchTab *tab,
1334 GtkTreeIter *pitr; 1199 GtkTreeIter *pitr;
1335 GtkTreeIter pmem; 1200 GtkTreeIter pmem;
1336 GtkTreePath *path; 1201 GtkTreePath *path;
1337 GtkTreeModel *tm; 1202 GtkTreeModel *tm;
1338 GtkTreeStore *ts; 1203 GtkTreeStore *ts;
1339 uint64_t fsize; 1204 uint64_t fsize;
1340 1205
1341 if ( (uri != NULL) && 1206 if ((uri != NULL) && (!GNUNET_FS_uri_test_loc (uri)) &&
1342 (!GNUNET_FS_uri_test_loc (uri)) && 1207 (!GNUNET_FS_uri_test_chk (uri)))
1343 (!GNUNET_FS_uri_test_chk (uri)) ) 1208 {
1344 { 1209 fsize = 0;
1345 fsize = 0; 1210 mime = GNUNET_strdup ("GNUnet namespace");
1346 mime = GNUNET_strdup ("GNUnet namespace"); 1211 status_colour = "lightgreen";
1347 status_colour = "lightgreen"; 1212 }
1348 }
1349 else if (uri != NULL) 1213 else if (uri != NULL)
1350 { 1214 {
1351 fsize = GNUNET_FS_uri_chk_get_file_size (uri); 1215 fsize = GNUNET_FS_uri_chk_get_file_size (uri);
1352 mime = GNUNET_CONTAINER_meta_data_get_first_by_types (meta, 1216 mime =
1353 EXTRACTOR_METATYPE_MIMETYPE, 1217 GNUNET_CONTAINER_meta_data_get_first_by_types (meta,
1354 EXTRACTOR_METATYPE_FORMAT, 1218 EXTRACTOR_METATYPE_MIMETYPE,
1355 -1); 1219 EXTRACTOR_METATYPE_FORMAT,
1356 status_colour = "white"; 1220 -1);
1357 } 1221 status_colour = "white";
1222 }
1358 else 1223 else
1359 { 1224 {
1360 fsize = 0; 1225 fsize = 0;
1361 status_colour = "gray"; 1226 status_colour = "gray";
1362 mime = NULL; 1227 mime = NULL;
1363 } 1228 }
1364 desc = GNUNET_CONTAINER_meta_data_get_first_by_types (meta, 1229 desc =
1365 EXTRACTOR_METATYPE_PACKAGE_NAME, 1230 GNUNET_CONTAINER_meta_data_get_first_by_types (meta,
1366 EXTRACTOR_METATYPE_TITLE, 1231 EXTRACTOR_METATYPE_PACKAGE_NAME,
1367 EXTRACTOR_METATYPE_BOOK_TITLE, 1232 EXTRACTOR_METATYPE_TITLE,
1368 EXTRACTOR_METATYPE_FILENAME, 1233 EXTRACTOR_METATYPE_BOOK_TITLE,
1369 EXTRACTOR_METATYPE_DESCRIPTION, 1234 EXTRACTOR_METATYPE_FILENAME,
1370 EXTRACTOR_METATYPE_SUMMARY, 1235 EXTRACTOR_METATYPE_DESCRIPTION,
1371 EXTRACTOR_METATYPE_ALBUM, 1236 EXTRACTOR_METATYPE_SUMMARY,
1372 EXTRACTOR_METATYPE_COMMENT, 1237 EXTRACTOR_METATYPE_ALBUM,
1373 EXTRACTOR_METATYPE_SUBJECT, 1238 EXTRACTOR_METATYPE_COMMENT,
1374 EXTRACTOR_METATYPE_KEYWORDS, 1239 EXTRACTOR_METATYPE_SUBJECT,
1375 -1); 1240 EXTRACTOR_METATYPE_KEYWORDS,
1241 -1);
1376 if (desc == NULL) 1242 if (desc == NULL)
1377 desc = GNUNET_strdup (_("no description supplied")); 1243 desc = GNUNET_strdup (_("no description supplied"));
1378 if (uri == NULL) 1244 if (uri == NULL)
@@ -1385,85 +1251,76 @@ GNUNET_GTK_add_search_result (struct SearchTab *tab,
1385 sr->result = result; 1251 sr->result = result;
1386 sr->tab = tab; 1252 sr->tab = tab;
1387 if (parent_rr != NULL) 1253 if (parent_rr != NULL)
1254 {
1255 /* get piter from parent */
1256 path = gtk_tree_row_reference_get_path (parent_rr);
1257 tm = gtk_tree_row_reference_get_model (parent_rr);
1258 if (TRUE != gtk_tree_model_get_iter (GTK_TREE_MODEL (tm), &pmem, path))
1388 { 1259 {
1389 /* get piter from parent */ 1260 GNUNET_break (0);
1390 path = gtk_tree_row_reference_get_path (parent_rr); 1261 gtk_tree_path_free (path);
1391 tm = gtk_tree_row_reference_get_model (parent_rr); 1262 /* desperate measure: make top-level entry */
1392 if (TRUE != gtk_tree_model_get_iter (GTK_TREE_MODEL (tm),
1393 &pmem, path))
1394 {
1395 GNUNET_break (0);
1396 gtk_tree_path_free (path);
1397 /* desperate measure: make top-level entry */
1398 pitr = NULL;
1399 }
1400 else
1401 {
1402 pitr = &pmem;
1403 }
1404 ts = GTK_TREE_STORE (tm);
1405 }
1406 else
1407 {
1408 /* top-level result */
1409 pitr = NULL; 1263 pitr = NULL;
1410 ts = tab->ts;
1411 } 1264 }
1412 gtk_tree_store_insert_with_values (ts, 1265 else
1413 iter,
1414 pitr,
1415 G_MAXINT,
1416 0, GNUNET_CONTAINER_meta_data_duplicate (meta),
1417 1, (uri == NULL) ? NULL : GNUNET_FS_uri_dup (uri),
1418 2, (uri == NULL) ? 0 : fsize,
1419 3, pixbuf /* preview */,
1420 4, 0 /* percent progress */,
1421 5, 0 /* percent availability */,
1422 6, desc /* filename/description */,
1423 7, uris,
1424 8, status_colour,
1425 9, sr,
1426 10, mime,
1427 11, applicability_rank,
1428 12, 0 /* avail-cert */,
1429 13, 0 /* avail-rank */,
1430 -1);
1431 if (tab != NULL)
1432 { 1266 {
1433 while (tab->parent != NULL) 1267 pitr = &pmem;
1434 tab = tab->parent->tab;
1435 tab->num_results++;
1436 } 1268 }
1269 ts = GTK_TREE_STORE (tm);
1270 }
1271 else
1272 {
1273 /* top-level result */
1274 pitr = NULL;
1275 ts = tab->ts;
1276 }
1277 gtk_tree_store_insert_with_values (ts, iter, pitr, G_MAXINT, 0,
1278 GNUNET_CONTAINER_meta_data_duplicate
1279 (meta), 1,
1280 (uri ==
1281 NULL) ? NULL : GNUNET_FS_uri_dup (uri), 2,
1282 (uri == NULL) ? 0 : fsize, 3,
1283 pixbuf /* preview */ ,
1284 4, 0 /* percent progress */ ,
1285 5, 0 /* percent availability */ ,
1286 6, desc /* filename/description */ ,
1287 7, uris, 8, status_colour, 9, sr, 10, mime,
1288 11, applicability_rank, 12,
1289 0 /* avail-cert */ ,
1290 13, 0 /* avail-rank */ ,
1291 -1);
1292 if (tab != NULL)
1293 {
1294 while (tab->parent != NULL)
1295 tab = tab->parent->tab;
1296 tab->num_results++;
1297 }
1437 if (pixbuf != NULL) 1298 if (pixbuf != NULL)
1438 g_object_unref (pixbuf); 1299 g_object_unref (pixbuf);
1439 GNUNET_free (uris); 1300 GNUNET_free (uris);
1440 GNUNET_free (desc); 1301 GNUNET_free (desc);
1441 GNUNET_free_non_null (mime); 1302 GNUNET_free_non_null (mime);
1442 tp = gtk_tree_model_get_path (GTK_TREE_MODEL (ts), 1303 tp = gtk_tree_model_get_path (GTK_TREE_MODEL (ts), iter);
1443 iter); 1304 sr->rr = gtk_tree_row_reference_new (GTK_TREE_MODEL (ts), tp);
1444 sr->rr = gtk_tree_row_reference_new (GTK_TREE_MODEL (ts),
1445 tp);
1446 gtk_tree_path_free (tp); 1305 gtk_tree_path_free (tp);
1447 return sr; 1306 return sr;
1448} 1307}
1449 1308
1450 1309
1451static struct SearchResult * 1310static struct SearchResult *
1452process_search_result (void *cls, 1311process_search_result (void *cls, struct SearchResult *parent,
1453 struct SearchResult *parent, 1312 const struct GNUNET_FS_Uri *uri,
1454 const struct GNUNET_FS_Uri *uri, 1313 const struct GNUNET_CONTAINER_MetaData *meta,
1455 const struct GNUNET_CONTAINER_MetaData *meta, 1314 struct GNUNET_FS_SearchResult *result,
1456 struct GNUNET_FS_SearchResult *result, 1315 uint32_t applicability_rank)
1457 uint32_t applicability_rank)
1458{ 1316{
1459 struct SearchTab *tab = cls; 1317 struct SearchTab *tab = cls;
1460 struct SearchResult *sr; 1318 struct SearchResult *sr;
1461 GtkTreeIter iter; 1319 GtkTreeIter iter;
1462 1320
1463 sr = GNUNET_GTK_add_search_result (tab, &iter, 1321 sr = GNUNET_GTK_add_search_result (tab, &iter,
1464 (parent != NULL) ? parent->rr : NULL, 1322 (parent != NULL) ? parent->rr : NULL, uri,
1465 uri, 1323 meta, result, applicability_rank);
1466 meta, result, applicability_rank);
1467 update_search_label (tab); 1324 update_search_label (tab);
1468 return sr; 1325 return sr;
1469} 1326}
@@ -1480,10 +1337,9 @@ process_search_result (void *cls,
1480 * @return NULL on error, otherwise tree store matching iter