aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/fs/search.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2007-07-10 09:01:06 +0000
committerChristian Grothoff <christian@grothoff.org>2007-07-10 09:01:06 +0000
commitce124c66c8aff19abaa695a16127a742050d01b4 (patch)
treeec813c1b394f5566655fa6ff52cfba45a14847d7 /src/plugins/fs/search.c
parentb2f6fe964b05c6995bcb50ebe29cf25f1c185f84 (diff)
downloadgnunet-gtk-ce124c66c8aff19abaa695a16127a742050d01b4.tar.gz
gnunet-gtk-ce124c66c8aff19abaa695a16127a742050d01b4.zip
indent
Diffstat (limited to 'src/plugins/fs/search.c')
-rw-r--r--src/plugins/fs/search.c1445
1 files changed, 681 insertions, 764 deletions
diff --git a/src/plugins/fs/search.c b/src/plugins/fs/search.c
index bd28425e..dc9600f7 100644
--- a/src/plugins/fs/search.c
+++ b/src/plugins/fs/search.c
@@ -39,18 +39,18 @@
39 * The user has edited the search entry. 39 * The user has edited the search entry.
40 * Update search button status. 40 * Update search button status.
41 */ 41 */
42static void on_fssearchSelectionChanged(gpointer signal, 42static void
43 gpointer cls) { 43on_fssearchSelectionChanged (gpointer signal, gpointer cls)
44 SearchList * list = cls; 44{
45 GtkTreeSelection * selection; 45 SearchList *list = cls;
46 GtkWidget * downloadButton; 46 GtkTreeSelection *selection;
47 47 GtkWidget *downloadButton;
48 selection = gtk_tree_view_get_selection(list->treeview); 48
49 downloadButton 49 selection = gtk_tree_view_get_selection (list->treeview);
50 = glade_xml_get_widget(list->searchXML, 50 downloadButton = glade_xml_get_widget (list->searchXML, "downloadButton");
51 "downloadButton"); 51 gtk_widget_set_sensitive (downloadButton,
52 gtk_widget_set_sensitive(downloadButton, 52 gtk_tree_selection_count_selected_rows (selection)
53 gtk_tree_selection_count_selected_rows(selection) > 0); 53 > 0);
54} 54}
55 55
56 56
@@ -60,84 +60,86 @@ static void on_fssearchSelectionChanged(gpointer signal,
60 * Update the number of results received for the given 60 * Update the number of results received for the given
61 * search in the summary and in the label of the tab. 61 * search in the summary and in the label of the tab.
62 */ 62 */
63static void updateSearchSummary(SearchList * searchContext) { 63static void
64 GtkTreePath * path; 64updateSearchSummary (SearchList * searchContext)
65{
66 GtkTreePath *path;
65 GtkTreeIter iter; 67 GtkTreeIter iter;
66 char * new_title; 68 char *new_title;
67 GtkLabel * label; 69 GtkLabel *label;
68 70
69 path = gtk_tree_row_reference_get_path(searchContext->summaryViewRowReference); 71 path =
70 if (TRUE != gtk_tree_model_get_iter(GTK_TREE_MODEL(search_summary), 72 gtk_tree_row_reference_get_path (searchContext->summaryViewRowReference);
71 &iter, 73 if (TRUE !=
72 path)) { 74 gtk_tree_model_get_iter (GTK_TREE_MODEL (search_summary), &iter, path))
73 GE_BREAK(ectx, 0); 75 {
74 return; 76 GE_BREAK (ectx, 0);
75 } 77 return;
76 gtk_tree_path_free(path); 78 }
77 gtk_list_store_set(search_summary, 79 gtk_tree_path_free (path);
78 &iter, 80 gtk_list_store_set (search_summary,
79 SEARCH_SUMMARY_RESULT_COUNT, searchContext->resultsReceived, 81 &iter,
80 -1); 82 SEARCH_SUMMARY_RESULT_COUNT,
83 searchContext->resultsReceived, -1);
84
81 85
82
83 86
84 /* update tab title with the number of results */ 87 /* update tab title with the number of results */
85 new_title = 88 new_title =
86 g_strdup_printf("%.*s%s (%u)", 89 g_strdup_printf ("%.*s%s (%u)",
87 20, 90 20,
88 searchContext->searchString, 91 searchContext->searchString,
89 strlen(searchContext->searchString) > 20 ? "..." : "", 92 strlen (searchContext->searchString) > 20 ? "..." : "",
90 searchContext->resultsReceived); 93 searchContext->resultsReceived);
91 label = GTK_LABEL(glade_xml_get_widget(searchContext->labelXML, 94 label = GTK_LABEL (glade_xml_get_widget (searchContext->labelXML,
92 "searchTabLabel")); 95 "searchTabLabel"));
93 gtk_label_set(label, new_title); 96 gtk_label_set (label, new_title);
94 FREE(new_title); 97 FREE (new_title);
95} 98}
96 99
97/** 100/**
98 * Add the given search result to the search 101 * Add the given search result to the search
99 * tree at the specified position. 102 * tree at the specified position.
100 */ 103 */
101void addEntryToSearchTree(SearchList * searchContext, 104void
102 DownloadList * downloadParent, 105addEntryToSearchTree (SearchList * searchContext,
103 const ECRS_FileInfo * info, 106 DownloadList * downloadParent,
104 GtkTreeIter * iter) { 107 const ECRS_FileInfo * info, GtkTreeIter * iter)
105 char * name; 108{
106 char * mime; 109 char *name;
107 char * desc; 110 char *mime;
111 char *desc;
108 unsigned long long size; 112 unsigned long long size;
109 char * size_h; 113 char *size_h;
110 GdkPixbuf * pixbuf; 114 GdkPixbuf *pixbuf;
111 enum URITRACK_STATE state; 115 enum URITRACK_STATE state;
112 116
113 state = URITRACK_getState(ectx, 117 state = URITRACK_getState (ectx, cfg, info->uri);
114 cfg, 118 mime = getMimeTypeFromMetaData (info->meta);
115 info->uri); 119 desc = getDescriptionFromMetaData (info->meta);
116 mime = getMimeTypeFromMetaData(info->meta); 120 name = getFileNameFromMetaData (info->meta);
117 desc = getDescriptionFromMetaData(info->meta); 121 size = ECRS_isFileUri (info->uri)
118 name = getFileNameFromMetaData(info->meta); 122 || ECRS_isLocationUri (info->uri) ? ECRS_fileSize (info->uri) : 0;
119 size = ECRS_isFileUri(info->uri) || ECRS_isLocationUri(info->uri) ? ECRS_fileSize(info->uri) : 0; 123 pixbuf = getThumbnailFromMetaData (info->meta);
120 pixbuf = getThumbnailFromMetaData(info->meta); 124 size_h = string_get_fancy_byte_size (size);
121 size_h = string_get_fancy_byte_size(size); 125 gtk_tree_store_set (searchContext->tree,
122 gtk_tree_store_set(searchContext->tree, 126 iter,
123 iter, 127 SEARCH_NAME, name,
124 SEARCH_NAME, name, 128 SEARCH_SIZE, size,
125 SEARCH_SIZE, size, 129 SEARCH_HSIZE, size_h,
126 SEARCH_HSIZE, size_h, 130 SEARCH_MIME, mime,
127 SEARCH_MIME, mime, 131 SEARCH_DESC, desc,
128 SEARCH_DESC, desc, 132 SEARCH_PIXBUF, pixbuf,
129 SEARCH_PIXBUF, pixbuf, 133 SEARCH_URI, ECRS_dupUri (info->uri),
130 SEARCH_URI, ECRS_dupUri(info->uri), 134 SEARCH_META, ECRS_dupMetaData (info->meta),
131 SEARCH_META, ECRS_dupMetaData(info->meta), 135 SEARCH_CELL_BG_COLOR, getColorCode (state),
132 SEARCH_CELL_BG_COLOR, getColorCode(state), 136 SEARCH_CELL_FG_COLOR, "black",
133 SEARCH_CELL_FG_COLOR, "black", 137 SEARCH_INTERNAL, searchContext,
134 SEARCH_INTERNAL, searchContext, 138 SEARCH_INTERNAL_PARENT, downloadParent, -1);
135 SEARCH_INTERNAL_PARENT, downloadParent, 139 FREE (size_h);
136 -1); 140 FREE (name);
137 FREE(size_h); 141 FREE (desc);
138 FREE(name); 142 FREE (mime);
139 FREE(desc);
140 FREE(mime);
141} 143}
142 144
143/** 145/**
@@ -148,202 +150,173 @@ void addEntryToSearchTree(SearchList * searchContext,
148 * @param uri the search URI 150 * @param uri the search URI
149 * @param searchContext identifies the search page 151 * @param searchContext identifies the search page
150 */ 152 */
151void fs_search_result_received(SearchList * searchContext, 153void
152 const ECRS_FileInfo * info, 154fs_search_result_received (SearchList * searchContext,
153 const struct ECRS_URI * uri) { 155 const ECRS_FileInfo * info,
154 GtkTreeStore * model; 156 const struct ECRS_URI *uri)
157{
158 GtkTreeStore *model;
155 GtkTreeIter iter; 159 GtkTreeIter iter;
156 enum URITRACK_STATE state; 160 enum URITRACK_STATE state;
157 161
158 state = URITRACK_getState(ectx, 162 state = URITRACK_getState (ectx, cfg, info->uri);
159 cfg, 163 if ((state & (URITRACK_INSERTED |
160 info->uri); 164 URITRACK_INDEXED)) &&
161 if ( (state & (URITRACK_INSERTED | 165 (YES == GC_get_configuration_value_yesno (cfg,
162 URITRACK_INDEXED) ) && 166 "GNUNET-GTK",
163 (YES == GC_get_configuration_value_yesno(cfg, 167 "DISABLE-OWN", YES)))
164 "GNUNET-GTK",
165 "DISABLE-OWN",
166 YES)) )
167 return; 168 return;
168 model = GTK_TREE_STORE(gtk_tree_view_get_model(searchContext->treeview)); 169 model = GTK_TREE_STORE (gtk_tree_view_get_model (searchContext->treeview));
169 gtk_tree_store_append(model, 170 gtk_tree_store_append (model, &iter, NULL);
170 &iter, 171 addEntryToSearchTree (searchContext, NULL, info, &iter);
171 NULL);
172 addEntryToSearchTree(searchContext,
173 NULL,
174 info,
175 &iter);
176 searchContext->resultsReceived++; 172 searchContext->resultsReceived++;
177 updateSearchSummary(searchContext); 173 updateSearchSummary (searchContext);
178} 174}
179 175
180static int 176static int
181on_search_copy_uri_activate(void * cls, 177on_search_copy_uri_activate (void *cls, GtkWidget * searchEntry)
182 GtkWidget * searchEntry) { 178{
183 SearchList * list = cls; 179 SearchList *list = cls;
184 GtkTreePath *path; 180 GtkTreePath *path;
185 GtkTreeIter iter; 181 GtkTreeIter iter;
186 struct ECRS_URI * uri; 182 struct ECRS_URI *uri;
187 char * str; 183 char *str;
188 GtkClipboard * clip; 184 GtkClipboard *clip;
189 185
190 path = NULL; 186 path = NULL;
191 if (FALSE == gtk_tree_view_get_path_at_pos(list->treeview, 187 if (FALSE == gtk_tree_view_get_path_at_pos (list->treeview,
192 list->last_x, 188 list->last_x,
193 list->last_y, 189 list->last_y,
194 &path, 190 &path, NULL, NULL, NULL))
195 NULL, 191 {
196 NULL, 192 GE_BREAK (NULL, 0);
197 NULL)) { 193 return FALSE;
198 GE_BREAK(NULL, 0); 194 }
199 return FALSE; 195 if (FALSE == gtk_tree_model_get_iter (GTK_TREE_MODEL (list->tree),
200 } 196 &iter, path))
201 if (FALSE == gtk_tree_model_get_iter(GTK_TREE_MODEL(list->tree), 197 {
202 &iter, 198 GE_BREAK (NULL, 0);
203 path)) { 199 gtk_tree_path_free (path);
204 GE_BREAK(NULL, 0); 200 return FALSE;
205 gtk_tree_path_free(path); 201 }
206 return FALSE; 202 gtk_tree_path_free (path);
207 }
208 gtk_tree_path_free(path);
209 uri = NULL; 203 uri = NULL;
210 gtk_tree_model_get(GTK_TREE_MODEL(list->tree), 204 gtk_tree_model_get (GTK_TREE_MODEL (list->tree),
211 &iter, 205 &iter, SEARCH_URI, &uri, -1);
212 SEARCH_URI, &uri, 206 str = ECRS_uriToString (uri);
213 -1); 207 clip = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
214 str = ECRS_uriToString(uri); 208 gtk_clipboard_set_text (clip, str, strlen (str));
215 clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); 209 FREE (str);
216 gtk_clipboard_set_text(clip,
217 str,
218 strlen(str));
219 FREE(str);
220 return FALSE; 210 return FALSE;
221} 211}
222 212
223 213
224#ifndef MINGW 214#ifndef MINGW
225static char * 215static char *
226selectFile() { 216selectFile ()
227 GladeXML * uploadXML; 217{
228 GtkFileChooser * dialog; 218 GladeXML *uploadXML;
229 char * ret; 219 GtkFileChooser *dialog;
220 char *ret;
230 221
231 uploadXML 222 uploadXML
232 = glade_xml_new(getGladeFileName(), 223 = glade_xml_new (getGladeFileName (),
233 "directorySaveDialog", 224 "directorySaveDialog", PACKAGE_NAME);
234 PACKAGE_NAME); 225 connectGladeWithPlugins (uploadXML);
235 connectGladeWithPlugins(uploadXML); 226 dialog = GTK_FILE_CHOOSER (glade_xml_get_widget (uploadXML,
236 dialog = GTK_FILE_CHOOSER(glade_xml_get_widget(uploadXML, 227 "directorySaveDialog"));
237 "directorySaveDialog")); 228 if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_CANCEL)
238 if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_CANCEL) 229 ret = gtk_file_chooser_get_filename (dialog);
239 ret = gtk_file_chooser_get_filename(dialog);
240 else 230 else
241 ret = NULL; 231 ret = NULL;
242 gtk_widget_destroy(GTK_WIDGET(dialog)); 232 gtk_widget_destroy (GTK_WIDGET (dialog));
243 UNREF(uploadXML); 233 UNREF (uploadXML);
244 return ret; 234 return ret;
245} 235}
246 236
247#else /* MINGW */ 237#else /* MINGW */
248 238
249static char * 239static char *
250selectFile() { 240selectFile ()
251 return plibc_ChooseFile(_("Choose the name under which you want to save the search results."), 241{
252 OFN_SHAREAWARE); 242 return
243 plibc_ChooseFile (_
244 ("Choose the name under which you want to save the search results."),
245 OFN_SHAREAWARE);
253} 246}
254#endif /* MINGW */ 247#endif /* MINGW */
255 248
256static int 249static int
257on_save_search_activate(void * cls, 250on_save_search_activate (void *cls, GtkWidget * searchEntry)
258 GtkWidget * searchEntry) { 251{
259 SearchList * list = cls; 252 SearchList *list = cls;
260 char * name; 253 char *name;
261 char * directory; 254 char *directory;
262 unsigned long long dir_len; 255 unsigned long long dir_len;
263 unsigned int fis_size; 256 unsigned int fis_size;
264 ECRS_FileInfo * fis; 257 ECRS_FileInfo *fis;
265 struct ECRS_MetaData * meta; 258 struct ECRS_MetaData *meta;
266 GtkTreeModel * model; 259 GtkTreeModel *model;
267 GtkTreeIter iter; 260 GtkTreeIter iter;
268 unsigned int pos; 261 unsigned int pos;
269 262
270 model = gtk_tree_view_get_model(list->treeview); 263 model = gtk_tree_view_get_model (list->treeview);
271 if (TRUE != gtk_tree_model_get_iter_first(model, &iter)) { 264 if (TRUE != gtk_tree_model_get_iter_first (model, &iter))
272 addLogEntry(_("No search results yet, cannot save!")); 265 {
273 return FALSE; 266 addLogEntry (_("No search results yet, cannot save!"));
274 } 267 return FALSE;
268 }
275 269
276 name = selectFile(""); 270 name = selectFile ("");
277 if (name == NULL) 271 if (name == NULL)
278 return FALSE; 272 return FALSE;
279 fis = NULL; 273 fis = NULL;
280 fis_size = 0; 274 fis_size = 0;
281 GROW(fis, 275 GROW (fis, fis_size, list->resultsReceived);
282 fis_size,
283 list->resultsReceived);
284 pos = 0; 276 pos = 0;
285 do { 277 do
286 if (pos == fis_size) 278 {
287 GROW(fis, 279 if (pos == fis_size)
288 fis_size, 280 GROW (fis, fis_size, pos + 1);
289 pos + 1); 281 gtk_tree_model_get (model,
290 gtk_tree_model_get(model, 282 &iter,
291 &iter, 283 SEARCH_URI, &fis[pos].uri,
292 SEARCH_URI, &fis[pos].uri, 284 SEARCH_META, &fis[pos].meta, -1);
293 SEARCH_META, &fis[pos].meta, 285 pos++;
294 -1); 286 }
295 pos++; 287 while (gtk_tree_model_iter_next (model, &iter));
296 } while (gtk_tree_model_iter_next(model, 288 meta = ECRS_createMetaData ();
297 &iter)); 289 ECRS_addToMetaData (meta, EXTRACTOR_KEYWORDS, list->searchString);
298 meta = ECRS_createMetaData(); 290 ECRS_addToMetaData (meta, EXTRACTOR_DESCRIPTION, _("Saved search results"));
299 ECRS_addToMetaData(meta, 291 ECRS_addToMetaData (meta, EXTRACTOR_SOFTWARE, "gnunet-gtk");
300 EXTRACTOR_KEYWORDS, 292 if (OK != ECRS_createDirectory (NULL,
301 list->searchString); 293 &directory, &dir_len, fis_size, fis, meta))
302 ECRS_addToMetaData(meta, 294 {
303 EXTRACTOR_DESCRIPTION, 295 addLogEntry (_("Internal error."));
304 _("Saved search results")); 296 GE_BREAK (NULL, 0);
305 ECRS_addToMetaData(meta, 297 ECRS_freeMetaData (meta);
306 EXTRACTOR_SOFTWARE, 298 GROW (fis, fis_size, 0);
307 "gnunet-gtk"); 299 FREE (name);
308 if (OK != ECRS_createDirectory(NULL, 300 return FALSE;
309 &directory, 301 }
310 &dir_len, 302 ECRS_freeMetaData (meta);
311 fis_size, 303 GROW (fis, fis_size, 0);
312 fis, 304 if (OK != disk_file_write (NULL, name, directory, dir_len, "644"))
313 meta)) { 305 {
314 addLogEntry(_("Internal error.")); 306 addLogEntry (_("Error writing file `%s'."), name);
315 GE_BREAK(NULL, 0); 307 }
316 ECRS_freeMetaData(meta); 308 FREE (directory);
317 GROW(fis, 309 FREE (name);
318 fis_size,
319 0);
320 FREE(name);
321 return FALSE;
322 }
323 ECRS_freeMetaData(meta);
324 GROW(fis,
325 fis_size,
326 0);
327 if (OK != disk_file_write(NULL,
328 name,
329 directory,
330 dir_len,
331 "644")) {
332 addLogEntry(_("Error writing file `%s'."),
333 name);
334 }
335 FREE(directory);
336 FREE(name);
337 return FALSE; 310 return FALSE;
338} 311}
339 312
340static gint 313static gint
341search_click_handler(void * cls, 314search_click_handler (void *cls, GdkEvent * event)
342 GdkEvent *event) { 315{
343 SearchList * list = cls; 316 SearchList *list = cls;
344 GtkMenu * menu; 317 GtkMenu *menu;
345 GtkWidget * entry; 318 GtkWidget *entry;
346 GdkEventButton * event_button; 319 GdkEventButton *event_button;
347 320
348 g_return_val_if_fail (event != NULL, FALSE); 321 g_return_val_if_fail (event != NULL, FALSE);
349 322
@@ -354,34 +327,26 @@ search_click_handler(void * cls,
354 return FALSE; 327 return FALSE;
355 list->last_x = event_button->x; 328 list->last_x = event_button->x;
356 list->last_y = event_button->y; 329 list->last_y = event_button->y;
357 menu = GTK_MENU(gtk_menu_new()); 330 menu = GTK_MENU (gtk_menu_new ());
358 entry = gtk_menu_item_new_with_label(_("_Copy URI to Clipboard")); 331 entry = gtk_menu_item_new_with_label (_("_Copy URI to Clipboard"));
359 g_signal_connect_swapped (entry, 332 g_signal_connect_swapped (entry,
360 "activate", 333 "activate",
361 G_CALLBACK(on_search_copy_uri_activate), 334 G_CALLBACK (on_search_copy_uri_activate), list);
362 list); 335 gtk_label_set_use_underline (GTK_LABEL
363 gtk_label_set_use_underline(GTK_LABEL(gtk_bin_get_child(GTK_BIN(entry))), 336 (gtk_bin_get_child (GTK_BIN (entry))), TRUE);
364 TRUE); 337 gtk_widget_show (entry);
365 gtk_widget_show(entry); 338 gtk_menu_shell_append (GTK_MENU_SHELL (menu), entry);
366 gtk_menu_shell_append(GTK_MENU_SHELL(menu), 339 entry = gtk_menu_item_new_with_label (_("_Save results as directory"));
367 entry);
368 entry = gtk_menu_item_new_with_label(_("_Save results as directory"));
369 g_signal_connect_swapped (entry, 340 g_signal_connect_swapped (entry,
370 "activate", 341 "activate",
371 G_CALLBACK(on_save_search_activate), 342 G_CALLBACK (on_save_search_activate), list);
372 list); 343 gtk_label_set_use_underline (GTK_LABEL
373 gtk_label_set_use_underline(GTK_LABEL(gtk_bin_get_child(GTK_BIN(entry))), 344 (gtk_bin_get_child (GTK_BIN (entry))), TRUE);
374 TRUE); 345 gtk_widget_show (entry);
375 gtk_widget_show(entry); 346 gtk_menu_shell_append (GTK_MENU_SHELL (menu), entry);
376 gtk_menu_shell_append(GTK_MENU_SHELL(menu),
377 entry);
378 gtk_menu_popup (menu, 347 gtk_menu_popup (menu,
379 NULL, 348 NULL,
380 NULL, 349 NULL, NULL, NULL, event_button->button, event_button->time);
381 NULL,
382 NULL,
383 event_button->button,
384 event_button->time);
385 return TRUE; 350 return TRUE;
386} 351}
387 352
@@ -390,234 +355,195 @@ search_click_handler(void * cls,
390 * tab and add an entry to the summary. 355 * tab and add an entry to the summary.
391 */ 356 */
392SearchList * 357SearchList *
393fs_search_started(struct FSUI_SearchList * fsui_list, 358fs_search_started (struct FSUI_SearchList * fsui_list,
394 const struct ECRS_URI * uri, 359 const struct ECRS_URI * uri,
395 unsigned int anonymityLevel, 360 unsigned int anonymityLevel,
396 unsigned int resultCount, 361 unsigned int resultCount,
397 const ECRS_FileInfo * results, 362 const ECRS_FileInfo * results, FSUI_State state)
398 FSUI_State state) { 363{
399 SearchList * list; 364 SearchList *list;
400 gint pages; 365 gint pages;
401 char * description; 366 char *description;
402 const char * dhead; 367 const char *dhead;
403 GtkTreeViewColumn * column; 368 GtkTreeViewColumn *column;
404 GtkCellRenderer * renderer; 369 GtkCellRenderer *renderer;
405 GtkNotebook * notebook; 370 GtkNotebook *notebook;
406 GtkTreePath * path; 371 GtkTreePath *path;
407 GtkTreeIter iter; 372 GtkTreeIter iter;
408 int col; 373 int col;
409 int i; 374 int i;
410 375
411 description = ECRS_uriToString(uri); 376 description = ECRS_uriToString (uri);
412 if (description == NULL) { 377 if (description == NULL)
413 GE_BREAK(ectx, 0); 378 {
414 return NULL; 379 GE_BREAK (ectx, 0);
415 } 380 return NULL;
416 GE_ASSERT(ectx, 381 }
417 strlen(description) >= strlen(ECRS_URI_PREFIX)); 382 GE_ASSERT (ectx, strlen (description) >= strlen (ECRS_URI_PREFIX));
418 dhead = &description[strlen(ECRS_URI_PREFIX)]; 383 dhead = &description[strlen (ECRS_URI_PREFIX)];
419 if (0 == strncmp(dhead, 384 if (0 == strncmp (dhead, ECRS_SEARCH_INFIX, strlen (ECRS_SEARCH_INFIX)))
420 ECRS_SEARCH_INFIX, 385 dhead = &dhead[strlen (ECRS_SEARCH_INFIX)];
421 strlen(ECRS_SEARCH_INFIX))) 386 else if (0 == strncmp (dhead,
422 dhead = &dhead[strlen(ECRS_SEARCH_INFIX)]; 387 ECRS_SUBSPACE_INFIX, strlen (ECRS_SUBSPACE_INFIX)))
423 else if (0 == strncmp(dhead, 388 dhead = &dhead[strlen (ECRS_SUBSPACE_INFIX)];
424 ECRS_SUBSPACE_INFIX, 389 list = MALLOC (sizeof (SearchList));
425 strlen(ECRS_SUBSPACE_INFIX))) 390 memset (list, 0, sizeof (SearchList));
426 dhead = &dhead[strlen(ECRS_SUBSPACE_INFIX)]; 391 list->searchString = STRDUP (dhead);
427 list 392 list->uri = ECRS_dupUri (uri);
428 = MALLOC(sizeof(SearchList)); 393 list->fsui_list = fsui_list;
429 memset(list, 394 list->next = search_head;
430 0,
431 sizeof(SearchList));
432 list->searchString
433 = STRDUP(dhead);
434 list->uri
435 = ECRS_dupUri(uri);
436 list->fsui_list
437 = fsui_list;
438 list->next
439 = search_head;
440 search_head = list; 395 search_head = list;
441 list->searchXML 396 list->searchXML
442 = glade_xml_new(getGladeFileName(), 397 = glade_xml_new (getGladeFileName (), "searchResultsFrame", PACKAGE_NAME);
443 "searchResultsFrame", 398 connectGladeWithPlugins (list->searchXML);
444 PACKAGE_NAME);
445 connectGladeWithPlugins(list->searchXML);
446 list->searchpage 399 list->searchpage
447 = extractMainWidgetFromWindow(list->searchXML, 400 = extractMainWidgetFromWindow (list->searchXML, "searchResultsFrame");
448 "searchResultsFrame");
449 /* setup tree view and renderers */ 401 /* setup tree view and renderers */
450 list->treeview = GTK_TREE_VIEW(glade_xml_get_widget(list->searchXML, 402 list->treeview = GTK_TREE_VIEW (glade_xml_get_widget (list->searchXML,
451 "searchResults")); 403 "searchResults"));
452 g_signal_connect_swapped (list->treeview, 404 g_signal_connect_swapped (list->treeview,
453 "button-press-event", 405 "button-press-event",
454 G_CALLBACK(search_click_handler), 406 G_CALLBACK (search_click_handler), list);
455 list); 407 list->tree = gtk_tree_store_new (SEARCH_NUM, G_TYPE_STRING, /* name */
456 list->tree = 408 G_TYPE_UINT64, /* size */
457 gtk_tree_store_new(SEARCH_NUM, 409 G_TYPE_STRING, /* human-readable size */
458 G_TYPE_STRING, /* name */ 410 G_TYPE_STRING, /* mime-type */
459 G_TYPE_UINT64, /* size */ 411 G_TYPE_STRING, /* meta-data (some) */
460 G_TYPE_STRING, /* human-readable size */ 412 GDK_TYPE_PIXBUF, /* preview */
461 G_TYPE_STRING, /* mime-type */ 413 G_TYPE_POINTER, /* url */
462 G_TYPE_STRING, /* meta-data (some) */ 414 G_TYPE_POINTER, /* meta */
463 GDK_TYPE_PIXBUF, /* preview */ 415 G_TYPE_STRING, /* bg-color */
464 G_TYPE_POINTER, /* url */ 416 G_TYPE_STRING, /* fg-color */
465 G_TYPE_POINTER, /* meta */ 417 G_TYPE_POINTER, /* internal: search list */
466 G_TYPE_STRING, /* bg-color */ 418 G_TYPE_POINTER); /* internal: download parent list */
467 G_TYPE_STRING, /* fg-color */ 419
468 G_TYPE_POINTER, /* internal: search list */ 420 gtk_tree_view_set_model (list->treeview, GTK_TREE_MODEL (list->tree));
469 G_TYPE_POINTER); /* internal: download parent list */ 421 gtk_tree_selection_set_mode (gtk_tree_view_get_selection (list->treeview),
470 422 GTK_SELECTION_MULTIPLE);
471 gtk_tree_view_set_model(list->treeview, 423
472 GTK_TREE_MODEL(list->tree)); 424 g_signal_connect_data (gtk_tree_view_get_selection (list->treeview),
473 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(list->treeview), 425 "changed",
474 GTK_SELECTION_MULTIPLE); 426 G_CALLBACK (&on_fssearchSelectionChanged),
475 427 list, NULL, 0);
476 g_signal_connect_data(gtk_tree_view_get_selection(list->treeview), 428 renderer = gtk_cell_renderer_text_new ();
477 "changed", 429 col = gtk_tree_view_insert_column_with_attributes (list->treeview,
478 G_CALLBACK(&on_fssearchSelectionChanged), 430 -1,
479 list, 431 _("Name"),
480 NULL, 432 renderer,
481 0); 433 "text", SEARCH_NAME,
482 renderer = gtk_cell_renderer_text_new(); 434 NULL);
483 col = gtk_tree_view_insert_column_with_attributes(list->treeview, 435 g_object_set (G_OBJECT (renderer),
484 -1, 436 "wrap-width", 45,
485 _("Name"), 437 "width-chars", 45, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
486 renderer, 438 column = gtk_tree_view_get_column (list->treeview, col - 1);
487 "text", SEARCH_NAME, 439 gtk_tree_view_column_set_resizable (column, TRUE);
488 NULL); 440 gtk_tree_view_column_set_clickable (column, TRUE);
489 g_object_set(G_OBJECT(renderer), 441 gtk_tree_view_column_set_reorderable (column, TRUE);
490 "wrap-width", 45, 442 gtk_tree_view_column_set_sort_column_id (column, SEARCH_NAME);
491 "width-chars", 45, 443
492 "ellipsize", PANGO_ELLIPSIZE_END, 444 renderer = gtk_cell_renderer_text_new ();
493 NULL);
494 column = gtk_tree_view_get_column(list->treeview,
495 col - 1);
496 gtk_tree_view_column_set_resizable(column, TRUE);
497 gtk_tree_view_column_set_clickable(column, TRUE);
498 gtk_tree_view_column_set_reorderable(column, TRUE);
499 gtk_tree_view_column_set_sort_column_id(column, SEARCH_NAME);
500
501 renderer = gtk_cell_renderer_text_new();
502 g_object_set (renderer, "xalign", 1.00, NULL); 445 g_object_set (renderer, "xalign", 1.00, NULL);
503 col = gtk_tree_view_insert_column_with_attributes(list->treeview, 446 col = gtk_tree_view_insert_column_with_attributes (list->treeview,
504 -1, 447 -1,
505 _("Size"), 448 _("Size"),
506 renderer, 449 renderer,
507 "text", SEARCH_HSIZE, 450 "text", SEARCH_HSIZE,
508 "cell-background", SEARCH_CELL_BG_COLOR, 451 "cell-background",
509 "foreground", SEARCH_CELL_FG_COLOR, 452 SEARCH_CELL_BG_COLOR,
510 NULL); 453 "foreground",
511 column = gtk_tree_view_get_column(list->treeview, 454 SEARCH_CELL_FG_COLOR,
512 col - 1); 455 NULL);
513 gtk_tree_view_column_set_resizable(column, TRUE); 456 column = gtk_tree_view_get_column (list->treeview, col - 1);
514 gtk_tree_view_column_set_clickable(column, TRUE); 457 gtk_tree_view_column_set_resizable (column, TRUE);
515 gtk_tree_view_column_set_reorderable(column, TRUE); 458 gtk_tree_view_column_set_clickable (column, TRUE);
516 gtk_tree_view_column_set_sort_column_id(column, SEARCH_SIZE); 459 gtk_tree_view_column_set_reorderable (column, TRUE);
517 460 gtk_tree_view_column_set_sort_column_id (column, SEARCH_SIZE);
518 renderer = gtk_cell_renderer_text_new(); 461
519 col = gtk_tree_view_insert_column_with_attributes(list->treeview, 462 renderer = gtk_cell_renderer_text_new ();
520 -1, 463 col = gtk_tree_view_insert_column_with_attributes (list->treeview,
521 _("Mime-type"), 464 -1,
522 renderer, 465 _("Mime-type"),
523 "text", SEARCH_MIME, 466 renderer,
524 NULL); 467 "text", SEARCH_MIME,
525 g_object_set(G_OBJECT(renderer), 468 NULL);
526 "wrap-width", 30, 469 g_object_set (G_OBJECT (renderer),
527 "width-chars", 30, 470 "wrap-width", 30,
528 "ellipsize", PANGO_ELLIPSIZE_END, 471 "width-chars", 30, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
529 NULL); 472 column = gtk_tree_view_get_column (list->treeview, col - 1);
530 column = gtk_tree_view_get_column(list->treeview, 473 gtk_tree_view_column_set_resizable (column, TRUE);
531 col - 1); 474 gtk_tree_view_column_set_clickable (column, TRUE);
532 gtk_tree_view_column_set_resizable(column, TRUE); 475 gtk_tree_view_column_set_reorderable (column, TRUE);
533 gtk_tree_view_column_set_clickable(column, TRUE); 476 gtk_tree_view_column_set_sort_column_id (column, SEARCH_MIME);
534 gtk_tree_view_column_set_reorderable(column, TRUE); 477
535 gtk_tree_view_column_set_sort_column_id(column, SEARCH_MIME); 478 if (YES != GC_get_configuration_value_yesno (cfg,
536 479 "GNUNET-GTK",
537 if (YES != GC_get_configuration_value_yesno(cfg, 480 "DISABLE-PREVIEWS", NO))
538 "GNUNET-GTK", 481 {
539 "DISABLE-PREVIEWS", 482 renderer = gtk_cell_renderer_pixbuf_new ();
540 NO)) { 483 col = gtk_tree_view_insert_column_with_attributes (list->treeview,
541 renderer = gtk_cell_renderer_pixbuf_new(); 484 -1,
542 col = gtk_tree_view_insert_column_with_attributes(list->treeview, 485 _("Preview"),
543 -1, 486 renderer,
544 _("Preview"), 487 "pixbuf",
545 renderer, 488 SEARCH_PIXBUF, NULL);
546 "pixbuf", SEARCH_PIXBUF, 489 column = gtk_tree_view_get_column (list->treeview, col - 1);
547 NULL); 490 gtk_tree_view_column_set_resizable (column, TRUE);
548 column = gtk_tree_view_get_column(list->treeview, 491 gtk_tree_view_column_set_reorderable (column, TRUE);
549 col - 1); 492 gtk_tree_view_column_set_resizable (column, TRUE);
550 gtk_tree_view_column_set_resizable(column, TRUE); 493 }
551 gtk_tree_view_column_set_reorderable(column, TRUE); 494
552 gtk_tree_view_column_set_resizable(column, TRUE); 495 renderer = gtk_cell_renderer_text_new ();
553 } 496 col = gtk_tree_view_insert_column_with_attributes (list->treeview,
554 497 -1,
555 renderer = gtk_cell_renderer_text_new(); 498 _("Meta-data"),
556 col = gtk_tree_view_insert_column_with_attributes(list->treeview, 499 renderer,
557 -1, 500 "text", SEARCH_DESC,
558 _("Meta-data"), 501 NULL);
559 renderer, 502 column = gtk_tree_view_get_column (list->treeview, col - 1);
560 "text", SEARCH_DESC, 503 g_object_set (G_OBJECT (renderer),
561 NULL); 504 "wrap-width", 60,
562 column = gtk_tree_view_get_column(list->treeview, 505 "width-chars", 60,
563 col - 1); 506 "wrap-mode", PANGO_WRAP_WORD_CHAR,
564 g_object_set(G_OBJECT(renderer), 507 "ellipsize", PANGO_ELLIPSIZE_END,
565 "wrap-width", 60, 508 "ellipsize-set", TRUE, NULL);
566 "width-chars", 60, 509 gtk_tree_view_column_set_resizable (column, TRUE);
567 "wrap-mode", PANGO_WRAP_WORD_CHAR, 510 gtk_tree_view_column_set_clickable (column, TRUE);
568 "ellipsize", PANGO_ELLIPSIZE_END, 511 gtk_tree_view_column_set_reorderable (column, TRUE);
569 "ellipsize-set", TRUE, 512 gtk_tree_view_column_set_sort_column_id (column, SEARCH_DESC);
570 NULL);
571 gtk_tree_view_column_set_resizable(column, TRUE);
572 gtk_tree_view_column_set_clickable(column, TRUE);
573 gtk_tree_view_column_set_reorderable(column, TRUE);
574 gtk_tree_view_column_set_sort_column_id(column, SEARCH_DESC);
575 513
576 /* add entry in search summary */ 514 /* add entry in search summary */
577 gtk_list_store_append(search_summary, 515 gtk_list_store_append (search_summary, &iter);
578 &iter); 516 gtk_list_store_set (search_summary,
579 gtk_list_store_set(search_summary, 517 &iter,
580 &iter, 518 SEARCH_SUMMARY_NAME, dhead,
581 SEARCH_SUMMARY_NAME, dhead, 519 SEARCH_SUMMARY_RESULT_COUNT, 0,
582 SEARCH_SUMMARY_RESULT_COUNT, 0, 520 SEARCH_SUMMARY_INTERNAL, list, -1);
583 SEARCH_SUMMARY_INTERNAL, list, 521 FREE (description);
584 -1); 522 path = gtk_tree_model_get_path (GTK_TREE_MODEL (search_summary), &iter);
585 FREE(description);
586 path = gtk_tree_model_get_path(GTK_TREE_MODEL(search_summary),
587 &iter);
588 list->summaryViewRowReference 523 list->summaryViewRowReference
589 = gtk_tree_row_reference_new(GTK_TREE_MODEL(search_summary), 524 = gtk_tree_row_reference_new (GTK_TREE_MODEL (search_summary), path);
590 path); 525 gtk_tree_path_free (path);
591 gtk_tree_path_free(path);
592 526
593 /* load label */ 527 /* load label */
594 list->labelXML 528 list->labelXML
595 = glade_xml_new(getGladeFileName(), 529 = glade_xml_new (getGladeFileName (),
596 "searchTabLabelWindow", 530 "searchTabLabelWindow", PACKAGE_NAME);
597 PACKAGE_NAME); 531 connectGladeWithPlugins (list->labelXML);
598 connectGladeWithPlugins(list->labelXML);
599 list->tab_label 532 list->tab_label
600 = extractMainWidgetFromWindow(list->labelXML, 533 = extractMainWidgetFromWindow (list->labelXML, "searchTabLabelWindow");
601 "searchTabLabelWindow");
602 /* process existing results */ 534 /* process existing results */
603 for (i=0;i<resultCount;i++) 535 for (i = 0; i < resultCount; i++)
604 fs_search_result_received(list, 536 fs_search_result_received (list, &results[i], uri);
605 &results[i], 537 if (resultCount == 0) /* otherwise already done! */
606 uri); 538 updateSearchSummary (list);
607 if (resultCount == 0) /* otherwise already done! */
608 updateSearchSummary(list);
609 539
610 /* insert new page into search notebook */ 540 /* insert new page into search notebook */
611 notebook 541 notebook
612 = GTK_NOTEBOOK(glade_xml_get_widget(getMainXML(), 542 = GTK_NOTEBOOK (glade_xml_get_widget (getMainXML (), "downloadNotebook"));
613 "downloadNotebook")); 543 pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook));
614 pages = gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)); 544 gtk_notebook_append_page (notebook, list->searchpage, list->tab_label);
615 gtk_notebook_append_page(notebook, 545 gtk_notebook_set_current_page (notebook, pages);
616 list->searchpage, 546 gtk_widget_show (GTK_WIDGET (notebook)); /* may have been hidden! */
617 list->tab_label);
618 gtk_notebook_set_current_page(notebook,
619 pages);
620 gtk_widget_show(GTK_WIDGET(notebook)); /* may have been hidden! */
621 547
622 return list; 548 return list;
623} 549}
@@ -626,42 +552,38 @@ fs_search_started(struct FSUI_SearchList * fsui_list,
626 * Recursively free the (internal) model data fields 552 * Recursively free the (internal) model data fields
627 * (uri and meta) from the search tree model. 553 * (uri and meta) from the search tree model.
628 */ 554 */
629static void freeIterSubtree(GtkTreeModel * tree, 555static void
630 GtkTreeIter * iter) { 556freeIterSubtree (GtkTreeModel * tree, GtkTreeIter * iter)
557{
631 GtkTreeIter child; 558 GtkTreeIter child;
632 struct ECRS_URI * uri; 559 struct ECRS_URI *uri;
633 struct ECRS_MetaData * meta; 560 struct ECRS_MetaData *meta;
634 561
635 do { 562 do
636 uri = NULL; 563 {
637 meta = NULL; 564 uri = NULL;
638 gtk_tree_model_get(tree, 565 meta = NULL;
639 iter, 566 gtk_tree_model_get (tree,
640 SEARCH_URI, &uri, 567 iter, SEARCH_URI, &uri, SEARCH_META, &meta, -1);
641 SEARCH_META, &meta, 568 if (uri != NULL)
642 -1); 569 ECRS_freeUri (uri);
643 if (uri != NULL) 570 if (meta != NULL)
644 ECRS_freeUri(uri); 571 ECRS_freeMetaData (meta);
645 if (meta != NULL) 572 gtk_tree_store_set (GTK_TREE_STORE (tree),
646 ECRS_freeMetaData(meta); 573 iter, SEARCH_URI, NULL, SEARCH_META, NULL, -1);
647 gtk_tree_store_set(GTK_TREE_STORE(tree), 574 if (gtk_tree_model_iter_children (tree, &child, iter))
648 iter, 575 freeIterSubtree (tree, &child);
649 SEARCH_URI, NULL, 576 }
650 SEARCH_META, NULL, 577 while (gtk_tree_model_iter_next (tree, iter));
651 -1);
652 if (gtk_tree_model_iter_children(tree,
653 &child,
654 iter))
655 freeIterSubtree(tree, &child);
656 } while (gtk_tree_model_iter_next(tree,
657 iter));
658} 578}
659 579
660/** 580/**
661 * FSUI event: a search was aborted. 581 * FSUI event: a search was aborted.
662 * Update views accordingly. 582 * Update views accordingly.
663 */ 583 */
664void fs_search_aborted(SearchList * list) { 584void
585fs_search_aborted (SearchList * list)
586{
665 /* FIXME: show aborted status somehow! */ 587 /* FIXME: show aborted status somehow! */
666} 588}
667 589
@@ -669,69 +591,68 @@ void fs_search_aborted(SearchList * list) {
669 * FSUI event: a search was stopped. Remove the 591 * FSUI event: a search was stopped. Remove the
670 * respective tab and its entry in the summary. 592 * respective tab and its entry in the summary.
671 */ 593 */
672void fs_search_stopped(SearchList * list) { 594void
673 GtkNotebook * notebook; 595fs_search_stopped (SearchList * list)
596{
597 GtkNotebook *notebook;
674 GtkTreeIter iter; 598 GtkTreeIter iter;
675 SearchList * prev; 599 SearchList *prev;
676 DownloadList * downloads; 600 DownloadList *downloads;
677 GtkTreePath * path; 601 GtkTreePath *path;
678 int index; 602 int index;
679 int i; 603 int i;
680 604
681 /* remove from linked list */ 605 /* remove from linked list */
682 if (search_head == list) { 606 if (search_head == list)
683 search_head = search_head->next; 607 {
684 } else { 608 search_head = search_head->next;
685 prev = search_head; 609 }
686 while (prev->next != list) 610 else
687 prev = prev->next; 611 {
688 prev->next = list->next; 612 prev = search_head;
689 } 613 while (prev->next != list)
614 prev = prev->next;
615 prev->next = list->next;
616 }
690 617
691 /* remove links from download views */ 618 /* remove links from download views */
692 downloads = download_head; 619 downloads = download_head;
693 while (downloads != NULL) { 620 while (downloads != NULL)
694 if (downloads->searchList == list) { 621 {
695 gtk_tree_row_reference_free(downloads->searchViewRowReference); 622 if (downloads->searchList == list)
696 downloads->searchViewRowReference = NULL; 623 {
697 downloads->searchList = NULL; 624 gtk_tree_row_reference_free (downloads->searchViewRowReference);
625 downloads->searchViewRowReference = NULL;
626 downloads->searchList = NULL;
627 }
628 downloads = downloads->next;
698 } 629 }
699 downloads = downloads->next;
700 }
701 630
702 /* remove page from notebook */ 631 /* remove page from notebook */
703 notebook 632 notebook
704 = GTK_NOTEBOOK(glade_xml_get_widget(getMainXML(), 633 = GTK_NOTEBOOK (glade_xml_get_widget (getMainXML (), "downloadNotebook"));
705 "downloadNotebook"));
706 index = -1; 634 index = -1;
707 for (i=gtk_notebook_get_n_pages(notebook)-1;i>=0;i--) 635 for (i = gtk_notebook_get_n_pages (notebook) - 1; i >= 0; i--)
708 if (list->searchpage == gtk_notebook_get_nth_page(notebook, 636 if (list->searchpage == gtk_notebook_get_nth_page (notebook, i))
709 i))
710 index = i; 637 index = i;
711 GE_BREAK(ectx, index != -1); 638 GE_BREAK (ectx, index != -1);
712 gtk_notebook_remove_page(notebook, 639 gtk_notebook_remove_page (notebook, index);
713 index);
714 /* recursively free search model */ 640 /* recursively free search model */
715 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list->tree), 641 if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list->tree), &iter))
716 &iter)) 642 freeIterSubtree (GTK_TREE_MODEL (list->tree), &iter);
717 freeIterSubtree(GTK_TREE_MODEL(list->tree),
718 &iter);
719 643
720 /* destroy entry in summary */ 644 /* destroy entry in summary */
721 path = gtk_tree_row_reference_get_path(list->summaryViewRowReference); 645 path = gtk_tree_row_reference_get_path (list->summaryViewRowReference);
722 gtk_tree_model_get_iter(GTK_TREE_MODEL(search_summary), 646 gtk_tree_model_get_iter (GTK_TREE_MODEL (search_summary), &iter, path);
723 &iter, 647 gtk_tree_path_free (path);
724 path); 648 gtk_list_store_remove (search_summary, &iter);
725 gtk_tree_path_free(path);
726 gtk_list_store_remove(search_summary,
727 &iter);
728 /* free list state itself */ 649 /* free list state itself */
729 UNREF(list->searchXML); 650 UNREF (list->searchXML);
730 UNREF(list->labelXML); 651 UNREF (list->labelXML);
731 gtk_tree_row_reference_free(list->summaryViewRowReference); 652 gtk_tree_row_reference_free (list->summaryViewRowReference);
732 FREE(list->searchString); 653 FREE (list->searchString);
733 ECRS_freeUri(list->uri); 654 ECRS_freeUri (list->uri);
734 FREE(list); 655 FREE (list);
735} 656}
736 657
737/* ****************** User event handling ************* */ 658/* ****************** User event handling ************* */
@@ -741,34 +662,32 @@ void fs_search_stopped(SearchList * list) {
741 * The user has edited the search entry. 662 * The user has edited the search entry.
742 * Update search button status. 663 * Update search button status.
743 */ 664 */
744void on_fssearchKeywordComboBoxEntry_changed_fs(gpointer dummy2, 665void
745 GtkWidget * searchEntry) { 666on_fssearchKeywordComboBoxEntry_changed_fs (gpointer dummy2,
746 const char * searchString; 667 GtkWidget * searchEntry)
747 GtkWidget * searchButton; 668{
748 669 const char *searchString;
749 searchString = getEntryLineValue(getMainXML(), 670 GtkWidget *searchButton;
750 "fssearchKeywordComboBoxEntry"); 671
751 searchButton 672 searchString = getEntryLineValue (getMainXML (),
752 = glade_xml_get_widget(getMainXML(), 673 "fssearchKeywordComboBoxEntry");
753 "fssearchbutton"); 674 searchButton = glade_xml_get_widget (getMainXML (), "fssearchbutton");
754 gtk_widget_set_sensitive(searchButton, 675 gtk_widget_set_sensitive (searchButton, strlen (searchString) > 0);
755 strlen(searchString) > 0);
756} 676}
757 677
758typedef struct { 678typedef struct
679{
759 unsigned int anonymity; 680 unsigned int anonymity;
760 unsigned int max; 681 unsigned int max;
761 cron_t delay; 682 cron_t delay;
762 struct ECRS_URI * uri; 683 struct ECRS_URI *uri;
763} FSSS; 684} FSSS;
764 685
765static void * search_start_helper(void * cls) { 686static void *
766 FSSS * fsss = cls; 687search_start_helper (void *cls)
767 FSUI_startSearch(ctx, 688{
768 fsss->anonymity, 689 FSSS *fsss = cls;
769 fsss->max, 690 FSUI_startSearch (ctx, fsss->anonymity, fsss->max, fsss->delay, fsss->uri);
770 fsss->delay,
771 fsss->uri);
772 return NULL; 691 return NULL;
773} 692}
774 693
@@ -776,147 +695,146 @@ static void * search_start_helper(void * cls) {
776 * The user has clicked the "SEARCH" button. 695 * The user has clicked the "SEARCH" button.
777 * Initiate a search. 696 * Initiate a search.
778 */ 697 */
779void on_fssearchbutton_clicked_fs(gpointer dummy2, 698void
780 GtkWidget * searchButton) { 699on_fssearchbutton_clicked_fs (gpointer dummy2, GtkWidget * searchButton)
700{
781 FSSS fsss; 701 FSSS fsss;
782 const char * searchString; 702 const char *searchString;
783 gint pages; 703 gint pages;
784 gint i; 704 gint i;
785 SearchList * list; 705 SearchList *list;
786 GtkTreeIter iter; 706 GtkTreeIter iter;
787 GtkComboBox * searchKeywordGtkCB; 707 GtkComboBox *searchKeywordGtkCB;
788 GtkWidget * searchNamespaceGtkCB; 708 GtkWidget *searchNamespaceGtkCB;
789 GtkNotebook * notebook; 709 GtkNotebook *notebook;
790 710
791 searchString = getEntryLineValue(getMainXML(), 711 searchString = getEntryLineValue (getMainXML (),
792 "fssearchKeywordComboBoxEntry"); 712 "fssearchKeywordComboBoxEntry");
793 if ( (searchString == NULL) || 713 if ((searchString == NULL) || (strlen (searchString) == 0))
794 (strlen(searchString) == 0) ) { 714 {
795 GE_LOG(ectx, 715 GE_LOG (ectx,
796 GE_ERROR | GE_USER | GE_IMMEDIATE, 716 GE_ERROR | GE_USER | GE_IMMEDIATE,
797 _("Need a keyword to search!\n")); 717 _("Need a keyword to search!\n"));
798 return; 718 return;
799 } 719 }
800 /* add the keyword to the list of keywords that have 720 /* add the keyword to the list of keywords that have
801 been used so far */ 721 been used so far */
802 searchKeywordGtkCB 722 searchKeywordGtkCB
803 = GTK_COMBO_BOX(glade_xml_get_widget(getMainXML(), 723 = GTK_COMBO_BOX (glade_xml_get_widget (getMainXML (),
804 "fssearchKeywordComboBoxEntry")); 724 "fssearchKeywordComboBoxEntry"));
805 i = gtk_combo_box_get_active(searchKeywordGtkCB); 725 i = gtk_combo_box_get_active (searchKeywordGtkCB);
806 if (i == -1) { 726 if (i == -1)
807 GtkListStore * model; 727 {
808 728 GtkListStore *model;
809 model = GTK_LIST_STORE(gtk_combo_box_get_model(searchKeywordGtkCB)); 729
810 gtk_list_store_prepend(model, 730 model = GTK_LIST_STORE (gtk_combo_box_get_model (searchKeywordGtkCB));
811 &iter); 731 gtk_list_store_prepend (model, &iter);
812 gtk_list_store_set(model, 732 gtk_list_store_set (model, &iter, 0, searchString, -1);
813 &iter, 733 }
814 0, searchString,
815 -1);
816 }
817 fsss.uri = NULL; 734 fsss.uri = NULL;
818 /* check for namespace search */ 735 /* check for namespace search */
819 searchNamespaceGtkCB 736 searchNamespaceGtkCB
820 = glade_xml_get_widget(getMainXML(), 737 = glade_xml_get_widget (getMainXML (), "searchNamespaceComboBoxEntry");
821 "searchNamespaceComboBoxEntry"); 738 if (TRUE ==
822 if (TRUE == gtk_combo_box_get_active_iter(GTK_COMBO_BOX(searchNamespaceGtkCB), 739 gtk_combo_box_get_active_iter (GTK_COMBO_BOX (searchNamespaceGtkCB),
823 &iter)) { 740 &iter))
824 char * descStr; 741 {
825 char * ns; 742 char *descStr;
826 743 char *ns;
827 ns = NULL; 744
828 descStr = NULL;
829 gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(searchNamespaceGtkCB)),
830 &iter,
831 NS_SEARCH_DESCRIPTION, &descStr,
832 NS_SEARCH_ENCNAME, &ns,
833 -1);
834
835 if ( (descStr != NULL) &&
836 (0 == strcmp(descStr,
837 _("globally"))) ) {
838 ns = NULL; 745 ns = NULL;
839 } else { 746 descStr = NULL;
840 GE_ASSERT(ectx, strlen(ns) == sizeof(EncName) - 1); 747 gtk_tree_model_get (gtk_combo_box_get_model
841 if ( (descStr == NULL) && 748 (GTK_COMBO_BOX (searchNamespaceGtkCB)), &iter,
842 (ns != NULL) ) 749 NS_SEARCH_DESCRIPTION, &descStr, NS_SEARCH_ENCNAME,
843 descStr = STRDUP(ns); 750 &ns, -1);
751
752 if ((descStr != NULL) && (0 == strcmp (descStr, _("globally"))))
753 {
754 ns = NULL;
755 }
756 else
757 {
758 GE_ASSERT (ectx, strlen (ns) == sizeof (EncName) - 1);
759 if ((descStr == NULL) && (ns != NULL))
760 descStr = STRDUP (ns);
761 }
762 if (ns != NULL)
763 {
764 char *ustring;
765
766 ustring = MALLOC (strlen (searchString) + sizeof (EncName) +
767 strlen (ECRS_URI_PREFIX) +
768 strlen (ECRS_SUBSPACE_INFIX) + 10);
769 strcpy (ustring, ECRS_URI_PREFIX);
770 strcat (ustring, ECRS_SUBSPACE_INFIX);
771 strcat (ustring, ns);
772 strcat (ustring, "/");
773 strcat (ustring, searchString);
774 fsss.uri = ECRS_stringToUri (ectx, ustring);
775 if (fsss.uri == NULL)
776 {
777 GE_LOG (ectx,
778 GE_ERROR | GE_BULK | GE_USER,
779 _("Failed to create namespace URI from `%s'.\n"),
780 ustring);
781 }
782 FREE (ustring);
783 }
784 if (descStr != NULL)
785 free (descStr);
786 if (ns != NULL)
787 free (ns);
844 } 788 }
845 if (ns != NULL) {
846 char * ustring;
847
848 ustring = MALLOC(strlen(searchString) + sizeof(EncName) +
849 strlen(ECRS_URI_PREFIX) +
850 strlen(ECRS_SUBSPACE_INFIX) + 10);
851 strcpy(ustring, ECRS_URI_PREFIX);
852 strcat(ustring, ECRS_SUBSPACE_INFIX);
853 strcat(ustring, ns);
854 strcat(ustring, "/");
855 strcat(ustring, searchString);
856 fsss.uri = ECRS_stringToUri(ectx, ustring);
857 if (fsss.uri == NULL) {
858 GE_LOG(ectx,
859 GE_ERROR | GE_BULK | GE_USER,
860 _("Failed to create namespace URI from `%s'.\n"),
861 ustring);
862 }
863 FREE(ustring);
864 }
865 if (descStr != NULL)
866 free(descStr);
867 if (ns != NULL)
868 free(ns);
869 }
870 if (fsss.uri == NULL) 789 if (fsss.uri == NULL)
871 fsss.uri = ECRS_parseCharKeywordURI(ectx, searchString); 790 fsss.uri = ECRS_parseCharKeywordURI (ectx, searchString);
872 if (fsss.uri == NULL) { 791 if (fsss.uri == NULL)
873 GE_BREAK(ectx, 0); 792 {
874 return; 793 GE_BREAK (ectx, 0);
875 } 794 return;
795 }
876 /* check if search is already running */ 796 /* check if search is already running */
877 notebook 797 notebook
878 = GTK_NOTEBOOK(glade_xml_get_widget(getMainXML(), 798 = GTK_NOTEBOOK (glade_xml_get_widget (getMainXML (), "downloadNotebook"));
879 "downloadNotebook")); 799 pages = gtk_notebook_get_n_pages (notebook);
880 pages = gtk_notebook_get_n_pages(notebook);
881 list = search_head; 800 list = search_head;
882 while (list != NULL) { 801 while (list != NULL)
883 if (ECRS_equalsUri(list->uri, 802 {
884 fsss.uri)) { 803 if (ECRS_equalsUri (list->uri, fsss.uri))
885 for (i=0;i<pages;i++) { 804 {
886 if (gtk_notebook_get_nth_page(notebook, 805 for (i = 0; i < pages; i++)
887 i) 806 {
888 == list->searchpage) { 807 if (gtk_notebook_get_nth_page (notebook, i) == list->searchpage)
889 gtk_notebook_set_current_page(notebook, 808 {
890 i); 809 gtk_notebook_set_current_page (notebook, i);
891 ECRS_freeUri(fsss.uri); 810 ECRS_freeUri (fsss.uri);
892 return; 811 return;
893 } 812 }
894 } 813 }
895 GE_BREAK(ectx, 0); 814 GE_BREAK (ectx, 0);
815 }
816 list = list->next;
896 } 817 }
897 list = list->next; 818 fsss.anonymity = getSpinButtonValue (getMainXML (),
898 } 819 "searchAnonymitySelectionSpinButton");
899 fsss.anonymity = getSpinButtonValue(getMainXML(), 820 fsss.max = getSpinButtonValue (getMainXML (), "maxResultsSpinButton");
900 "searchAnonymitySelectionSpinButton"); 821 fsss.delay = getSpinButtonValue (getMainXML (),
901 fsss.max = getSpinButtonValue(getMainXML(), 822 "searchDelaySpinButton") * cronSECONDS;
902 "maxResultsSpinButton"); 823 run_with_save_calls (search_start_helper, &fsss);
903 fsss.delay = getSpinButtonValue(getMainXML(), 824 ECRS_freeUri (fsss.uri);
904 "searchDelaySpinButton") * cronSECONDS;
905 run_with_save_calls(search_start_helper,
906 &fsss);
907 ECRS_freeUri(fsss.uri);
908} 825}
909 826
910struct FCBC { 827struct FCBC
911 int (*method)(struct FSUI_Context * ctx, 828{
912 struct FSUI_SearchList * list); 829 int (*method) (struct FSUI_Context * ctx, struct FSUI_SearchList * list);
913 struct FSUI_SearchList * argument; 830 struct FSUI_SearchList *argument;
914}; 831};
915 832
916static void * fsui_callback(void * cls) { 833static void *
917 struct FCBC * fcbc = cls; 834fsui_callback (void *cls)
918 fcbc->method(ctx, 835{
919 fcbc->argument); 836 struct FCBC *fcbc = cls;
837 fcbc->method (ctx, fcbc->argument);
920 return NULL; 838 return NULL;
921} 839}
922 840
@@ -928,132 +846,131 @@ static void * fsui_callback(void * cls) {
928 * either refer to the main page in the tab or to the 846 * either refer to the main page in the tab or to the
929 * main entry of the tab label. 847 * main entry of the tab label.
930 */ 848 */
931void on_closeSearchButton_clicked_fs(GtkWidget * searchPage, 849void
932 GtkWidget * closeButton) { 850on_closeSearchButton_clicked_fs (GtkWidget * searchPage,
933 SearchList * list; 851 GtkWidget * closeButton)
852{
853 SearchList *list;
934 struct FCBC fcbc; 854 struct FCBC fcbc;
935 855
936 list = search_head; 856 list = search_head;
937 while (list != NULL) { 857 while (list != NULL)
938 if ( (list->searchpage == searchPage) || 858 {
939 (list->tab_label == searchPage) ) 859 if ((list->searchpage == searchPage) || (list->tab_label == searchPage))
940 break; 860 break;
941 list = list->next; 861 list = list->next;
942 } 862 }
943 GE_ASSERT(ectx, list != NULL); 863 GE_ASSERT (ectx, list != NULL);
944 if (list->fsui_list == NULL) { 864 if (list->fsui_list == NULL)
945 /* open directory - close directly */ 865 {
946 fs_search_stopped(list); 866 /* open directory - close directly */
947 } else { 867 fs_search_stopped (list);
948 /* actual search - close via FSUI */ 868 }
949 fcbc.method = &FSUI_abortSearch; 869 else
950 fcbc.argument = list->fsui_list; 870 {
951 run_with_save_calls(&fsui_callback, 871 /* actual search - close via FSUI */
952 &fcbc); 872 fcbc.method = &FSUI_abortSearch;
953 fcbc.method = &FSUI_stopSearch; 873 fcbc.argument = list->fsui_list;
954 run_with_save_calls(&fsui_callback, 874 run_with_save_calls (&fsui_callback, &fcbc);
955 &fcbc); 875 fcbc.method = &FSUI_stopSearch;
956 } 876 run_with_save_calls (&fsui_callback, &fcbc);
877 }
957} 878}
958 879
959/** 880/**
960 * The abort button was clicked. Abort the search. 881 * The abort button was clicked. Abort the search.
961 */ 882 */
962void on_abortSearchButton_clicked_fs(GtkWidget * searchPage, 883void
963 GtkWidget * closeButton) { 884on_abortSearchButton_clicked_fs (GtkWidget * searchPage,
964 SearchList * list; 885 GtkWidget * closeButton)
886{
887 SearchList *list;
965 struct FCBC fcbc; 888 struct FCBC fcbc;
966 889
967 list = search_head; 890 list = search_head;
968 while (list != NULL) { 891 while (list != NULL)
969 if (list->searchpage == searchPage) 892 {
970 break; 893 if (list->searchpage == searchPage)
971 list = list->next; 894 break;
972 } 895 list = list->next;
973 GE_ASSERT(ectx, list != NULL); 896 }
974 if (list->fsui_list != NULL) { 897 GE_ASSERT (ectx, list != NULL);
975 fcbc.method = &FSUI_abortSearch; 898 if (list->fsui_list != NULL)
976 fcbc.argument = list->fsui_list; 899 {
977 run_with_save_calls(&fsui_callback, 900 fcbc.method = &FSUI_abortSearch;
978 &fcbc); 901 fcbc.argument = list->fsui_list;
979 } 902 run_with_save_calls (&fsui_callback, &fcbc);
903 }
980} 904}
981 905
982static void stopSearch(GtkTreeModel * model, 906static void
983 GtkTreePath * path, 907stopSearch (GtkTreeModel * model,
984 GtkTreeIter * iter, 908 GtkTreePath * path, GtkTreeIter * iter, gpointer unused)
985 gpointer unused) { 909{
986 SearchList * s; 910 SearchList *s;
987 struct FCBC fcbc; 911 struct FCBC fcbc;
988 912
989 s = NULL; 913 s = NULL;
990 gtk_tree_model_get(model, 914 gtk_tree_model_get (model, iter, SEARCH_SUMMARY_INTERNAL, &s, -1);
991 iter, 915 if (s != NULL)
992 SEARCH_SUMMARY_INTERNAL, &s, 916 {
993 -1); 917 if (s->fsui_list == NULL)
994 if (s != NULL) { 918 {
995 if (s->fsui_list == NULL) { 919 /* open directory - close directly */
996 /* open directory - close directly */ 920 fs_search_stopped (s);
997 fs_search_stopped(s); 921 }
998 } else { 922 else
999 fcbc.method = &FSUI_abortSearch; 923 {
1000 fcbc.argument = s->fsui_list; 924 fcbc.method = &FSUI_abortSearch;
1001 run_with_save_calls(&fsui_callback, 925 fcbc.argument = s->fsui_list;
1002 &fcbc); 926 run_with_save_calls (&fsui_callback, &fcbc);
1003 fcbc.method = &FSUI_stopSearch; 927 fcbc.method = &FSUI_stopSearch;
1004 run_with_save_calls(&fsui_callback, 928 run_with_save_calls (&fsui_callback, &fcbc);
1005 &fcbc); 929 }
1006 } 930 }
1007 }
1008} 931}
1009 932
1010/** 933/**
1011 * The stop button in the search summary was clicked. 934 * The stop button in the search summary was clicked.
1012 */ 935 */
1013void on_closeSearchSummaryButton_clicked_fs(GtkWidget * treeview, 936void
1014 GtkWidget * closeButton) { 937on_closeSearchSummaryButton_clicked_fs (GtkWidget * treeview,
1015 GtkTreeSelection * selection; 938 GtkWidget * closeButton)
1016 939{
1017 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); 940 GtkTreeSelection *selection;
1018 ggc_tree_selection_selected_foreach 941
1019 (selection, 942 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
1020 &stopSearch, 943 ggc_tree_selection_selected_foreach (selection, &stopSearch, NULL);
1021 NULL);
1022} 944}
1023 945
1024static void abortSearch(GtkTreeModel * model, 946static void
1025 GtkTreePath * path, 947abortSearch (GtkTreeModel * model,
1026 GtkTreeIter * iter, 948 GtkTreePath * path, GtkTreeIter * iter, gpointer unused)
1027 gpointer unused) { 949{
1028 SearchList * s; 950 SearchList *s;
1029 struct FCBC fcbc; 951 struct FCBC fcbc;
1030 952
1031 s = NULL; 953 s = NULL;
1032 gtk_tree_model_get(model, 954 gtk_tree_model_get (model, iter, SEARCH_SUMMARY_INTERNAL, &s, -1);
1033 iter, 955 if ((s != NULL) && (s->fsui_list != NULL))
1034 SEARCH_SUMMARY_INTERNAL, &s, 956 {
1035 -1); 957 fcbc.method = &FSUI_abortSearch;
1036 if ( (s != NULL) && 958 fcbc.argument = s->fsui_list;
1037 (s->fsui_list != NULL) ) { 959 run_with_save_calls (&fsui_callback, &fcbc);
1038 fcbc.method = &FSUI_abortSearch; 960 }
1039 fcbc.argument = s->fsui_list;
1040 run_with_save_calls(&fsui_callback,
1041 &fcbc);
1042 }
1043} 961}
1044 962
1045/** 963/**
1046 * The abort button in the search summary was clicked. 964 * The abort button in the search summary was clicked.
1047 */ 965 */
1048void on_abortSearchSummaryButton_clicked_fs(GtkWidget * treeview, 966void
1049 GtkWidget * closeButton) { 967on_abortSearchSummaryButton_clicked_fs (GtkWidget * treeview,
1050 GtkTreeSelection * selection; 968 GtkWidget * closeButton)
1051 969{
1052 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); 970 GtkTreeSelection *selection;
1053 ggc_tree_selection_selected_foreach 971
1054 (selection, 972 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
1055 &abortSearch, 973 ggc_tree_selection_selected_foreach (selection, &abortSearch, NULL);
1056 NULL);
1057} 974}
1058 975
1059/* end of search.c */ 976/* end of search.c */