-lots
[oweals/gnunet.git] / src / fs / fs_search.c
index 542d8f2e9908e4b6ad5cd9abee79638bdb9eb3cb..370fd2f5c6b703fb3f4abf8fc79275e2ebe46e16 100644 (file)
@@ -505,7 +505,7 @@ process_sks_result (struct GNUNET_FS_SearchContext *sc, const char *id_update,
   if (0 == strlen (id_update))
     return;                     /* no updates */
   uu.type = sks;
-  uu.data.sks.namespace = sc->uri->data.sks.namespace;
+  uu.data.sks.ns = sc->uri->data.sks.ns;
   uu.data.sks.identifier = GNUNET_strdup (id_update);
   (void) search_start (sc->h, &uu, sc->anonymity, sc->options, NULL, sr);
   GNUNET_free (uu.data.sks.identifier);
@@ -671,13 +671,13 @@ process_nblock (struct GNUNET_FS_SearchContext *sc, const struct NBlock *nb,
   uri->data.sks.identifier = GNUNET_strdup (pt);
   GNUNET_CRYPTO_hash (&nb->subspace,
                       sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
-                      &uri->data.sks.namespace);
+                      &uri->data.sks.ns);
   uris = GNUNET_FS_uri_to_string (uri);
   GNUNET_CONTAINER_meta_data_insert (meta, "<gnunet>", EXTRACTOR_METATYPE_URI,
                                      EXTRACTOR_METAFORMAT_UTF8, "text/plain",
                                      uris, strlen (uris) + 1);
   GNUNET_free (uris);
-  GNUNET_PSEUDONYM_add (sc->h->cfg, &uri->data.sks.namespace, meta);
+  GNUNET_PSEUDONYM_add (sc->h->cfg, &uri->data.sks.ns, meta);
   /* process */
   process_ksk_result (sc, &sc->requests[i], uri, meta);
 
@@ -762,7 +762,8 @@ process_sblock (struct GNUNET_FS_SearchContext *sc, const struct SBlock *sb,
  */
 static void
 process_result (struct GNUNET_FS_SearchContext *sc, enum GNUNET_BLOCK_Type type,
-                struct GNUNET_TIME_Absolute expiration, const void *data,
+                struct GNUNET_TIME_Absolute expiration, 
+               const void *data,
                 size_t size)
 {
   if (GNUNET_TIME_absolute_get_duration (expiration).rel_value > 0)
@@ -1013,24 +1014,26 @@ transmit_search_request (void *cls, size_t size, void *buf)
     msize = sizeof (struct SearchMessage);
     GNUNET_assert (size >= msize);
     mbc.keyword_offset = sc->keyword_offset;
+    /* calculate total number of known results (in put_cnt => sqms) */
     mbc.put_cnt = 0;
     GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map,
                                            &find_result_set, &mbc);
     sqms = mbc.put_cnt;
+    /* calculate how many results we can send in this message */
     mbc.put_cnt = (size - msize) / sizeof (struct GNUNET_HashCode);
     mbc.put_cnt = GNUNET_MIN (mbc.put_cnt, sqms - mbc.skip_cnt);
     if (sc->search_request_map_offset < sqms)
       GNUNET_assert (mbc.put_cnt > 0);
 
+    /* now build message */
+    msize += sizeof (struct GNUNET_HashCode) * mbc.put_cnt;
     sm->header.size = htons (msize);
     sm->type = htonl (GNUNET_BLOCK_TYPE_ANY);
     sm->anonymity_level = htonl (sc->anonymity);
     memset (&sm->target, 0, sizeof (struct GNUNET_HashCode));
     sm->query = sc->requests[sc->keyword_offset].query;
-    msize += sizeof (struct GNUNET_HashCode) * mbc.put_cnt;
     GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map,
                                            &build_result_set, &mbc);
-    sm->header.size = htons (msize);
     GNUNET_assert (sqms >= sc->search_request_map_offset);
     if (sqms != sc->search_request_map_offset)
     {
@@ -1055,7 +1058,7 @@ transmit_search_request (void *cls, size_t size, void *buf)
     GNUNET_assert (size >= msize);
     sm->type = htonl (GNUNET_BLOCK_TYPE_FS_SBLOCK);
     sm->anonymity_level = htonl (sc->anonymity);
-    sm->target = sc->uri->data.sks.namespace;
+    sm->target = sc->uri->data.sks.ns;
     identifier = sc->uri->data.sks.identifier;
     GNUNET_CRYPTO_hash (identifier, strlen (identifier), &key);
     GNUNET_CRYPTO_hash (&key, sizeof (struct GNUNET_HashCode), &idh);
@@ -1155,8 +1158,15 @@ try_reconnect (struct GNUNET_FS_SearchContext *sc)
     GNUNET_CLIENT_disconnect (sc->client);
     sc->client = NULL;
   }
+  if (0 == sc->reconnect_backoff.rel_value)
+    sc->reconnect_backoff = GNUNET_TIME_UNIT_MILLISECONDS;
+  else
+    sc->reconnect_backoff = GNUNET_TIME_relative_min (GNUNET_TIME_relative_multiply (sc->reconnect_backoff, 2),
+                                                     GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 10));
+
   sc->task =
-      GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &do_reconnect,
+      GNUNET_SCHEDULER_add_delayed (sc->reconnect_backoff, 
+                                   &do_reconnect,
                                     sc);
 }
 
@@ -1192,7 +1202,7 @@ search_start (struct GNUNET_FS_Handle *h, const struct GNUNET_FS_Uri *uri,
     sc->psearch_result = psearch;
     psearch->update_search = sc;
   }
-  sc->master_result_map = GNUNET_CONTAINER_multihashmap_create (16);
+  sc->master_result_map = GNUNET_CONTAINER_multihashmap_create (16, GNUNET_NO);
   sc->client_info = cctx;
   if (GNUNET_OK != GNUNET_FS_search_start_searching_ (sc))
   {
@@ -1246,7 +1256,7 @@ GNUNET_FS_search_start_searching_ (struct GNUNET_FS_SearchContext *sc)
       sc->requests[i].mandatory = (sc->uri->data.ksk.keywords[i][0] == '+');
       if (sc->requests[i].mandatory)
         sc->mandatory_count++;
-      sc->requests[i].results = GNUNET_CONTAINER_multihashmap_create (4);
+      sc->requests[i].results = GNUNET_CONTAINER_multihashmap_create (4, GNUNET_NO);
       GNUNET_CRYPTO_hash (keyword, strlen (keyword), &sc->requests[i].key);
     }
   }