diff options
author | Anonymized <anonymous@example.com> | 2018-01-20 02:25:18 +0100 |
---|---|---|
committer | Anonymized <anonymous@example.com> | 2018-01-20 02:25:18 +0100 |
commit | 59ee9129c87d5009648a2f9892c32c85d5115f72 (patch) | |
tree | 9d8a7816af3ceae60d445e26a9d4a9eeeda4694e | |
parent | f8d398218d339f001a3eca920d4c79f2ff64e67a (diff) | |
download | gnunet-guile2-59ee9129c87d5009648a2f9892c32c85d5115f72.tar.gz gnunet-guile2-59ee9129c87d5009648a2f9892c32c85d5115f72.zip |
sync: add search
-rw-r--r-- | gnunet/sync.scm | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/gnunet/sync.scm b/gnunet/sync.scm index c351a95..038e937 100644 --- a/gnunet/sync.scm +++ b/gnunet/sync.scm | |||
@@ -22,6 +22,8 @@ | |||
22 | (use-modules ((gnunet))) | 22 | (use-modules ((gnunet))) |
23 | 23 | ||
24 | 24 | ||
25 | ;;; publish | ||
26 | |||
25 | (define (publish/task/shutdown publish-context) | 27 | (define (publish/task/shutdown publish-context) |
26 | (lambda () | 28 | (lambda () |
27 | (fs-publish-stop publish-context))) | 29 | (fs-publish-stop publish-context))) |
@@ -82,3 +84,45 @@ code is non-zero; otherwise return #t." | |||
82 | (let ((uri (publish-file configuration filename))) | 84 | (let ((uri (publish-file configuration filename))) |
83 | (publish-keywords configuration uri keywords) | 85 | (publish-keywords configuration uri keywords) |
84 | uri)) | 86 | uri)) |
87 | |||
88 | ;;; search | ||
89 | |||
90 | (define (search/task/shutdown search-context) | ||
91 | (lambda () | ||
92 | (fs-search-stop search-context))) | ||
93 | |||
94 | (define (search/progress callback) | ||
95 | (lambda (info) | ||
96 | (let ((status (fs-progress-info-status info))) | ||
97 | (cond | ||
98 | ((eq? status %fs-status-search-result) | ||
99 | (callback (uri->string (fs-progress-info-search-result-uri info)))))))) | ||
100 | |||
101 | (define (search/timeout) | ||
102 | (scheduler-shutdown)) | ||
103 | |||
104 | (define %ten-seconds (* 10 (expt 10 6))) | ||
105 | |||
106 | (define (search/task configuration uri callback) | ||
107 | (lambda () | ||
108 | (let ((fs (fs-start configuration "gnunet-guile" (search/progress callback)))) | ||
109 | (let ((search-context (fs-search-start fs uri 1 %fs-search-option-none))) | ||
110 | (scheduler-add-delayed %ten-seconds search/timeout) | ||
111 | (scheduler-add-shutdown (search/task/shutdown search-context)))))) | ||
112 | |||
113 | (define (search-exec configuration keywords callback) | ||
114 | (let ((configuration* (configuration-create)) | ||
115 | (uri (apply fs-uri-ksk-create keywords))) | ||
116 | (configuration-load! configuration* configuration) | ||
117 | (scheduler-run (search/task configuration* uri callback)))) | ||
118 | |||
119 | (define-public (search configuration keywords) | ||
120 | "Search for files on matchin KEYWORDS" | ||
121 | (let ((out '())) | ||
122 | (let ((thread (call-with-new-thread | ||
123 | (lambda () | ||
124 | (search-exec configuration | ||
125 | keywords | ||
126 | (lambda (uri) (set! out (cons uri out)))))))) | ||
127 | (join-thread thread)) | ||
128 | out)) | ||