gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r3560 - in gnunet-gtk: . src/include src/plugins/daemon src


From: grothoff
Subject: [GNUnet-SVN] r3560 - in gnunet-gtk: . src/include src/plugins/daemon src/plugins/fs
Date: Sun, 29 Oct 2006 11:50:18 -0800 (PST)

Author: grothoff
Date: 2006-10-29 11:50:11 -0800 (Sun, 29 Oct 2006)
New Revision: 3560

Added:
   gnunet-gtk/src/plugins/fs/download.c
   gnunet-gtk/src/plugins/fs/download.h
Modified:
   gnunet-gtk/TODO
   gnunet-gtk/src/include/gnunetgtk_common.h
   gnunet-gtk/src/plugins/daemon/daemon.c
   gnunet-gtk/src/plugins/fs/Makefile.am
   gnunet-gtk/src/plugins/fs/fs.c
   gnunet-gtk/src/plugins/fs/fs.h
   gnunet-gtk/src/plugins/fs/meta.c
   gnunet-gtk/src/plugins/fs/search.c
   gnunet-gtk/src/plugins/fs/search.h
Log:
fixing compile errors

Modified: gnunet-gtk/TODO
===================================================================
--- gnunet-gtk/TODO     2006-10-29 06:16:00 UTC (rev 3559)
+++ gnunet-gtk/TODO     2006-10-29 19:50:11 UTC (rev 3560)
@@ -4,6 +4,7 @@
   * update event managements for upload
   * complete UI options processing for search and download and upload;
     including recursive download!
+  * fix thread context switching
   * test, test, test!
   * support abort of search/download/upload (without killing it)
   * check memory leaks!

Modified: gnunet-gtk/src/include/gnunetgtk_common.h
===================================================================
--- gnunet-gtk/src/include/gnunetgtk_common.h   2006-10-29 06:16:00 UTC (rev 
3559)
+++ gnunet-gtk/src/include/gnunetgtk_common.h   2006-10-29 19:50:11 UTC (rev 
3560)
@@ -27,6 +27,10 @@
 #ifndef GTKUI_HELPER_H
 #define GTKUI_HELPER_H
 
+#include <gtk/gtk.h>
+#include <gtk/gtktext.h>
+#include <glade/glade.h>
+
 #define DEBUG_GTK 0
 
 #if DEBUG_GTK
@@ -39,10 +43,6 @@
 #define DEBUG_END()
 #endif
 
-#ifndef DATADIR
-#include "datadir.h"
-#endif
-
 void initGNUnetGTKCommon(struct GE_Context * ectx,
                         struct GC_Configuration * cfg,
                         void * callback);

Modified: gnunet-gtk/src/plugins/daemon/daemon.c
===================================================================
--- gnunet-gtk/src/plugins/daemon/daemon.c      2006-10-29 06:16:00 UTC (rev 
3559)
+++ gnunet-gtk/src/plugins/daemon/daemon.c      2006-10-29 19:50:11 UTC (rev 
3560)
@@ -101,7 +101,7 @@
                           "applicationList");
   gtk_tree_view_set_model(GTK_TREE_VIEW(w),
                          GTK_TREE_MODEL(model));
-  
gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(searchList)),
+  gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(w)),
                              GTK_SELECTION_NONE);
   connection_destroy(sock);
 }

Modified: gnunet-gtk/src/plugins/fs/Makefile.am
===================================================================
--- gnunet-gtk/src/plugins/fs/Makefile.am       2006-10-29 06:16:00 UTC (rev 
3559)
+++ gnunet-gtk/src/plugins/fs/Makefile.am       2006-10-29 19:50:11 UTC (rev 
3560)
@@ -16,6 +16,7 @@
   meta.c meta.h \
   namespace.c namespace.h \
   search.c search.h \
+  download.c download.h \
   upload.c upload.h
 libgnunetgtkmodule_fs_la_LIBADD = \
   $(top_builddir)/src/common/libgnunetgtk_common.la \

Added: gnunet-gtk/src/plugins/fs/download.c
===================================================================
--- gnunet-gtk/src/plugins/fs/download.c        2006-10-29 06:16:00 UTC (rev 
3559)
+++ gnunet-gtk/src/plugins/fs/download.c        2006-10-29 19:50:11 UTC (rev 
3560)
@@ -0,0 +1,705 @@
+/*
+     This file is part of GNUnet.
+     (C) 2005, 2006 Christian Grothoff (and other contributing authors)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 2, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+
+/**
+ * @file src/plugins/fs/download.c
+ * @brief code for downloading with gnunet-gtk
+ * @author Christian Grothoff
+ */
+
+#include "fs.h"
+#include "search.h"
+#include "meta.h"
+#include "platform.h"
+
+/* ****************** FSUI download events ****************** */
+
+/**
+ * We are iterating over the contents of a 
+ * directory.  Add the list of entries to
+ * the search page at the position indicated
+ * by the download list.
+ */
+static int 
+addFilesToDirectory(const ECRS_FileInfo * fi,
+                   const HashCode512 * key,
+                   int isRoot,
+                   void * closure) {
+  DownloadList * list = closure;
+  GtkTreeIter iter;
+  GtkTreeIter child;
+  int i;
+  GtkTreePath * path;
+  GtkTreeModel * model;
+
+  if (isRoot == YES) 
+    return OK;
+  if (! gtk_tree_row_reference_valid(list->searchViewRowReference))
+    return SYSERR;
+  model = GTK_TREE_MODEL(list->searchList->tree);
+  path = gtk_tree_row_reference_get_path(list->searchViewRowReference);
+  gtk_tree_model_get_iter(model,
+                         &iter,
+                         path);
+  gtk_tree_path_free(path);
+  /* check for existing entry -- this function
+     maybe called multiple times for the same
+     directory entry */
+  for (i=gtk_tree_model_iter_n_children(model,
+                                       &iter)-1;i>=0;i--) {
+    if (TRUE == gtk_tree_model_iter_nth_child(model,
+                                             &child,
+                                             &iter,
+                                             i)) {
+      struct ECRS_URI * uri;
+      uri = NULL;
+      gtk_tree_model_get(model,
+                        &child,
+                        SEARCH_URI, &uri,
+                        -1);
+      if ( (uri != NULL) &&
+          (ECRS_equalsUri(uri,
+                          fi->uri)) )
+       return OK;
+    }
+  }
+  gtk_tree_store_append(GTK_TREE_STORE(model),
+                       &child,
+                       &iter);
+  addEntryToSearchTree(list->searchList,
+                      list,
+                      fi,
+                      &child);
+  return OK;
+}
+
+static void 
+refreshDirectoryViewFromDisk(DownloadList * list) {
+  unsigned long long size;
+  char * data;
+  int fd;
+  struct ECRS_MetaData * meta;
+
+  if ( (list->is_directory != YES) ||
+       (list->searchList == NULL) ||
+       (list->searchViewRowReference == NULL) ||
+       (! gtk_tree_row_reference_valid(list->searchViewRowReference)) )  
+    return;
+  
+  if (OK != disk_file_size(ectx,
+                          list->filename,
+                          &size,
+                          YES)) 
+    return;      
+  fd = disk_file_open(ectx,
+                     list->filename, 
+                     O_RDONLY);
+  if (fd == -1) 
+    return;
+  data = MMAP(NULL,
+             size,
+             PROT_READ,
+             MAP_SHARED,
+             fd,
+             0);
+  if ( (data == MAP_FAILED) ||
+       (data == NULL) ) {
+    GE_LOG_STRERROR_FILE(ectx,
+                        GE_ERROR | GE_ADMIN | GE_BULK,
+                        "mmap",
+                        list->filename);
+    CLOSE(fd);
+    return;
+  }
+  meta = NULL;
+  ECRS_listDirectory(ectx,
+                    data,
+                    size,
+                    &meta,
+                    &addFilesToDirectory,
+                    list);
+  MUNMAP(data, size);
+  CLOSE(fd);
+  if (meta != NULL)
+    ECRS_freeMetaData(meta);   
+}
+
+/**
+ * A download has been started.  Add an entry
+ * to the search tree view (if applicable) and
+ * the download summary.
+ */
+DownloadList *
+fs_download_started(struct FSUI_DownloadList * fsui_dl,
+                   DownloadList * dl_parent,
+                   SearchList * sl_parent,
+                   unsigned long long total,
+                   unsigned int anonymityLevel,
+                   const ECRS_FileInfo * fi,
+                   const char * filename,
+                   unsigned long long completed,
+                   cron_t eta) {
+  DownloadList * list;
+  GtkTreeIter iter;
+  GtkTreePath * path;
+  unsigned long long size;
+  char * size_h;
+  const char * sname;
+  int progress;
+  char * uri_name;
+  gboolean valid;
+  struct ECRS_URI * u;
+  
+  /* setup visualization */
+  list = MALLOC(sizeof(DownloadList));
+  memset(list,
+        0,
+        sizeof(DownloadList));
+  list->uri = ECRS_dupUri(fi->uri);
+  list->filename = STRDUP(filename);
+  /* FIXME: if we have dl_parent,
+     we may not want to just append! */
+  gtk_tree_store_append(download_summary,
+                       &iter,
+                        NULL);
+  size = ECRS_fileSize(fi->uri);
+  size_h = string_get_fancy_byte_size(size);
+  sname = &filename[strlen(filename)-1];
+  while ( (sname > filename) &&
+         (sname[-1] != '/') &&
+         (sname[-1] != '\\') )
+    sname--;
+  if (size != 0)
+    progress = completed * 100 / size;
+  else
+    progress = 100;
+  uri_name = ECRS_uriToString(fi->uri);
+  gtk_tree_store_set(download_summary,
+                     &iter,
+                     DOWNLOAD_FILENAME, filename,
+                     DOWNLOAD_SHORTNAME, sname,
+                     DOWNLOAD_SIZE, size,
+                    DOWNLOAD_HSIZE, size_h,
+                     DOWNLOAD_PROGRESS, progress,
+                     DOWNLOAD_URISTRING, uri_name,
+                    DOWNLOAD_INTERNAL, list, 
+                     -1);
+  FREE(uri_name);
+  FREE(size_h);
+  path = gtk_tree_model_get_path(GTK_TREE_MODEL(download_summary),
+                                &iter);
+  list->summaryViewRowReference
+    = gtk_tree_row_reference_new(GTK_TREE_MODEL(download_summary),
+                                path);
+  gtk_tree_path_free(path);
+  list->searchList = sl_parent;
+  if (sl_parent != NULL) {
+    if (dl_parent != NULL) {
+      /* have parent, must be download from
+        directory inside of search */
+      path = 
gtk_tree_row_reference_get_path(dl_parent->searchViewRowReference);
+      valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(sl_parent->tree),
+                                     &iter,
+                                     path);      
+    } else {
+      /* must be top-level entry in search */
+      valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(sl_parent->tree),
+                                           &iter);
+    } 
+    if (valid == TRUE) {
+      valid = FALSE;
+      /* find matching entry */
+      do {
+       gtk_tree_model_get(GTK_TREE_MODEL(sl_parent->tree),
+                          &iter,
+                          SEARCH_URI, &u,
+                          -1);
+       if (ECRS_equalsUri(u,
+                          fi->uri)) {
+         valid = TRUE;
+         path = gtk_tree_model_get_path(GTK_TREE_MODEL(sl_parent->tree),
+                                        &iter);
+         list->searchViewRowReference
+           = gtk_tree_row_reference_new(GTK_TREE_MODEL(sl_parent->tree),
+                                        path);
+         gtk_tree_path_free(path);
+         /* TODO: extend search model with status;
+            start to indicate active download! */
+         break;
+       }
+      } while (TRUE == 
gtk_tree_model_iter_next(GTK_TREE_MODEL(sl_parent->tree),
+                                               &iter));
+    }
+    if (valid == FALSE) {
+      /* did not find matching entry in search list
+        -- bug!  Continue without adding to to
+        search list! */
+      GE_BREAK(ectx, 0);
+      list->searchList = NULL;
+    }
+  }
+  list->fsui_list = fsui_dl;
+  list->total = total;
+  list->is_directory = ECRS_isDirectory(fi->meta);
+  list->next = download_head;
+  download_head = list;
+  if ( (list->is_directory == YES) &&
+       (completed != 0) ) 
+    refreshDirectoryViewFromDisk(list);
+  return list;
+}
+
+/**
+ * The download has progressed.  Update the
+ * summary and the preview of the directory
+ * contents in the search page (if applicable).
+ */
+void fs_download_update(DownloadList * list,
+                       unsigned long long completed,
+                       const char * data,
+                       unsigned int size) {
+  GtkTreeIter iter;
+  GtkTreePath * path;
+  unsigned int val;
+
+  path = gtk_tree_row_reference_get_path(list->summaryViewRowReference);
+  gtk_tree_model_get_iter(GTK_TREE_MODEL(download_summary),
+                         &iter,
+                         path);
+  gtk_tree_path_free(path);
+  if (list->total != 0)
+    val = completed * 100 / list->total;
+  else
+    val = 100;
+  gtk_tree_store_set(download_summary,
+                    &iter,
+                    DOWNLOAD_PROGRESS, val,
+                    -1);
+  if ( (list->is_directory == YES) &&
+       (list->searchList != NULL) &&
+       (list->searchViewRowReference != NULL) ) {
+    struct ECRS_MetaData * meta;
+    
+    meta = NULL;
+    ECRS_listDirectory(ectx,
+                      data,
+                      size,
+                      &meta,
+                      &addFilesToDirectory,
+                      list);
+    if (meta != NULL)
+      ECRS_freeMetaData(meta);
+  }
+}
+
+/**
+ * A download has terminated successfully.  Update summary and
+ * possibly refresh directory listing.
+ */
+void fs_download_completed(DownloadList * downloadContext) {
+  /* FIXME: update summary? / search list status entry (once added) */
+  downloadContext->has_terminated = YES;
+  refreshDirectoryViewFromDisk(downloadContext);
+}
+
+/**
+ * A download has been aborted.  Update summary and
+ * possibly refresh directory listing.
+ */
+void fs_download_aborted(DownloadList * downloadContext) {
+  /* FIXME: update summary? / search list status entry (once added) */
+  downloadContext->has_terminated = YES;
+  refreshDirectoryViewFromDisk(downloadContext);
+}
+
+/**
+ * A download has been stopped.  Remove from summary
+ * and free associated resources.
+ */
+void fs_download_stopped(DownloadList * list) {
+  GtkTreeIter iter;
+  GtkTreePath * path;
+  DownloadList * prev;
+
+  path = gtk_tree_row_reference_get_path(list->summaryViewRowReference);
+  gtk_tree_model_get_iter(GTK_TREE_MODEL(download_summary),
+                         &iter,
+                         path);
+  gtk_tree_path_free(path);
+  gtk_tree_row_reference_free(list->summaryViewRowReference); 
+  list->summaryViewRowReference = NULL;
+  gtk_tree_store_remove(download_summary,
+                       &iter);
+  if (list->searchViewRowReference != NULL) {
+    gtk_tree_row_reference_free(list->searchViewRowReference); 
+    list->searchViewRowReference = NULL;
+  }
+  FREE(list->filename);
+  ECRS_freeUri(list->uri);
+  
+  if (download_head == list)
+    download_head = list->next;
+  else {
+    prev = download_head;
+    while ( (prev != NULL) &&
+           (prev->next != list) )
+      prev = prev->next;
+    if (prev != NULL)
+      prev->next = list->next;
+    else
+      GE_BREAK(ectx, 0);
+  }
+  FREE(list);
+}
+
+
+/* **************** user download events ******************** */
+
+/**
+ * The user clicked the download button.
+ * Start the download of the selected entry.
+ */
+static void 
+initiateDownload(GtkTreeModel * model,
+                GtkTreePath * path,
+                GtkTreeIter * iter,
+                gpointer unused) {
+  char * uri_name;
+  char * final_download_dir;
+  GtkTreeIter iiter;
+  const char * oname;
+  const char * cname;
+  char * dname;
+  GtkTreePath *dirTreePath;
+  char *dirPath;
+  unsigned int dirPathLen;
+  struct ECRS_URI * idc_uri;
+  struct ECRS_MetaData * idc_meta;
+  const char * idc_name;
+  const char * idc_mime;
+  char * idc_final_download_destination;
+  SearchList * searchContext;
+  DownloadList * parentContext;
+
+#ifdef WINDOWS
+  char *filehash = NULL;
+#endif
+
+  DEBUG_BEGIN();
+  idc_uri = NULL;
+  idc_meta = NULL;
+  idc_name = NULL;
+  idc_mime = NULL;
+  searchContext = NULL;
+  parentContext = NULL;
+  gtk_tree_model_get(model,
+                     iter,
+                     SEARCH_NAME, &idc_name,
+                     SEARCH_URI, &idc_uri,
+                     SEARCH_META, &idc_meta,
+                     SEARCH_MIME, &idc_mime,
+                    SEARCH_INTERNAL, &searchContext,
+                    SEARCH_INTERNAL_PARENT, &parentContext,
+                     -1);
+  if ( (idc_uri == NULL) ||
+       (! ECRS_isFileUri(idc_uri)) ) {
+    GE_BREAK(ectx, 0);
+    return;
+  }
+  uri_name = ECRS_uriToString(idc_uri);
+  if ( (uri_name == NULL) ||
+       (strlen(uri_name) <
+        strlen(ECRS_URI_PREFIX) +
+        strlen(ECRS_FILE_INFIX)) ) {
+    GE_BREAK(ectx, 0);
+    FREENONNULL(uri_name);
+    return;
+  }
+  if (idc_name == NULL) {
+#ifdef WINDOWS
+    filehash = STRDUP(uri_name);
+    filehash[16] = 0;
+    idc_name = filehash;
+#else
+    idc_name = uri_name;
+#endif
+  } 
+  cname = idc_name;
+  oname = idc_name;
+  dname = MALLOC(strlen(idc_name)+1);
+  dname[0] = '\0';
+  while (*idc_name != '\0') {
+    if ( (*idc_name == DIR_SEPARATOR) &&
+        (idc_name[1] != '\0') ) {
+      memcpy(dname, oname, idc_name - oname);
+      dname[idc_name - oname] = '\0';
+      cname = &idc_name[1];
+    }
+    idc_name++;
+  }
+  if (*cname == '\0') /* name ended in '/' - likely directory */
+    cname = oname;
+  idc_name = cname;
+  GC_get_configuration_value_filename(cfg,
+                                     "FS",
+                                     "INCOMINGDIR",
+                                     "$HOME/gnunet-downloads/",
+                                     &final_download_dir);
+  if (strlen(dname) > 0) {
+    char * tmp;
+    tmp = MALLOC(strlen(final_download_dir) + strlen(dname) + 2);
+    strcpy(tmp, final_download_dir);
+    if (tmp[strlen(tmp)] != DIR_SEPARATOR)
+      strcat(tmp, DIR_SEPARATOR_STR);
+    if (dname[0] == DIR_SEPARATOR)
+      strcat(tmp, &dname[1]);
+    else
+      strcat(tmp, dname);
+    FREE(final_download_dir);
+    final_download_dir = tmp;
+  }
+  FREE(dname);
+  disk_directory_create(ectx, final_download_dir);
+
+
+  /* If file is inside a directory, get the full path */
+  dirTreePath = gtk_tree_path_copy(path);
+  dirPath = MALLOC(1);
+  dirPath[0] = '\0';
+  dirPathLen = 0;
+  while (gtk_tree_path_get_depth(dirTreePath) > 1) {
+    const char * dirname;
+    char * new;
+
+    if (! gtk_tree_path_up(dirTreePath))
+      break;
+
+    if (!gtk_tree_model_get_iter(model,
+                                &iiter,
+                                dirTreePath))
+      break;
+    gtk_tree_model_get(model,
+                       &iiter,
+                       SEARCH_NAME, &dirname,
+                       -1);
+    dirPathLen = strlen(dirPath) + strlen(dirname) + strlen(DIR_SEPARATOR_STR) 
+ 1;
+    new = MALLOC(dirPathLen + 1);
+    strcpy(new, dirname);
+    if (new[strlen(new)-1] != DIR_SEPARATOR)
+      strcat(new, DIR_SEPARATOR_STR);
+    strcat(new, dirPath);
+    FREE(dirPath);
+    dirPath = new;
+  }
+  gtk_tree_path_free(dirTreePath);
+
+
+  /* construct completed/directory/real-filename */
+  idc_final_download_destination = MALLOC(strlen(final_download_dir) + 2 +
+                                         strlen(idc_name) + 
strlen(GNUNET_DIRECTORY_EXT) +
+                                         strlen(dirPath));
+  strcpy(idc_final_download_destination, final_download_dir);
+  if (idc_final_download_destination[strlen(idc_final_download_destination)-1] 
!= DIR_SEPARATOR)
+    strcat(idc_final_download_destination,
+           DIR_SEPARATOR_STR);
+  strcat(idc_final_download_destination, dirPath);
+  disk_directory_create(ectx,
+                       idc_final_download_destination);
+  strcat(idc_final_download_destination, idc_name);
+  if ( (idc_final_download_destination[strlen(idc_final_download_destination) 
- 1] == '/') ||
+       (idc_final_download_destination[strlen(idc_final_download_destination) 
- 1] == '\\') )
+    idc_final_download_destination[strlen(idc_final_download_destination) - 1] 
= '\0'; 
+  /* append ".gnd" if needed (== directory and .gnd not present) */
+  if ( (idc_mime != NULL) && 
+       (0 == strcmp(idc_mime, GNUNET_DIRECTORY_MIME)) &&
+       ( (strlen(idc_final_download_destination) < 
strlen(GNUNET_DIRECTORY_EXT)) ||
+        (0 != 
strcmp(&idc_final_download_destination[strlen(idc_final_download_destination) 
+                                                     - 
strlen(GNUNET_DIRECTORY_EXT)],
+                     GNUNET_DIRECTORY_EXT)) ) )
+    strcat(idc_final_download_destination, GNUNET_DIRECTORY_EXT);
+   
+  addLogEntry(_("Downloading `%s'"), idc_name);
+  FSUI_startDownload(ctx,
+                    0, /* FIXME: anonymity level */
+                    NO, /* FIXME: isRecursive */
+                    idc_uri,
+                    idc_meta,
+                    idc_final_download_destination,
+                    searchContext->fsui_list,
+                    (parentContext != NULL) ? parentContext->fsui_list : NULL);
+  FREE(uri_name);
+  FREE(dirPath);
+  FREENONNULL(final_download_dir);
+#ifdef WINDOWS
+  FREENONNULL(filehash);
+#endif
+}
+
+/**
+ * The download button in the search dialog was
+ * clicked.  Download all selected entries.
+ */
+void on_downloadButton_clicked_fs(GtkWidget * treeview,
+                                 GtkWidget * downloadButton) {
+  GtkTreeSelection * selection;
+
+  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+  gtk_tree_selection_selected_foreach
+    (selection,
+     &initiateDownload,
+     NULL);
+}
+
+
+/**
+ * User used the URI download entry.  Start download
+ * that is NOT rooted within a search or directory.
+ *
+ * TODO:
+ * - support for recursive downloads 
+ * - support for showing directories (if downloaded like this)
+ * - support for user-specified filename
+ */
+void on_statusDownloadURIEntry_editing_done_fs(GtkWidget * entry,
+                                              GtkWidget * downloadButton) {
+  struct ECRS_URI * idc_uri;
+  struct ECRS_MetaData * idc_meta;
+  char * idc_final_download_destination;
+  const char * uris;
+  char * urid;
+  char * final_download_dir;
+  const char * dname;
+ 
+  uris = gtk_entry_get_text(GTK_ENTRY(entry));
+  urid = STRDUP(uris);
+  gtk_entry_set_text(GTK_ENTRY(entry),
+                    ECRS_URI_PREFIX);
+  idc_uri = ECRS_stringToUri(ectx, urid);
+  if (idc_uri == NULL) {
+    addLogEntry(_("Invalid URI `%s'"), urid);
+    FREE(urid);
+    return;
+  }
+  if (ECRS_isKeywordUri(idc_uri)) {
+    addLogEntry(_("Please use the search function for keyword (KSK) URIs!"));
+    FREE(urid);
+    ECRS_freeUri(idc_uri);
+    return;
+  } else if (ECRS_isLocationUri(idc_uri)) {
+    addLogEntry(_("Location URIs are not yet supported"));
+    FREE(urid);
+    ECRS_freeUri(idc_uri);
+    return;
+  }
+  GC_get_configuration_value_filename(cfg,
+                                     "FS",
+                                     "INCOMINGDIR",
+                                     "$HOME/gnunet-downloads/",
+                                     &final_download_dir);
+  disk_directory_create(ectx, final_download_dir);
+  dname = &uris[strlen(ECRS_URI_PREFIX) + strlen(ECRS_FILE_INFIX)];
+  idc_final_download_destination = MALLOC(strlen(final_download_dir) + 
strlen(dname) + 2);
+  strcpy(idc_final_download_destination, final_download_dir);
+  FREE(final_download_dir);
+  if (idc_final_download_destination[strlen(idc_final_download_destination)] 
!= DIR_SEPARATOR)
+    strcat(idc_final_download_destination, DIR_SEPARATOR_STR);
+  strcat(idc_final_download_destination, dname);
+
+  addLogEntry(_("Downloading `%s'"), uris);
+  idc_meta = ECRS_createMetaData();
+  FSUI_startDownload(ctx,
+                    getSpinButtonValue(getMainXML(),
+                                       "fsstatusAnonymitySpin"),
+                    NO, /* FIXME: isRecursive */
+                    idc_uri,
+                    idc_meta,
+                    idc_final_download_destination,
+                    NULL,
+                    NULL);
+  ECRS_freeMetaData(idc_meta);
+  FREE(urid);
+}
+
+
+static void 
+clearCompletedDownloadCallback(GtkTreeModel * model,
+                              GtkTreePath * path,
+                              GtkTreeIter * iter,
+                              gpointer unused) {
+  DownloadList * dl;
+
+  GE_ASSERT(ectx,
+           model == GTK_TREE_MODEL(download_summary));
+  gtk_tree_model_get(model,
+                     iter,
+                     DOWNLOAD_INTERNAL, &dl,
+                     -1);
+  if (dl->has_terminated)
+    FSUI_stopDownload(ctx,
+                     dl->fsui_list);
+}
+
+void on_clearCompletedDownloadsButton_clicked_fs(void * unused,
+                                                GtkWidget * clearButton) { 
+  GtkTreeSelection * selection;
+  GtkWidget * downloadList;
+
+  downloadList = glade_xml_get_widget(getMainXML(),
+                                      "activeDownloadsList");
+  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(downloadList));
+  gtk_tree_selection_selected_foreach
+    (selection,
+     &clearCompletedDownloadCallback,
+     NULL);
+}
+
+static void 
+abortDownloadCallback(GtkTreeModel * model,
+                     GtkTreePath * path,
+                     GtkTreeIter * iter,
+                     gpointer unused) {
+  DownloadList * dl;
+
+  GE_ASSERT(ectx,
+           model == GTK_TREE_MODEL(download_summary));
+  gtk_tree_model_get(model,
+                     iter,
+                     DOWNLOAD_INTERNAL, &dl,
+                     -1);
+  FSUI_abortDownload(ctx,
+                    dl->fsui_list);
+}
+
+void on_abortDownloadButton_clicked_fs(void * unused,
+                                      GtkWidget * clearButton) {
+  GtkTreeSelection * selection;
+  GtkWidget * downloadList;
+
+  downloadList = glade_xml_get_widget(getMainXML(),
+                                      "activeDownloadsList");
+  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(downloadList));
+  gtk_tree_selection_selected_foreach
+    (selection,
+     &abortDownloadCallback,
+     NULL);
+}
+
+/* end of download.c */


Property changes on: gnunet-gtk/src/plugins/fs/download.c
___________________________________________________________________
Name: svn:eol-style
   + native

Added: gnunet-gtk/src/plugins/fs/download.h
===================================================================
--- gnunet-gtk/src/plugins/fs/download.h        2006-10-29 06:16:00 UTC (rev 
3559)
+++ gnunet-gtk/src/plugins/fs/download.h        2006-10-29 19:50:11 UTC (rev 
3560)
@@ -0,0 +1,56 @@
+/*
+     This file is part of GNUnet.
+     (C) 2005, 2006 Christian Grothoff (and other contributing authors)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 2, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file src/plugins/fs/download.h
+ * @brief code for searching with gnunet-gtk
+ * @author Christian Grothoff
+ */
+
+#ifndef GTK_DOWNLOAD_H
+#define GTK_DOWNLOAD_H
+
+#include <GNUnet/gnunet_ecrs_lib.h>
+#include <GNUnet/gnunet_fsui_lib.h>
+#include "fs.h"
+
+DownloadList *
+fs_download_started(struct FSUI_DownloadList * fsui_dl,
+                   DownloadList * dl_parent,
+                   SearchList * sl_parent,
+                   unsigned long long total,
+                   unsigned int anonymityLevel,
+                   const ECRS_FileInfo * fi,
+                   const char * filename,
+                   unsigned long long completed,
+                   cron_t eta);
+
+void fs_download_update(DownloadList * downloadContext,
+                       unsigned long long completed,
+                       const char * data,
+                       unsigned int size);
+
+void fs_download_completed(DownloadList * downloadContext);
+
+void fs_download_aborted(DownloadList * downloadContext);
+
+void fs_download_stopped(DownloadList * downloadContext);
+
+#endif


Property changes on: gnunet-gtk/src/plugins/fs/download.h
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: gnunet-gtk/src/plugins/fs/fs.c
===================================================================
--- gnunet-gtk/src/plugins/fs/fs.c      2006-10-29 06:16:00 UTC (rev 3559)
+++ gnunet-gtk/src/plugins/fs/fs.c      2006-10-29 19:50:11 UTC (rev 3560)
@@ -25,20 +25,27 @@
  */
 
 #include "platform.h"
-#include "gnunetgtk_common.h"
 #include "fs.h"
+#include "download.h"
 #include "search.h"
 #include "upload.h"
 #include "collection.h"
 #include "namespace.h"
-#include <GNUnet/gnunet_fsui_lib.h>
 
 struct FSUI_Context * ctx;
 
-static struct GE_Context * ectx;
+struct GE_Context * ectx;
 
-static struct GC_Configuration * cfg;
+struct GC_Configuration * cfg;
 
+SearchList * search_head;
+
+DownloadList * download_head;
+
+GtkListStore * search_summary;
+
+GtkTreeStore * download_summary;
+
 typedef struct {
   const FSUI_Event * event;
   void * ret;
@@ -112,7 +119,7 @@
     break;
  case FSUI_download_started:
     cls->ret = fs_download_started(event->data.DownloadStarted.dc.pos,
-                                  event->data.DownloadStarted.dc.pctx,
+                                  event->data.DownloadStarted.dc.pcctx,
                                   event->data.DownloadStarted.dc.sctx,
                                   event->data.DownloadStarted.total,
                                   event->data.DownloadStarted.anonymityLevel,
@@ -123,7 +130,7 @@
     break;
   case FSUI_download_resumed:
     cls->ret = fs_download_started(event->data.DownloadResumed.dc.pos,
-                                  event->data.DownloadStarted.dc.pctx,
+                                  event->data.DownloadStarted.dc.pcctx,
                                   event->data.DownloadStarted.dc.sctx,
                                   event->data.DownloadResumed.total,
                                   event->data.DownloadResumed.anonymityLevel,
@@ -185,6 +192,159 @@
   return cls.ret;
 }
 
+
+
+/**
+ * Setup the summary views (in particular the models
+ * and the renderers).  
+ */
+static void fs_summary_start() {
+  GtkComboBoxEntry * searchCB;
+  GtkTreeView * searchList;
+  GtkTreeView * downloadList;
+  GtkListStore * model;
+  GtkCellRenderer * renderer;
+  GtkTreeViewColumn * column;
+  int col;
+  
+  searchCB
+    = GTK_COMBO_BOX_ENTRY(glade_xml_get_widget(getMainXML(),
+                                              "fssearchKeywordComboBoxEntry"));
+  
+  model = gtk_list_store_new(NS_SEARCH_NUM,
+                            G_TYPE_STRING, /* what we show */
+                            G_TYPE_STRING, /* EncName of namespace */
+                            G_TYPE_POINTER, /* ECRS MetaData */
+                            G_TYPE_POINTER, /* FSUI search list */
+                            G_TYPE_INT);  /* Meta-data about namespace */
+  gtk_combo_box_set_model(GTK_COMBO_BOX(searchCB),
+                         GTK_TREE_MODEL(model));
+  gtk_combo_box_entry_set_text_column(searchCB,
+                                     NS_SEARCH_DESCRIPTION);
+  searchList = GTK_TREE_VIEW(glade_xml_get_widget(getMainXML(),
+                                                 "activeSearchesSummary"));
+  search_summary =
+    gtk_list_store_new(SEARCH_SUMMARY_NUM,
+                      G_TYPE_STRING, /* name */
+                      G_TYPE_INT,    /* # results */
+                      G_TYPE_POINTER);  /* internal: search list */
+  gtk_tree_view_set_model(searchList,
+                         GTK_TREE_MODEL(search_summary));
+  gtk_tree_selection_set_mode(gtk_tree_view_get_selection(searchList),
+                             GTK_SELECTION_MULTIPLE);
+
+  renderer = gtk_cell_renderer_text_new();
+  col = gtk_tree_view_insert_column_with_attributes(searchList,
+                                                   -1,
+                                                   _("Query"),
+                                                   renderer,
+                                                   "text", SEARCH_SUMMARY_NAME,
+                                             NULL);
+  column = gtk_tree_view_get_column(searchList,
+                                   col - 1);
+  gtk_tree_view_column_set_resizable(column, TRUE);
+  gtk_tree_view_column_set_clickable(column, TRUE);
+  gtk_tree_view_column_set_reorderable(column, TRUE);
+  gtk_tree_view_column_set_sort_column_id(column, SEARCH_SUMMARY_NAME);
+  gtk_tree_view_column_set_resizable(column, TRUE);
+  renderer = gtk_cell_renderer_text_new();
+  col = gtk_tree_view_insert_column_with_attributes(searchList,
+                                                   -1,
+                                                   _("Results"),
+                                                   renderer,
+                                                   "text", 
SEARCH_SUMMARY_RESULT_COUNT,
+                                                   NULL);
+  column = gtk_tree_view_get_column(searchList,
+                                   col - 1);
+  gtk_tree_view_column_set_resizable(column, TRUE);
+  gtk_tree_view_column_set_clickable(column, TRUE);
+  gtk_tree_view_column_set_reorderable(column, TRUE);
+  gtk_tree_view_column_set_sort_column_id(column, SEARCH_SUMMARY_RESULT_COUNT);
+  gtk_tree_view_column_set_resizable(column, TRUE);
+
+
+  downloadList = GTK_TREE_VIEW(glade_xml_get_widget(getMainXML(),
+                                                   "activeDownloadsList"));
+  download_summary =
+    gtk_tree_store_new(DOWNLOAD_NUM,
+                       G_TYPE_STRING, /* name (full-path file name) */
+                       G_TYPE_STRING, /* name (user-friendly name) */
+                       G_TYPE_UINT64,  /* size */
+                      G_TYPE_STRING, /* human readable size */
+                       G_TYPE_INT,  /* progress */
+                       G_TYPE_STRING, /* uri as string */
+                      G_TYPE_POINTER); /* internal download list ptr */
+  gtk_tree_view_set_model(downloadList,
+                          GTK_TREE_MODEL(download_summary));
+  gtk_tree_selection_set_mode(gtk_tree_view_get_selection(downloadList),
+                             GTK_SELECTION_MULTIPLE);
+  renderer = gtk_cell_renderer_progress_new();
+  col = gtk_tree_view_insert_column_with_attributes(downloadList,
+                                                   -1,
+                                                   _("Name"),
+                                                   renderer,
+                                                   "value", DOWNLOAD_PROGRESS,
+                                                   "text", DOWNLOAD_SHORTNAME,
+                                                   NULL);
+  column = gtk_tree_view_get_column(downloadList,
+                                   col - 1);
+  gtk_tree_view_column_set_resizable(column, TRUE);
+  gtk_tree_view_column_set_clickable(column, TRUE);
+  gtk_tree_view_column_set_reorderable(column, TRUE);
+  gtk_tree_view_column_set_sort_column_id(column, DOWNLOAD_PROGRESS);
+  /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/
+  gtk_tree_view_column_set_resizable(column, TRUE);
+  renderer = gtk_cell_renderer_text_new();
+  g_object_set (renderer, "xalign", 1.00, NULL);
+  col = gtk_tree_view_insert_column_with_attributes(downloadList,
+                                                   -1,
+                                                   _("Size"),
+                                                   renderer,
+                                                   "text", DOWNLOAD_HSIZE,
+                                                   NULL);
+  
+  column = gtk_tree_view_get_column(downloadList,
+                                   col - 1);
+  gtk_tree_view_column_set_resizable(column, TRUE);
+  gtk_tree_view_column_set_clickable(column, TRUE);
+  gtk_tree_view_column_set_reorderable(column, TRUE);
+  gtk_tree_view_column_set_sort_column_id(column, DOWNLOAD_SIZE);
+  /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/
+  gtk_tree_view_column_set_resizable(column, TRUE);
+  renderer = gtk_cell_renderer_text_new();
+  col = gtk_tree_view_insert_column_with_attributes(downloadList,
+                                                   -1,
+                                                   _("URI"),
+                                                   renderer,
+                                                   "text", DOWNLOAD_URISTRING,
+                                                   NULL);
+  column = gtk_tree_view_get_column(downloadList,
+                                   col - 1);
+  gtk_tree_view_column_set_resizable(column, TRUE);
+  gtk_tree_view_column_set_reorderable(column, TRUE);
+  /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/
+  gtk_tree_view_column_set_resizable(column, TRUE);
+}
+
+/**
+ * Shutdown.
+ */
+static void fs_summary_stop() {
+  GtkComboBox * searchCB;
+  GtkListStore * model;
+
+  searchCB
+    = GTK_COMBO_BOX(glade_xml_get_widget(getMainXML(),
+                                        "fssearchKeywordComboBoxEntry"));
+  model = GTK_LIST_STORE(gtk_combo_box_get_model(searchCB));
+  /* FIXME: iterate over model entries
+     and free URIs and MetaData! */
+}
+
+
+
+
+
 void init_fs(struct GE_Context * e,
             struct GC_Configuration * c) {
   GtkWidget * tab;
@@ -211,7 +371,7 @@
                   &eventProcessor,
                   NULL);
   fs_collection_start(ectx, cfg);
-  fs_search_start(ectx, cfg);
+  fs_summary_start();
   fs_upload_start(ectx, cfg);
   fs_namespace_start(ectx, cfg);
 }
@@ -223,7 +383,7 @@
     = glade_xml_get_widget(getMainXML(),
                           "fsnotebook");
   gtk_widget_hide(tab);
-  fs_search_stop();
+  fs_summary_stop();
   fs_collection_stop();
   fs_namespace_stop();
   fs_upload_stop();

Modified: gnunet-gtk/src/plugins/fs/fs.h
===================================================================
--- gnunet-gtk/src/plugins/fs/fs.h      2006-10-29 06:16:00 UTC (rev 3559)
+++ gnunet-gtk/src/plugins/fs/fs.h      2006-10-29 19:50:11 UTC (rev 3560)
@@ -29,8 +29,8 @@
 
 #include <GNUnet/gnunet_ecrs_lib.h>
 #include <GNUnet/gnunet_fsui_lib.h>
+#include "gnunetgtk_common.h"
 
-
 /**
  * On search box, for namespace selection
  * (for input of search URI; lists known namespaces).
@@ -58,6 +58,7 @@
   SEARCH_URI,
   SEARCH_META,
   SEARCH_INTERNAL,
+  SEARCH_INTERNAL_PARENT,
   SEARCH_NUM,
 };
 
@@ -129,6 +130,139 @@
   KTYPE_NUM,
 };
 
+
+/**
+ * @brief linked list of pages in the search notebook
+ */
+typedef struct SL {
+  struct SL * next;
+  /**
+   * Reference to the glade XML context that was
+   * used to create the search page.
+   */
+  GladeXML * searchXML;
+
+  /**
+   * Reference to the glade XML context that was
+   * used to create the search label.
+   */
+  GladeXML * labelXML;
+
+  /**
+   * Tree view widget that is used to display the
+   * search results.
+   */
+  GtkTreeView * treeview;
+
+  /**
+   * Model of the tree view.
+   */
+  GtkTreeStore * tree;
+
+  /**
+   * The label used in the notebook page.
+   */
+  GtkWidget * tab_label;
+
+  /**
+   * The notebook page that is associated with this
+   * search.
+   */
+  GtkWidget * searchpage;
+
+  /**
+   * Path to the entry in the summary list
+   * for this search.
+   */
+  GtkTreeRowReference * summaryViewRowReference;
+
+  /**
+   * URI for this search.
+   */
+  struct ECRS_URI * uri;
+
+  /**
+   * String describing the search.
+   */
+  char * searchString;
+
+  /**
+   * Number of results received so far.
+   */
+  unsigned int resultsReceived;
+
+  /**
+   * FSUI search handle.
+   */
+  struct FSUI_SearchList * fsui_list; 
+} SearchList;
+
+
+typedef struct DL {
+  struct DL * next;
+
+  /**
+   * URI of the download.
+   */
+  struct ECRS_URI * uri;
+
+  /**
+   * Where is the download being saved to?
+   */
+  char * filename;
+
+  /**
+   * Path in the summary view for this download.
+   */
+  GtkTreeRowReference * summaryViewRowReference;
+
+  /**
+   * Search that this download belongs to.
+   * Maybe NULL.
+   */
+  struct SL * searchList;
+
+  /**
+   * Path in the search view that this
+   * download is represented by.  Maybe NULL
+   * if search has been closed or if download
+   * was initiated from URI without search.
+   */
+  GtkTreeRowReference * searchViewRowReference;
+
+  /**
+   * FSUI reference for the download.
+   */
+  struct FSUI_DownloadList * fsui_list;
+
+  /**
+   * Total size of the download.
+   */
+  unsigned long long total;
+
+  /**
+   * Is this a GNUnet directory? (by mime-type)
+   */
+  int is_directory;
+
+  int has_terminated;
+
+} DownloadList;
+
 extern struct FSUI_Context * ctx;
 
+extern struct GE_Context * ectx;
+
+extern struct GC_Configuration * cfg;
+
+extern SearchList * search_head;
+
+extern DownloadList * download_head;
+
+extern GtkListStore * search_summary;
+
+extern GtkTreeStore * download_summary;
+
+
+
 #endif

Modified: gnunet-gtk/src/plugins/fs/meta.c
===================================================================
--- gnunet-gtk/src/plugins/fs/meta.c    2006-10-29 06:16:00 UTC (rev 3559)
+++ gnunet-gtk/src/plugins/fs/meta.c    2006-10-29 19:50:11 UTC (rev 3560)
@@ -498,7 +498,7 @@
 char * getFileNameFromMetaData(const struct ECRS_MetaData * meta) {
   char * name;
 
-  name = ECRS_getFirstFromMetaData(info->meta,
+  name = ECRS_getFirstFromMetaData(meta,
                                   EXTRACTOR_FILENAME,
                                   EXTRACTOR_TITLE,
                                   EXTRACTOR_ARTIST,
@@ -522,7 +522,7 @@
 char * getDescriptionFromMetaData(const struct ECRS_MetaData * meta) {
   char * desc;
 
-  desc = ECRS_getFirstFromMetaData(info->meta,
+  desc = ECRS_getFirstFromMetaData(meta,
                                   EXTRACTOR_DESCRIPTION,
                                   EXTRACTOR_GENRE,
                                   EXTRACTOR_ALBUM,
@@ -538,7 +538,7 @@
 }
 
 GdkPixbuf * getThumbnailFromMetaData(const struct ECRS_MetaData * meta) {
-  GdkPixbuf * pxibuf;
+  GdkPixbuf * pixbuf;
   GdkPixbufLoader * loader;
   size_t ts;
   unsigned char * thumb;
@@ -576,7 +576,7 @@
   ret = gtk_bin_get_child(GTK_BIN(window));
   gtk_widget_ref(ret);
   gtk_container_remove(window, ret);
-  gtk_widget_destroy(window);
+  gtk_widget_destroy(GTK_WIDGET(window));
   return ret;
 }
 

Modified: gnunet-gtk/src/plugins/fs/search.c
===================================================================
--- gnunet-gtk/src/plugins/fs/search.c  2006-10-29 06:16:00 UTC (rev 3559)
+++ gnunet-gtk/src/plugins/fs/search.c  2006-10-29 19:50:11 UTC (rev 3560)
@@ -22,12 +22,6 @@
  * @file src/plugins/fs/search.c
  * @brief code for searching with gnunet-gtk
  * @author Christian Grothoff
- *
- *
- * TODO:
- * - figure out how to handle directories displayed on the
- *   search page (and how to communicate for downloads that
- *   they do or do not hang in the search page!)
  */
 
 #include "platform.h"
@@ -40,124 +34,7 @@
 #include <GNUnet/gnunet_util_crypto.h>
 #include <GNUnet/gnunet_namespace_lib.h>
 
-
 /**
- * @brief linked list of pages in the search notebook
- */
-typedef struct SL {
-  struct SL * next;
-  /**
-   * Reference to the glade XML context that was
-   * used to create the search page.
-   */
-  GladeXML * searchXML;
-
-  /**
-   * Reference to the glade XML context that was
-   * used to create the search label.
-   */
-  GladeXML * labelXML;
-
-  /**
-   * Tree view widget that is used to display the
-   * search results.
-   */
-  GtkTreeView * treeview;
-
-  /**
-   * Model of the tree view.
-   */
-  GtkTreeStore * tree;
-
-  /**
-   * The label used in the notebook page.
-   */
-  GtkLabel * tab_label;
-
-  /**
-   * The notebook page that is associated with this
-   * search.
-   */
-  GtkWidget * searchpage;
-
-  /**
-   * Path to the entry in the summary list
-   * for this search.
-   */
-  GtkTreeRowReference * summaryViewRowReference;
-
-  /**
-   * URI for this search.
-   */
-  struct ECRS_URI * uri;
-
-  /**
-   * String describing the search.
-   */
-  char * searchString;
-
-  /**
-   * Number of results received so far.
-   */
-  unsigned int resultsReceived;
-
-  /**
-   * FSUI search handle.
-   */
-  struct FSUI_SearchList * fsui_list; 
-} SearchList;
-
-typedef struct DL {
-  struct DL * next;
-
-  /**
-   * URI of the download.
-   */
-  struct ECRS_URI * uri;
-
-  /**
-   * Where is the download being saved to?
-   */
-  char * filename;
-
-  /**
-   * Path in the summary view for this download.
-   */
-  GtkTreeRowReference * summaryViewRowReference;
-
-  /**
-   * Search that this download belongs to.
-   * Maybe NULL.
-   */
-  struct SL * searchList;
-
-  /**
-   * Path in the search view that this
-   * download is represented by.  Maybe NULL
-   * if search has been closed or if download
-   * was initiated from URI without search.
-   */
-  GtkTreeRowReference * searchViewRowReference;
-
-  /**
-   * FSUI reference for the download.
-   */
-  struct FSUI_DownloadList * fsui_list;
-} DownloadList;
-
-static SearchList * search_head;
-
-static DownloadList * download_head;
-
-static GtkListStore * search_summary;
-
-static GtkTreeStore * download_summary;
-
-static struct GE_Context * ectx;
-
-static struct GC_Configuration * cfg;
-
-/**
  * The user has clicked the "SEARCH" button.
  * Initiate a search.
  */
@@ -301,7 +178,7 @@
   list = search_head;
   while (list != NULL) {
     if ( (list->searchpage == searchPage) ||
-        (list->tab_label == searchPage) )
+        (list->tab_label  == searchPage) )
       break;
     list = list->next;
   }
@@ -332,7 +209,7 @@
                       GtkTreePath * path,
                       GtkTreeIter * iter,
                       gpointer unused) {
-  struct SL * s;
+  SearchList * s;
 
   s = NULL;
   gtk_tree_model_get(model,
@@ -362,7 +239,7 @@
                        GtkTreePath * path,
                        GtkTreeIter * iter,
                        gpointer unused) {
-  struct SL * s;
+  SearchList * s;
 
   s = NULL;
   gtk_tree_model_get(model,
@@ -392,11 +269,11 @@
  * Update the number of results received for the given
  * search in the summary and in the label of the tab.
  */
-static void updateSearchSummary(struct SL * searchContext) {
+static void updateSearchSummary(SearchList * searchContext) {
   GtkTreePath * path;
   GtkTreeIter iter;
   char * new_title;
-  GtkWidget * label;
+  GtkLabel * label;
 
   path = 
gtk_tree_row_reference_get_path(searchContext->summaryViewRowReference);
   if (TRUE != gtk_tree_model_get_iter(GTK_TREE_MODEL(search_summary),
@@ -418,45 +295,35 @@
     g_strdup_printf("%s (%u)", 
                    searchContext->searchString,
                    searchContext->resultsReceived);
-  label = glade_xml_get_widget(searchContext->labelXML,
-                              "searchTabLabel");
+  label = GTK_LABEL(glade_xml_get_widget(searchContext->labelXML,
+                                        "searchTabLabel"));
   gtk_label_set(label, new_title);
   FREE(new_title);
 }
 
 /**
- * Add the given result to the model (search result
- * list).
- * 
- * @param info the information to add to the model
- * @param uri the search URI
- * @param searchContext identifies the search page
+ * Add the given search result to the search
+ * tree at the specified position.
  */
-void fs_search_result_received(struct SL * searchContext,
-                              const ECRS_FileInfo * info,
-                              const struct ECRS_URI * uri) {
+void addEntryToSearchTree(SearchList * searchContext,
+                         DownloadList * downloadParent,
+                         const ECRS_FileInfo * info,
+                         GtkTreeIter * iter) {
   char * name;
   char * mime;
   char * desc;
   unsigned long long size;
   char * size_h;
-  GtkTreeStore * model;
-  GtkTreeIter iter;
+  GdkPixbuf * pixbuf;
 
   mime = getMimeTypeFromMetaData(info->meta);
   desc = getDescriptionFromMetaData(info->meta);
   name = getFileNameFromMetaData(info->meta);    
-  size = ECRS_isFileUri(info->uri) ? ECRS_fileSize(info->uri) : 0
+  size = ECRS_isFileUri(info->uri) ? ECRS_fileSize(info->uri) : 0;
   pixbuf = getThumbnailFromMetaData(info->meta);
   size_h = string_get_fancy_byte_size(size);
-  model = GTK_TREE_STORE
-    (gtk_tree_view_get_model
-     (GTK_TREE_VIEW(searchContext->treeview)));
-  gtk_tree_store_append(model,
-                       &iter,
-                       NULL);  
-  gtk_tree_store_set(model,
-                    &iter,
+  gtk_tree_store_set(searchContext->tree,
+                    iter,
                     SEARCH_NAME, name,
                     SEARCH_SIZE, size,
                     SEARCH_HSIZE, size_h,
@@ -466,12 +333,36 @@
                     SEARCH_URI, ECRS_dupUri(info->uri),
                     SEARCH_META, ECRS_dupMetaData(info->meta),
                     SEARCH_INTERNAL, searchContext,
+                    SEARCH_INTERNAL_PARENT, downloadParent,
                     -1);
   FREE(size_h);
   FREE(name);
   FREE(desc);
   FREE(mime);
-  /* UNREF pixbuf? */
+}
+
+/**
+ * Add the given result to the model (search result
+ * list).
+ * 
+ * @param info the information to add to the model
+ * @param uri the search URI
+ * @param searchContext identifies the search page
+ */
+void fs_search_result_received(SearchList * searchContext,
+                              const ECRS_FileInfo * info,
+                              const struct ECRS_URI * uri) {
+  GtkTreeStore * model;
+  GtkTreeIter iter;
+
+  model = GTK_TREE_STORE(gtk_tree_view_get_model(searchContext->treeview));
+  gtk_tree_store_append(model,
+                       &iter,
+                       NULL); 
+  addEntryToSearchTree(searchContext,
+                      NULL,
+                      info,
+                      &iter);
   searchContext->resultsReceived++;
   updateSearchSummary(searchContext);
 }
@@ -480,23 +371,23 @@
  * FSUI event: a search was started; create the
  * tab and add an entry to the summary.
  */
-struct SL * 
+SearchList * 
 fs_search_started(struct FSUI_SearchList * fsui_list,
                  const struct ECRS_URI * uri,
                  unsigned int anonymityLevel,
                  unsigned int resultCount,
                  const ECRS_FileInfo * results) {
-  struct SL * list;
+  SearchList * list;
   gint pages;
   char * description;
   const char * dhead;
-  GtkContainer * window;
   GtkTreeViewColumn * column;
   GtkCellRenderer * renderer;
-  int col;
   GtkNotebook * notebook;
   GtkTreePath * path;
   GtkTreeIter iter;
+  int col;
+  int i;
 
   description = ECRS_uriToString(uri);
   if (description == NULL) {
@@ -515,10 +406,10 @@
                        strlen(ECRS_SUBSPACE_INFIX)))
     dhead = &dhead[strlen(ECRS_SUBSPACE_INFIX)];
   list
-    = MALLOC(sizeof(struct SL));
+    = MALLOC(sizeof(SearchList));
   memset(list,
         0,
-        sizeof(struct SL));
+        sizeof(SearchList));
   list->searchString
     = STRDUP(dhead);
   FREE(description);
@@ -551,7 +442,8 @@
                       GDK_TYPE_PIXBUF, /* preview */   
                       G_TYPE_POINTER,  /* url */
                       G_TYPE_POINTER,  /* meta */
-                      G_TYPE_POINTER); /* internal: download info/NULL */
+                      G_TYPE_POINTER,  /* internal: search list */
+                      G_TYPE_POINTER); /* internal: download parent list */
 
   gtk_tree_view_set_model(list->treeview,
                          GTK_TREE_MODEL(list->tree));
@@ -721,13 +613,12 @@
  */
 void fs_search_stopped(SearchList * list) {
   GtkNotebook * notebook;
-  int index;
-  int i;
   GtkTreeIter iter;
-  struct ECRS_URI * euri;
   SearchList * prev;
   DownloadList * downloads;
   GtkTreePath * path;
+  int index;
+  int i;
 
   /* remove from linked list */
   if (search_head == list) {
@@ -742,10 +633,10 @@
   /* remove links from download views */
   downloads = download_head;
   while (downloads != NULL) {
-    if (download->searchList == list) {
-      gtk_tree_row_reference_free(download->searchViewRowReference);
-      download->searchViewRowReference = NULL;
-      download->searchList = NULL;
+    if (downloads->searchList == list) {
+      gtk_tree_row_reference_free(downloads->searchViewRowReference);
+      downloads->searchViewRowReference = NULL;
+      downloads->searchList = NULL;
     }
     downloads = downloads->next;
   }
@@ -764,9 +655,9 @@
                           index);
   
   /* recursively free search model */
-  if (gtk_tree_model_get_iter_first(list->model,
+  if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list->tree),
                                    &iter))
-    freeIterSubtree(list->model,
+    freeIterSubtree(GTK_TREE_MODEL(list->tree),
                    &iter);
   
   /* destroy entry in summary */
@@ -788,760 +679,4 @@
 }
 
 
-
-
-
-
-
-
-#if 0
-static int addFilesToDirectory
-  (const ECRS_FileInfo * fi,
-   const HashCode512 * key,
-   int isRoot,
-   void * closure) {
-  struct ECRS_URI * uri = closure;
-  DownloadList * pos;
-  GtkTreeIter iter;
-  GtkTreeIter child;
-  int i;
-  GtkTreePath * path;
-
-  if (isRoot == YES)
-    return OK;
-  DEBUG_BEGIN();
-  pos = download_head;
-  while (pos != NULL) {
-    if (ECRS_equalsUri(uri,
-                       pos->uri))
-      break;
-    pos = pos->next;
-  }
-  if (pos != NULL) {
-    if (! gtk_tree_row_reference_valid(pos->rr))
-      return SYSERR;
-    path = gtk_tree_row_reference_get_path(pos->rr);
-    gtk_tree_model_get_iter(GTK_TREE_MODEL(pos->model),
-                            &iter,
-                            path);
-    gtk_tree_path_free(path);
-    for (i=gtk_tree_model_iter_n_children(pos->model,
-                                          &iter)-1;i>=0;i--) {
-      if (TRUE == gtk_tree_model_iter_nth_child(pos->model,
-                                                &child,
-                                                &iter,
-                                                i)) {
-        struct ECRS_URI * uri;
-        uri = NULL;
-        gtk_tree_model_get(pos->model,
-                           &child,
-                           SEARCH_URI, &uri,
-                           -1);
-        if ( (uri != NULL) &&
-             (ECRS_equalsUri(uri,
-                             fi->uri)) )
-          return OK;
-      }
-    }
-    gtk_tree_store_append(GTK_TREE_STORE(pos->model),
-                          &child,
-                          &iter);
-    addEntryToSearchTree(GTK_TREE_STORE(pos->model),
-                         &child,
-                         fi->uri,
-                         fi->meta);
-  }
-  DEBUG_END();
-  return OK;
-}
-#endif
-
-
-/**
- * A download has been started.  Add an entry
- * to the search tree view (if applicable) and
- * the download summary.
- */
-struct DL *
-fs_download_started(struct FSUI_DownloadList * fsui_dl,
-                   struct DL * dl_parent,
-                   struct SL * sl_parent,
-                   unsigned long long total,
-                   unsigned int anonymityLevel,
-                   const ECRS_FileInfo * fi,
-                   const char * filename,
-                   unsigned long long completed,
-                   cron_t eta) {
-  DownloadList * list;
-  GtkTreeIter iiter;
-  unsigned long long size;
-  char * size_h;
-  const char * sname;
-  int progress;
-  char * uri_name;
-  
-  /* setup visualization */
-  list = MALLOC(sizeof(DownloadList));
-  list->fsui_list = fsui_dl;
-  list->rr = NULL;
-  list->model = NULL;
-#if 0
-  if (YES == ECRS_isDirectory(fi->meta)) {
-    list->rr = gtk_tree_row_reference_new(model, path);
-    list->model = model;
-  }
-#endif
-  list->uri = ECRS_dupUri(fi->uri);
-  list->filename = STRDUP(filename);
-  size = ECRS_fileSize(fi->uri);
-  size_h = string_get_fancy_byte_size(size);
-  sname = &filename[strlen(filename)-1];
-  while ( (sname > filename) &&
-         (sname[-1] != '/') &&
-         (sname[-1] != '\\') )
-    sname--;
-  if (size != 0)
-    progress = completed * 100 / size;
-  else
-    progress = 100;
-  uri_name = ECRS_uriToString(fi->uri);
-  gtk_tree_store_append(download_summary,
-                       &iiter,
-                        NULL);
-  gtk_tree_store_set(download_summary,
-                     &iiter,
-                     DOWNLOAD_FILENAME, filename,
-                     DOWNLOAD_SHORTNAME, sname,
-                     DOWNLOAD_SIZE, size,
-                    DOWNLOAD_HSIZE, size_h,
-                     DOWNLOAD_PROGRESS, progress,
-                     DOWNLOAD_URISTRING, uri_name,
-                     DOWNLOAD_URI, ECRS_dupUri(fi->uri),
-                     DOWNLOAD_TREEPATH, list->rr, /* internal: row reference! 
*/
-                    DOWNLOAD_POS, list, 
-                     -1);
-  FREE(uri_name);
-  FREE(size_h);
-  list->next = download_head;
-  download_head = list;
-  DEBUG_END();
-  return list;
-}
-
-
-
-
-static void initiateDownload(GtkTreeModel * model,
-                             GtkTreePath * path,
-                             GtkTreeIter * iter,
-                             gpointer unused) {
-  char * uri_name;
-  char * final_download_dir;
-  GtkTreeIter iiter;
-  GtkWidget * spin;
-  const char * oname;
-  const char * cname;
-  char * dname;
-  GtkTreePath *dirTreePath;
-  char *dirPath;
-  unsigned int dirPathLen;
-  struct ECRS_URI * idc_uri;
-  struct ECRS_MetaData * idc_meta;
-  const char * idc_name;
-  const char * idc_mime;
-  char * idc_final_download_destination;
-  unsigned int idc_anon;
-  struct SL * searchContext;
-
-#ifdef WINDOWS
-  char *filehash = NULL;
-#endif
-
-  DEBUG_BEGIN();
-  idc_uri = NULL;
-  idc_meta = NULL;
-  idc_name = NULL;
-  idc_mime = NULL;
-  gtk_tree_model_get(model,
-                     iter,
-                     SEARCH_NAME, &idc_name,
-                     SEARCH_URI, &idc_uri,
-                     SEARCH_META, &idc_meta,
-                     SEARCH_MIME, &idc_mime,
-                    SEARCH_INTERNAL, &searchContext,
-                     -1);
-  if (idc_uri == NULL) {
-    GE_BREAK(ectx, 0);
-    return;
-  }
-
-  spin = searchContext->anonymityButton;
-  if (spin == NULL) {
-    GE_BREAK(ectx, 0);
-    idc_anon = 1;
-  } else {
-    idc_anon = gtk_spin_button_get_value_as_int
-      (GTK_SPIN_BUTTON(spin));
-  }
-  if (! ECRS_isFileUri(idc_uri)) {
-    if (ECRS_isNamespaceUri(idc_uri)) {
-      /* start namespace search; would probably be better
-        to add this as a subtree, but for simplicity
-        we'll just add it as a new tab for now */
-      FSUI_startSearch(ctx,
-                      idc_anon,
-                      1000, /* FIXME: max results */
-                      99 * cronYEARS, /* fixme: timeout */
-                      idc_uri);
-      return;
-    } else {
-      GE_BREAK(ectx, 0); /* unsupported URI type (i.e. ksk or loc) */
-      return;
-    }
-  }
-
-  uri_name = ECRS_uriToString(idc_uri);
-  if ( (uri_name == NULL) ||
-       (strlen(uri_name) <
-        strlen(ECRS_URI_PREFIX) +
-        strlen(ECRS_FILE_INFIX)) ) {
-    GE_BREAK(ectx, 0);
-    FREENONNULL(uri_name);
-    return;
-  }
-
-  if (idc_name == NULL) {
-#ifdef WINDOWS
-    filehash = STRDUP(uri_name);
-    filehash[16] = 0;
-    idc_name = filehash;
-#else
-    idc_name = uri_name;
-#endif
-  } 
-
-  cname = idc_name;
-  oname = idc_name;
-  dname = MALLOC(strlen(idc_name)+1);
-  dname[0] = '\0';
-  while (*idc_name != '\0') {
-    if ( (*idc_name == DIR_SEPARATOR) &&
-        (idc_name[1] != '\0') ) {
-      memcpy(dname, oname, idc_name - oname);
-      dname[idc_name - oname] = '\0';
-      cname = &idc_name[1];
-    }
-    idc_name++;
-  }
-  if (*cname == '\0') /* name ended in '/' - likely directory */
-    cname = oname;
-  idc_name = cname;
-  GC_get_configuration_value_filename(cfg,
-                                     "FS",
-                                     "INCOMINGDIR",
-                                     "$HOME/gnunet-downloads/",
-                                     &final_download_dir);
-  if (strlen(dname) > 0) {
-    char * tmp;
-    tmp = MALLOC(strlen(final_download_dir) + strlen(dname) + 2);
-    strcpy(tmp, final_download_dir);
-    if (tmp[strlen(tmp)] != DIR_SEPARATOR)
-      strcat(tmp, DIR_SEPARATOR_STR);
-    if (dname[0] == DIR_SEPARATOR)
-      strcat(tmp, &dname[1]);
-    else
-      strcat(tmp, dname);
-    FREE(final_download_dir);
-    final_download_dir = tmp;
-  }
-  FREE(dname);
-  disk_directory_create(ectx, final_download_dir);
-
-
-  /* If file is inside a directory, get the full path */
-  dirTreePath = gtk_tree_path_copy(path);
-  dirPath = MALLOC(1);
-  dirPath[0] = '\0';
-  dirPathLen = 0;
-  while (gtk_tree_path_get_depth(dirTreePath) > 1) {
-    const char * dirname;
-    char * new;
-
-    if (! gtk_tree_path_up(dirTreePath))
-      break;
-
-    if (!gtk_tree_model_get_iter(model,
-                                &iiter,
-                                dirTreePath))
-      break;
-    gtk_tree_model_get(model,
-                       &iiter,
-                       SEARCH_NAME, &dirname,
-                       -1);
-    dirPathLen = strlen(dirPath) + strlen(dirname) + strlen(DIR_SEPARATOR_STR) 
+ 1;
-    new = MALLOC(dirPathLen + 1);
-    strcpy(new, dirname);
-    if (new[strlen(new)-1] != DIR_SEPARATOR)
-      strcat(new, DIR_SEPARATOR_STR);
-    strcat(new, dirPath);
-    FREE(dirPath);
-    dirPath = new;
-  }
-  gtk_tree_path_free(dirTreePath);
-
-
-  /* construct completed/directory/real-filename */
-  idc_final_download_destination = MALLOC(strlen(final_download_dir) + 2 +
-                                         strlen(idc_name) + 
strlen(GNUNET_DIRECTORY_EXT) +
-                                         strlen(dirPath));
-  strcpy(idc_final_download_destination, final_download_dir);
-  if (idc_final_download_destination[strlen(idc_final_download_destination)-1] 
!= DIR_SEPARATOR)
-    strcat(idc_final_download_destination,
-           DIR_SEPARATOR_STR);
-  strcat(idc_final_download_destination, dirPath);
-  disk_directory_create(ectx,
-                       idc_final_download_destination);
-  strcat(idc_final_download_destination, idc_name);
-  if ( (idc_final_download_destination[strlen(idc_final_download_destination) 
- 1] == '/') ||
-       (idc_final_download_destination[strlen(idc_final_download_destination) 
- 1] == '\\') )
-    idc_final_download_destination[strlen(idc_final_download_destination) - 1] 
= '\0'; 
-  /* append ".gnd" if needed (== directory and .gnd not present) */
-  if ( (idc_mime != NULL) && 
-       (0 == strcmp(idc_mime, GNUNET_DIRECTORY_MIME)) &&
-       ( (strlen(idc_final_download_destination) < 
strlen(GNUNET_DIRECTORY_EXT)) ||
-        (0 != 
strcmp(&idc_final_download_destination[strlen(idc_final_download_destination) 
-                                                     - 
strlen(GNUNET_DIRECTORY_EXT)],
-                     GNUNET_DIRECTORY_EXT)) ) )
-    strcat(idc_final_download_destination, GNUNET_DIRECTORY_EXT);
-   
-  addLogEntry(_("Downloading `%s'"), idc_name);
-  FSUI_startDownload(ctx,
-                    idc_anon,
-                    NO, /* FIXME: isRecursive */
-                    idc_uri,
-                    idc_meta,
-                    idc_final_download_destination,
-                    NULL,
-                    NULL);
-  FREE(uri_name);
-  FREE(dirPath);
-  FREENONNULL(final_download_dir);
-#ifdef WINDOWS
-  FREENONNULL(filehash);
-#endif
-}
-
-void on_downloadButton_clicked_fs(GtkWidget * treeview,
-                                 GtkWidget * downloadButton) {
-  GtkTreeSelection * selection;
-
-  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
-  gtk_tree_selection_selected_foreach
-    (selection,
-     &initiateDownload,
-     NULL);
-}
-
-
-void on_statusDownloadURIEntry_editing_done_fs(GtkWidget * entry,
-                                              GtkWidget * downloadButton) {
-  struct ECRS_URI * idc_uri;
-  struct ECRS_MetaData * idc_meta;
-  char * idc_final_download_destination;
-  unsigned int idc_anon;
-  const char * uris;
-  char * urid;
-  GtkWidget * spin;
-  char * final_download_dir;
-  const char * dname;
- 
-  uris = gtk_entry_get_text(GTK_ENTRY(entry));
-  urid = STRDUP(uris);
-  gtk_entry_set_text(GTK_ENTRY(entry),
-                    ECRS_URI_PREFIX);
-  idc_uri = ECRS_stringToUri(ectx, urid);
-  if (idc_uri == NULL) {
-    addLogEntry(_("Invalid URI `%s'"), urid);
-    FREE(urid);
-    return;
-  }
-  if (ECRS_isKeywordUri(idc_uri)) {
-    addLogEntry(_("Please use the search function for keyword (KSK) URIs!"));
-    FREE(urid);
-    ECRS_freeUri(idc_uri);
-    return;
-  } else if (ECRS_isLocationUri(idc_uri)) {
-    addLogEntry(_("Location URIs are not yet supported"));
-    FREE(urid);
-    ECRS_freeUri(idc_uri);
-    return;
-  }
-  GC_get_configuration_value_filename(cfg,
-                                     "FS",
-                                     "INCOMINGDIR",
-                                     "$HOME/gnunet-downloads/",
-                                     &final_download_dir);
-  disk_directory_create(ectx, final_download_dir);
-  dname = &uris[strlen(ECRS_URI_PREFIX) + strlen(ECRS_FILE_INFIX)];
-  idc_final_download_destination = MALLOC(strlen(final_download_dir) + 
strlen(dname) + 2);
-  strcpy(idc_final_download_destination, final_download_dir);
-  FREE(final_download_dir);
-  if (idc_final_download_destination[strlen(idc_final_download_destination)] 
!= DIR_SEPARATOR)
-    strcat(idc_final_download_destination, DIR_SEPARATOR_STR);
-  strcat(idc_final_download_destination, dname);
-
-  /* get anonymity level */
-  spin = glade_xml_get_widget(getMainXML(),
-                             "fsstatusAnonymitySpin");
-  if (spin == NULL) {
-    GE_BREAK(ectx, 0);
-    idc_anon = 1;
-  } else {
-    idc_anon = gtk_spin_button_get_value_as_int
-      (GTK_SPIN_BUTTON(spin));
-  }
-  addLogEntry(_("Downloading `%s'"), uris);
-  idc_meta = ECRS_createMetaData();
-  FSUI_startDownload(ctx,
-                    idc_anon,
-                    NO, /* FIXME: isRecursive */
-                    idc_uri,
-                    idc_meta,
-                    idc_final_download_destination,
-                    NULL,
-                    NULL);
-  ECRS_freeMetaData(idc_meta);
-  FREE(urid);
-}
-
-
-void fs_download_update(struct DL * downloadContext,
-                       unsigned long long completed,
-                       const char * data,
-                       unsigned int size) {
-  GtkTreeIter iter;
-  unsigned int val;
-  unsigned long long total;
-  struct DL * p;
-
-  DEBUG_BEGIN();
-  if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(download_summary),
-                                    &iter)) {
-    do {
-      gtk_tree_model_get(GTK_TREE_MODEL(download_summary),
-                         &iter,
-                         DOWNLOAD_SIZE, &total,
-                         DOWNLOAD_POS, &p,
-                         -1);
-      if (p == downloadContext) {
-        if (total != 0)
-          val = completed * 100 / total;
-        else
-          val = 100;
-        gtk_tree_store_set(download_summary,
-                           &iter,
-                           DOWNLOAD_PROGRESS, val,
-                           -1);
-        break;
-      }
-    } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(download_summary),
-                                      &iter));
-  }
-#if 0
-  meta = NULL;
-  ECRS_listDirectory(ectx,
-                    data,
-                     size,
-                     &meta,
-                     &addFilesToDirectory,
-                     downloadContext->uri);
-  if (meta != NULL)
-    ECRS_freeMetaData(meta);
-#endif
-  DEBUG_END();
-}
-
-void fs_download_completed(struct DL * downloadContext) {
-  unsigned long long size;
-  char * data;
-  int fd;
-  struct ECRS_MetaData * meta;
-
-  DEBUG_BEGIN();
-  GE_LOG(ectx,
-        GE_STATUS | GE_USER | GE_BULK,
-        _("Download '%s' complete.\n"),
-        downloadContext->filename);
-  /* Not available for resumed downloads */
-  if ( (downloadContext->rr != NULL) &&
-       (gtk_tree_row_reference_valid(downloadContext->rr)) ) { 
-    /* update directory view (if applicable!) */
-    if (OK == disk_file_size(ectx,
-                            downloadContext->filename,
-                            &size,
-                            YES)) {
-      GE_LOG(ectx,
-            GE_DEBUG,
-            "Updating directory view of '%s'\n",
-            downloadContext->filename);
-      
-      meta = NULL;
-      fd = disk_file_open(ectx,
-                         downloadContext->filename, 
-                         O_RDONLY);
-      if (fd != -1) {
-       data = MMAP(NULL,
-                   size,
-                   PROT_READ,
-                   MAP_SHARED,
-                   fd,
-                   0);
-       if (data == MAP_FAILED) {
-         GE_LOG_STRERROR_FILE(ectx,
-                              GE_ERROR | GE_ADMIN | GE_BULK,
-                              "mmap",
-                              downloadContext->filename);
-       } else {
-#if 0
-         if (data != NULL) {
-           ECRS_listDirectory(ectx,
-                              data,
-                              size,
-                              &meta,
-                              &addFilesToDirectory,
-                              downloadContext->uri);
-           MUNMAP(data, size);
-         }
-#endif
-       }
-       CLOSE(fd);
-      }
-      if (meta != NULL)
-       ECRS_freeMetaData(meta);        
-    }
-  }
-  DEBUG_END();
-}
-
-void fs_download_stopped(struct DL * downloadContext) {
-  GtkTreeIter iter;
-  struct DL * d;
-
-  DEBUG_BEGIN();
-  if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(download_summary),
-                                    &iter)) {
-    do {
-      gtk_tree_model_get(GTK_TREE_MODEL(download_summary),
-                         &iter,
-                         DOWNLOAD_POS, &d,
-                         -1);
-      if (d == downloadContext) {
-        gtk_tree_store_remove(download_summary,
-                              &iter);
-        break;
-      }
-    } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(download_summary),
-                                      &iter));
-  }
-  DEBUG_END();
-  /* FIXME: free dl downloadContext! */
-}
-
-void on_clearCompletedDownloadsButton_clicked_fs(void * unused,
-                                                GtkWidget * clearButton) {
-  /* FIXME */
-}
-
-static void abortDownloadCallback(GtkTreeModel * model,
-                                  GtkTreePath * path,
-                                  GtkTreeIter * iter,
-                                  gpointer unused) {
-  struct DL * dl;
-
-  GE_ASSERT(ectx, model == GTK_TREE_MODEL(download_summary));
-  gtk_tree_model_get(model,
-                     iter,
-                     DOWNLOAD_POS, &dl,
-                     -1);
-  FSUI_abortDownload(ctx,
-                    dl->fsui_list);
-}
-
-void on_abortDownloadButton_clicked_fs(void * unused,
-                                      GtkWidget * clearButton) {
-  GtkTreeSelection * selection;
-  GtkWidget * downloadList;
-
-  DEBUG_BEGIN();
-  downloadList = glade_xml_get_widget(getMainXML(),
-                                      "activeDownloadsList");
-  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(downloadList));
-  gtk_tree_selection_selected_foreach
-    (selection,
-     &abortDownloadCallback,
-     NULL);
-  DEBUG_END();
-}
-
-
-
-
-
-
-
-
-
-/* *************** startup/shutdown ****************** */
-
-/**
- * Setup the summary views (in particular the models
- * and the renderers).  
- */
-void fs_search_start(struct GE_Context * e,
-                    struct GC_Configuration * c) {
-  GtkComboBoxEntry * searchCB;
-  GtkTreeView * searchList;
-  GtkTreeView * downloadList;
-  GtkListStore * model;
-  GtkCellRenderer * renderer;
-  GtkTreeViewColumn * column;
-  int col;
-  
-  ectx = e;
-  cfg = c;
-  searchCB
-    = GTK_COMBO_BOX_ENTRY(glade_xml_get_widget(getMainXML(),
-                                              "fssearchKeywordComboBoxEntry"));
-  
-  model = gtk_list_store_new(NS_SEARCH_NUM,
-                            G_TYPE_STRING, /* what we show */
-                            G_TYPE_STRING, /* EncName of namespace */
-                            G_TYPE_POINTER, /* ECRS MetaData */
-                            G_TYPE_POINTER, /* FSUI search list */
-                            G_TYPE_INT);  /* Meta-data about namespace */
-  gtk_combo_box_set_model(GTK_COMBO_BOX(searchCB),
-                         GTK_TREE_MODEL(model));
-  gtk_combo_box_entry_set_text_column(searchCB,
-                                     NS_SEARCH_DESCRIPTION);
-  searchList = GTK_TREE_VIEW(glade_xml_get_widget(getMainXML(),
-                                                 "activeSearchesSummary"));
-  search_summary =
-    gtk_list_store_new(SER_SUM_NUM,
-                      G_TYPE_STRING, /* name */
-                      G_TYPE_INT,    /* # results */
-                      G_TYPE_POINTER);  /* internal: search list */
-  gtk_tree_view_set_model(searchList,
-                         GTK_TREE_MODEL(search_summary));
-  gtk_tree_selection_set_mode(gtk_tree_view_get_selection(searchList),
-                             GTK_SELECTION_MULTIPLE);
-
-  renderer = gtk_cell_renderer_text_new();
-  col = gtk_tree_view_insert_column_with_attributes(searchList,
-                                                   -1,
-                                                   _("Query"),
-                                                   renderer,
-                                                   "text", 
SERARCH_SUMMARY_NAME,
-                                             NULL);
-  column = gtk_tree_view_get_column(searchList,
-                                   col - 1);
-  gtk_tree_view_column_set_resizable(column, TRUE);
-  gtk_tree_view_column_set_clickable(column, TRUE);
-  gtk_tree_view_column_set_reorderable(column, TRUE);
-  gtk_tree_view_column_set_sort_column_id(column, SER_SUM_NAME);
-  gtk_tree_view_column_set_resizable(column, TRUE);
-  renderer = gtk_cell_renderer_text_new();
-  col = gtk_tree_view_insert_column_with_attributes(searchList,
-                                                   -1,
-                                                   _("Results"),
-                                                   renderer,
-                                                   "text", 
SERARCH_SUMMARY_RESULT_COUNT,
-                                                   NULL);
-  column = gtk_tree_view_get_column(searchList,
-                                   col - 1);
-  gtk_tree_view_column_set_resizable(column, TRUE);
-  gtk_tree_view_column_set_clickable(column, TRUE);
-  gtk_tree_view_column_set_reorderable(column, TRUE);
-  gtk_tree_view_column_set_sort_column_id(column, SER_SUM_COUNT);
-  gtk_tree_view_column_set_resizable(column, TRUE);
-
-
-  downloadList = GTK_TREE_VIEW(glade_xml_get_widget(getMainXML(),
-                                                   "activeDownloadsList"));
-  download_summary =
-    gtk_tree_store_new(DOWNLOAD_NUM,
-                       G_TYPE_STRING, /* name (full-path file name) */
-                       G_TYPE_STRING, /* name (user-friendly name) */
-                       G_TYPE_UINT64,  /* size */
-                      G_TYPE_STRING, /* human readable size */
-                       G_TYPE_INT,  /* progress */
-                       G_TYPE_STRING, /* uri as string */
-                      G_TYPE_POINTER); /* internal download list ptr */
-  gtk_tree_view_set_model(downloadList,
-                          GTK_TREE_MODEL(download_summary));
-  gtk_tree_selection_set_mode(gtk_tree_view_get_selection(downloadList),
-                             GTK_SELECTION_MULTIPLE);
-  renderer = gtk_cell_renderer_progress_new();
-  col = gtk_tree_view_insert_column_with_attributes(downloadList,
-                                                   -1,
-                                                   _("Name"),
-                                                   renderer,
-                                                   "value", DOWNLOAD_PROGRESS,
-                                                   "text", DOWNLOAD_SHORTNAME,
-                                                   NULL);
-  column = gtk_tree_view_get_column(downloadList,
-                                   col - 1);
-  gtk_tree_view_column_set_resizable(column, TRUE);
-  gtk_tree_view_column_set_clickable(column, TRUE);
-  gtk_tree_view_column_set_reorderable(column, TRUE);
-  gtk_tree_view_column_set_sort_column_id(column, DOWNLOAD_PROGRESS);
-  /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/
-  gtk_tree_view_column_set_resizable(column, TRUE);
-  renderer = gtk_cell_renderer_text_new();
-  g_object_set (renderer, "xalign", 1.00, NULL);
-  col = gtk_tree_view_insert_column_with_attributes(downloadList,
-                                                   -1,
-                                                   _("Size"),
-                                                   renderer,
-                                                   "text", DOWNLOAD_HSIZE,
-                                                   NULL);
-  
-  column = gtk_tree_view_get_column(downloadList,
-                                   col - 1);
-  gtk_tree_view_column_set_resizable(column, TRUE);
-  gtk_tree_view_column_set_clickable(column, TRUE);
-  gtk_tree_view_column_set_reorderable(column, TRUE);
-  gtk_tree_view_column_set_sort_column_id(column, DOWNLOAD_SIZE);
-  /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/
-  gtk_tree_view_column_set_resizable(column, TRUE);
-  renderer = gtk_cell_renderer_text_new();
-  col = gtk_tree_view_insert_column_with_attributes(downloadList,
-                                                   -1,
-                                                   _("URI"),
-                                                   renderer,
-                                                   "text", DOWNLOAD_URISTRING,
-                                                   NULL);
-  column = gtk_tree_view_get_column(downloadList,
-                                   col - 1);
-  gtk_tree_view_column_set_resizable(column, TRUE);
-  gtk_tree_view_column_set_reorderable(column, TRUE);
-  /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/
-  gtk_tree_view_column_set_resizable(column, TRUE);
-}
-
-/**
- * Shutdown.
- */
-void fs_search_stop() {
-  GtkComboBox * searchCB;
-  GtkListStore * model;
-
-  searchCB
-    = GTK_COMBO_BOX(glade_xml_get_widget(getMainXML(),
-                                        "fssearchKeywordComboBoxEntry"));
-  model = gtk_combo_box_get_model(searchCB);
-  /* FIXME: iterate over model entries
-     and free URIs and MetaData! */
-}
-
-
 /* end of search.c */

Modified: gnunet-gtk/src/plugins/fs/search.h
===================================================================
--- gnunet-gtk/src/plugins/fs/search.h  2006-10-29 06:16:00 UTC (rev 3559)
+++ gnunet-gtk/src/plugins/fs/search.h  2006-10-29 19:50:11 UTC (rev 3560)
@@ -29,34 +29,18 @@
 
 #include <GNUnet/gnunet_ecrs_lib.h>
 #include <GNUnet/gnunet_fsui_lib.h>
+#include "fs.h"
 
-struct SL;
 
-struct DL;
+/**
+ * Add the given search result to the search
+ * tree at the specified position.
+ */
+void addEntryToSearchTree(SearchList * searchContext,
+                         DownloadList * downloadParent,
+                         const ECRS_FileInfo * info,
+                         GtkTreeIter * iter);
 
-struct DL *
-fs_download_started(struct FSUI_DownloadList * fsui_dl,
-                   struct DL * dl_parent,
-                   struct SL * sl_parent,
-                   unsigned long long total,
-                   unsigned int anonymityLevel,
-                   const ECRS_FileInfo * fi,
-                   const char * filename,
-                   unsigned long long completed,
-                   cron_t eta);
-
-void fs_download_update(struct DL * downloadContext,
-                       unsigned long long completed,
-                       const char * data,
-                       unsigned int size);
-
-void fs_download_completed(struct DL * downloadContext);
-
-void fs_download_aborted(struct DL * downloadContext);
-
-void fs_download_stopped(struct DL * downloadContext);
-
-
 /**
  * Add the given result to the model (search result
  * list).
@@ -65,7 +49,7 @@
  * @param path the tree path that selects where to add
  *        the information, NULL for top-level
  */
-void fs_search_result_received(struct SL * searchContext,
+void fs_search_result_received(SearchList * searchContext,
                               const ECRS_FileInfo * info,
                               const struct ECRS_URI * uri);
 
@@ -74,7 +58,7 @@
  *
  * @return internal search context
  */
-struct SL * 
+SearchList * 
 fs_search_started(struct FSUI_SearchList * list,
                  const struct ECRS_URI * uri,
                  unsigned int anonymityLevel,
@@ -84,28 +68,11 @@
 /**
  * A search process has been aborted.  Update display.
  */
-void fs_search_aborted(struct SL * searchContext);
+void fs_search_aborted(SearchList * searchContext);
 
 /**
  * A search process has stopped.  Clean up.
  */
-void fs_search_stopped(struct SL * searchContext);
+void fs_search_stopped(SearchList * searchContext);
 
-
-/**
- * Initialize the search module.
- */
-void fs_search_start(struct GE_Context * e,
-                    struct GC_Configuration * c);
-
-/**
- * Shutdown the search module.
- */
-void fs_search_stop(void);
-
-
-void on_closeSearchButton_clicked_fs(GtkWidget * searchPage,
-                                    GtkWidget * closeButton);
-
-
 #endif





reply via email to

[Prev in Thread] Current Thread [Next in Thread]