diff options
Diffstat (limited to 'src/plugins/fs/search.c')
-rw-r--r-- | src/plugins/fs/search.c | 129 |
1 files changed, 128 insertions, 1 deletions
diff --git a/src/plugins/fs/search.c b/src/plugins/fs/search.c index d1e5676a..a851b6cb 100644 --- a/src/plugins/fs/search.c +++ b/src/plugins/fs/search.c | |||
@@ -203,6 +203,123 @@ on_search_copy_uri_activate(void * cls, | |||
203 | return FALSE; | 203 | return FALSE; |
204 | } | 204 | } |
205 | 205 | ||
206 | |||
207 | #ifndef MINGW | ||
208 | static char * | ||
209 | selectFile() { | ||
210 | GladeXML * uploadXML; | ||
211 | GtkFileChooser * dialog; | ||
212 | char * ret; | ||
213 | |||
214 | uploadXML | ||
215 | = glade_xml_new(getGladeFileName(), | ||
216 | "directorySaveDialog", | ||
217 | PACKAGE_NAME); | ||
218 | connectGladeWithPlugins(uploadXML); | ||
219 | dialog = GTK_FILE_CHOOSER(glade_xml_get_widget(uploadXML, | ||
220 | "directorySaveDialog")); | ||
221 | if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_CANCEL) | ||
222 | ret = gtk_file_chooser_get_filename(dialog); | ||
223 | else | ||
224 | ret = NULL; | ||
225 | gtk_widget_destroy(GTK_WIDGET(dialog)); | ||
226 | UNREF(uploadXML); | ||
227 | return ret; | ||
228 | } | ||
229 | |||
230 | #else /* MINGW */ | ||
231 | |||
232 | static char * | ||
233 | selectFile() { | ||
234 | return plibc_ChooseFile(_("Choose the name under which you want to save the search results."), | ||
235 | OFN_SHAREAWARE); | ||
236 | } | ||
237 | #endif /* MINGW */ | ||
238 | |||
239 | static int | ||
240 | on_save_search_activate(void * cls, | ||
241 | GtkWidget * searchEntry) { | ||
242 | SearchList * list = cls; | ||
243 | char * name; | ||
244 | char * directory; | ||
245 | unsigned long long dir_len; | ||
246 | unsigned int fis_size; | ||
247 | ECRS_FileInfo * fis; | ||
248 | struct ECRS_MetaData * meta; | ||
249 | GtkTreeModel * model; | ||
250 | GtkTreeIter iter; | ||
251 | unsigned int pos; | ||
252 | |||
253 | model = gtk_tree_view_get_model(list->treeview); | ||
254 | if (TRUE != gtk_tree_model_get_iter_first(model, &iter)) { | ||
255 | addLogEntry(_("No search results yet, cannot save!")); | ||
256 | return FALSE; | ||
257 | } | ||
258 | |||
259 | name = selectFile(""); | ||
260 | if (name == NULL) | ||
261 | return FALSE; | ||
262 | fis = NULL; | ||
263 | fis_size = 0; | ||
264 | GROW(fis, | ||
265 | fis_size, | ||
266 | list->resultsReceived); | ||
267 | pos = 0; | ||
268 | do { | ||
269 | if (pos == fis_size) | ||
270 | GROW(fis, | ||
271 | fis_size, | ||
272 | pos + 1); | ||
273 | gtk_tree_model_get(model, | ||
274 | &iter, | ||
275 | SEARCH_URI, &fis[pos].uri, | ||
276 | SEARCH_META, &fis[pos].meta, | ||
277 | -1); | ||
278 | pos++; | ||
279 | } while (gtk_tree_model_iter_next(model, | ||
280 | &iter)); | ||
281 | meta = ECRS_createMetaData(); | ||
282 | ECRS_addToMetaData(meta, | ||
283 | EXTRACTOR_KEYWORDS, | ||
284 | list->searchString); | ||
285 | ECRS_addToMetaData(meta, | ||
286 | EXTRACTOR_DESCRIPTION, | ||
287 | _("Saved search results")); | ||
288 | ECRS_addToMetaData(meta, | ||
289 | EXTRACTOR_SOFTWARE, | ||
290 | "gnunet-gtk"); | ||
291 | if (OK != ECRS_createDirectory(NULL, | ||
292 | &directory, | ||
293 | &dir_len, | ||
294 | fis_size, | ||
295 | fis, | ||
296 | meta)) { | ||
297 | addLogEntry(_("Internal error.")); | ||
298 | GE_BREAK(NULL, 0); | ||
299 | ECRS_freeMetaData(meta); | ||
300 | GROW(fis, | ||
301 | fis_size, | ||
302 | 0); | ||
303 | FREE(name); | ||
304 | return FALSE; | ||
305 | } | ||
306 | ECRS_freeMetaData(meta); | ||
307 | GROW(fis, | ||
308 | fis_size, | ||
309 | 0); | ||
310 | if (OK != disk_file_write(NULL, | ||
311 | name, | ||
312 | directory, | ||
313 | dir_len, | ||
314 | "644")) { | ||
315 | addLogEntry(_("Error writing file `%s'."), | ||
316 | name); | ||
317 | } | ||
318 | FREE(directory); | ||
319 | FREE(name); | ||
320 | return FALSE; | ||
321 | } | ||
322 | |||
206 | static gint | 323 | static gint |
207 | search_click_handler(void * cls, | 324 | search_click_handler(void * cls, |
208 | GdkEvent *event) { | 325 | GdkEvent *event) { |
@@ -220,6 +337,7 @@ search_click_handler(void * cls, | |||
220 | return FALSE; | 337 | return FALSE; |
221 | list->last_x = event_button->x; | 338 | list->last_x = event_button->x; |
222 | list->last_y = event_button->y; | 339 | list->last_y = event_button->y; |
340 | menu = GTK_MENU(gtk_menu_new()); | ||
223 | entry = gtk_menu_item_new_with_label(_("_Copy URI to Clipboard")); | 341 | entry = gtk_menu_item_new_with_label(_("_Copy URI to Clipboard")); |
224 | g_signal_connect_swapped (entry, | 342 | g_signal_connect_swapped (entry, |
225 | "activate", | 343 | "activate", |
@@ -228,7 +346,16 @@ search_click_handler(void * cls, | |||
228 | gtk_label_set_use_underline(GTK_LABEL(gtk_bin_get_child(GTK_BIN(entry))), | 346 | gtk_label_set_use_underline(GTK_LABEL(gtk_bin_get_child(GTK_BIN(entry))), |
229 | TRUE); | 347 | TRUE); |
230 | gtk_widget_show(entry); | 348 | gtk_widget_show(entry); |
231 | menu = GTK_MENU(gtk_menu_new()); | 349 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), |
350 | entry); | ||
351 | entry = gtk_menu_item_new_with_label(_("_Save results as directory")); | ||
352 | g_signal_connect_swapped (entry, | ||
353 | "activate", | ||
354 | G_CALLBACK(on_save_search_activate), | ||
355 | list); | ||
356 | gtk_label_set_use_underline(GTK_LABEL(gtk_bin_get_child(GTK_BIN(entry))), | ||
357 | TRUE); | ||
358 | gtk_widget_show(entry); | ||
232 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), | 359 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), |
233 | entry); | 360 | entry); |
234 | gtk_menu_popup (menu, | 361 | gtk_menu_popup (menu, |