ee10a0156f5e25ad97af37a206ba6a50a46a72f4
[oweals/gnunet.git] / src / include / gnunet_fs_service.h
1 /*
2      This file is part of GNUnet
3      (C) 2004, 2005, 2006, 2007, 2008, 2009 Christian Grothoff (and other contributing authors)
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 2, or (at your
8      option) any later version.
9
10      GNUnet is distributed in the hope that it will be useful, but
11      WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20 /**
21  * @file include/gnunet_fs_service.h
22  * @brief API for file-sharing via GNUnet 
23  * @author Christian Grothoff
24  *
25  * TODO:
26  * - extend API with support for publish simulation (-s)
27  *   and URI-argument binding to keyword/namespace (-u)
28  */
29 #ifndef GNUNET_FS_LIB_H
30 #define GNUNET_FS_LIB_H
31
32 #include "gnunet_util_lib.h"
33
34 #ifdef __cplusplus
35 extern "C"
36 {
37 #if 0                           /* keep Emacsens' auto-indent happy */
38 }
39 #endif
40 #endif
41
42 /**
43  * Version number of the implementation.
44  * History:
45  *
46  * 1.x.x: initial version with triple GNUNET_hash and merkle tree
47  * 2.x.x: root node with mime-type, filename and version number
48  * 2.1.x: combined GNUNET_EC_ContentHashKey/3HASH encoding with 25:1 super-nodes
49  * 2.2.x: with directories
50  * 3.0.x: with namespaces
51  * 3.1.x: with namespace meta-data
52  * 3.2.x: with collections
53  * 4.0.x: with expiration, variable meta-data, kblocks
54  * 4.1.x: with new error and configuration handling
55  * 5.0.x: with location URIs
56  * 6.0.0: with support for OR in KSKs
57  * 6.1.x: with simplified namespace support
58  * 9.0.0: CPS-style integrated API
59  */
60 #define GNUNET_FS_VERSION 0x00090000
61
62
63 /* ******************** URI API *********************** */
64
65 #define GNUNET_FS_URI_PREFIX "gnunet://fs/"
66 #define GNUNET_FS_URI_KSK_INFIX "ksk/"
67 #define GNUNET_FS_URI_SKS_INFIX "sks/"
68 #define GNUNET_FS_URI_CHK_INFIX "chk/"
69 #define GNUNET_FS_URI_LOC_INFIX "loc/"
70
71
72 /**
73  * A Universal Resource Identifier (URI), opaque.
74  */
75 struct GNUNET_FS_Uri;
76
77
78 /**
79  * Iterator over keywords
80  *
81  * @param cls closure
82  * @param keyword the keyword
83  * @param is_mandatory is the keyword mandatory (in a search)
84  * @return GNUNET_OK to continue to iterate, GNUNET_SYSERR to abort
85  */
86 typedef int (*GNUNET_FS_KeywordIterator) (void *cls,
87                                           const char *keyword,
88                                           int is_mandatory);
89
90 /**
91  * Get a unique key from a URI.  This is for putting URIs
92  * into HashMaps.  The key may change between FS implementations.
93  *
94  * @param uri uri to convert to a unique key
95  * @param key wherer to store the unique key
96  */
97 void 
98 GNUNET_FS_uri_to_key (const struct GNUNET_FS_Uri *uri,
99                       GNUNET_HashCode * key);
100
101 /**
102  * Convert a URI to a UTF-8 String.
103  *
104  * @param uri uri to convert to a string
105  * @return the UTF-8 string
106  */
107 char *
108 GNUNET_FS_uri_to_string (const struct GNUNET_FS_Uri *uri);
109
110 /**
111  * Convert keyword URI to a human readable format
112  * (i.e. the search query that was used in the first place)
113  *
114  * @param uri ksk uri to convert to a string 
115  * @return string with the keywords
116  */
117 char *
118 GNUNET_FS_uri_ksk_to_string_fancy (const struct GNUNET_FS_Uri *uri);
119
120 /**
121  * Convert a UTF-8 String to a URI.
122  *
123  * @param uri string to parse
124  * @param emsg where to store the parser error message (if any)
125  * @return NULL on error
126  */
127 struct GNUNET_FS_Uri *
128 GNUNET_FS_uri_parse (const char *uri,
129                      char **emsg);
130
131 /**
132  * Free URI.
133  *
134  * @param uri uri to free
135  */
136 void 
137 GNUNET_FS_uri_destroy (struct GNUNET_FS_Uri *uri);
138
139
140 /**
141  * How many keywords are ANDed in this keyword URI?
142  *
143  * @param uri ksk uri to get the number of keywords from
144  * @return 0 if this is not a keyword URI
145  */
146 unsigned int 
147 GNUNET_FS_uri_ksk_get_keyword_count (const struct GNUNET_FS_Uri *uri);
148
149
150 /**
151  * Iterate over all keywords in this keyword URI.
152  *
153  * @param uri ksk uri to get the keywords from
154  * @param iterator function to call on each keyword
155  * @param iterator_cls closure for iterator
156  * @return -1 if this is not a keyword URI, otherwise number of
157  *   keywords iterated over until iterator aborted
158  */
159 int 
160 GNUNET_FS_uri_ksk_get_keywords (const struct GNUNET_FS_Uri *uri,
161                                 GNUNET_FS_KeywordIterator iterator, 
162                                 void *iterator_cls);
163
164
165 /**
166  * Obtain the identity of the peer offering the data
167  *
168  * @param uri the location URI to inspect
169  * @param peer where to store the identify of the peer (presumably) offering the content
170  * @return GNUNET_SYSERR if this is not a location URI, otherwise GNUNET_OK
171  */
172 int
173 GNUNET_FS_uri_loc_get_peer_identity (const struct GNUNET_FS_Uri *uri,
174                                      struct GNUNET_PeerIdentity * peer);
175
176
177 /**
178  * Obtain the URI of the content itself.
179  *
180  * @param uri location URI to get the content URI from
181  * @return NULL if argument is not a location URI
182  */
183 struct GNUNET_FS_Uri *
184 GNUNET_FS_uri_loc_get_uri (const struct GNUNET_FS_Uri *uri);
185
186
187 /**
188  * Construct a location URI (this peer will be used for the location).
189  *
190  * @param baseURI content offered by the sender
191  * @param cfg configuration information (used to find our hostkey)
192  * @param expiration_time how long will the content be offered?
193  * @return the location URI, NULL on error
194  */
195 struct GNUNET_FS_Uri *
196 GNUNET_FS_uri_loc_create (const struct GNUNET_FS_Uri *baseUri,
197                           struct GNUNET_CONFIGURATION_Handle *cfg,
198                           struct GNUNET_TIME_Absolute expiration_time);
199
200
201 /**
202  * Canonicalize keyword URI.  Performs operations such
203  * as decapitalization and removal of certain characters.
204  * (useful for search).
205  *
206  * @param uri the URI to canonicalize 
207  * @return canonicalized version of the URI, NULL on error
208  */
209 struct GNUNET_FS_Uri *
210 GNUNET_FS_uri_ksk_canonicalize (const struct GNUNET_FS_Uri *uri);
211
212
213 /**
214  * Merge the sets of keywords from two KSK URIs.
215  * (useful for merging the canonicalized keywords with
216  * the original keywords for sharing).
217  *
218  * @param u1 first uri
219  * @param u2 second uri
220  * @return merged URI, NULL on error
221  */
222 struct GNUNET_FS_Uri *
223 GNUNET_FS_uri_ksk_merge (const struct GNUNET_FS_Uri *u1,
224                          const struct GNUNET_FS_Uri *u2);
225
226
227 /**
228  * Duplicate URI.
229  *
230  * @param uri the URI to duplicate
231  * @return copy of the URI
232  */
233 struct GNUNET_FS_Uri *
234 GNUNET_FS_uri_dup (const struct GNUNET_FS_Uri *uri);
235
236
237 /**
238  * Create an FS URI from a single user-supplied string of keywords.
239  * The string is broken up at spaces into individual keywords.
240  * Keywords that start with "+" are mandatory.  Double-quotes can
241  * be used to prevent breaking up strings at spaces (and also
242  * to specify non-mandatory keywords starting with "+").
243  *
244  * Keywords must contain a balanced number of double quotes and
245  * double quotes can not be used in the actual keywords (for
246  * example, the string '""foo bar""' will be turned into two
247  * "OR"ed keywords 'foo' and 'bar', not into '"foo bar"'.
248  *
249  * @param keywords the keyword string
250  * @param emsg where to store an error message
251  * @return an FS URI for the given keywords, NULL
252  *  if keywords is not legal (i.e. empty).
253  */
254 struct GNUNET_FS_Uri *
255 GNUNET_FS_uri_ksk_create (const char *keywords,
256                           char **emsg);
257
258
259 /**
260  * Create an FS URI from a user-supplied command line of keywords.
261  * Arguments should start with "+" to indicate mandatory
262  * keywords.
263  *
264  * @param argc number of keywords
265  * @param argv keywords (double quotes are not required for
266  *             keywords containing spaces; however, double
267  *             quotes are required for keywords starting with
268  *             "+"); there is no mechanism for having double
269  *             quotes in the actual keywords (if the user
270  *             did specifically specify double quotes, the
271  *             caller should convert each double quote
272  *             into two single quotes).
273  * @return an FS URI for the given keywords, NULL
274  *  if keywords is not legal (i.e. empty).
275  */
276 struct GNUNET_FS_Uri *
277 GNUNET_FS_uri_ksk_create_from_args (unsigned int argc,
278                                     const char **argv);
279
280
281 /**
282  * Test if two URIs are equal.
283  *
284  * @param u1 one of the URIs
285  * @param u2 the other URI
286  * @return GNUNET_YES if the URIs are equal
287  */
288 int 
289 GNUNET_FS_uri_test_equal (const struct GNUNET_FS_Uri *u1,
290                           const struct GNUNET_FS_Uri *u2);
291
292
293 /**
294  * Is this a namespace URI?
295  *
296  * @param uri the uri to check
297  * @return GNUNET_YES if this is an SKS uri
298  */
299 int
300 GNUNET_FS_uri_test_sks (const struct GNUNET_FS_Uri *uri);
301
302
303 /**
304  * Get the ID of a namespace from the given
305  * namespace URI.
306  *
307  * @param uri the uri to get the namespace ID from
308  * @param nsid where to store the ID of the namespace
309  * @return GNUNET_OK on success
310  */
311 int 
312 GNUNET_FS_uri_sks_get_namespace (const struct GNUNET_FS_Uri *uri,
313                                  GNUNET_HashCode * nsid);
314
315
316 /**
317  * Get the content identifier of an SKS URI.
318  *
319  * @param uri the sks uri
320  * @return NULL on error (not a valid SKS URI)
321  */
322 char *
323 GNUNET_FS_uri_sks_get_content_id (const struct GNUNET_FS_Uri *uri);
324
325
326 /**
327  * Convert namespace URI to a human readable format
328  * (using the namespace description, if available).
329  *
330  * @param cfg configuration to use
331  * @param uri SKS uri to convert
332  * @return NULL on error (not an SKS URI)
333  */
334 char *
335 GNUNET_FS_uri_sks_to_string_fancy (struct GNUNET_CONFIGURATION_Handle *cfg,
336                                    const struct GNUNET_FS_Uri *uri);
337
338
339 /**
340  * Is this a keyword URI?
341  *
342  * @param uri the uri
343  * @return GNUNET_YES if this is a KSK uri
344  */
345 int 
346 GNUNET_FS_uri_test_ksk (const struct GNUNET_FS_Uri *uri);
347
348
349 /**
350  * Is this a file (or directory) URI?
351  *
352  * @param uri the uri to check
353  * @return GNUNET_YES if this is a CHK uri
354  */
355 int 
356 GNUNET_FS_uri_test_chk (const struct GNUNET_FS_Uri *uri);
357
358
359 /**
360  * What is the size of the file that this URI
361  * refers to?
362  *
363  * @param uri the CHK URI to inspect
364  * @return size of the file as specified in the CHK URI
365  */
366 uint64_t 
367 GNUNET_FS_uri_chk_get_file_size (const struct GNUNET_FS_Uri *uri);
368
369
370 /**
371  * Is this a location URI?
372  *
373  * @param uri the uri to check
374  * @return GNUNET_YES if this is a LOC uri
375  */
376 int 
377 GNUNET_FS_uri_test_loc (const struct GNUNET_FS_Uri *uri);
378
379
380 /**
381  * Construct a keyword-URI from meta-data (take all entries
382  * in the meta-data and construct one large keyword URI
383  * that lists all keywords that can be found in the meta-data).
384  * @deprecated
385  */
386 struct GNUNET_FS_Uri *
387 GNUNET_FS_uri_ksk_create_from_meta_data (const struct GNUNET_CONTAINER_MetaData *md);
388
389
390 /* ******************** command-line option parsing API *********************** */
391
392 /**
393  * Command-line option parser function that allows the user
394  * to specify one or more '-k' options with keywords.  Each
395  * specified keyword will be added to the URI.  A pointer to
396  * the URI must be passed as the "scls" argument.
397  *
398  * @param ctx command line processor context
399  * @param scls must be of type "struct GNUNET_FS_Uri **"
400  * @param option name of the option (typically 'k')
401  * @param value command line argument given
402  * @return GNUNET_OK on success
403  */
404 int
405 GNUNET_FS_getopt_set_keywords (struct GNUNET_GETOPT_CommandLineProcessorContext* ctx, 
406                                          void *scls,
407                                          const char *option,
408                                          const char *value);
409
410
411 /**
412  * Command-line option parser function that allows the user to specify
413  * one or more '-m' options with metadata.  Each specified entry of
414  * the form "type=value" will be added to the metadata.  A pointer to
415  * the metadata must be passed as the "scls" argument.
416  *
417  * @param ctx command line processor context
418  * @param scls must be of type "struct GNUNET_CONTAINER_MetaData **"
419  * @param option name of the option (typically 'k')
420  * @param value command line argument given
421  * @return GNUNET_OK on success
422  */
423 int
424 GNUNET_FS_getopt_set_metadata (struct GNUNET_GETOPT_CommandLineProcessorContext* ctx, 
425                                          void *scls,
426                                          const char *option,
427                                          const char *value);
428
429
430
431 /* ************************* sharing API ***************** */
432
433
434 /**
435  * Possible status codes used in the callback for the 
436  * various file-sharing operations.  On each file (or search),
437  * the callback is guaranteed to be called once with "START"
438  * and once with STOPPED; calls with PROGRESS, ERROR or COMPLETED
439  * are optional and depend on the circumstances; parent operations
440  * will be STARTED before child-operations and STOPPED after
441  * their respective child-operations.  START and STOP signals 
442  * are typically generated either due to explicit client requests
443  * or because of suspend/resume operations.
444  */
445 enum GNUNET_FS_Status
446 {
447   /**
448    * Notification that we have started to publish a file structure.
449    */
450   GNUNET_FS_STATUS_PUBLISH_START,
451
452   /**
453    * Notification that we have resumed sharing a file structure.
454    */
455   GNUNET_FS_STATUS_PUBLISH_RESUME,
456
457   /**
458    * Notification that we have suspended sharing a file structure.
459    */
460   GNUNET_FS_STATUS_PUBLISH_SUSPEND,
461
462   /**
463    * Notification that we are making progress sharing a file structure.
464    */
465   GNUNET_FS_STATUS_PUBLISH_PROGRESS,
466
467   /**
468    * Notification that an error was encountered  sharing a file structure.
469    * The application will continue to receive resume/suspend events for
470    * this structure until "GNUNET_FS_publish_stop" is called.
471    */
472   GNUNET_FS_STATUS_PUBLISH_ERROR,
473
474   /**
475    * Notification that we completed sharing a file structure.
476    * The application will continue to receive resume/suspend events for
477    * this structure until "GNUNET_FS_publish_stop" is called.
478    */
479   GNUNET_FS_STATUS_PUBLISH_COMPLETED,
480
481   /**
482    * Notification that we have stopped
483    * the process of uploading a file structure; no
484    * futher events will be generated for this action.
485    */
486   GNUNET_FS_STATUS_PUBLISH_STOPPED,
487
488   /**
489    * Notification that we have started this download.
490    */
491   GNUNET_FS_STATUS_DOWNLOAD_START,
492
493   /**
494    * Notification that this download is being resumed.
495    */
496   GNUNET_FS_STATUS_DOWNLOAD_RESUME,
497
498   /**
499    * Notification that this download was suspended.
500    */
501   GNUNET_FS_STATUS_DOWNLOAD_SUSPEND,
502
503   /**
504    * Notification about progress with this download.
505    */
506   GNUNET_FS_STATUS_DOWNLOAD_PROGRESS,
507
508   /**
509    * Notification that this download encountered an error.
510    */
511   GNUNET_FS_STATUS_DOWNLOAD_ERROR,
512
513   /**
514    * Notification that this download completed.  Note that for
515    * directories, completion does not imply completion of all files in
516    * the directory.
517    */
518   GNUNET_FS_STATUS_DOWNLOAD_COMPLETED,
519
520   /**
521    * Notification that this download was stopped
522    * (final event with respect to this action).
523    */
524   GNUNET_FS_STATUS_DOWNLOAD_STOPPED,
525
526   /**
527    * First event generated when a client requests 
528    * a search to begin or when a namespace result
529    * automatically triggers the search for updates.
530    */
531   GNUNET_FS_STATUS_SEARCH_START,
532
533   /**
534    * Last event when a search is being resumed;
535    * note that "GNUNET_FS_SEARCH_START" will not
536    * be generated in this case.
537    */
538   GNUNET_FS_STATUS_SEARCH_RESUME,
539
540   /**
541    * Event generated for each search result
542    * when the respective search is resumed.
543    */
544   GNUNET_FS_STATUS_SEARCH_RESUME_RESULT,
545
546   /**
547    * Last event when a search is being suspended;
548    * note that "GNUNET_FS_SEARCH_STOPPED" will not
549    * be generated in this case.
550    */
551   GNUNET_FS_STATUS_SEARCH_SUSPEND,
552   
553   /**
554    * Event generated for each search result
555    * when the respective search is suspended.
556    */
557   GNUNET_FS_STATUS_SEARCH_SUSPEND_RESULT,
558
559   /**
560    * This search has yielded a result.
561    */
562   GNUNET_FS_STATUS_SEARCH_RESULT,
563
564   /**
565    * We have discovered a new namespace.
566    */
567   GNUNET_FS_STATUS_SEARCH_RESULT_NAMESPACE,
568
569   /**
570    * We have additional data about the quality
571    * or availability of a search result.
572    */
573   GNUNET_FS_STATUS_SEARCH_UPDATE,
574
575   /**
576    * Signals a problem with this search.
577    */
578   GNUNET_FS_STATUS_SEARCH_ERROR,
579
580   /**
581    * Signals that this search was paused.
582    */
583   GNUNET_FS_STATUS_SEARCH_PAUSED,
584
585   /**
586    * Signals that this search was continued (unpaused).
587    */
588   GNUNET_FS_STATUS_SEARCH_CONTINUED,
589
590   /**
591    * Event generated for each search result
592    * when the respective search is stopped.
593    */
594   GNUNET_FS_STATUS_SEARCH_RESULT_STOPPED,
595
596   /**
597    * Last message from a search; this signals
598    * that there will be no further events associated
599    * with this search.
600    */
601   GNUNET_FS_STATUS_SEARCH_STOPPED,
602
603   /**
604    * Notification that we started to unindex a file.
605    */ 
606   GNUNET_FS_STATUS_UNINDEX_START,
607
608   /**
609    * Notification that we resumed unindexing of a file.
610    */
611   GNUNET_FS_STATUS_UNINDEX_RESUME,
612
613   /**
614    * Notification that we suspended unindexing a file.
615    */
616   GNUNET_FS_STATUS_UNINDEX_SUSPEND,
617
618   /**
619    * Notification that we made progress unindexing a file.
620    */
621   GNUNET_FS_STATUS_UNINDEX_PROGRESS,
622
623   /**
624    * Notification that we encountered an error unindexing
625    * a file.
626    */
627   GNUNET_FS_STATUS_UNINDEX_ERROR,
628
629   /**
630    * Notification that the unindexing of this file
631    * was completed.
632    */
633   GNUNET_FS_STATUS_UNINDEX_COMPLETED,
634
635   /**
636    * Notification that the unindexing of this file
637    * was stopped (final event for this action).
638    */
639   GNUNET_FS_STATUS_UNINDEX_STOPPED
640
641 };
642
643
644 /**
645  * Handle to one of our namespaces.
646  */
647 struct GNUNET_FS_Namespace;
648
649
650 /**
651  * Handle for controlling an upload.
652  */
653 struct GNUNET_FS_PublishContext;
654
655
656 /**
657  * Handle for controlling an unindexing operation.
658  */
659 struct GNUNET_FS_UnindexContext;
660
661
662 /**
663  * Handle for controlling a search.
664  */
665 struct GNUNET_FS_SearchContext;
666
667
668 /**
669  * Context for controlling a download.
670  */
671 struct GNUNET_FS_DownloadContext;
672
673
674 /**
675  * Handle for detail information about a file that is being publishd.
676  * Specifies metadata, keywords, how to get the contents of the file
677  * (i.e. data-buffer in memory, filename on disk) and other options.
678  */
679 struct GNUNET_FS_FileInformation;
680
681
682 /**
683  * Argument given to the progress callback with
684  * information about what is going on.
685  */
686 struct GNUNET_FS_ProgressInfo
687 {  
688
689   /**
690    * Values that depend on the event type.
691    */
692   union {
693     
694     /**
695      * Values for all "GNUNET_FS_STATUS_PUBLISH_*" events.
696      */
697     struct {
698
699       /**
700        * Context for controlling the upload.
701        */
702       struct GNUNET_FS_PublishContext *sc;
703
704       /**
705        * Information about the file that is being publishd.
706        */
707       const struct GNUNET_FS_FileInformation *fi;
708
709       /**
710        * Client context pointer (set the last time
711        * by the client for this operation; initially
712        * NULL on START/RESUME events).
713        */
714       void *cctx;
715
716       /**
717        * Client context pointer for the parent operation
718        * (if this is a file in a directory or a subdirectory).
719        */
720       void *pctx;
721       
722       /**
723        * How large is the file overall?  For directories,
724        * this is only the size of the directory itself,
725        * not of the other files contained within the 
726        * directory.
727        */
728       uint64_t size;
729
730       /**
731        * At what time do we expect to finish the upload?
732        * (will be a value in the past for completed
733        * uploads).
734        */ 
735       struct GNUNET_TIME_Relative eta;
736
737       /**
738        * How long has this upload been actively running
739        * (excludes times where the upload was suspended).
740        */
741       struct GNUNET_TIME_Relative duration;
742
743       /**
744        * How many bytes have we completed?
745        */
746       uint64_t completed;
747
748       /**
749        * What anonymity level is used for this upload?
750        */
751       uint32_t anonymity;
752
753       /**
754        * Additional values for specific events.
755        */
756       union {
757
758         /**
759          * These values are only valid for
760          * GNUNET_FS_STATUS_PUBLISH_PROGRESS events.
761          */
762         struct {
763           
764           /**
765            * Data block we just published.
766            */
767           const void *data;
768           
769           /**
770            * At what offset in the file is "data"?
771            */
772           uint64_t offset;
773           
774           /**
775            * Length of the data block.
776            */
777           uint64_t data_len;
778
779           /**
780            * Depth of the given block in the tree; 
781            * 0 would be the highest level (the first
782            * call is guaranteed to be for the lowest
783            * level).
784            */
785           unsigned int depth;
786
787         } progress;
788
789         /**
790          * These values are only valid for
791          * GNUNET_FS_STATUS_PUBLISH_RESUME events.
792          */
793         struct {
794           
795           /**
796            * Error message, NULL if no error was encountered so far.
797            */
798           const char *message;
799           
800           /**
801            * URI of the file (if the download had been completed)
802            */
803           const struct GNUNET_FS_Uri *chk_uri;
804
805         } resume;
806
807         /**
808          * These values are only valid for
809          * GNUNET_FS_STATUS_PUBLISH_COMPLETED events.
810          */
811         struct {
812           
813           /**
814            * URI of the file.
815            */
816           const struct GNUNET_FS_Uri *chk_uri;
817
818         } completed;
819
820         /**
821          * These values are only valid for
822          * GNUNET_FS_STATUS_PUBLISH_ERROR events.
823          */
824         struct {
825           
826           /**
827            * Error message, never NULL.
828            */
829           const char *message;
830
831         } error;
832
833       } specifics;
834
835     } publish;
836
837     
838     /**
839      * Values for all "GNUNET_FS_STATUS_DOWNLOAD_*" events.
840      */
841     struct {
842
843       /**
844        * Context for controlling the download.
845        */
846       struct GNUNET_FS_DownloadContext *dc;
847
848       /**
849        * Client context pointer (set the last time
850        * by the client for this operation; initially
851        * NULL on START/RESUME events).
852        */
853       void *cctx;
854
855       /**
856        * Client context pointer for the parent operation
857        * (if this is a file in a directory or a subdirectory).
858        */
859       void *pctx;
860       
861       /**
862        * URI used for this download.
863        */
864       const struct GNUNET_FS_Uri *uri;
865       
866       /**
867        * How large is the download overall?  This
868        * is NOT necessarily the size from the
869        * URI since we may be doing a partial download.
870        */
871       uint64_t length;
872
873       /**
874        * At what time do we expect to finish the download?
875        * (will be a value in the past for completed
876        * uploads).
877        */ 
878       struct GNUNET_TIME_Relative eta;
879
880       /**
881        * How long has this download been active?
882        */ 
883       struct GNUNET_TIME_Relative duration;
884
885       /**
886        * How many bytes have we completed?
887        */
888       uint64_t completed;
889
890       /**
891        * What anonymity level is used for this download?
892        */
893       uint32_t anonymity;
894
895       /**
896        * Additional values for specific events.
897        */
898       union {
899         
900         /**
901          * These values are only valid for
902          * GNUNET_FS_STATUS_DOWNLOAD_PROGRESS events.
903          */
904         struct {
905   
906           /**
907            * Data block we just obtained.
908            */
909           const void *data;
910           
911           /**
912            * At what offset in the file is "data"?
913            */
914           uint64_t offset;
915           
916           /**
917            * Length of the data block.
918            */
919           uint64_t data_len;
920
921           /**
922            * Depth of the given block in the tree; 
923            * 0 would be the highest level (the first
924            * call is guaranteed to be for the lowest
925            * level).
926            */
927           unsigned int depth;
928
929         } progress;
930
931         /**
932          * These values are only valid for
933          * GNUNET_FS_STATUS_DOWNLOAD_START events.
934          */
935         struct {
936
937           /**
938            * Known metadata for the download.
939            */
940           const struct GNUNET_CONTAINER_MetaData *meta;
941           
942         } start;
943
944         /**
945          * These values are only valid for
946          * GNUNET_FS_STATUS_DOWNLOAD_RESUME events.
947          */
948         struct {
949
950           /**
951            * Known metadata for the download.
952            */
953           const struct GNUNET_CONTAINER_MetaData *meta;
954
955           /**
956            * Error message, NULL if we have not encountered any error yet.
957            */
958           const char *message;
959
960         } resume;
961
962         /**
963          * These values are only valid for
964          * GNUNET_FS_STATUS_DOWNLOAD_ERROR events.
965          */
966         struct {
967
968           /**
969            * Error message.
970            */
971           const char *message;
972
973         } error;
974
975       } specifics;
976
977     } download;
978
979     /**
980      * Values for all "GNUNET_FS_STATUS_SEARCH_*" events.
981      */
982     struct {
983
984       /**
985        * Context for controlling the search, NULL for
986        * searches that were not explicitly triggered
987        * by the client (i.e., searches for updates in
988        * namespaces).
989        */
990       struct GNUNET_FS_SearchContext *sc;
991
992       /**
993        * Client context pointer (set the last time by the client for
994        * this operation; initially NULL on START/RESUME events).  Note
995        * that this value can only be set on START/RESUME; returning
996        * non-NULL on RESULT/RESUME_RESULT will actually update the
997        * private context for "UPDATE" events.
998        */
999       void *cctx;
1000
1001       /**
1002        * Client parent-context pointer; NULL for top-level searches,
1003        * non-NULL for automatically triggered searches for updates in
1004        * namespaces.
1005        */
1006       void *pctx;
1007
1008       /**
1009        * What query is used for this search
1010        * (list of keywords or SKS identifier).
1011        */
1012       const struct GNUNET_FS_Uri *query;
1013
1014       /**
1015        * How long has this search been actively running
1016        * (excludes times where the search was paused or
1017        * suspended).
1018        */
1019       struct GNUNET_TIME_Relative duration;
1020
1021       /**
1022        * What anonymity level is used for this search?
1023        */
1024       uint32_t anonymity;
1025
1026       /**
1027        * Additional values for specific events.
1028        */
1029       union {
1030         
1031         /**
1032          * These values are only valid for
1033          * GNUNET_FS_STATUS_SEARCH_RESULT events.
1034          */
1035         struct {
1036           
1037           /**
1038            * Metadata for the search result.
1039            */
1040           const struct GNUNET_CONTAINER_MetaData *meta;
1041
1042           /**
1043            * URI for the search result.
1044            */
1045           const struct GNUNET_FS_Uri *uri;
1046
1047         } result;
1048         
1049         /**
1050          * These values are only valid for
1051          * GNUNET_FS_STATUS_SEARCH_RESUME_RESULT events.
1052          */
1053         struct {
1054           
1055           /**
1056            * Metadata for the search result.
1057            */
1058           const struct GNUNET_CONTAINER_MetaData *meta;
1059
1060           /**
1061            * URI for the search result.
1062            */
1063           const struct GNUNET_FS_Uri *uri;
1064
1065           /**
1066            * Current availability rank (negative:
1067            * unavailable, positive: available)
1068            */
1069           int32_t availability_rank;
1070  
1071           /**
1072            * On how many total queries is the given
1073            * availability_rank based?
1074            */
1075           uint32_t availabiliy_certainty;
1076
1077           /**
1078            * Updated applicability rank (the larger,
1079            * the better the result fits the search
1080            * criteria).
1081            */
1082           uint32_t applicabiliy_rank;     
1083           
1084         } resume_result;
1085         
1086         /**
1087          * These values are only valid for
1088          * GNUNET_FS_STATUS_SEARCH_UPDATE events.
1089          */
1090         struct {
1091
1092           /**
1093            * Private context set for for this result
1094            * during the "RESULT" event.
1095            */
1096           void *cctx;
1097           
1098           /**
1099            * Metadata for the search result.
1100            */
1101           const struct GNUNET_CONTAINER_MetaData *meta;
1102
1103           /**
1104            * URI for the search result.
1105            */
1106           const struct GNUNET_FS_Uri *uri;
1107
1108           /**
1109            * Current availability rank (negative:
1110            * unavailable, positive: available)
1111            */
1112           int32_t availability_rank;
1113  
1114           /**
1115            * On how many total queries is the given
1116            * availability_rank based?
1117            */
1118           uint32_t availability_certainty;
1119
1120           /**
1121            * Updated applicability rank (the larger,
1122            * the better the result fits the search
1123            * criteria).
1124            */
1125           uint32_t applicability_rank;
1126
1127         } update;
1128         
1129         /**
1130          * These values are only valid for
1131          * GNUNET_FS_STATUS_SEARCH_RESULT_SUSPEND events.
1132          * These events are automatically triggered for
1133          * each search result before the 
1134          * GNUNET_FS_STATUS_SEARCH_SUSPEND event.  This
1135          * happens primarily to give the client a chance
1136          * to clean up the "cctx" (if needed).
1137          */
1138         struct {
1139
1140           /**
1141            * Private context set for for this result
1142            * during the "RESULT" event.
1143            */
1144           void *cctx;
1145           
1146           /**
1147            * Metadata for the search result.
1148            */
1149           const struct GNUNET_CONTAINER_MetaData *meta;
1150
1151           /**
1152            * URI for the search result.
1153            */
1154           const struct GNUNET_FS_Uri *uri;
1155
1156         } result_suspend;
1157         
1158         /**
1159          * These values are only valid for
1160          * GNUNET_FS_STATUS_SEARCH_RESULT_STOPPED events.
1161          * These events are automatically triggered for
1162          * each search result before the 
1163          * GNUNET_FS_STATUS_SEARCH_STOPPED event.  This
1164          * happens primarily to give the client a chance
1165          * to clean up the "cctx" (if needed).
1166          */
1167         struct {
1168
1169           /**
1170            * Private context set for for this result
1171            * during the "RESULT" event.
1172            */
1173           void *cctx;
1174           
1175           /**
1176            * Metadata for the search result.
1177            */
1178           const struct GNUNET_CONTAINER_MetaData *meta;
1179
1180           /**
1181            * URI for the search result.
1182            */
1183           const struct GNUNET_FS_Uri *uri;
1184
1185         } result_stopped;
1186
1187         /**
1188          * These values are only valid for
1189          * GNUNET_FS_STATUS_SEARCH_RESUME events.
1190          */
1191         struct {
1192
1193           /**
1194            * Error message, NULL if we have not encountered any error yet.
1195            */
1196           const char *message;
1197
1198           /**
1199            * Is this search currently paused?
1200            */
1201           int is_paused;
1202
1203         } resume;
1204
1205         /**
1206          * These values are only valid for
1207          * GNUNET_FS_STATUS_SEARCH_ERROR events.
1208          */
1209         struct {
1210
1211           /**
1212            * Error message.
1213            */
1214           const char *message;
1215
1216         } error;
1217     
1218         /**
1219          * Values for all "GNUNET_FS_STATUS_SEARCH_RESULT_NAMESPACE" events.
1220          */
1221         struct {
1222           
1223           /**
1224            * Handle to the namespace (NULL if it is not a local
1225            * namespace).
1226            */
1227           struct GNUNET_FS_Namespace *ns;
1228           
1229           /**
1230            * Short, human-readable name of the namespace.
1231            */
1232           const char *name;
1233           
1234           /**
1235            * Root identifier for the namespace, can be NULL.
1236            */
1237           const char *root;
1238           
1239           /**
1240            * Metadata for the namespace.
1241            */
1242           const struct GNUNET_CONTAINER_MetaData *meta;
1243           
1244           /**
1245            * Hash-identifier for the namespace.
1246            */
1247           GNUNET_HashCode id;      
1248           
1249         } namespace;
1250
1251       } specifics;
1252
1253     } search;
1254
1255     /**
1256      * Values for all "GNUNET_FS_STATUS_UNINDEX_*" events.
1257      */
1258     struct {
1259
1260       /**
1261        * Context for controlling the unindexing.
1262        */
1263       struct GNUNET_FS_UnindexContext *uc;
1264
1265       /**
1266        * Client context pointer (set the last time
1267        * by the client for this operation; initially
1268        * NULL on START/RESUME events).
1269        */
1270       void *cctx;
1271
1272       /**
1273        * Name of the file that is being unindexed.
1274        */
1275       const char *filename;
1276
1277       /**
1278        * How large is the file overall?
1279        */
1280       uint64_t size;
1281
1282       /**
1283        * At what time do we expect to finish unindexing?
1284        * (will be a value in the past for completed
1285        * unindexing opeations).
1286        */ 
1287       struct GNUNET_TIME_Relative eta;
1288
1289       /**
1290        * How long has this upload been actively running
1291        * (excludes times where the upload was suspended).
1292        */
1293       struct GNUNET_TIME_Relative duration;
1294
1295       /**
1296        * How many bytes have we completed?
1297        */
1298       uint64_t completed;
1299
1300       /**
1301        * Additional values for specific events.
1302        */
1303       union {
1304
1305         /**
1306          * These values are only valid for
1307          * GNUNET_FS_STATUS_UNINDEX_PROGRESS events.
1308          */
1309         struct {
1310   
1311           /**
1312            * Data block we just unindexed.
1313            */
1314           const void *data;
1315           
1316           /**
1317            * At what offset in the file is "data"?
1318            */
1319           uint64_t offset;
1320           
1321           /**
1322            * Length of the data block.
1323            */
1324           uint64_t data_len;
1325
1326           /**
1327            * Depth of the given block in the tree; 
1328            * 0 would be the highest level (the first
1329            * call is guaranteed to be for the lowest
1330            * level).
1331            */
1332           unsigned int depth;
1333
1334         } progress;
1335
1336         /**
1337          * These values are only valid for
1338          * GNUNET_FS_STATUS_UNINDEX_RESUME events.
1339          */
1340         struct {
1341
1342           /**
1343            * Error message, NULL if we have not encountered any error yet.
1344            */
1345           const char *message;
1346
1347         } resume;
1348
1349         /**
1350          * These values are only valid for
1351          * GNUNET_FS_STATUS_UNINDEX_ERROR events.
1352          */
1353         struct {
1354
1355           /**
1356            * Error message.
1357            */
1358           const char *message;
1359
1360         } error;
1361
1362       } specifics;
1363
1364     } unindex;
1365
1366   } value;
1367
1368   /**
1369    * Specific status code (determines the event type).
1370    */  
1371   enum GNUNET_FS_Status status;
1372
1373 };
1374
1375
1376 /**
1377  * Notification of FS to a client about the progress of an 
1378  * operation.  Callbacks of this type will be used for uploads,
1379  * downloads and searches.  Some of the arguments depend a bit 
1380  * in their meaning on the context in which the callback is used.
1381  *
1382  * @param cls closure
1383  * @param info details about the event, specifying the event type
1384  *        and various bits about the event
1385  * @return client-context (for the next progress call
1386  *         for this operation; should be set to NULL for
1387  *         SUSPEND and STOPPED events).  The value returned
1388  *         will be passed to future callbacks in the respective
1389  *         field in the GNUNET_FS_ProgressInfo struct.
1390  */
1391 typedef void* (*GNUNET_FS_ProgressCallback)
1392   (void *cls,
1393    const struct GNUNET_FS_ProgressInfo *info);
1394
1395
1396 /**
1397  * Handle to the file-sharing service.
1398  */
1399 struct GNUNET_FS_Handle;
1400
1401
1402 /**
1403  * Setup a connection to the file-sharing service.
1404  *
1405  * @param sched scheduler to use
1406  * @param cfg configuration to use
1407  * @param client_name unique identifier for this client 
1408  * @param upcb function to call to notify about FS actions
1409  * @param upcb_cls closure for upcb
1410  */
1411 struct GNUNET_FS_Handle *
1412 GNUNET_FS_start (struct GNUNET_SCHEDULER_Handle *sched,
1413                  const struct GNUNET_CONFIGURATION_Handle *cfg,
1414                  const char *client_name,
1415                  GNUNET_FS_ProgressCallback upcb,
1416                  void *upcb_cls);
1417
1418
1419 /**
1420  * Close our connection with the file-sharing service.
1421  * The callback given to GNUNET_FS_start will no longer be
1422  * called after this function returns.
1423  *
1424  * @param h handle that was returned from GNUNET_FS_start
1425  */                    
1426 void 
1427 GNUNET_FS_stop (struct GNUNET_FS_Handle *h); 
1428
1429
1430 /**
1431  * Function called on entries in a GNUNET_FS_FileInformation publish-structure.
1432  *
1433  * @param cls closure
1434  * @param fi the entry in the publish-structure
1435  * @param length length of the file or directory
1436  * @param meta metadata for the file or directory (can be modified)
1437  * @param uri pointer to the keywords that will be used for this entry (can be modified)
1438  * @param anonymity pointer to selected anonymity level (can be modified)
1439  * @param priority pointer to selected priority (can be modified)
1440  * @param expirationTime pointer to selected expiration time (can be modified)
1441  * @param client_info pointer to client context set upon creation (can be modified)
1442  * @return GNUNET_OK to continue, GNUNET_NO to remove
1443  *         this entry from the directory, GNUNET_SYSERR
1444  *         to abort the iteration
1445  */
1446 typedef int (*GNUNET_FS_FileInformationProcessor)(void *cls,
1447                                                   struct GNUNET_FS_FileInformation *fi,
1448                                                   uint64_t length,
1449                                                   struct GNUNET_CONTAINER_MetaData *meta,
1450                                                   struct GNUNET_FS_Uri **uri,
1451                                                   uint32_t *anonymity,
1452                                                   uint32_t *priority,
1453                                                   struct GNUNET_TIME_Absolute *expirationTime,
1454                                                   void **client_info);
1455
1456
1457 /**
1458  * Recover file information structure from disk.
1459  *
1460  * @param name filename for the structure on disk
1461  * @return NULL on error 
1462  */
1463 struct GNUNET_FS_FileInformation *
1464 GNUNET_FS_file_information_recover (const char *name);
1465
1466
1467 /**
1468  * Obtain the name under which this file information
1469  * structure is stored on disk.  Only works for top-level
1470  * file information structures.
1471  *
1472  * @param s structure to get the filename for
1473  * @return NULL on error, otherwise filename that
1474  *         can be passed to "GNUNET_FS_file_information_recover"
1475  *         to read this fi-struct from disk.
1476  */
1477 const char *
1478 GNUNET_FS_file_information_get_id (struct GNUNET_FS_FileInformation *s);
1479
1480
1481 /**
1482  * Synchronize this file-information struct with its mirror
1483  * on disk.  Note that all internal FS-operations that change
1484  * file information data should already call "sync" internally,
1485  * so this function is likely not useful for clients.
1486  * 
1487  * @param s the struct to sync
1488  */
1489 void
1490 GNUNET_FS_file_information_sync (struct GNUNET_FS_FileInformation *s);
1491
1492
1493 /**
1494  * Create an entry for a file in a publish-structure.
1495  *
1496  * @param filename name of the file or directory to publish
1497  * @param keywords under which keywords should this file be available
1498  *         directly; can be NULL
1499  * @param meta metadata for the file
1500  * @param do_index GNUNET_YES for index, GNUNET_NO for insertion,
1501  *                GNUNET_SYSERR for simulation
1502  * @param anonymity what is the desired anonymity level for sharing?
1503  * @param priority what is the priority for OUR node to
1504  *   keep this file available?  Use 0 for maximum anonymity and
1505  *   minimum reliability...
1506  * @param expirationTime when should this content expire?
1507  * @return publish structure entry for the file
1508  */
1509 struct GNUNET_FS_FileInformation *
1510 GNUNET_FS_file_information_create_from_file (void *client_info,
1511                                              const char *filename,
1512                                              const struct GNUNET_FS_Uri *keywords,
1513                                              const struct GNUNET_CONTAINER_MetaData *meta,
1514                                              int do_index,
1515                                              uint32_t anonymity,
1516                                              uint32_t priority,
1517                                              struct GNUNET_TIME_Absolute expirationTime);
1518
1519
1520 /**
1521  * Create an entry for a file in a publish-structure.
1522  *
1523  * @param length length of the file
1524  * @param data data for the file (should not be used afterwards by
1525  *        the caller; caller will "free")
1526  * @param keywords under which keywords should this file be available
1527  *         directly; can be NULL
1528  * @param meta metadata for the file
1529  * @param do_index GNUNET_YES for index, GNUNET_NO for insertion,
1530  *                GNUNET_SYSERR for simulation
1531  * @param anonymity what is the desired anonymity level for sharing?
1532  * @param priority what is the priority for OUR node to
1533  *   keep this file available?  Use 0 for maximum anonymity and
1534  *   minimum reliability...
1535  * @param expirationTime when should this content expire?
1536  * @return publish structure entry for the file
1537  */
1538 struct GNUNET_FS_FileInformation *
1539 GNUNET_FS_file_information_create_from_data (void *client_info,
1540                                              uint64_t length,
1541                                              void *data,
1542                                              const struct GNUNET_FS_Uri *keywords,
1543                                              const struct GNUNET_CONTAINER_MetaData *meta,
1544                                              int do_index,
1545                                              uint32_t anonymity,
1546                                              uint32_t priority,
1547                                              struct GNUNET_TIME_Absolute expirationTime);
1548
1549
1550 /**
1551  * Function that provides data.
1552  *
1553  * @param cls closure
1554  * @param offset offset to read from; it is possible
1555  *            that the caller might need to go backwards
1556  *            a bit at times
1557  * @param max maximum number of bytes that should be 
1558  *            copied to buf; readers are not allowed
1559  *            to provide less data unless there is an error;
1560  *            a value of "0" will be used at the end to allow
1561  *            the reader to clean up its internal state
1562  * @param buf where the reader should write the data
1563  * @param emsg location for the reader to store an error message
1564  * @return number of bytes written, usually "max", 0 on error
1565  */
1566 typedef size_t (*GNUNET_FS_DataReader)(void *cls, 
1567                                        uint64_t offset,
1568                                        size_t max, 
1569                                        void *buf,
1570                                        char **emsg);
1571
1572
1573 /**
1574  * Create an entry for a file in a publish-structure.
1575  *
1576  * @param length length of the file
1577  * @param reader function that can be used to obtain the data for the file 
1578  * @param reader_cls closure for "reader"
1579  * @param keywords under which keywords should this file be available
1580  *         directly; can be NULL
1581  * @param meta metadata for the file
1582  * @param do_index GNUNET_YES for index, GNUNET_NO for insertion,
1583  *                GNUNET_SYSERR for simulation
1584  * @param anonymity what is the desired anonymity level for sharing?
1585  * @param priority what is the priority for OUR node to
1586  *   keep this file available?  Use 0 for maximum anonymity and
1587  *   minimum reliability...
1588  * @param expirationTime when should this content expire?
1589  * @return publish structure entry for the file
1590  */
1591 struct GNUNET_FS_FileInformation *
1592 GNUNET_FS_file_information_create_from_reader (void *client_info,
1593                                                uint64_t length,
1594                                                GNUNET_FS_DataReader reader,
1595                                                void *reader_cls,
1596                                                const struct GNUNET_FS_Uri *keywords,
1597                                                const struct GNUNET_CONTAINER_MetaData *meta,
1598                                                int do_index,
1599                                                uint32_t anonymity,
1600                                                uint32_t priority,
1601                                                struct GNUNET_TIME_Absolute expirationTime);
1602
1603
1604 /**
1605  * Function that a "GNUNET_FS_DirectoryScanner" should call
1606  * for each entry in the directory.
1607  *
1608  * @param cls closure
1609  * @param filename name of the file (including path); must end 
1610  *          in a "/" (even on W32) if this is a directory
1611  * @param fi information about the file (should not be
1612  *        used henceforth by the caller)
1613  */
1614 typedef void (*GNUNET_FS_FileProcessor)(void *cls,
1615                                         const char *filename,
1616                                         struct GNUNET_FS_FileInformation *fi);
1617
1618
1619 /**
1620  * Type of a function that will be used to scan a directory.
1621  * 
1622  * @param cls closure
1623  * @param dirname name of the directory to scan
1624  * @param do_index should files be indexed or inserted
1625  * @param anonymity desired anonymity level
1626  * @param priority priority for publishing
1627  * @param expirationTime expiration for publication
1628  * @param proc function to call on each entry
1629  * @param proc_cls closure for proc
1630  * @param emsg where to store an error message (on errors)
1631  * @return GNUNET_OK on success
1632  */
1633 typedef int (*GNUNET_FS_DirectoryScanner)(void *cls,
1634                                           const char *dirname,
1635                                           int do_index,
1636                                           uint32_t anonymity,
1637                                           uint32_t priority,
1638                                           struct GNUNET_TIME_Absolute expirationTime,
1639                                           GNUNET_FS_FileProcessor proc,
1640                                           void *proc_cls,
1641                                           char **emsg);
1642
1643
1644
1645 /**
1646  * Simple, useful default implementation of a directory scanner
1647  * (GNUNET_FS_DirectoryScanner).  This implementation expects to get a
1648  * UNIX filename, will publish all files in the directory except hidden
1649  * files (those starting with a ".").  Metadata will be extracted
1650  * using GNU libextractor; the specific list of plugins should be
1651  * specified in "cls", passing NULL will disable (!)  metadata
1652  * extraction.  Keywords will be derived from the metadata and be
1653  * subject to default canonicalization.  This is strictly a
1654  * convenience function.
1655  *
1656  * @param cls must be of type "struct EXTRACTOR_Extractor*"
1657  * @param dirname name of the directory to scan
1658  * @param do_index should files be indexed or inserted
1659  * @param anonymity desired anonymity level
1660  * @param priority priority for publishing
1661  * @param expirationTime expiration for publication
1662  * @param proc function called on each entry
1663  * @param proc_cls closure for proc
1664  * @param emsg where to store an error message (on errors)
1665  * @return GNUNET_OK on success
1666  */
1667 int
1668 GNUNET_FS_directory_scanner_default (void *cls,
1669                                      const char *dirname,
1670                                      int do_index,
1671                                      uint32_t anonymity,
1672                                      uint32_t priority,
1673                                      struct GNUNET_TIME_Absolute expirationTime,
1674                                      GNUNET_FS_FileProcessor proc,
1675                                      void *proc_cls,
1676                                      char **emsg);
1677
1678
1679 /**
1680  * Create a publish-structure from an existing file hierarchy, inferring
1681  * and organizing keywords and metadata as much as possible.  This
1682  * function primarily performs the recursive build and re-organizes
1683  * keywords and metadata; for automatically getting metadata
1684  * extraction, scanning of directories and creation of the respective
1685  * GNUNET_FS_FileInformation entries the default scanner should be
1686  * passed (GNUNET_FS_directory_scanner_default).  This is strictly a
1687  * convenience function.
1688  *
1689  * @param filename name of the top-level file or directory
1690  * @param scanner function used to get a list of files in a directory
1691  * @param scanner_cls closure for scanner
1692  * @param do_index should files in the hierarchy be indexed?
1693  * @param anonymity what is the desired anonymity level for sharing?
1694  * @param priority what is the priority for OUR node to
1695  *   keep this file available?  Use 0 for maximum anonymity and
1696  *   minimum reliability...
1697  * @param expirationTime when should this content expire?
1698  * @param emsg where to store an error message
1699  * @return publish structure entry for the directory, NULL on error
1700  */
1701 struct GNUNET_FS_FileInformation *
1702 GNUNET_FS_file_information_create_from_directory (void *client_info,
1703                                                   const char *filename,
1704                                                   GNUNET_FS_DirectoryScanner scanner,
1705                                                   void *scanner_cls,
1706                                                   int do_index,
1707                                                   uint32_t anonymity,
1708                                                   uint32_t priority,
1709                                                   struct GNUNET_TIME_Absolute expirationTime,
1710                                                   char **emsg);
1711
1712
1713 /**
1714  * Create an entry for an empty directory in a publish-structure.
1715  * This function should be used by applications for which the
1716  * use of "GNUNET_FS_file_information_create_from_directory"
1717  * is not appropriate.
1718  *
1719  * @param meta metadata for the directory
1720  * @param keywords under which keywords should this directory be available
1721  *         directly; can be NULL
1722  * @param anonymity what is the desired anonymity level for sharing?
1723  * @param priority what is the priority for OUR node to
1724  *   keep this file available?  Use 0 for maximum anonymity and
1725  *   minimum reliability...
1726  * @param expirationTime when should this content expire?
1727  * @return publish structure entry for the directory , NULL on error
1728  */
1729 struct GNUNET_FS_FileInformation *
1730 GNUNET_FS_file_information_create_empty_directory (void *client_info,
1731                                                    const struct GNUNET_CONTAINER_MetaData *meta,
1732                                                    const struct GNUNET_FS_Uri *keywords,
1733                                                    uint32_t anonymity,
1734                                                    uint32_t priority,
1735                                                    struct GNUNET_TIME_Absolute expirationTime);
1736
1737
1738 /**
1739  * Add an entry to a directory in a publish-structure.  Clients
1740  * should never modify publish structures that were passed to
1741  * "GNUNET_FS_publish_start" already.
1742  *
1743  * @param dir the directory
1744  * @param end the entry to add; the entry must not have been
1745  *            added to any other directory at this point and 
1746  *            must not include "dir" in its structure
1747  * @return GNUNET_OK on success, GNUNET_SYSERR on error
1748  */
1749 int
1750 GNUNET_FS_file_information_add (struct GNUNET_FS_FileInformation *dir,
1751                                 struct GNUNET_FS_FileInformation *end);
1752
1753
1754 /**
1755  * Inspect a file or directory in a publish-structure.  Clients
1756  * should never modify publish structures that were passed to
1757  * "GNUNET_FS_publish_start" already.  When called on a directory,
1758  * this function will FIRST call "proc" with information about
1759  * the directory itself and then for each of the files in the
1760  * directory (but not for files in subdirectories).  When called
1761  * on a file, "proc" will be called exactly once (with information
1762  * about the specific file).
1763  *
1764  * @param dir the directory
1765  * @param proc function to call on each entry
1766  * @param proc_cls closure for proc
1767  */
1768 void
1769 GNUNET_FS_file_information_inspect (struct GNUNET_FS_FileInformation *dir,
1770                                     GNUNET_FS_FileInformationProcessor proc,
1771                                     void *proc_cls);
1772
1773
1774 /**
1775  * Destroy publish-structure.  Clients should never destroy publish
1776  * structures that were passed to "GNUNET_FS_publish_start" already.
1777  *
1778  * @param fi structure to destroy
1779  * @param cleaner function to call on each entry in the structure
1780  *        (useful to clean up client_info); can be NULL; return
1781  *        values are ignored
1782  * @param cleaner_cls closure for cleaner
1783  */
1784 void
1785 GNUNET_FS_file_information_destroy (struct GNUNET_FS_FileInformation *fi,
1786                                     GNUNET_FS_FileInformationProcessor cleaner,
1787                                     void *cleaner_cls);
1788
1789
1790 /**
1791  * Options for publishing.  Compatible options
1792  * can be OR'ed together.
1793  */
1794 enum GNUNET_FS_PublishOptions 
1795   {
1796     /**
1797      * No options (use defaults for everything).
1798      */
1799     GNUNET_FS_PUBLISH_OPTION_NONE = 0,
1800     
1801     /**
1802      * Simulate publishing.  With this option, no data will be stored
1803      * in the datastore.  Useful for computing URIs from files.
1804      */
1805     GNUNET_FS_PUBLISH_OPTION_SIMULATE_ONLY = 1
1806   };
1807
1808 /**
1809  * Publish a file or directory.
1810  *
1811  * @param h handle to the file sharing subsystem
1812  * @param ctx initial value to use for the '*ctx'
1813  *        in the callback (for the GNUNET_FS_STATUS_PUBLISH_START event).
1814  * @param fi information about the file or directory structure to publish
1815  * @param namespace namespace to publish the file in, NULL for no namespace
1816  * @param nid identifier to use for the publishd content in the namespace
1817  *        (can be NULL, must be NULL if namespace is NULL)
1818  * @param nuid update-identifier that will be used for future updates 
1819  *        (can be NULL, must be NULL if namespace or nid is NULL)
1820  * @param options options for the publication 
1821  * @return context that can be used to control the publish operation
1822  */
1823 struct GNUNET_FS_PublishContext *
1824 GNUNET_FS_publish_start (struct GNUNET_FS_Handle *h,
1825                          void *ctx,
1826                          struct GNUNET_FS_FileInformation *fi,
1827                          struct GNUNET_FS_Namespace *namespace,
1828                          const char *nid,
1829                          const char *nuid,
1830                          enum GNUNET_FS_PublishOptions options);
1831
1832
1833 /**
1834  * Stop an upload.  Will abort incomplete uploads (but 
1835  * not remove blocks that have already been publishd) or
1836  * simply clean up the state for completed uploads.
1837  *
1838  * @param sc context for the upload to stop
1839  */
1840 void 
1841 GNUNET_FS_publish_stop (struct GNUNET_FS_PublishContext *sc);
1842
1843
1844 /**
1845  * Signature of a function called as the continuation of a KBlock or
1846  * SBlock publication.
1847  *
1848  * @param cls closure
1849  * @param uri URI under which the block is now available, NULL on error
1850  * @param emsg error message, NULL on success
1851  */
1852 typedef void (*GNUNET_FS_PublishContinuation)(void *cls,
1853                                               const struct GNUNET_FS_Uri *uri,
1854                                               const char *emsg);
1855                                       
1856
1857 /**
1858  * Publish a KBlock on GNUnet.
1859  *
1860  * @param h handle to the file sharing subsystem
1861  * @param keywords keywords to use
1862  * @param meta metadata to use
1863  * @param uri URI to refer to in the KBlock
1864  * @param expirationTime when the KBlock expires
1865  * @param anonymity anonymity level for the KBlock
1866  * @param priority priority for the KBlock
1867  * @param cont continuation
1868  * @param cont_cls closure for cont
1869  */
1870 void
1871 GNUNET_FS_publish_ksk (struct GNUNET_FS_Handle *h,
1872                        struct GNUNET_FS_Uri *keywords,
1873                        struct GNUNET_CONTAINER_MetaData *meta,
1874                        struct GNUNET_FS_Uri *uri,
1875                        struct GNUNET_TIME_Absolute expirationTime,
1876                        uint32_t anonymity,
1877                        uint32_t priority,
1878                        enum GNUNET_FS_PublishOptions options,
1879                        GNUNET_FS_PublishContinuation cont,
1880                        void *cont_cls);
1881
1882
1883 /**
1884  * Publish an SBlock on GNUnet.
1885  *
1886  * @param h handle to the file sharing subsystem
1887  * @param namespace namespace to publish in
1888  * @param identifier identifier to use
1889  * @param update update identifier to use
1890  * @param meta metadata to use
1891  * @param uri URI to refer to in the SBlock
1892  * @param expirationTime when the SBlock expires
1893  * @param anonymity anonymity level for the SBlock
1894  * @param priority priority for the SBlock
1895  * @param cont continuation
1896  * @param cont_cls closure for cont
1897  */
1898 void
1899 GNUNET_FS_publish_sks (struct GNUNET_FS_Handle *h,
1900                        struct GNUNET_FS_Namespace *namespace,
1901                        const char *identifier,
1902                        const char *update,
1903                        struct GNUNET_CONTAINER_MetaData *meta,
1904                        struct GNUNET_FS_Uri *uri,
1905                        struct GNUNET_TIME_Absolute expirationTime,
1906                        uint32_t anonymity,
1907                        uint32_t priority,
1908                        enum GNUNET_FS_PublishOptions options,
1909                        GNUNET_FS_PublishContinuation cont,
1910                        void *cont_cls);
1911
1912
1913 /**
1914  * Type of a function called by "GNUNET_FS_get_indexed_files".
1915  *
1916  * @param cls closure
1917  * @param filename the name of the file
1918  * @param file_id hash of the contents of the indexed file
1919  * @return GNUNET_OK to continue iteration, GNUNET_SYSERR to abort
1920  */
1921 typedef int (*GNUNET_FS_IndexedFileProcessor) (void *cls,
1922                                                const char *filename,
1923                                                const GNUNET_HashCode *file_id);
1924
1925
1926 /**
1927  * Iterate over all indexed files.
1928  *
1929  * @param h handle to the file sharing subsystem
1930  * @param iterator function to call on each indexed file
1931  * @param iterator_cls closure for iterator
1932  * @param cont continuation to call when done;
1933  *             reason should be "TIMEOUT" (on
1934  *             error) or  "PREREQ_DONE" (on success)
1935  * @param cont_cls closure for cont
1936  */
1937 void 
1938 GNUNET_FS_get_indexed_files (struct GNUNET_FS_Handle *h,
1939                              GNUNET_FS_IndexedFileProcessor iterator,
1940                              void *iterator_cls,
1941                              GNUNET_SCHEDULER_Task cont,
1942                              void *cont_cls);
1943
1944
1945 /**
1946  * Unindex a file.
1947  *
1948  * @param h handle to the file sharing subsystem
1949  * @param filename file to unindex
1950  * @return NULL on error, otherwise handle 
1951  */
1952 struct GNUNET_FS_UnindexContext *
1953 GNUNET_FS_unindex (struct GNUNET_FS_Handle *h,
1954                    const char *filename);
1955
1956
1957 /**
1958  * Clean up after completion of an unindex operation.
1959  *
1960  * @param uc handle
1961  */
1962 void
1963 GNUNET_FS_unindex_stop (struct GNUNET_FS_UnindexContext *uc);
1964
1965
1966 /**
1967  * Publish an advertismement for a namespace.  
1968  *
1969  * @param h handle to the file sharing subsystem
1970  * @param namespace handle for the namespace that should be advertised
1971  * @param meta meta-data for the namespace advertisement
1972  * @param anonymity for the namespace advertismement
1973  * @param priority for the namespace advertisement
1974  * @param expiration for the namespace advertisement
1975  * @param advertisementURI the keyword (!) URI to advertise the
1976  *        namespace under (we will create a GNUNET_EC_KNBlock)
1977  * @param rootEntry name of the root entry in the namespace (for
1978  *        the namespace advertisement)
1979  *
1980  * @return uri of the advertisement
1981  */
1982 struct GNUNET_FS_Uri *
1983 GNUNET_FS_namespace_advertise (struct GNUNET_FS_Handle *h,
1984                                struct GNUNET_FS_Namespace *namespace,
1985                                const struct GNUNET_CONTAINER_MetaData *meta,
1986                                uint32_t anonymity,
1987                                uint32_t priority,
1988                                struct GNUNET_TIME_Absolute expiration,
1989                                const struct GNUNET_FS_Uri *advertisementURI,
1990                                const char *rootEntry);
1991
1992
1993 /**
1994  * Create a namespace with the given name; if one already
1995  * exists, return a handle to the existing namespace.
1996  *
1997  * @param h handle to the file sharing subsystem
1998  * @param name name to use for the namespace
1999  * @return handle to the namespace, NULL on error
2000  */
2001 struct GNUNET_FS_Namespace *
2002 GNUNET_FS_namespace_create (struct GNUNET_FS_Handle *h,
2003                             const char *name);
2004
2005
2006 /**
2007  * Delete a namespace handle.  Can be used for a clean shutdown (free
2008  * memory) or also to freeze the namespace to prevent further
2009  * insertions by anyone.
2010  *
2011  * @param namespace handle to the namespace that should be deleted / freed
2012  * @param freeze prevents future insertions; creating a namespace
2013  *        with the same name again will create a fresh namespace instead
2014  *
2015  * @return GNUNET_OK on success, GNUNET_SYSERR on error
2016  */
2017 int 
2018 GNUNET_FS_namespace_delete (struct GNUNET_FS_Namespace *namespace,
2019                             int freeze);
2020
2021
2022 /**
2023  * Callback with information about local (!) namespaces.
2024  * Contains the names of the local namespace and the global
2025  * ID.
2026  *
2027  * @param cls closure
2028  * @param name human-readable identifier of the namespace
2029  * @param id hash identifier for the namespace
2030  */
2031 typedef void (*GNUNET_FS_NamespaceInfoProcessor) (void *cls,
2032                                                   const char *name,
2033                                                   const GNUNET_HashCode *id);
2034
2035
2036 /**
2037  * Build a list of all available local (!) namespaces The returned
2038  * names are only the nicknames since we only iterate over the local
2039  * namespaces.
2040  *
2041  * @param h handle to the file sharing subsystem
2042  * @param cb function to call on each known namespace
2043  * @param cb_cls closure for cb
2044  */
2045 void 
2046 GNUNET_FS_namespace_list (struct GNUNET_FS_Handle *h,
2047                           GNUNET_FS_NamespaceInfoProcessor cb,
2048                           void *cb_cls);
2049
2050
2051 /**
2052  * Function called on updateable identifiers.
2053  *
2054  * @param cls closure
2055  * @param last_id last identifier 
2056  * @param last_uri uri used for the content published under the last_id
2057  * @param last_meta metadata associated with last_uri
2058  * @param next_id identifier that should be used for updates
2059  */
2060 typedef void 
2061 (*GNUNET_FS_IdentifierProcessor)(void *cls,
2062                                  const char *last_id, 
2063                                  const struct GNUNET_FS_Uri *last_uri,
2064                                  const struct GNUNET_CONTAINER_MetaData *last_meta,
2065                                  const char *next_id);
2066
2067
2068 /**
2069  * List all of the identifiers in the namespace for 
2070  * which we could produce an update.
2071  *
2072  * @param namespace namespace to inspect for updateable content
2073  * @param ip function to call on each updateable identifier
2074  * @param ip_cls closure for ip
2075  */
2076 void
2077 GNUNET_FS_namespace_list_updateable (struct GNUNET_FS_Namespace *namespace,
2078                                      GNUNET_FS_IdentifierProcessor ip, 
2079                                      void *ip_cls);
2080
2081
2082 /**
2083  * Start search for content.
2084  *
2085  * @param h handle to the file sharing subsystem
2086  * @param uri specifies the search parameters; can be
2087  *        a KSK URI or an SKS URI.
2088  * @param anonymity desired level of anonymity
2089  * @return context that can be used to control the search
2090  */
2091 struct GNUNET_FS_SearchContext *
2092 GNUNET_FS_search_start (struct GNUNET_FS_Handle *h,
2093                         const struct GNUNET_FS_Uri *uri,
2094                         uint32_t anonymity);
2095
2096
2097 /**
2098  * Pause search.  
2099  *
2100  * @param sc context for the search that should be paused
2101  */
2102 void 
2103 GNUNET_FS_search_pause (struct GNUNET_FS_SearchContext *sc);
2104
2105
2106 /**
2107  * Continue paused search.
2108  *
2109  * @param sc context for the search that should be resumed
2110  */
2111 void 
2112 GNUNET_FS_search_continue (struct GNUNET_FS_SearchContext *sc);
2113
2114
2115 /**
2116  * Stop search for content.
2117  *
2118  * @param sc context for the search that should be stopped
2119  */
2120 void 
2121 GNUNET_FS_search_stop (struct GNUNET_FS_SearchContext *sc);
2122
2123
2124
2125
2126 /**
2127  * Options for downloading.  Compatible options
2128  * can be OR'ed together.
2129  */
2130 enum GNUNET_FS_DownloadOptions 
2131   {
2132     /**
2133      * No options (use defaults for everything).
2134      */
2135     GNUNET_FS_DOWNLOAD_OPTION_NONE = 0,
2136     
2137     /**
2138      * Do a recursive download (that is, automatically trigger the
2139      * download of files in directories).
2140      */
2141     GNUNET_FS_DOWNLOAD_OPTION_RECURSIVE = 1,
2142
2143     /**
2144      * Do not append temporary data to
2145      * the target file (for the IBlocks).
2146      */
2147     GNUNET_FS_DOWNLOAD_NO_TEMPORARIES = 2
2148
2149   };
2150
2151
2152
2153 /**
2154  * Download parts of a file.  Note that this will store
2155  * the blocks at the respective offset in the given file.  Also, the
2156  * download is still using the blocking of the underlying FS
2157  * encoding.  As a result, the download may *write* outside of the
2158  * given boundaries (if offset and length do not match the 32k FS
2159  * block boundaries). <p>
2160  *
2161  * The given range can be used to focus a download towards a
2162  * particular portion of the file (optimization), not to strictly
2163  * limit the download to exactly those bytes.
2164  *
2165  * @param h handle to the file sharing subsystem
2166  * @param uri the URI of the file (determines what to download); CHK or LOC URI
2167  * @param meta known metadata for the file (can be NULL)
2168  * @param filename where to store the file, maybe NULL (then no file is
2169  *        created on disk and data must be grabbed from the callbacks)
2170  * @param offset at what offset should we start the download (typically 0)
2171  * @param length how many bytes should be downloaded starting at offset
2172  * @param anonymity anonymity level to use for the download
2173  * @param options various download options
2174  * @param parent parent download to associate this download with (use NULL
2175  *        for top-level downloads; useful for manually-triggered recursive downloads)
2176  * @return context that can be used to control this download
2177  */
2178 struct GNUNET_FS_DownloadContext *
2179 GNUNET_FS_file_download_start (struct GNUNET_FS_Handle *h,
2180                                const struct GNUNET_FS_Uri *uri,
2181                                const struct GNUNET_CONTAINER_MetaData *meta,
2182                                const char *filename,
2183                                uint64_t offset,
2184                                uint64_t length,
2185                                uint32_t anonymity,
2186                                enum GNUNET_FS_DownloadOptions options,
2187                                struct GNUNET_FS_DownloadContext *parent);
2188
2189
2190 /**
2191  * Stop a download (aborts if download is incomplete).
2192  *
2193  * @param rm handle for the download
2194  * @param do_delete delete files of incomplete downloads
2195  */
2196 void
2197 GNUNET_FS_file_download_stop (struct GNUNET_FS_DownloadContext *rm,
2198                               int do_delete);
2199
2200
2201 /**
2202  * Initialize collection.
2203  *
2204  * @param h handle to the file sharing subsystem
2205  * @param namespace namespace to use for the collection
2206  * @return GNUNET_OK on success, GNUNET_SYSERR if another
2207  *         namespace is already set for our collection
2208  */
2209 int 
2210 GNUNET_FS_collection_start (struct GNUNET_FS_Handle *h,
2211                             struct GNUNET_FS_Namespace *namespace);
2212
2213
2214 /**
2215  * Stop collection.
2216  *
2217  * @param h handle to the file sharing subsystem
2218  * @return GNUNET_OK on success, GNUNET_SYSERR if no collection is active
2219  */
2220 int 
2221 GNUNET_FS_collection_stop (struct GNUNET_FS_Handle *h);
2222
2223
2224 /**
2225  * Are we using a collection?
2226  *
2227  * @param h handle to the file sharing subsystem
2228  * @return NULL if there is no collection,
2229  */
2230 struct GNUNET_FS_Namespace *
2231 GNUNET_FS_collection_get(struct GNUNET_FS_Handle *h);
2232
2233
2234 /**
2235  * Publish an update of the current collection information to the
2236  * network now.  The function has no effect if the collection has not
2237  * changed since the last publication.  If we are currently not
2238  * collecting, this function does nothing.
2239  *
2240  * @param h handle to the file sharing subsystem
2241  */
2242 void GNUNET_FS_collection_publish (struct GNUNET_FS_Handle *h);
2243
2244
2245 /**
2246  * If we are currently building a collection, publish the given file
2247  * information in that collection.  If we are currently not
2248  * collecting, this function does nothing.
2249  *
2250  * @param h handle to the file sharing subsystem
2251  * @param uri uri to add to the collection
2252  * @param meta metadata for the uri
2253  */
2254 void GNUNET_FS_collection_add (const struct GNUNET_FS_Handle *h,
2255                                const struct GNUNET_FS_Uri *uri,
2256                                const struct GNUNET_CONTAINER_MetaData *meta);
2257
2258
2259
2260
2261
2262 /* ******************** Directory API *********************** */
2263
2264
2265 #define GNUNET_FS_DIRECTORY_MIME  "application/gnunet-directory"
2266 #define GNUNET_FS_DIRECTORY_MAGIC "\211GND\r\n\032\n"
2267 #define GNUNET_FS_DIRECTORY_EXT   ".gnd"
2268
2269 /**
2270  * Does the meta-data claim that this is a directory?
2271  * Checks if the mime-type is that of a GNUnet directory.
2272  *
2273  * @return GNUNET_YES if it is, GNUNET_NO if it is not, GNUNET_SYSERR if
2274  *  we have no mime-type information (treat as 'GNUNET_NO')
2275  */
2276 int 
2277 GNUNET_FS_meta_data_test_for_directory (const struct GNUNET_CONTAINER_MetaData *md);
2278
2279
2280 /**
2281  * Set the MIMETYPE information for the given
2282  * metadata to "application/gnunet-directory".
2283  * 
2284  * @param md metadata to add mimetype to
2285  */
2286 void
2287 GNUNET_FS_meta_data_make_directory (struct GNUNET_CONTAINER_MetaData *md);
2288
2289
2290 /**
2291  * Function used to process entries in a directory.
2292  *
2293  * @param cls closure
2294  * @param filename name of the file in the directory
2295  * @param uri URI of the file
2296  * @param metadata metadata for the file; metadata for
2297  *        the directory if everything else is NULL/zero
2298  * @param length length of the available data for the file
2299  *           (of type size_t since data must certainly fit
2300  *            into memory; if files are larger than size_t
2301  *            permits, then they will certainly not be
2302  *            embedded with the directory itself).
2303  * @param data data available for the file (length bytes)
2304  */
2305 typedef void (*GNUNET_FS_DirectoryEntryProcessor)(void *cls,
2306                                                   const char *filename,
2307                                                   const struct GNUNET_FS_Uri *uri,
2308                                                   const struct GNUNET_CONTAINER_MetaData *meta,
2309                                                   size_t length,
2310                                                   const void *data);
2311
2312
2313 /**
2314  * Iterate over all entries in a directory.  Note that directories
2315  * are structured such that it is possible to iterate over the
2316  * individual blocks as well as over the entire directory.  Thus
2317  * a client can call this function on the buffer in the
2318  * GNUNET_FS_ProgressCallback.  Also, directories can optionally
2319  * include the contents of (small) files embedded in the directory
2320  * itself; for those files, the processor may be given the
2321  * contents of the file directly by this function.
2322  *
2323  * @param size number of bytes in data
2324  * @param data pointer to the beginning of the directory
2325  * @param offset offset of data in the directory
2326  * @param dep function to call on each entry
2327  * @param dep_cls closure for dep
2328  */
2329 void 
2330 GNUNET_FS_directory_list_contents (size_t size,
2331                                    const void *data,
2332                                    uint64_t offset,
2333                                    GNUNET_FS_DirectoryEntryProcessor dep, 
2334                                    void *dep_cls);
2335
2336
2337 /**
2338  * Opaque handle to a directory builder.
2339  */
2340 struct GNUNET_FS_DirectoryBuilder;
2341
2342 /**
2343  * Create a directory builder.
2344  * 
2345  * @param mdir metadata for the directory
2346  */
2347 struct GNUNET_FS_DirectoryBuilder *
2348 GNUNET_FS_directory_builder_create (const struct GNUNET_CONTAINER_MetaData *mdir);
2349
2350
2351 /**
2352  * Add an entry to a directory.
2353  * 
2354  * @param bld directory to extend
2355  * @param uri uri of the entry (must not be a KSK)
2356  * @param md metadata of the entry
2357  * @param data raw data of the entry, can be NULL, otherwise
2358  *        data must point to exactly the number of bytes specified
2359  *        by the uri
2360  */
2361 void
2362 GNUNET_FS_directory_builder_add (struct GNUNET_FS_DirectoryBuilder *bld,
2363                                  const struct GNUNET_FS_Uri *uri,
2364                                  const struct GNUNET_CONTAINER_MetaData *md,
2365                                  const void *data);
2366                  
2367
2368 /**
2369  * Finish building the directory.  Frees the
2370  * builder context and returns the directory
2371  * in-memory.
2372  *
2373  * @param bld directory to finish
2374  * @param size set to the number of bytes needed
2375  * @param data set to the encoded directory
2376  */
2377 void
2378 GNUNET_FS_directory_builder_finish (struct GNUNET_FS_DirectoryBuilder *bld,
2379                                     size_t *size,
2380                                     void **data);
2381
2382
2383 #if 0                           /* keep Emacsens' auto-indent happy */
2384 {
2385 #endif
2386 #ifdef __cplusplus
2387 }
2388 #endif
2389
2390
2391 #endif