gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r11172 - in gnunet: . src/fs


From: gnunet
Subject: [GNUnet-SVN] r11172 - in gnunet: . src/fs
Date: Tue, 4 May 2010 09:16:28 +0200

Author: grothoff
Date: 2010-05-04 09:16:28 +0200 (Tue, 04 May 2010)
New Revision: 11172

Modified:
   gnunet/TODO
   gnunet/src/fs/fs.c
   gnunet/src/fs/fs_download.c
   gnunet/src/fs/fs_search.c
Log:
deserialize search link to download

Modified: gnunet/TODO
===================================================================
--- gnunet/TODO 2010-05-03 21:35:44 UTC (rev 11171)
+++ gnunet/TODO 2010-05-04 07:16:28 UTC (rev 11172)
@@ -1,6 +1,5 @@
 0.9.0pre1:
 * FS: [CG]
-  - implement linking of downloads to searches in syncing 
(serialize/deserialize) 
   - generate SUSPEND events (publish, unindex, search, download) AND free 
memory!
     => test SUSPEND events
   - actually call 'sync' functions (publish, unindex, search, download)

Modified: gnunet/src/fs/fs.c
===================================================================
--- gnunet/src/fs/fs.c  2010-05-03 21:35:44 UTC (rev 11171)
+++ gnunet/src/fs/fs.c  2010-05-04 07:16:28 UTC (rev 11172)
@@ -1547,6 +1547,8 @@
   if ( (GNUNET_OK !=
        GNUNET_BIO_write_string (wh, uris)) ||
        (GNUNET_OK !=
+       GNUNET_BIO_write_string (wh, sr->download != NULL ? 
sr->download->serialization : NULL)) ||
+       (GNUNET_OK !=
        GNUNET_BIO_write_meta_data (wh, sr->meta)) ||
        (GNUNET_OK !=
        GNUNET_BIO_write (wh, key, sizeof (GNUNET_HashCode))) ||
@@ -1805,6 +1807,23 @@
 
 
 /**
+ * Deserialize a download.
+ *
+ * @param h overall context
+ * @param rh file to deserialize from
+ * @param parent parent download
+ * @param search associated search
+ * @param serialization name under which the search was serialized
+ */
+static void
+deserialize_download (struct GNUNET_FS_Handle *h,
+                     struct GNUNET_BIO_ReadHandle *rh,
+                     struct GNUNET_FS_DownloadContext *parent,
+                     struct GNUNET_FS_SearchResult *search,
+                     const char *serialization);
+
+
+/**
  * Function called with a filename of serialized search result
  * to deserialize.
  *
@@ -1821,7 +1840,9 @@
   char *ser;
   char *uris;
   char *emsg;
+  char *download;
   struct GNUNET_BIO_ReadHandle *rh;
+  struct GNUNET_BIO_ReadHandle *drh;
   struct GNUNET_FS_SearchResult *sr;
   GNUNET_HashCode key;
 
@@ -1844,6 +1865,7 @@
     }
   emsg = NULL;
   uris = NULL;
+  download = NULL;
   sr = GNUNET_malloc (sizeof (struct GNUNET_FS_SearchResult));
   sr->serialization = ser;  
   if ( (GNUNET_OK !=
@@ -1852,6 +1874,8 @@
        ( (GNUNET_YES != GNUNET_FS_uri_test_chk (sr->uri)) &&
         (GNUNET_YES != GNUNET_FS_uri_test_loc (sr->uri)) ) ||
        (GNUNET_OK !=
+       GNUNET_BIO_read_string (rh, "download-lnk", &download, 16)) ||
+       (GNUNET_OK !=
        GNUNET_BIO_read_meta_data (rh, "result-meta", &sr->meta)) ||
        (GNUNET_OK !=
        GNUNET_BIO_read (rh, "result-key", &key, sizeof (key))) ||
@@ -1865,12 +1889,34 @@
        GNUNET_BIO_read_int32 (rh, &sr->availability_trials)) )
     goto cleanup;   
   GNUNET_free (uris);
+  if (download != NULL)
+    {
+      drh = get_read_handle (sc->h, 
+                            "subdownloads",
+                            download);
+      deserialize_download (sc->h,
+                           drh,
+                           NULL,
+                           sr,
+                           download);
+      if (GNUNET_OK !=
+         GNUNET_BIO_read_close (drh, &emsg))
+       {
+         GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                     _("Failed to resume sub-download `%s': %s\n"),
+                     download,
+                     emsg);
+         GNUNET_free (emsg);
+       }
+      GNUNET_free (download);
+    }
   GNUNET_CONTAINER_multihashmap_put (sc->master_result_map,
                                     &key,
                                     sr,
                                     
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
   return GNUNET_OK;
  cleanup:
+  GNUNET_free_non_null (download);
   GNUNET_free_non_null (emsg);
   GNUNET_free_non_null (uris);
   if (sr->uri != NULL)
@@ -1884,6 +1930,36 @@
 
 
 /**
+ * Send the 'resume' signal to the callback; also actually
+ * resume the download (put it in the queue).  Does this
+ * recursively for the top-level download and all child
+ * downloads.
+ * 
+ * @param dc download to resume
+ */
+static void
+signal_download_resume (struct GNUNET_FS_DownloadContext *dc)
+{
+  struct GNUNET_FS_DownloadContext *dcc;
+  struct GNUNET_FS_ProgressInfo pi;
+  
+  pi.status = GNUNET_FS_STATUS_DOWNLOAD_RESUME;
+  pi.value.download.specifics.resume.meta = dc->meta;
+  pi.value.download.specifics.resume.message = dc->emsg;
+  GNUNET_FS_download_make_status_ (&pi,
+                                  dc);
+  dcc = dc->child_head;
+  while (NULL != dcc)
+    {
+      signal_download_resume (dcc);
+      dcc = dcc->next;
+    }
+  if (dc->pending != NULL)
+    GNUNET_FS_download_start_downloading_ (dc);
+}
+
+
+/**
  * Iterator over search results signaling resume to the client for
  * each result.
  *
@@ -1913,7 +1989,14 @@
       sr->client_info = GNUNET_FS_search_make_status_ (&pi,
                                                       sc);
     }
-  GNUNET_FS_search_start_probe_ (sr);
+  if (sr->download != NULL)
+    {
+      signal_download_resume (sr->download);
+    }
+  else
+    {
+      GNUNET_FS_search_start_probe_ (sr);
+    }
   return GNUNET_YES;
 }
 
@@ -1976,21 +2059,6 @@
 
 
 /**
- * Deserialize a download.
- *
- * @param h overall context
- * @param rh file to deserialize from
- * @param parent parent download
- * @param serialization name under which the search was serialized
- */
-static void
-deserialize_download (struct GNUNET_FS_Handle *h,
-                     struct GNUNET_BIO_ReadHandle *rh,
-                     struct GNUNET_FS_DownloadContext *parent,
-                     const char *serialization);
-
-
-/**
  * Function called with a filename of serialized sub-download
  * to deserialize.
  *
@@ -2012,6 +2080,7 @@
   deserialize_download (parent->h,
                        rh,
                        parent,
+                       NULL,
                        ser);
   if (GNUNET_OK !=
       GNUNET_BIO_read_close (rh, &emsg))
@@ -2028,36 +2097,6 @@
 
 
 /**
- * Send the 'resume' signal to the callback; also actually
- * resume the download (put it in the queue).  Does this
- * recursively for the top-level download and all child
- * downloads.
- * 
- * @param dc download to resume
- */
-static void
-signal_download_resume (struct GNUNET_FS_DownloadContext *dc)
-{
-  struct GNUNET_FS_DownloadContext *dcc;
-  struct GNUNET_FS_ProgressInfo pi;
-  
-  pi.status = GNUNET_FS_STATUS_DOWNLOAD_RESUME;
-  pi.value.download.specifics.resume.meta = dc->meta;
-  pi.value.download.specifics.resume.message = dc->emsg;
-  GNUNET_FS_download_make_status_ (&pi,
-                                  dc);
-  dcc = dc->child_head;
-  while (NULL != dcc)
-    {
-      signal_download_resume (dcc);
-      dcc = dcc->next;
-    }
-  if (dc->pending != NULL)
-    GNUNET_FS_download_start_downloading_ (dc);
-}
-
-
-/**
  * Free this download context and all of its descendants.
  * (only works during deserialization since not all possible
  * state it taken care of).
@@ -2098,12 +2137,14 @@
  * @param h overall context
  * @param rh file to deserialize from
  * @param parent parent download
+ * @param search associated search
  * @param serialization name under which the search was serialized
  */
 static void
 deserialize_download (struct GNUNET_FS_Handle *h,
                      struct GNUNET_BIO_ReadHandle *rh,
                      struct GNUNET_FS_DownloadContext *parent,
+                     struct GNUNET_FS_SearchResult *search,
                      const char *serialization)
 {
   struct GNUNET_FS_DownloadContext *dc;
@@ -2197,6 +2238,11 @@
     GNUNET_CONTAINER_DLL_insert (parent->child_head,
                                 parent->child_tail,
                                 dc);
+  if (search != NULL)
+    {
+      dc->search = search;
+      search->download = dc;
+    }
   signal_download_resume (dc);
   GNUNET_free (uris);
   return;
@@ -2437,7 +2483,7 @@
        }
       return GNUNET_OK;
     }
-  deserialize_download (h, rh, NULL, ser);
+  deserialize_download (h, rh, NULL, NULL, ser);
   GNUNET_free (ser);
   if (GNUNET_OK !=
       GNUNET_BIO_read_close (rh, &emsg))

Modified: gnunet/src/fs/fs_download.c
===================================================================
--- gnunet/src/fs/fs_download.c 2010-05-03 21:35:44 UTC (rev 11171)
+++ gnunet/src/fs/fs_download.c 2010-05-04 07:16:28 UTC (rev 11172)
@@ -1592,6 +1592,11 @@
   dc->h = h;
   dc->search = sr;
   sr->download = dc;
+  if (sr->probe_ctx != NULL)
+    {
+      GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES);
+      sr->probe_ctx = NULL;      
+    }
   dc->uri = GNUNET_FS_uri_dup (sr->uri);
   dc->meta = GNUNET_CONTAINER_meta_data_duplicate (sr->meta);
   dc->client_info = cctx;

Modified: gnunet/src/fs/fs_search.c
===================================================================
--- gnunet/src/fs/fs_search.c   2010-05-03 21:35:44 UTC (rev 11171)
+++ gnunet/src/fs/fs_search.c   2010-05-04 07:16:28 UTC (rev 11172)
@@ -301,7 +301,12 @@
                                                            sr);
       break;
     case GNUNET_FS_STATUS_DOWNLOAD_STOPPED:
-      /* FIXME: clean up? schedule next probe? or already done? */
+      if (sr->probe_cancel_task != GNUNET_SCHEDULER_NO_TASK)
+       {
+         GNUNET_SCHEDULER_cancel (sr->sc->h->sched,
+                                  sr->probe_cancel_task);
+         sr->probe_cancel_task = GNUNET_SCHEDULER_NO_TASK;
+       }     
       sr = NULL;
       break;
     case GNUNET_FS_STATUS_DOWNLOAD_ACTIVE:
@@ -344,6 +349,8 @@
   
   if (sr->probe_ctx != NULL)
     return;
+  if (sr->download != NULL)
+    return;
   if (0 == (sr->sc->h->flags & GNUNET_FS_FLAGS_DO_PROBES))
     return;
   if (sr->availability_trials > AVAILABILITY_TRIALS_MAX)





reply via email to

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