aboutsummaryrefslogtreecommitdiff
path: root/src/fs/fs_search.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2010-05-04 08:50:09 +0000
committerChristian Grothoff <christian@grothoff.org>2010-05-04 08:50:09 +0000
commit6aefa4ac85435c8e7afb86e4e6daef77da69709a (patch)
treefe3241f641088070ef4a909f627482f8252bf0a9 /src/fs/fs_search.c
parentdb9926f66da9571020fba8f1f2fa0014d1b65b0f (diff)
downloadgnunet-6aefa4ac85435c8e7afb86e4e6daef77da69709a.tar.gz
gnunet-6aefa4ac85435c8e7afb86e4e6daef77da69709a.zip
generating SUSPEND events
Diffstat (limited to 'src/fs/fs_search.c')
-rw-r--r--src/fs/fs_search.c74
1 files changed, 73 insertions, 1 deletions
diff --git a/src/fs/fs_search.c b/src/fs/fs_search.c
index 9ab024eeb..36aa26193 100644
--- a/src/fs/fs_search.c
+++ b/src/fs/fs_search.c
@@ -1168,6 +1168,46 @@ GNUNET_FS_search_start_searching_ (struct GNUNET_FS_SearchContext *sc)
1168} 1168}
1169 1169
1170 1170
1171
1172/**
1173 * Signal suspend and free the given search result.
1174 *
1175 * @param cls the global FS handle
1176 * @param key the key for the search result (unused)
1177 * @param value the search result to free
1178 * @return GNUNET_OK
1179 */
1180static int
1181search_result_suspend (void *cls,
1182 const GNUNET_HashCode * key,
1183 void *value)
1184{
1185 struct GNUNET_FS_SearchContext *sc = cls;
1186 struct GNUNET_FS_Handle *h = sc->h;
1187 struct GNUNET_FS_SearchResult *sr = value;
1188 struct GNUNET_FS_ProgressInfo pi;
1189
1190 if (sr->download != NULL)
1191 GNUNET_FS_download_signal_suspend_ (sr->download);
1192 pi.status = GNUNET_FS_STATUS_SEARCH_RESULT_SUSPEND;
1193 pi.value.search.specifics.result_suspend.cctx = sr->client_info;
1194 pi.value.search.specifics.result_suspend.meta = sr->meta;
1195 pi.value.search.specifics.result_suspend.uri = sr->uri;
1196 sr->client_info = GNUNET_FS_search_make_status_ (&pi, sc);
1197 GNUNET_break (NULL == sr->client_info);
1198 GNUNET_free_non_null (sr->serialization);
1199 GNUNET_FS_uri_destroy (sr->uri);
1200 GNUNET_CONTAINER_meta_data_destroy (sr->meta);
1201 if (sr->probe_ctx != NULL)
1202 GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES);
1203 if (sr->probe_cancel_task != GNUNET_SCHEDULER_NO_TASK)
1204 GNUNET_SCHEDULER_cancel (h->sched,
1205 sr->probe_cancel_task);
1206 GNUNET_free (sr);
1207 return GNUNET_OK;
1208}
1209
1210
1171/** 1211/**
1172 * Create SUSPEND event for the given search operation 1212 * Create SUSPEND event for the given search operation
1173 * and then clean up our state (without stop signal). 1213 * and then clean up our state (without stop signal).
@@ -1178,9 +1218,41 @@ static void
1178search_signal_suspend (void *cls) 1218search_signal_suspend (void *cls)
1179{ 1219{
1180 struct GNUNET_FS_SearchContext *sc = cls; 1220 struct GNUNET_FS_SearchContext *sc = cls;
1221 struct GNUNET_FS_SearchContext *parent = cls;
1222 struct GNUNET_FS_ProgressInfo pi;
1223 unsigned int i;
1181 1224
1182 GNUNET_FS_end_top (sc->h, sc->top); 1225 GNUNET_FS_end_top (sc->h, sc->top);
1183 /* FIXME: signal! */ 1226 if (NULL != (parent = sc->parent))
1227 {
1228 GNUNET_CONTAINER_DLL_remove (parent->child_head,
1229 parent->child_tail,
1230 sc);
1231 sc->parent = NULL;
1232 }
1233 while (NULL != sc->child_head)
1234 search_signal_suspend (sc->child_head);
1235 GNUNET_CONTAINER_multihashmap_iterate (sc->master_result_map,
1236 &search_result_suspend,
1237 sc);
1238 pi.status = GNUNET_FS_STATUS_SEARCH_SUSPEND;
1239 sc->client_info = GNUNET_FS_search_make_status_ (&pi, sc);
1240 GNUNET_break (NULL == sc->client_info);
1241 if (sc->task != GNUNET_SCHEDULER_NO_TASK)
1242 GNUNET_SCHEDULER_cancel (sc->h->sched,
1243 sc->task);
1244 if (NULL != sc->client)
1245 GNUNET_CLIENT_disconnect (sc->client, GNUNET_NO);
1246 GNUNET_CONTAINER_multihashmap_destroy (sc->master_result_map);
1247 if (sc->requests != NULL)
1248 {
1249 GNUNET_assert (GNUNET_FS_uri_test_ksk (sc->uri));
1250 for (i=0;i<sc->uri->data.ksk.keywordCount;i++)
1251 GNUNET_CONTAINER_multihashmap_destroy (sc->requests[i].results);
1252 }
1253 GNUNET_free_non_null (sc->requests);
1254 GNUNET_free_non_null (sc->emsg);
1255 GNUNET_FS_uri_destroy (sc->uri);
1184 GNUNET_free (sc); 1256 GNUNET_free (sc);
1185} 1257}
1186 1258