-preparations for fixing #2711
[oweals/gnunet.git] / src / fs / fs_api.h
1 /*
2      This file is part of GNUnet.
3      (C) 2003, 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 3, 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 /**
22  * @file fs/fs_api.h
23  * @brief shared definitions for the FS library
24  * @author Igor Wronsky, Christian Grothoff
25  */
26 #ifndef FS_API_H
27 #define FS_API_H
28
29 #include "gnunet_constants.h"
30 #include "gnunet_datastore_service.h"
31 #include "gnunet_dht_service.h"
32 #include "gnunet_fs_service.h"
33 #include "gnunet_block_lib.h"
34 #include "block_fs.h"
35 #include "fs.h"
36
37 /**
38  * Size of the individual blocks used for file-sharing.
39  */
40 #define DBLOCK_SIZE (32*1024)
41
42 /**
43  * Pick a multiple of 2 here to achive 8-byte alignment!  We also
44  * probably want DBlocks to have (roughly) the same size as IBlocks.
45  * With SHA-512, the optimal value is 32768 byte / 128 byte = 256 (128
46  * byte = 2 * 512 bits).  DO NOT CHANGE!
47  */
48 #define CHK_PER_INODE 256
49
50 /**
51  * Maximum size for a file to be considered for inlining in a
52  * directory.
53  */
54 #define MAX_INLINE_SIZE 65536
55
56 /**
57  * Name of the directory with top-level searches.
58  */
59 #define GNUNET_FS_SYNC_PATH_MASTER_SEARCH "search"
60
61 /**
62  * Name of the directory with sub-searches (namespace-updates).
63  */
64 #define GNUNET_FS_SYNC_PATH_CHILD_SEARCH "search-child"
65
66 /**
67  * Name of the directory with master downloads (not associated
68  * with search or part of another download).
69  */
70 #define GNUNET_FS_SYNC_PATH_MASTER_DOWNLOAD "download"
71
72 /**
73  * Name of the directory with downloads that are part of another
74  * download or a search.
75  */
76 #define GNUNET_FS_SYNC_PATH_CHILD_DOWNLOAD "download-child"
77
78 /**
79  * Name of the directory with publishing operations.
80  */
81 #define GNUNET_FS_SYNC_PATH_MASTER_PUBLISH "publish"
82
83 /**
84  * Name of the directory with files that are being published
85  */
86 #define GNUNET_FS_SYNC_PATH_FILE_INFO "publish-file"
87
88 /**
89  * Name of the directory with unindex operations.
90  */
91 #define GNUNET_FS_SYNC_PATH_MASTER_UNINDEX "unindex"
92
93
94 /**
95  * @brief complete information needed
96  * to download a file.
97  */
98 struct FileIdentifier
99 {
100
101   /**
102    * Total size of the file in bytes. (network byte order (!))
103    */
104   uint64_t file_length;
105
106   /**
107    * Query and key of the top GNUNET_EC_IBlock.
108    */
109   struct ContentHashKey chk;
110
111 };
112
113
114 /**
115  * Information about a file and its location
116  * (peer claiming to share the file).
117  */
118 struct Location
119 {
120   /**
121    * Information about the shared file.
122    */
123   struct FileIdentifier fi;
124
125   /**
126    * Identity of the peer sharing the file.
127    */
128   struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded peer;
129
130   /**
131    * Time when this location URI expires.
132    */
133   struct GNUNET_TIME_Absolute expirationTime;
134
135   /**
136    * RSA signature over the GNUNET_EC_FileIdentifier,
137    * GNUNET_hash of the peer and expiration time.
138    */
139   struct GNUNET_CRYPTO_EccSignature contentSignature;
140
141 };
142
143 /**
144  * Types of URIs.
145  */
146 enum GNUNET_FS_UriType
147 {
148     /**
149      * Content-hash-key (simple file).
150      */
151   GNUNET_FS_URI_CHK,
152
153     /**
154      * Signed key space (file in namespace).
155      */
156   GNUNET_FS_URI_SKS,
157
158     /**
159      * Keyword search key (query with keywords).
160      */
161   GNUNET_FS_URI_KSK,
162
163     /**
164      * Location (chk with identity of hosting peer).
165      */
166   GNUNET_FS_URI_LOC
167 };
168
169
170 /**
171  * A Universal Resource Identifier (URI), opaque.
172  */
173 struct GNUNET_FS_Uri
174 {
175   /**
176    * Type of the URI.
177    */
178   enum GNUNET_FS_UriType type;
179
180   union
181   {
182     struct
183     {
184       /**
185        * Keywords start with a '+' if they are
186        * mandatory (in which case the '+' is NOT
187        * part of the keyword) and with a
188        * simple space if they are optional
189        * (in which case the space is ALSO not
190        * part of the actual keyword).
191        *
192        * Double-quotes to protect spaces and
193        * %-encoding are NOT used internally
194        * (only in URI-strings).
195        */
196       char **keywords;
197
198       /**
199        * Size of the keywords array.
200        */
201       unsigned int keywordCount;
202     } ksk;
203
204     struct
205     {
206       /**
207        * Identifier of the namespace.
208        */
209       struct GNUNET_FS_PseudonymIdentifier ns;
210
211       /**
212        * Human-readable identifier chosen for this
213        * entry in the namespace.
214        */
215       char *identifier;
216     } sks;
217
218     /**
219      * Information needed to retrieve a file (content-hash-key
220      * plus file size).
221      */
222     struct FileIdentifier chk;
223
224     /**
225      * Information needed to retrieve a file including signed
226      * location (identity of a peer) of the content.
227      */
228     struct Location loc;
229   } data;
230
231 };
232
233
234 /**
235  * Information for a file or directory that is
236  * about to be published.
237  */
238 struct GNUNET_FS_FileInformation
239 {
240
241   /**
242    * Files in a directory are kept as a linked list.
243    */
244   struct GNUNET_FS_FileInformation *next;
245
246   /**
247    * If this is a file in a directory, "dir" refers to
248    * the directory; otherwise NULL.
249    */
250   struct GNUNET_FS_FileInformation *dir;
251
252   /**
253    * Handle to the master context.
254    */
255   struct GNUNET_FS_Handle *h;
256
257   /**
258    * Pointer kept for the client.
259    */
260   void *client_info;
261
262   /**
263    * Metadata to use for the file.
264    */
265   struct GNUNET_CONTAINER_MetaData *meta;
266
267   /**
268    * Keywords to use for KBlocks.
269    */
270   struct GNUNET_FS_Uri *keywords;
271
272   /**
273    * CHK for this file or directory. NULL if
274    * we have not yet computed it.
275    */
276   struct GNUNET_FS_Uri *chk_uri;
277
278   /**
279    * Block options for the file.
280    */
281   struct GNUNET_FS_BlockOptions bo;
282
283   /**
284    * At what time did we start this upload?
285    */
286   struct GNUNET_TIME_Absolute start_time;
287
288   /**
289    * Under what filename is this struct serialized
290    * (for operational persistence).  Should be determined
291    * using 'mktemp'.
292    */
293   char *serialization;
294
295   /**
296    * Encoder being used to publish this file.
297    */
298   struct GNUNET_FS_TreeEncoder *te;
299
300   /**
301    * Error message (non-NULL if this operation failed).
302    */
303   char *emsg;
304
305   /**
306    * Name of the file or directory (must be an absolute path).
307    */
308   char *filename;
309
310   /**
311    * Data describing either the file or the directory.
312    */
313   union
314   {
315
316     /**
317      * Data for a file.
318      */
319     struct
320     {
321
322       /**
323        * Function that can be used to read the data for the file.
324        */
325       GNUNET_FS_DataReader reader;
326
327       /**
328        * Closure for reader.
329        */
330       void *reader_cls;
331
332       /**
333        * If this file is being indexed, this value is set to the hash
334        * over the entire file (when the indexing process is started).
335        * Otherwise this field is not used.
336        */
337       struct GNUNET_HashCode file_id;
338
339       /**
340        * Size of the file (in bytes).
341        */
342       uint64_t file_size;
343
344       /**
345        * Should the file be indexed or inserted?
346        */
347       int do_index;
348
349       /**
350        * Is "file_id" already valid?  Set to GNUNET_YES once the hash
351        * has been calculated.
352        */
353       int have_hash;
354
355       /**
356        * Has the service confirmed our INDEX_START request?
357        * GNUNET_YES if this step has been completed.
358        */
359       int index_start_confirmed;
360
361     } file;
362
363     /**
364      * Data for a directory.
365      */
366     struct
367     {
368
369       /**
370        * Linked list of entries in the directory.
371        */
372       struct GNUNET_FS_FileInformation *entries;
373
374       /**
375        * Size of the directory itself (in bytes); 0 if the
376        * size has not yet been calculated.
377        */
378       size_t dir_size;
379
380       /**
381        * Pointer to the data for the directory (or NULL if not
382        * available).
383        */
384       void *dir_data;
385
386     } dir;
387
388   } data;
389
390   /**
391    * Is this struct for a file or directory?
392    */
393   int is_directory;
394
395   /**
396    * Are we done publishing this file?
397    */
398   int is_published;
399
400 };
401
402
403 /**
404  * The job is now ready to run and should use the given client
405  * handle to communicate with the FS service.
406  *
407  * @param cls closure
408  * @param client handle to use for FS communication
409  */
410 typedef void (*GNUNET_FS_QueueStart) (void *cls,
411                                       struct GNUNET_CLIENT_Connection * client);
412
413
414 /**
415  * The job must now stop to run and should destry the client handle as
416  * soon as possible (ideally prior to returning).
417  */
418 typedef void (*GNUNET_FS_QueueStop) (void *cls);
419
420
421
422 /**
423  * Priorities for the queue.
424  */ 
425 enum GNUNET_FS_QueuePriority
426   {
427     /**
428      * This is a probe (low priority).
429      */
430     GNUNET_FS_QUEUE_PRIORITY_PROBE,
431
432     /**
433      * Default priority.
434      */
435     GNUNET_FS_QUEUE_PRIORITY_NORMAL
436   };
437
438
439 /**
440  * Entry in the job queue.
441  */
442 struct GNUNET_FS_QueueEntry
443 {
444   /**
445    * This is a linked list.
446    */
447   struct GNUNET_FS_QueueEntry *next;
448
449   /**
450    * This is a linked list.
451    */
452   struct GNUNET_FS_QueueEntry *prev;
453
454   /**
455    * Function to call when the job is started.
456    */
457   GNUNET_FS_QueueStart start;
458
459   /**
460    * Function to call when the job needs to stop (or is done / dequeued).
461    */
462   GNUNET_FS_QueueStop stop;
463
464   /**
465    * Closure for start and stop.
466    */
467   void *cls;
468
469   /**
470    * Handle to FS primary context.
471    */
472   struct GNUNET_FS_Handle *h;
473
474   /**
475    * Client handle, or NULL if job is not running.
476    */
477   struct GNUNET_CLIENT_Connection *client;
478
479   /**
480    * Time the job was originally queued.
481    */
482   struct GNUNET_TIME_Absolute queue_time;
483
484   /**
485    * Time the job was started last.
486    */
487   struct GNUNET_TIME_Absolute start_time;
488
489   /**
490    * Total amount of time the job has been running (except for the
491    * current run).
492    */
493   struct GNUNET_TIME_Relative run_time;
494
495   /**
496    * How many blocks do the active downloads have?
497    */
498   unsigned int blocks;
499
500   /**
501    * How important is this download?
502    */
503   enum GNUNET_FS_QueuePriority priority;
504
505   /**
506    * How often have we (re)started this download?
507    */
508   unsigned int start_times;
509
510 };
511
512
513 /**
514  * Information we store for each search result.
515  */
516 struct GNUNET_FS_SearchResult
517 {
518
519   /**
520    * File-sharing context this result belongs to.
521    */
522   struct GNUNET_FS_Handle *h;
523
524   /**
525    * Search context this result belongs to; can be NULL
526    * for probes that come from a directory result.
527    */
528   struct GNUNET_FS_SearchContext *sc;
529
530   /**
531    * URI to which this search result refers to.
532    */
533   struct GNUNET_FS_Uri *uri;
534
535   /**
536    * Metadata for the search result.
537    */
538   struct GNUNET_CONTAINER_MetaData *meta;
539
540   /**
541    * Client info for this search result.
542    */
543   void *client_info;
544
545   /**
546    * ID of a job that is currently probing this results' availability
547    * (NULL if we are not currently probing).
548    */
549   struct GNUNET_FS_DownloadContext *probe_ctx;
550
551   /**
552    * ID of an associated download based on this search result (or
553    * NULL for none).
554    */
555   struct GNUNET_FS_DownloadContext *download;
556
557   /**
558    * If this search result triggered an update search, this field
559    * links to the update search.
560    */
561   struct GNUNET_FS_SearchContext *update_search;
562
563   /**
564    * Name under which this search result is stored on disk.
565    */
566   char *serialization;
567
568   /**
569    * Bitmap that specifies precisely which keywords have been matched already.
570    */
571   uint8_t *keyword_bitmap;
572
573   /**
574    * Key for the search result
575    */
576   struct GNUNET_HashCode key;
577
578   /**
579    * ID of the task that will clean up the probe_ctx should it not
580    * complete on time (and that will need to be cancelled if we clean
581    * up the search result before then).
582    */
583   GNUNET_SCHEDULER_TaskIdentifier probe_cancel_task;
584
585   /**
586    * Task we use to report periodically to the application that the
587    * probe is still running.
588    */
589   GNUNET_SCHEDULER_TaskIdentifier probe_ping_task;
590
591   /**
592    * When did the current probe become active?
593    */
594   struct GNUNET_TIME_Absolute probe_active_time;
595
596   /**
597    * How much longer should we run the current probe before giving up?
598    */
599   struct GNUNET_TIME_Relative remaining_probe_time;
600
601   /**
602    * Number of mandatory keywords for which we have NOT yet found the
603    * search result; when this value hits zero, the search result is
604    * given to the callback.
605    */
606   uint32_t mandatory_missing;
607
608   /**
609    * Number of optional keywords under which this result was also
610    * found.
611    */
612   uint32_t optional_support;
613
614   /**
615    * Number of availability tests that have succeeded for this result.
616    */
617   uint32_t availability_success;
618
619   /**
620    * Number of availability trials that we have performed for this
621    * search result.
622    */
623   uint32_t availability_trials;
624
625 };
626
627
628 /**
629  * Add a job to the queue.
630  *
631  * @param h handle to the overall FS state
632  * @param start function to call to begin the job
633  * @param stop function to call to pause the job, or on dequeue (if the job was running)
634  * @param cls closure for start and stop
635  * @param blocks number of blocks this download has
636  * @param priority how important is this download
637  * @return queue handle
638  */
639 struct GNUNET_FS_QueueEntry *
640 GNUNET_FS_queue_ (struct GNUNET_FS_Handle *h, GNUNET_FS_QueueStart start,
641                   GNUNET_FS_QueueStop stop, void *cls, unsigned int blocks,
642                   enum GNUNET_FS_QueuePriority priority);
643
644
645 /**
646  * Dequeue a job from the queue.
647  *
648  * @param qe handle for the job
649  */
650 void
651 GNUNET_FS_dequeue_ (struct GNUNET_FS_QueueEntry *qe);
652
653
654 /**
655  * Function that provides data by reading from a file.
656  *
657  * @param cls closure (points to the file information)
658  * @param offset offset to read from; it is possible
659  *            that the caller might need to go backwards
660  *            a bit at times
661  * @param max maximum number of bytes that should be
662  *            copied to buf; readers are not allowed
663  *            to provide less data unless there is an error;
664  *            a value of "0" will be used at the end to allow
665  *            the reader to clean up its internal state
666  * @param buf where the reader should write the data
667  * @param emsg location for the reader to store an error message
668  * @return number of bytes written, usually "max", 0 on error
669  */
670 size_t
671 GNUNET_FS_data_reader_file_ (void *cls, uint64_t offset, size_t max, void *buf,
672                              char **emsg);
673
674
675 /**
676  * Create the closure for the 'GNUNET_FS_data_reader_file_' callback.
677  *
678  * @param filename file to read
679  * @return closure to use
680  */
681 void *
682 GNUNET_FS_make_file_reader_context_ (const char *filename);
683
684
685
686 /**
687  * Function that provides data by copying from a buffer.
688  *
689  * @param cls closure (points to the buffer)
690  * @param offset offset to read from; it is possible
691  *            that the caller might need to go backwards
692  *            a bit at times
693  * @param max maximum number of bytes that should be
694  *            copied to buf; readers are not allowed
695  *            to provide less data unless there is an error;
696  *            a value of "0" will be used at the end to allow
697  *            the reader to clean up its internal state
698  * @param buf where the reader should write the data
699  * @param emsg location for the reader to store an error message
700  * @return number of bytes written, usually "max", 0 on error
701  */
702 size_t
703 GNUNET_FS_data_reader_copy_ (void *cls, uint64_t offset, size_t max, void *buf,
704                              char **emsg);
705
706 /**
707  * Notification of FS that a search probe has made progress.
708  * This function is used INSTEAD of the client's event handler
709  * for downloads where the GNUNET_FS_DOWNLOAD_IS_PROBE flag is set.
710  *
711  * @param cls closure, always NULL (!), actual closure
712  *        is in the client-context of the info struct
713  * @param info details about the event, specifying the event type
714  *        and various bits about the event
715  * @return client-context (for the next progress call
716  *         for this operation; should be set to NULL for
717  *         SUSPEND and STOPPED events).  The value returned
718  *         will be passed to future callbacks in the respective
719  *         field in the GNUNET_FS_ProgressInfo struct.
720  */
721 void *
722 GNUNET_FS_search_probe_progress_ (void *cls,
723                                   const struct GNUNET_FS_ProgressInfo *info);
724
725
726 /**
727  * Main function that performs the upload.
728  *
729  * @param cls "struct GNUNET_FS_PublishContext" identifies the upload
730  * @param tc task context
731  */
732 void
733 GNUNET_FS_publish_main_ (void *cls,
734                          const struct GNUNET_SCHEDULER_TaskContext *tc);
735
736
737 /**
738  * Function called once the hash of the file
739  * that is being unindexed has been computed.
740  *
741  * @param cls closure, unindex context
742  * @param file_id computed hash, NULL on error
743  */
744 void
745 GNUNET_FS_unindex_process_hash_ (void *cls, const struct GNUNET_HashCode * file_id);
746
747
748 /**
749  * Extract the keywords for KBlock removal
750  *
751  * @param uc context for the unindex operation.
752  */
753 void
754 GNUNET_FS_unindex_do_extract_keywords_ (struct GNUNET_FS_UnindexContext *uc);
755
756
757 /**
758  * If necessary, connect to the datastore and remove the KBlocks.
759  *
760  * @param uc context for the unindex operation.
761  */
762 void
763 GNUNET_FS_unindex_do_remove_kblocks_ (struct GNUNET_FS_UnindexContext *uc);
764
765
766 /**
767  * Fill in all of the generic fields for a publish event and call the
768  * callback.
769  *
770  * @param pi structure to fill in
771  * @param pc overall publishing context
772  * @param p file information for the file being published
773  * @param offset where in the file are we so far
774  * @return value returned from callback
775  */
776 void *
777 GNUNET_FS_publish_make_status_ (struct GNUNET_FS_ProgressInfo *pi,
778                                 struct GNUNET_FS_PublishContext *pc,
779                                 const struct GNUNET_FS_FileInformation *p,
780                                 uint64_t offset);
781
782
783 /**
784  * Fill in all of the generic fields for a download event and call the
785  * callback.
786  *
787  * @param pi structure to fill in
788  * @param dc overall download context
789  */
790 void
791 GNUNET_FS_download_make_status_ (struct GNUNET_FS_ProgressInfo *pi,
792                                  struct GNUNET_FS_DownloadContext *dc);
793
794
795 /**
796  * Task that creates the initial (top-level) download
797  * request for the file.
798  *
799  * @param cls the 'struct GNUNET_FS_DownloadContext'
800  * @param tc scheduler context
801  */
802 void
803 GNUNET_FS_download_start_task_ (void *cls,
804                                 const struct GNUNET_SCHEDULER_TaskContext *tc);
805
806
807
808 /**
809  * Fill in all of the generic fields for
810  * an unindex event and call the callback.
811  *
812  * @param pi structure to fill in
813  * @param uc overall unindex context
814  * @param offset where we are in the file (for progress)
815  */
816 void
817 GNUNET_FS_unindex_make_status_ (struct GNUNET_FS_ProgressInfo *pi,
818                                 struct GNUNET_FS_UnindexContext *uc,
819                                 uint64_t offset);
820
821 /**
822  * Fill in all of the generic fields for a search event and
823  * call the callback.
824  *
825  * @param pi structure to fill in
826  * @param h file-sharing handle
827  * @param sc overall search context
828  * @return value returned by the callback
829  */
830 void *
831 GNUNET_FS_search_make_status_ (struct GNUNET_FS_ProgressInfo *pi,
832                                struct GNUNET_FS_Handle *h,
833                                struct GNUNET_FS_SearchContext *sc);
834
835
836 /**
837  * Connect to the datastore and remove the blocks.
838  *
839  * @param uc context for the unindex operation.
840  */
841 void
842 GNUNET_FS_unindex_do_remove_ (struct GNUNET_FS_UnindexContext *uc);
843
844 /**
845  * Build the request and actually initiate the search using the
846  * GNUnet FS service.
847  *
848  * @param sc search context
849  * @return GNUNET_OK on success, GNUNET_SYSERR on error
850  */
851 int
852 GNUNET_FS_search_start_searching_ (struct GNUNET_FS_SearchContext *sc);
853
854 /**
855  * Start the downloading process (by entering the queue).
856  *
857  * @param dc our download context
858  */
859 void
860 GNUNET_FS_download_start_downloading_ (struct GNUNET_FS_DownloadContext *dc);
861
862
863 /**
864  * Start download probes for the given search result.
865  *
866  * @param sr the search result
867  */
868 void
869 GNUNET_FS_search_start_probe_ (struct GNUNET_FS_SearchResult *sr);
870
871 /**
872  * Remove serialization/deserialization file from disk.
873  *
874  * @param h master context
875  * @param ext component of the path
876  * @param ent entity identifier
877  */
878 void
879 GNUNET_FS_remove_sync_file_ (struct GNUNET_FS_Handle *h, const char *ext,
880                              const char *ent);
881
882
883 /**
884  * Remove serialization/deserialization directory from disk.
885  *
886  * @param h master context
887  * @param ext component of the path
888  * @param uni unique name of parent
889  */
890 void
891 GNUNET_FS_remove_sync_dir_ (struct GNUNET_FS_Handle *h, const char *ext,
892                             const char *uni);
893
894
895 /**
896  * Synchronize this file-information struct with its mirror
897  * on disk.  Note that all internal FS-operations that change
898  * file information data should already call "sync" internally,
899  * so this function is likely not useful for clients.
900  *
901  * @param fi the struct to sync
902  */
903 void
904 GNUNET_FS_file_information_sync_ (struct GNUNET_FS_FileInformation *f);
905
906 /**
907  * Synchronize this publishing struct with its mirror
908  * on disk.  Note that all internal FS-operations that change
909  * publishing structs should already call "sync" internally,
910  * so this function is likely not useful for clients.
911  *
912  * @param pc the struct to sync
913  */
914 void
915 GNUNET_FS_publish_sync_ (struct GNUNET_FS_PublishContext *pc);
916
917 /**
918  * Synchronize this unindex struct with its mirror
919  * on disk.  Note that all internal FS-operations that change
920  * publishing structs should already call "sync" internally,
921  * so this function is likely not useful for clients.
922  *
923  * @param uc the struct to sync
924  */
925 void
926 GNUNET_FS_unindex_sync_ (struct GNUNET_FS_UnindexContext *uc);
927
928 /**
929  * Synchronize this search struct with its mirror
930  * on disk.  Note that all internal FS-operations that change
931  * publishing structs should already call "sync" internally,
932  * so this function is likely not useful for clients.
933  *
934  * @param sc the struct to sync
935  */
936 void
937 GNUNET_FS_search_sync_ (struct GNUNET_FS_SearchContext *sc);
938
939 /**
940  * Synchronize this search result with its mirror
941  * on disk.  Note that all internal FS-operations that change
942  * publishing structs should already call "sync" internally,
943  * so this function is likely not useful for clients.
944  *
945  * @param sr the struct to sync
946  */
947 void
948 GNUNET_FS_search_result_sync_ (struct GNUNET_FS_SearchResult *sr);
949
950 /**
951  * Synchronize this download struct with its mirror
952  * on disk.  Note that all internal FS-operations that change
953  * publishing structs should already call "sync" internally,
954  * so this function is likely not useful for clients.
955  *
956  * @param dc the struct to sync
957  */
958 void
959 GNUNET_FS_download_sync_ (struct GNUNET_FS_DownloadContext *dc);
960
961 /**
962  * Create SUSPEND event for the given publish operation
963  * and then clean up our state (without stop signal).
964  *
965  * @param cls the 'struct GNUNET_FS_PublishContext' to signal for
966  */
967 void
968 GNUNET_FS_publish_signal_suspend_ (void *cls);
969
970 /**
971  * Create SUSPEND event for the given search operation
972  * and then clean up our state (without stop signal).
973  *
974  * @param cls the 'struct GNUNET_FS_SearchContext' to signal for
975  */
976 void
977 GNUNET_FS_search_signal_suspend_ (void *cls);
978
979 /**
980  * Create SUSPEND event for the given download operation
981  * and then clean up our state (without stop signal).
982  *
983  * @param cls the 'struct GNUNET_FS_DownloadContext' to signal for
984  */
985 void
986 GNUNET_FS_download_signal_suspend_ (void *cls);
987
988 /**
989  * Create SUSPEND event for the given unindex operation
990  * and then clean up our state (without stop signal).
991  *
992  * @param cls the 'struct GNUNET_FS_UnindexContext' to signal for
993  */
994 void
995 GNUNET_FS_unindex_signal_suspend_ (void *cls);
996
997 /**
998  * Function signature of the functions that can be called
999  * to trigger suspend signals and clean-up for top-level
1000  * activities.
1001  *
1002  * @param cls closure
1003  */
1004 typedef void (*SuspendSignalFunction) (void *cls);
1005
1006 /**
1007  * We track all of the top-level activities of FS
1008  * so that we can signal 'suspend' on shutdown.
1009  */
1010 struct TopLevelActivity
1011 {
1012   /**
1013    * This is a doubly-linked list.
1014    */
1015   struct TopLevelActivity *next;
1016
1017   /**
1018    * This is a doubly-linked list.
1019    */
1020   struct TopLevelActivity *prev;
1021
1022   /**
1023    * Function to call for suspend-signalling and clean up.
1024    */
1025   SuspendSignalFunction ssf;
1026
1027   /**
1028    * Closure for 'ssf' (some struct GNUNET_FS_XXXHandle*)
1029    */
1030   void *ssf_cls;
1031 };
1032
1033
1034 /**
1035  * Create a top-level activity entry.
1036  *
1037  * @param h global fs handle
1038  * @param ssf suspend signal function to use
1039  * @param ssf_cls closure for ssf
1040  * @return fresh top-level activity handle
1041  */
1042 struct TopLevelActivity *
1043 GNUNET_FS_make_top (struct GNUNET_FS_Handle *h, SuspendSignalFunction ssf,
1044                     void *ssf_cls);
1045
1046
1047 /**
1048  * Destroy a top-level activity entry.
1049  *
1050  * @param h global fs handle
1051  * @param top top level activity entry
1052  */
1053 void
1054 GNUNET_FS_end_top (struct GNUNET_FS_Handle *h, struct TopLevelActivity *top);
1055
1056
1057
1058 /**
1059  * Master context for most FS operations.
1060  */
1061 struct GNUNET_FS_Handle
1062 {
1063   /**
1064    * Configuration to use.
1065    */
1066   const struct GNUNET_CONFIGURATION_Handle *cfg;
1067
1068   /**
1069    * Name of our client.
1070    */
1071   char *client_name;
1072
1073   /**
1074    * Function to call with updates on our progress.
1075    */
1076   GNUNET_FS_ProgressCallback upcb;
1077
1078   /**
1079    * Closure for upcb.
1080    */
1081   void *upcb_cls;
1082
1083   /**
1084    * Head of DLL of top-level activities.
1085    */
1086   struct TopLevelActivity *top_head;
1087
1088   /**
1089    * Tail of DLL of top-level activities.
1090    */
1091   struct TopLevelActivity *top_tail;
1092
1093   /**
1094    * Head of DLL of running jobs.
1095    */
1096   struct GNUNET_FS_QueueEntry *running_head;
1097
1098   /**
1099    * Tail of DLL of running jobs.
1100    */
1101   struct GNUNET_FS_QueueEntry *running_tail;
1102
1103   /**
1104    * Head of DLL of pending jobs.
1105    */
1106   struct GNUNET_FS_QueueEntry *pending_head;
1107
1108   /**
1109    * Tail of DLL of pending jobs.
1110    */
1111   struct GNUNET_FS_QueueEntry *pending_tail;
1112
1113   /**
1114    * Task that processes the jobs in the running and pending queues
1115    * (and moves jobs around as needed).
1116    */
1117   GNUNET_SCHEDULER_TaskIdentifier queue_job;
1118
1119   /**
1120    * Average time we take for a single request to be satisfied.
1121    * FIXME: not yet calcualted properly...
1122    */
1123   struct GNUNET_TIME_Relative avg_block_latency;
1124
1125   /**
1126    * How many actual downloads do we have running right now?
1127    */
1128   unsigned int active_downloads;
1129
1130   /**
1131    * How many blocks do the active downloads have?
1132    */
1133   unsigned int active_blocks;
1134
1135   /**
1136    * General flags.
1137    */
1138   enum GNUNET_FS_Flags flags;
1139
1140   /**
1141    * Maximum number of parallel downloads.
1142    */
1143   unsigned int max_parallel_downloads;
1144
1145   /**
1146    * Maximum number of parallel requests.
1147    */
1148   unsigned int max_parallel_requests;
1149
1150 };
1151
1152
1153 /**
1154  * Handle for controlling a publication process.
1155  */
1156 struct GNUNET_FS_PublishContext
1157 {
1158   /**
1159    * Handle to the global fs context.
1160    */
1161   struct GNUNET_FS_Handle *h;
1162
1163   /**
1164    * Our top-level activity entry (if we are top-level, otherwise NULL).
1165    */
1166   struct TopLevelActivity *top;
1167
1168   /**
1169    * File-structure that is being shared.
1170    */
1171   struct GNUNET_FS_FileInformation *fi;
1172
1173   /**
1174    * Namespace that we are publishing in, NULL if we have no namespace.
1175    */
1176   struct GNUNET_FS_Namespace *ns;
1177
1178   /**
1179    * ID of the content in the namespace, NULL if we have no namespace.
1180    */
1181   char *nid;
1182
1183   /**
1184    * ID for future updates, NULL if we have no namespace or no updates.
1185    */
1186   char *nuid;
1187
1188   /**
1189    * Filename used for serializing information about this operation
1190    * (should be determined using 'mktemp').
1191    */
1192   char *serialization;
1193
1194   /**
1195    * Our own client handle for the FS service; only briefly used when
1196    * we start to index a file, otherwise NULL.
1197    */
1198   struct GNUNET_CLIENT_Connection *client;
1199
1200   /**
1201    * Current position in the file-tree for the upload.
1202    */
1203   struct GNUNET_FS_FileInformation *fi_pos;
1204
1205   /**
1206    * Non-null if we are currently hashing a file.
1207    */
1208   struct GNUNET_CRYPTO_FileHashContext *fhc;
1209
1210   /**
1211    * Connection to the datastore service.
1212    */
1213   struct GNUNET_DATASTORE_Handle *dsh;
1214
1215   /**
1216    * Queue entry for reservation/unreservation.
1217    */
1218   struct GNUNET_DATASTORE_QueueEntry *qre;
1219
1220   /**
1221    * Context for SKS publishing operation that is part of this publishing operation
1222    * (NULL if not active).
1223    */
1224   struct GNUNET_FS_PublishSksContext *sks_pc;
1225
1226   /**
1227    * Context for KSK publishing operation that is part of this publishing operation
1228    * (NULL if not active).
1229    */
1230   struct GNUNET_FS_PublishKskContext *ksk_pc;
1231
1232   /**
1233    * ID of the task performing the upload. NO_TASK if the upload has
1234    * completed.
1235    */
1236   GNUNET_SCHEDULER_TaskIdentifier upload_task;
1237
1238   /**
1239    * Storage space to reserve for the operation.
1240    */
1241   uint64_t reserve_space;
1242
1243   /**
1244    * Overall number of entries to reserve for the
1245    * publish operation.
1246    */
1247   uint32_t reserve_entries;
1248
1249   /**
1250    * Options for publishing.
1251    */
1252   enum GNUNET_FS_PublishOptions options;
1253
1254   /**
1255    * Space reservation ID with datastore service
1256    * for this upload.
1257    */
1258   int rid;
1259
1260   /**
1261    * Set to GNUNET_YES if all processing has completed.
1262    */
1263   int all_done;
1264   
1265   /**
1266    * Flag set to GNUNET_YES if the next callback from
1267    * GNUNET_FS_file_information_inspect should be skipped because it
1268    * is for the directory which was already processed with the parent.
1269    */
1270   int skip_next_fi_callback;
1271 };
1272
1273
1274 /**
1275  * Phases of unindex processing (state machine).
1276  */
1277 enum UnindexState
1278 {
1279   /**
1280    * We're currently hashing the file.
1281    */
1282   UNINDEX_STATE_HASHING = 0,
1283
1284   /**
1285    * We're telling the datastore to delete
1286    * the respective DBlocks and IBlocks.
1287    */
1288   UNINDEX_STATE_DS_REMOVE = 1,
1289   
1290   /**
1291    * Find out which keywords apply.
1292    */
1293   UNINDEX_STATE_EXTRACT_KEYWORDS = 2,
1294
1295   /**
1296    * We're telling the datastore to remove KBlocks.
1297    */
1298   UNINDEX_STATE_DS_REMOVE_KBLOCKS = 3,
1299
1300   /**
1301    * We're notifying the FS service about
1302    * the unindexing.
1303    */
1304   UNINDEX_STATE_FS_NOTIFY = 4,
1305   
1306   /**
1307    * We're done.
1308    */
1309   UNINDEX_STATE_COMPLETE = 5,
1310   
1311   /**
1312    * We've encountered a fatal error.
1313    */
1314   UNINDEX_STATE_ERROR = 6
1315 };
1316
1317
1318 /**
1319  * Handle for controlling an unindexing operation.
1320  */
1321 struct GNUNET_FS_UnindexContext
1322 {
1323
1324   /**
1325    * The content hash key of the last block we processed, will in the
1326    * end be set to the CHK from the URI.  Used to remove the KBlocks.
1327    */
1328   struct ContentHashKey chk; 
1329
1330   /**
1331    * Global FS context.
1332    */
1333   struct GNUNET_FS_Handle *h;
1334
1335   /**
1336    * Our top-level activity entry.
1337    */
1338   struct TopLevelActivity *top;
1339
1340   /**
1341    * Directory scanner to find keywords (KBlock removal).
1342    */
1343   struct GNUNET_FS_DirScanner *dscan;
1344
1345   /**
1346    * Keywords found (telling us which KBlocks to remove).
1347    */
1348   struct GNUNET_FS_Uri *ksk_uri;
1349
1350   /**
1351    * Current offset in KSK removal.
1352    */
1353   uint32_t ksk_offset;
1354
1355   /**
1356    * Name of the file that we are unindexing.
1357    */
1358   char *filename;
1359
1360   /**
1361    * Short name under which we are serializing the state of this operation.
1362    */
1363   char *serialization;
1364
1365   /**
1366    * Connection to the FS service, only valid during the
1367    * UNINDEX_STATE_FS_NOTIFY phase.
1368    */
1369   struct GNUNET_CLIENT_Connection *client;
1370
1371   /**
1372    * Connection to the datastore service, only valid during the
1373    * UNINDEX_STATE_DS_NOTIFY phase.
1374    */
1375   struct GNUNET_DATASTORE_Handle *dsh;
1376
1377   /**
1378    * Pointer kept for the client.
1379    */
1380   void *client_info;
1381
1382   /**
1383    * Merkle-ish tree encoder context.
1384    */
1385   struct GNUNET_FS_TreeEncoder *tc;
1386
1387   /**
1388    * Handle used to read the file.
1389    */
1390   struct GNUNET_DISK_FileHandle *fh;
1391
1392   /**
1393    * Handle to datastore 'get_key' operation issued for
1394    * obtaining KBlocks.
1395    */
1396   struct GNUNET_DATASTORE_QueueEntry *dqe;
1397
1398   /**
1399    * Current key for decrypting UBLocks from 'get_key' operation.
1400    */
1401   struct GNUNET_HashCode ukey;
1402
1403   /**
1404    * Current query of 'get_key' operation.
1405    */
1406   struct GNUNET_HashCode uquery;
1407
1408   /**
1409    * First content UID, 0 for none.
1410    */
1411   uint64_t first_uid;
1412
1413   /**
1414    * Error message, NULL on success.
1415    */
1416   char *emsg;
1417
1418   /**
1419    * Context for hashing of the file.
1420    */
1421   struct GNUNET_CRYPTO_FileHashContext *fhc;
1422
1423   /**
1424    * Overall size of the file.
1425    */
1426   uint64_t file_size;
1427
1428   /**
1429    * Random offset given to 'GNUNET_DATASTORE_get_key'.
1430    */
1431   uint64_t roff;
1432
1433   /**
1434    * When did we start?
1435    */
1436   struct GNUNET_TIME_Absolute start_time;
1437
1438   /**
1439    * Hash of the file's contents (once computed).
1440    */
1441   struct GNUNET_HashCode file_id;
1442
1443   /**
1444    * Current operatinonal phase.
1445    */
1446   enum UnindexState state;
1447
1448 };
1449
1450
1451 /**
1452  * Information we keep for each keyword in
1453  * a keyword search.
1454  */
1455 struct SearchRequestEntry
1456 {
1457   /**
1458    * Hash of the original keyword, used to derive the
1459    * key (for decrypting the KBlock).
1460    */
1461   struct GNUNET_HashCode ukey;
1462
1463   /**
1464    * Hash of the public key, also known as the query.
1465    */
1466   struct GNUNET_HashCode uquery;
1467
1468   /**
1469    * Map that contains a "struct GNUNET_FS_SearchResult" for each result that
1470    * was found under this keyword.  Note that the entries will point
1471    * to the same locations as those in the master result map (in
1472    * "struct GNUNET_FS_SearchContext"), so they should not be freed.
1473    * The key for each entry is the XOR of the key and query in the CHK
1474    * URI (as a unique identifier for the search result).
1475    */
1476   struct GNUNET_CONTAINER_MultiHashMap *results;
1477
1478   /**
1479    * Is this keyword a mandatory keyword
1480    * (started with '+')?
1481    */
1482   int mandatory;
1483
1484 };
1485
1486
1487 /**
1488  * Handle for controlling a search.
1489  */
1490 struct GNUNET_FS_SearchContext
1491 {
1492   /**
1493    * Handle to the global FS context.
1494    */
1495   struct GNUNET_FS_Handle *h;
1496
1497   /**
1498    * Our top-level activity entry (if we are top-level, otherwise NULL).
1499    */
1500   struct TopLevelActivity *top;
1501
1502   /**
1503    * List of keywords that we're looking for.
1504    */
1505   struct GNUNET_FS_Uri *uri;
1506
1507   /**
1508    * For update-searches, link to the search result that triggered
1509    * the update search; otherwise NULL.
1510    */
1511   struct GNUNET_FS_SearchResult *psearch_result;
1512
1513   /**
1514    * Connection to the FS service.
1515    */
1516   struct GNUNET_CLIENT_Connection *client;
1517
1518   /**
1519    * Pointer we keep for the client.
1520    */
1521   void *client_info;
1522
1523   /**
1524    * Name of the file on disk we use for persistence.
1525    */
1526   char *serialization;
1527
1528   /**
1529    * Error message (non-NULL if this operation failed).
1530    */
1531   char *emsg;
1532
1533   /**
1534    * Map that contains a "struct GNUNET_FS_SearchResult" for each result that
1535    * was found in the search.  The key for each entry is the XOR of
1536    * the key and query in the CHK URI (as a unique identifier for the
1537    * search result).
1538    */
1539   struct GNUNET_CONTAINER_MultiHashMap *master_result_map;
1540
1541   /**
1542    * Per-keyword information for a keyword search.  This array will
1543    * have exactly as many entries as there were keywords.
1544    */
1545   struct SearchRequestEntry *requests;
1546
1547   /**
1548    * When did we start?
1549    */
1550   struct GNUNET_TIME_Absolute start_time;
1551
1552   /**
1553    * How long to wait before we try to reconnect to FS service?
1554    */
1555   struct GNUNET_TIME_Relative reconnect_backoff;
1556
1557   /**
1558    * ID of a task that is using this struct and that must be cancelled
1559    * when the search is being stopped (if not
1560    * GNUNET_SCHEDULER_NO_TASK).  Used for the task that adds some
1561    * artificial delay when trying to reconnect to the FS service.
1562    */
1563   GNUNET_SCHEDULER_TaskIdentifier task;
1564
1565   /**
1566    * How many of the entries in the search request
1567    * map have been passed to the service so far?
1568    */
1569   unsigned int search_request_map_offset;
1570
1571   /**
1572    * How many of the keywords in the KSK
1573    * map have been passed to the service so far?
1574    */
1575   unsigned int keyword_offset;
1576
1577   /**
1578    * Anonymity level for the search.
1579    */
1580   uint32_t anonymity;
1581
1582   /**
1583    * Number of mandatory keywords in this query.
1584    */
1585   uint32_t mandatory_count;
1586
1587   /**
1588    * Options for the search.
1589    */
1590   enum GNUNET_FS_SearchOptions options;
1591 };
1592
1593
1594 /**
1595  * FSM for possible states a block can go through.  The typical
1596  * order of progression is linear through the states, alternatives
1597  * are documented in the comments.
1598  */
1599 enum BlockRequestState
1600 {
1601     /**
1602      * Initial state, block has only been allocated (since it is
1603      * relevant to the overall download request).
1604      */
1605   BRS_INIT = 0,
1606
1607     /**
1608      * We've checked the block on the path down the tree, and the
1609      * content on disk did match the desired CHK, but not all
1610      * the way down, so at the bottom some blocks will still
1611      * need to be reconstructed).
1612      */
1613   BRS_RECONSTRUCT_DOWN = 1,
1614
1615     /**
1616      * We've calculated the CHK bottom-up based on the meta data.
1617      * This may work, but if it did we have to write the meta data to
1618      * disk at the end (and we still need to check against the
1619      * CHK set on top).
1620      */
1621   BRS_RECONSTRUCT_META_UP = 2,
1622
1623     /**
1624      * We've calculated the CHK bottom-up based on what we have on
1625      * disk, which may not be what the desired CHK is.  If the
1626      * reconstructed CHKs match whatever comes from above, we're
1627      * done with the respective subtree.
1628      */
1629   BRS_RECONSTRUCT_UP = 3,
1630
1631     /**
1632      * We've determined the real, desired CHK for this block
1633      * (full tree reconstruction failed), request is now pending.
1634      * If the CHK that bubbled up through reconstruction did match
1635      * the top-level request, the state machine for the subtree
1636      * would have moved to BRS_DOWNLOAD_UP.
1637      */
1638   BRS_CHK_SET = 4,
1639
1640     /**
1641      * We've successfully downloaded this block, but the children
1642      * still need to be either downloaded or verified (download
1643      * request propagates down).  If the download fails, the
1644      * state machine for this block may move to
1645      * BRS_DOWNLOAD_ERROR instead.
1646      */
1647   BRS_DOWNLOAD_DOWN = 5,
1648
1649     /**
1650      * This block and all of its children have been downloaded
1651      * successfully (full completion propagates up).
1652      */
1653   BRS_DOWNLOAD_UP = 6,
1654
1655     /**
1656      * We got a block back that matched the query but did not hash to
1657      * the key (malicious publisher or hash collision); this block
1658      * can never be downloaded (error propagates up).
1659      */
1660   BRS_ERROR = 7
1661 };
1662
1663
1664 /**
1665  * Information about an active download request.
1666  */
1667 struct DownloadRequest
1668 {
1669   /**
1670    * While pending, we keep all download requests in a doubly-linked list.
1671    */
1672   struct DownloadRequest *next;
1673
1674   /**
1675    * While pending, we keep all download requests in a doubly-linked list.
1676    */
1677   struct DownloadRequest *prev;
1678
1679   /**
1680    * Parent in the CHK-tree.
1681    */
1682   struct DownloadRequest *parent;
1683
1684   /**
1685    * Array (!) of child-requests, or NULL for the bottom of the tree.
1686    */
1687   struct DownloadRequest **children;
1688
1689   /**
1690    * CHK for the request for this block (set during reconstruction
1691    * to what we have on disk, later to what we want to have).
1692    */
1693   struct ContentHashKey chk;
1694
1695   /**
1696    * Offset of the corresponding block.  Specifically, first (!) byte of
1697    * the first DBLOCK in the subtree induced by block represented by
1698    * this request.
1699    */
1700   uint64_t offset;
1701
1702   /**
1703    * Number of entries in 'children' array.
1704    */
1705   unsigned int num_children;
1706
1707   /**
1708    * Depth of the corresponding block in the tree.  0==DBLOCKs.
1709    */
1710   unsigned int depth;
1711
1712   /**
1713    * Offset of the CHK for this block in the parent block
1714    */
1715   unsigned int chk_idx;
1716
1717   /**
1718    * State in the FSM.
1719    */
1720   enum BlockRequestState state;
1721
1722   /**
1723    * GNUNET_YES if this entry is in the pending list.
1724    */
1725   int is_pending;
1726
1727 };
1728
1729
1730 /**
1731  * (recursively) free download request structure
1732  *
1733  * @param dr request to free
1734  */
1735 void
1736 GNUNET_FS_free_download_request_ (struct DownloadRequest *dr);
1737
1738
1739 /**
1740  * Context for controlling a download.
1741  */
1742 struct GNUNET_FS_DownloadContext
1743 {
1744
1745   /**
1746    * Global FS context.
1747    */
1748   struct GNUNET_FS_Handle *h;
1749
1750   /**
1751    * Our top-level activity entry (if we are top-level, otherwise NULL).
1752    */
1753   struct TopLevelActivity *top;
1754
1755   /**
1756    * Connection to the FS service.
1757    */
1758   struct GNUNET_CLIENT_Connection *client;
1759
1760   /**
1761    * Parent download (used when downloading files
1762    * in directories).
1763    */
1764   struct GNUNET_FS_DownloadContext *parent;
1765
1766   /**
1767    * Associated search (used when downloading files
1768    * based on search results), or NULL for none.
1769    */
1770   struct GNUNET_FS_SearchResult *search;
1771
1772   /**
1773    * Head of list of child downloads.
1774    */
1775   struct GNUNET_FS_DownloadContext *child_head;
1776
1777   /**
1778    * Tail of list of child downloads.
1779    */
1780   struct GNUNET_FS_DownloadContext *child_tail;
1781
1782   /**
1783    * Previous download belonging to the same parent.
1784    */
1785   struct GNUNET_FS_DownloadContext *prev;
1786
1787   /**
1788    * Next download belonging to the same parent.
1789    */
1790   struct GNUNET_FS_DownloadContext *next;
1791
1792   /**
1793    * Context kept for the client.
1794    */
1795   void *client_info;
1796
1797   /**
1798    * URI that identifies the file that we are downloading.
1799    */
1800   struct GNUNET_FS_Uri *uri;
1801
1802   /**
1803    * Known meta-data for the file (can be NULL).
1804    */
1805   struct GNUNET_CONTAINER_MetaData *meta;
1806
1807   /**
1808    * Error message, NULL if we're doing OK.
1809    */
1810   char *emsg;
1811
1812   /**
1813    * Random portion of filename we use for syncing state of this
1814    * download.
1815    */
1816   char *serialization;
1817
1818   /**
1819    * Where are we writing the data (name of the
1820    * file, can be NULL!).
1821    */
1822   char *filename;
1823
1824   /**
1825    * Where are we writing the data temporarily (name of the
1826    * file, can be NULL!); used if we do not have a permanent
1827    * name and we are a directory and we do a recursive download.
1828    */
1829   char *temp_filename;
1830
1831   /**
1832    * Our entry in the job queue.
1833    */
1834   struct GNUNET_FS_QueueEntry *job_queue;
1835
1836   /**
1837    * Non-NULL if we are currently having a request for
1838    * transmission pending with the client handle.
1839    */
1840   struct GNUNET_CLIENT_TransmitHandle *th;
1841
1842   /**
1843    * Tree encoder used for the reconstruction.
1844    */
1845   struct GNUNET_FS_TreeEncoder *te;
1846
1847   /**
1848    * File handle for reading data from an existing file
1849    * (to pass to tree encoder).
1850    */
1851   struct GNUNET_DISK_FileHandle *rfh;
1852
1853   /**
1854    * Map of active requests (those waiting for a response).  The key
1855    * is the hash of the encryped block (aka query).
1856    */
1857   struct GNUNET_CONTAINER_MultiHashMap *active;
1858
1859   /**
1860    * Head of linked list of pending requests.
1861    */
1862   struct DownloadRequest *pending_head;
1863
1864   /**
1865    * Head of linked list of pending requests.
1866    */
1867   struct DownloadRequest *pending_tail;
1868
1869   /**
1870    * Top-level download request.
1871    */
1872   struct DownloadRequest *top_request;
1873
1874   /**
1875    * Identity of the peer having the content, or all-zeros
1876    * if we don't know of such a peer.
1877    */
1878   struct GNUNET_PeerIdentity target;
1879
1880   /**
1881    * ID of a task that is using this struct and that must be cancelled
1882    * when the download is being stopped (if not
1883    * GNUNET_SCHEDULER_NO_TASK).  Used for the task that adds some
1884    * artificial delay when trying to reconnect to the FS service or
1885    * the task processing incrementally the data on disk, or the
1886    * task requesting blocks, etc.
1887    */
1888   GNUNET_SCHEDULER_TaskIdentifier task;
1889
1890   /**
1891    * What is the first offset that we're interested
1892    * in?
1893    */
1894   uint64_t offset;
1895
1896   /**
1897    * How many bytes starting from offset are desired?
1898    * This is NOT the overall length of the file!
1899    */
1900   uint64_t length;
1901
1902   /**
1903    * How many bytes have we already received within
1904    * the specified range (DBlocks only).
1905    */
1906   uint64_t completed;
1907
1908   /**
1909    * What was the size of the file on disk that we're downloading
1910    * before we started?  Used to detect if there is a point in
1911    * checking an existing block on disk for matching the desired
1912    * content.  0 if the file did not exist already.
1913    */
1914   uint64_t old_file_size;
1915
1916   /**
1917    * Time download was started.
1918    */
1919   struct GNUNET_TIME_Absolute start_time;
1920
1921   /**
1922    * How long to wait before we try to reconnect to FS service?
1923    */
1924   struct GNUNET_TIME_Relative reconnect_backoff;
1925
1926   /**
1927    * Desired level of anonymity.
1928    */
1929   uint32_t anonymity;
1930
1931   /**
1932    * The depth of the file-tree.
1933    */
1934   unsigned int treedepth;
1935
1936   /**
1937    * Options for the download.
1938    */
1939   enum GNUNET_FS_DownloadOptions options;
1940
1941   /**
1942    * Flag set upon transitive completion (includes child downloads).
1943    * This flag is only set to GNUNET_YES for directories where all
1944    * child-downloads have also completed (and signalled completion).
1945    */
1946   int has_finished;
1947
1948   /**
1949    * Have we started the receive continuation yet?
1950    */
1951   int in_receive;
1952
1953   /**
1954    * Are we ready to issue requests (reconstructions are finished)?
1955    */
1956   int issue_requests;
1957
1958 };
1959
1960
1961 /**
1962  * Information about an (updateable) node in the
1963  * namespace.
1964  */
1965 struct NamespaceUpdateNode
1966 {
1967   /**
1968    * Identifier for this node.
1969    */
1970   char *id;
1971
1972   /**
1973    * Identifier of children of this node.
1974    */
1975   char *update;
1976
1977   /**
1978    * Metadata for this entry.
1979    */
1980   struct GNUNET_CONTAINER_MetaData *md;
1981
1982   /**
1983    * URI of this entry in the namespace.
1984    */
1985   struct GNUNET_FS_Uri *uri;
1986
1987   /**
1988    * Namespace update generation ID.  Used to ensure
1989    * freshness of the tree_id.
1990    */
1991   unsigned int nug;
1992
1993   /**
1994    * TREE this entry belongs to (if nug is current).
1995    */
1996   unsigned int tree_id;
1997
1998 };
1999
2000
2001 /**
2002  * Handle to one of our namespaces.
2003  */
2004 struct GNUNET_FS_Namespace
2005 {
2006
2007   /**
2008    * Handle to the FS service context.
2009    */
2010   struct GNUNET_FS_Handle *h;
2011
2012   /**
2013    * Array with information about nodes in the namespace.
2014    */
2015   struct NamespaceUpdateNode **update_nodes;
2016
2017   /**
2018    * Private key for the namespace.
2019    */
2020   struct GNUNET_FS_PseudonymHandle *key;
2021
2022   /**
2023    * Hash map mapping identifiers of update nodes
2024    * to the update nodes (initialized on-demand).
2025    */
2026   struct GNUNET_CONTAINER_MultiHashMap *update_map;
2027
2028   /**
2029    * Name of the file with the private key.
2030    */
2031   char *filename;
2032
2033   /**
2034    * Name of the namespace.
2035    */
2036   char *name;
2037
2038   /**
2039    * Size of the update nodes array.
2040    */
2041   unsigned int update_node_count;
2042
2043   /**
2044    * Reference counter.
2045    */
2046   unsigned int rc;
2047
2048   /**
2049    * Generator for unique nug numbers.
2050    */
2051   unsigned int nug_gen;
2052 };
2053
2054 #endif
2055
2056 /* end of fs_api.h */