diff options
author | Christian Grothoff <christian@grothoff.org> | 2010-05-04 08:50:09 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2010-05-04 08:50:09 +0000 |
commit | 6aefa4ac85435c8e7afb86e4e6daef77da69709a (patch) | |
tree | fe3241f641088070ef4a909f627482f8252bf0a9 /src/fs/fs_search.c | |
parent | db9926f66da9571020fba8f1f2fa0014d1b65b0f (diff) | |
download | gnunet-6aefa4ac85435c8e7afb86e4e6daef77da69709a.tar.gz gnunet-6aefa4ac85435c8e7afb86e4e6daef77da69709a.zip |
generating SUSPEND events
Diffstat (limited to 'src/fs/fs_search.c')
-rw-r--r-- | src/fs/fs_search.c | 74 |
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 | */ | ||
1180 | static int | ||
1181 | search_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 | |||
1178 | search_signal_suspend (void *cls) | 1218 | search_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 | ||