diff options
author | Christian Grothoff <christian@grothoff.org> | 2013-05-30 15:20:02 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2013-05-30 15:20:02 +0000 |
commit | 4647e06936db32a1829223e48eb3d6b6a52b0c3d (patch) | |
tree | cecf4c425161d04a41254eed1ba534b019737abf /src/fs/fs_search.c | |
parent | 40b50b568b0c74d168b4b009c8f528568bfe8ac1 (diff) | |
download | gnunet-4647e06936db32a1829223e48eb3d6b6a52b0c3d.tar.gz gnunet-4647e06936db32a1829223e48eb3d6b6a52b0c3d.zip |
-towards allowing probes for directory entries
Diffstat (limited to 'src/fs/fs_search.c')
-rw-r--r-- | src/fs/fs_search.c | 98 |
1 files changed, 82 insertions, 16 deletions
diff --git a/src/fs/fs_search.c b/src/fs/fs_search.c index 0c51ed394..2fa14f68d 100644 --- a/src/fs/fs_search.c +++ b/src/fs/fs_search.c | |||
@@ -429,7 +429,7 @@ GNUNET_FS_search_start_probe_ (struct GNUNET_FS_SearchResult *sr) | |||
429 | 2 * (1 + sr->availability_trials)); | 429 | 2 * (1 + sr->availability_trials)); |
430 | sr->probe_ctx = | 430 | sr->probe_ctx = |
431 | GNUNET_FS_download_start (sr->h, sr->uri, sr->meta, NULL, NULL, off, | 431 | GNUNET_FS_download_start (sr->h, sr->uri, sr->meta, NULL, NULL, off, |
432 | len, sr->sc->anonymity, | 432 | len, sr->anonymity, |
433 | GNUNET_FS_DOWNLOAD_NO_TEMPORARIES | | 433 | GNUNET_FS_DOWNLOAD_NO_TEMPORARIES | |
434 | GNUNET_FS_DOWNLOAD_IS_PROBE, sr, NULL); | 434 | GNUNET_FS_DOWNLOAD_IS_PROBE, sr, NULL); |
435 | sr->probe_ping_task | 435 | sr->probe_ping_task |
@@ -439,6 +439,84 @@ GNUNET_FS_search_start_probe_ (struct GNUNET_FS_SearchResult *sr) | |||
439 | 439 | ||
440 | 440 | ||
441 | /** | 441 | /** |
442 | * Start download probes for the given search result. | ||
443 | * | ||
444 | * @param h file-sharing handle to use for the operation | ||
445 | * @param uri URI to probe | ||
446 | * @param meta meta data associated with the URI | ||
447 | * @param client_info client info pointer to use for associated events | ||
448 | * @param anonymity anonymity level to use for the probes | ||
449 | * @return the search result handle to access the probe activity | ||
450 | */ | ||
451 | struct GNUNET_FS_SearchResult * | ||
452 | GNUNET_FS_probe (struct GNUNET_FS_Handle *h, | ||
453 | const struct GNUNET_FS_Uri *uri, | ||
454 | const struct GNUNET_CONTAINER_MetaData *meta, | ||
455 | void *client_info, | ||
456 | uint32_t anonymity) | ||
457 | { | ||
458 | struct GNUNET_FS_SearchResult *sr; | ||
459 | |||
460 | sr = GNUNET_new (struct GNUNET_FS_SearchResult); | ||
461 | sr->h = h; | ||
462 | sr->uri = GNUNET_FS_uri_dup (uri); | ||
463 | sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); | ||
464 | sr->client_info = client_info; | ||
465 | sr->anonymity = anonymity; | ||
466 | GNUNET_FS_search_start_probe_ (sr); | ||
467 | return sr; | ||
468 | } | ||
469 | |||
470 | |||
471 | /** | ||
472 | * Stop probing activity associated with a search result. | ||
473 | * | ||
474 | * @param sr search result | ||
475 | */ | ||
476 | static void | ||
477 | GNUNET_FS_search_stop_probe_ (struct GNUNET_FS_SearchResult *sr) | ||
478 | { | ||
479 | if (NULL != sr->probe_ctx) | ||
480 | { | ||
481 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); | ||
482 | sr->probe_ctx = NULL; | ||
483 | } | ||
484 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_ping_task) | ||
485 | { | ||
486 | GNUNET_SCHEDULER_cancel (sr->probe_ping_task); | ||
487 | sr->probe_ping_task = GNUNET_SCHEDULER_NO_TASK; | ||
488 | } | ||
489 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task) | ||
490 | { | ||
491 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); | ||
492 | sr->probe_cancel_task = GNUNET_SCHEDULER_NO_TASK; | ||
493 | } | ||
494 | } | ||
495 | |||
496 | |||
497 | /** | ||
498 | * Stop probe activity. Must ONLY be used on values | ||
499 | * returned from 'GNUNET_FS_probe'. | ||
500 | * | ||
501 | * @param sr search result to stop probing for (freed) | ||
502 | * @return the value of the 'client_info' pointer | ||
503 | */ | ||
504 | void * | ||
505 | GNUNET_FS_probe_stop (struct GNUNET_FS_SearchResult *sr) | ||
506 | { | ||
507 | void *client_info; | ||
508 | |||
509 | GNUNET_assert (NULL == sr->sc); | ||
510 | GNUNET_FS_search_stop_probe_ (sr); | ||
511 | GNUNET_FS_uri_destroy (sr->uri); | ||
512 | GNUNET_CONTAINER_meta_data_destroy (sr->meta); | ||
513 | client_info = sr->client_info; | ||
514 | GNUNET_free (sr); | ||
515 | return client_info; | ||
516 | } | ||
517 | |||
518 | |||
519 | /** | ||
442 | * We have received a KSK result. Check how it fits in with the | 520 | * We have received a KSK result. Check how it fits in with the |
443 | * overall query and notify the client accordingly. | 521 | * overall query and notify the client accordingly. |
444 | * | 522 | * |
@@ -480,6 +558,7 @@ process_ksk_result (struct GNUNET_FS_SearchContext *sc, | |||
480 | sr = GNUNET_malloc (sizeof (struct GNUNET_FS_SearchResult)); | 558 | sr = GNUNET_malloc (sizeof (struct GNUNET_FS_SearchResult)); |
481 | sr->h = sc->h; | 559 | sr->h = sc->h; |
482 | sr->sc = sc; | 560 | sr->sc = sc; |
561 | sr->anonymity = sc->anonymity; | ||
483 | sr->uri = GNUNET_FS_uri_dup (uri); | 562 | sr->uri = GNUNET_FS_uri_dup (uri); |
484 | sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); | 563 | sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); |
485 | sr->mandatory_missing = sc->mandatory_count; | 564 | sr->mandatory_missing = sc->mandatory_count; |
@@ -560,6 +639,7 @@ process_sks_result (struct GNUNET_FS_SearchContext *sc, const char *id_update, | |||
560 | sr = GNUNET_malloc (sizeof (struct GNUNET_FS_SearchResult)); | 639 | sr = GNUNET_malloc (sizeof (struct GNUNET_FS_SearchResult)); |
561 | sr->h = sc->h; | 640 | sr->h = sc->h; |
562 | sr->sc = sc; | 641 | sr->sc = sc; |
642 | sr->anonymity = sc->anonymity; | ||
563 | sr->uri = GNUNET_FS_uri_dup (uri); | 643 | sr->uri = GNUNET_FS_uri_dup (uri); |
564 | sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); | 644 | sr->meta = GNUNET_CONTAINER_meta_data_duplicate (meta); |
565 | sr->key = key; | 645 | sr->key = key; |
@@ -1489,21 +1569,7 @@ search_result_stop (void *cls, const struct GNUNET_HashCode * key, void *value) | |||
1489 | struct GNUNET_FS_SearchResult *sr = value; | 1569 | struct GNUNET_FS_SearchResult *sr = value; |
1490 | struct GNUNET_FS_ProgressInfo pi; | 1570 | struct GNUNET_FS_ProgressInfo pi; |
1491 | 1571 | ||
1492 | if (NULL != sr->probe_ctx) | 1572 | GNUNET_FS_search_stop_probe_ (sr); |
1493 | { | ||
1494 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); | ||
1495 | sr->probe_ctx = NULL; | ||
1496 | } | ||
1497 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_ping_task) | ||
1498 | { | ||
1499 | GNUNET_SCHEDULER_cancel (sr->probe_ping_task); | ||
1500 | sr->probe_ping_task = GNUNET_SCHEDULER_NO_TASK; | ||
1501 | } | ||
1502 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task) | ||
1503 | { | ||
1504 | GNUNET_SCHEDULER_cancel (sr->probe_cancel_task); | ||
1505 | sr->probe_cancel_task = GNUNET_SCHEDULER_NO_TASK; | ||
1506 | } | ||
1507 | 1573 | ||
1508 | if (NULL != sr->download) | 1574 | if (NULL != sr->download) |
1509 | { | 1575 | { |