Merge branch 'master' of ssh://gnunet.org/gnunet
[oweals/gnunet.git] / src / fs / fs_api.h
index 46f398e86e20db0d86342e870552b7a2a5cb117a..be22ea73e7d8277bc636e9edb422443226424b73 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 GNUnet e.V.
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -14,8 +14,8 @@
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
@@ -409,25 +409,6 @@ struct GNUNET_FS_FileInformation
 };
 
 
-/**
- * The job is now ready to run and should use the given client
- * handle to communicate with the FS service.
- *
- * @param cls closure
- * @param client handle to use for FS communication
- */
-typedef void (*GNUNET_FS_QueueStart) (void *cls,
-                                      struct GNUNET_CLIENT_Connection * client);
-
-
-/**
- * The job must now stop to run and should destry the client handle as
- * soon as possible (ideally prior to returning).
- */
-typedef void (*GNUNET_FS_QueueStop) (void *cls);
-
-
-
 /**
  * Priorities for the queue.
  */
@@ -463,12 +444,12 @@ struct GNUNET_FS_QueueEntry
   /**
    * Function to call when the job is started.
    */
-  GNUNET_FS_QueueStart start;
+  GNUNET_SCHEDULER_TaskCallback start;
 
   /**
    * Function to call when the job needs to stop (or is done / dequeued).
    */
-  GNUNET_FS_QueueStop stop;
+  GNUNET_SCHEDULER_TaskCallback stop;
 
   /**
    * Closure for start and stop.
@@ -481,9 +462,9 @@ struct GNUNET_FS_QueueEntry
   struct GNUNET_FS_Handle *h;
 
   /**
-   * Client handle, or NULL if job is not running.
+   * Message queue handle, or NULL if job is not running.
    */
-  struct GNUNET_CLIENT_Connection *client;
+  struct GNUNET_MQ_Handle *mq;
 
   /**
    * Time the job was originally queued.
@@ -516,6 +497,11 @@ struct GNUNET_FS_QueueEntry
    */
   unsigned int start_times;
 
+  /**
+   * #GNUNET_YES if the job is active now.
+   */
+  int active;
+
 };
 
 
@@ -599,7 +585,7 @@ struct GNUNET_FS_SearchResult
    * complete on time (and that will need to be cancelled if we clean
    * up the search result before then).
    */
-  GNUNET_SCHEDULER_TaskIdentifier probe_cancel_task;
+  struct GNUNET_SCHEDULER_Task * probe_cancel_task;
 
   /**
    * When did the current probe become active?
@@ -656,8 +642,8 @@ struct GNUNET_FS_SearchResult
  */
 struct GNUNET_FS_QueueEntry *
 GNUNET_FS_queue_ (struct GNUNET_FS_Handle *h,
-                  GNUNET_FS_QueueStart start,
-                  GNUNET_FS_QueueStop stop,
+                  GNUNET_SCHEDULER_TaskCallback start,
+                  GNUNET_SCHEDULER_TaskCallback stop,
                   void *cls,
                   unsigned int blocks,
                  enum GNUNET_FS_QueuePriority priority);
@@ -680,7 +666,7 @@ GNUNET_FS_dequeue_ (struct GNUNET_FS_QueueEntry *qe);
  *            that the caller might need to go backwards
  *            a bit at times
  * @param max maximum number of bytes that should be
- *            copied to buf; readers are not allowed
+ *            copied to @a buf; readers are not allowed
  *            to provide less data unless there is an error;
  *            a value of "0" will be used at the end to allow
  *            the reader to clean up its internal state
@@ -689,12 +675,15 @@ GNUNET_FS_dequeue_ (struct GNUNET_FS_QueueEntry *qe);
  * @return number of bytes written, usually "max", 0 on error
  */
 size_t
-GNUNET_FS_data_reader_file_ (void *cls, uint64_t offset, size_t max, void *buf,
+GNUNET_FS_data_reader_file_ (void *cls,
+                             uint64_t offset,
+                             size_t max,
+                             void *buf,
                              char **emsg);
 
 
 /**
- * Create the closure for the 'GNUNET_FS_data_reader_file_' callback.
+ * Create the closure for the #GNUNET_FS_data_reader_file_() callback.
  *
  * @param filename file to read
  * @return closure to use
@@ -712,23 +701,26 @@ GNUNET_FS_make_file_reader_context_ (const char *filename);
  *            that the caller might need to go backwards
  *            a bit at times
  * @param max maximum number of bytes that should be
- *            copied to buf; readers are not allowed
+ *            copied to @a buf; readers are not allowed
  *            to provide less data unless there is an error;
  *            a value of "0" will be used at the end to allow
  *            the reader to clean up its internal state
  * @param buf where the reader should write the data
  * @param emsg location for the reader to store an error message
- * @return number of bytes written, usually "max", 0 on error
+ * @return number of bytes written, usually @a max, 0 on error
  */
 size_t
-GNUNET_FS_data_reader_copy_ (void *cls, uint64_t offset, size_t max, void *buf,
+GNUNET_FS_data_reader_copy_ (void *cls,
+                             uint64_t offset,
+                             size_t max,
+                             void *buf,
                              char **emsg);
 
 
 /**
  * Notification of FS that a search probe has made progress.
  * This function is used INSTEAD of the client's event handler
- * for downloads where the GNUNET_FS_DOWNLOAD_IS_PROBE flag is set.
+ * for downloads where the #GNUNET_FS_DOWNLOAD_IS_PROBE flag is set.
  *
  * @param cls closure, always NULL (!), actual closure
  *        is in the client-context of the info struct
@@ -738,7 +730,7 @@ GNUNET_FS_data_reader_copy_ (void *cls, uint64_t offset, size_t max, void *buf,
  *         for this operation; should be set to NULL for
  *         SUSPEND and STOPPED events).  The value returned
  *         will be passed to future callbacks in the respective
- *         field in the GNUNET_FS_ProgressInfo struct.
+ *         field in the `struct GNUNET_FS_ProgressInfo`.
  */
 void *
 GNUNET_FS_search_probe_progress_ (void *cls,
@@ -749,11 +741,9 @@ GNUNET_FS_search_probe_progress_ (void *cls,
  * Main function that performs the upload.
  *
  * @param cls `struct GNUNET_FS_PublishContext` identifies the upload
- * @param tc task context
  */
 void
-GNUNET_FS_publish_main_ (void *cls,
-                         const struct GNUNET_SCHEDULER_TaskContext *tc);
+GNUNET_FS_publish_main_ (void *cls);
 
 
 /**
@@ -764,7 +754,8 @@ GNUNET_FS_publish_main_ (void *cls,
  * @param file_id computed hash, NULL on error
  */
 void
-GNUNET_FS_unindex_process_hash_ (void *cls, const struct GNUNET_HashCode * file_id);
+GNUNET_FS_unindex_process_hash_ (void *cls,
+                                 const struct GNUNET_HashCode *file_id);
 
 
 /**
@@ -819,11 +810,9 @@ GNUNET_FS_download_make_status_ (struct GNUNET_FS_ProgressInfo *pi,
  * request for the file.
  *
  * @param cls the 'struct GNUNET_FS_DownloadContext'
- * @param tc scheduler context
  */
 void
-GNUNET_FS_download_start_task_ (void *cls,
-                                const struct GNUNET_SCHEDULER_TaskContext *tc);
+GNUNET_FS_download_start_task_ (void *cls);
 
 
 
@@ -890,6 +879,7 @@ GNUNET_FS_download_start_downloading_ (struct GNUNET_FS_DownloadContext *dc);
 void
 GNUNET_FS_search_start_probe_ (struct GNUNET_FS_SearchResult *sr);
 
+
 /**
  * Remove serialization/deserialization file from disk.
  *
@@ -898,7 +888,8 @@ GNUNET_FS_search_start_probe_ (struct GNUNET_FS_SearchResult *sr);
  * @param ent entity identifier
  */
 void
-GNUNET_FS_remove_sync_file_ (struct GNUNET_FS_Handle *h, const char *ext,
+GNUNET_FS_remove_sync_file_ (struct GNUNET_FS_Handle *h,
+                             const char *ext,
                              const char *ent);
 
 
@@ -991,7 +982,7 @@ GNUNET_FS_download_sync_ (struct GNUNET_FS_DownloadContext *dc);
  * Create SUSPEND event for the given publish operation
  * and then clean up our state (without stop signal).
  *
- * @param cls the 'struct GNUNET_FS_PublishContext' to signal for
+ * @param cls the `struct GNUNET_FS_PublishContext` to signal for
  */
 void
 GNUNET_FS_publish_signal_suspend_ (void *cls);
@@ -1021,7 +1012,7 @@ GNUNET_FS_download_signal_suspend_ (void *cls);
  * Create SUSPEND event for the given unindex operation
  * and then clean up our state (without stop signal).
  *
- * @param cls the 'struct GNUNET_FS_UnindexContext' to signal for
+ * @param cls the `struct GNUNET_FS_UnindexContext` to signal for
  */
 void
 GNUNET_FS_unindex_signal_suspend_ (void *cls);
@@ -1159,13 +1150,13 @@ struct GNUNET_FS_Handle
    * Task that processes the jobs in the running and pending queues
    * (and moves jobs around as needed).
    */
-  GNUNET_SCHEDULER_TaskIdentifier queue_job;
+  struct GNUNET_SCHEDULER_Task * queue_job;
 
   /**
    * Task we use to report periodically to the application that
    * certain search probes (from @e probes_head) are still running.
    */
-  GNUNET_SCHEDULER_TaskIdentifier probe_ping_task;
+  struct GNUNET_SCHEDULER_Task * probe_ping_task;
 
   /**
    * Average time we take for a single request to be satisfied.
@@ -1243,10 +1234,10 @@ struct GNUNET_FS_PublishContext
   char *serialization;
 
   /**
-   * Our own client handle for the FS service; only briefly used when
+   * Our own message queue for the FS service; only briefly used when
    * we start to index a file, otherwise NULL.
    */
-  struct GNUNET_CLIENT_Connection *client;
+  struct GNUNET_MQ_Handle *mq;
 
   /**
    * Current position in the file-tree for the upload.
@@ -1284,7 +1275,7 @@ struct GNUNET_FS_PublishContext
    * ID of the task performing the upload. NO_TASK if the upload has
    * completed.
    */
-  GNUNET_SCHEDULER_TaskIdentifier upload_task;
+  struct GNUNET_SCHEDULER_Task * upload_task;
 
   /**
    * Storage space to reserve for the operation.
@@ -1308,6 +1299,12 @@ struct GNUNET_FS_PublishContext
    */
   int rid;
 
+  /**
+   * Set to #GNUNET_YES if we were able to publish any block.
+   * (and thus unindexing on error might make sense).
+   */
+  int any_done;
+
   /**
    * Set to #GNUNET_YES if all processing has completed.
    */
@@ -1417,7 +1414,7 @@ struct GNUNET_FS_UnindexContext
    * Connection to the FS service, only valid during the
    * #UNINDEX_STATE_FS_NOTIFY phase.
    */
-  struct GNUNET_CLIENT_Connection *client;
+  struct GNUNET_MQ_Handle *mq;
 
   /**
    * Connection to the datastore service, only valid during the
@@ -1456,11 +1453,6 @@ struct GNUNET_FS_UnindexContext
    */
   struct GNUNET_HashCode uquery;
 
-  /**
-   * First content UID, 0 for none.
-   */
-  uint64_t first_uid;
-
   /**
    * Error message, NULL on success.
    */
@@ -1476,11 +1468,6 @@ struct GNUNET_FS_UnindexContext
    */
   uint64_t file_size;
 
-  /**
-   * Random offset given to #GNUNET_DATASTORE_get_key.
-   */
-  uint64_t roff;
-
   /**
    * When did we start?
    */
@@ -1569,7 +1556,7 @@ struct GNUNET_FS_SearchContext
   /**
    * Connection to the FS service.
    */
-  struct GNUNET_CLIENT_Connection *client;
+  struct GNUNET_MQ_Handle *mq;
 
   /**
    * Pointer we keep for the client.
@@ -1613,22 +1600,10 @@ struct GNUNET_FS_SearchContext
   /**
    * ID of a task that is using this struct and that must be cancelled
    * when the search is being stopped (if not
-   * #GNUNET_SCHEDULER_NO_TASK).  Used for the task that adds some
+   * NULL).  Used for the task that adds some
    * artificial delay when trying to reconnect to the FS service.
    */
-  GNUNET_SCHEDULER_TaskIdentifier task;
-
-  /**
-   * How many of the entries in the search request
-   * map have been passed to the service so far?
-   */
-  unsigned int search_request_map_offset;
-
-  /**
-   * How many of the keywords in the KSK
-   * map have been passed to the service so far?
-   */
-  unsigned int keyword_offset;
+  struct GNUNET_SCHEDULER_Task *task;
 
   /**
    * Anonymity level for the search.
@@ -1722,15 +1697,6 @@ enum BlockRequestState
  */
 struct DownloadRequest
 {
-  /**
-   * While pending, we keep all download requests in a doubly-linked list.
-   */
-  struct DownloadRequest *next;
-
-  /**
-   * While pending, we keep all download requests in a doubly-linked list.
-   */
-  struct DownloadRequest *prev;
 
   /**
    * Parent in the CHK-tree.
@@ -1756,7 +1722,7 @@ struct DownloadRequest
   uint64_t offset;
 
   /**
-   * Number of entries in 'children' array.
+   * Number of entries in @e children array.
    */
   unsigned int num_children;
 
@@ -1775,11 +1741,6 @@ struct DownloadRequest
    */
   enum BlockRequestState state;
 
-  /**
-   * #GNUNET_YES if this entry is in the pending list.
-   */
-  int is_pending;
-
 };
 
 
@@ -1820,7 +1781,7 @@ struct GNUNET_FS_DownloadContext
   /**
    * Connection to the FS service.
    */
-  struct GNUNET_CLIENT_Connection *client;
+  struct GNUNET_MQ_Handle *mq;
 
   /**
    * Parent download (used when downloading files
@@ -1898,12 +1859,6 @@ struct GNUNET_FS_DownloadContext
    */
   struct GNUNET_FS_QueueEntry *job_queue;
 
-  /**
-   * Non-NULL if we are currently having a request for
-   * transmission pending with the client handle.
-   */
-  struct GNUNET_CLIENT_TransmitHandle *th;
-
   /**
    * Tree encoder used for the reconstruction.
    */
@@ -1921,16 +1876,6 @@ struct GNUNET_FS_DownloadContext
    */
   struct GNUNET_CONTAINER_MultiHashMap *active;
 
-  /**
-   * Head of linked list of pending requests.
-   */
-  struct DownloadRequest *pending_head;
-
-  /**
-   * Head of linked list of pending requests.
-   */
-  struct DownloadRequest *pending_tail;
-
   /**
    * Top-level download request.
    */
@@ -1945,12 +1890,12 @@ struct GNUNET_FS_DownloadContext
   /**
    * ID of a task that is using this struct and that must be cancelled
    * when the download is being stopped (if not
-   * #GNUNET_SCHEDULER_NO_TASK).  Used for the task that adds some
+   * NULL).  Used for the task that adds some
    * artificial delay when trying to reconnect to the FS service or
    * the task processing incrementally the data on disk, or the
    * task requesting blocks, etc.
    */
-  GNUNET_SCHEDULER_TaskIdentifier task;
+  struct GNUNET_SCHEDULER_Task *task;
 
   /**
    * What is the first offset that we're interested
@@ -2010,11 +1955,6 @@ struct GNUNET_FS_DownloadContext
    */
   int has_finished;
 
-  /**
-   * Have we started the receive continuation yet?
-   */
-  int in_receive;
-
   /**
    * Are we ready to issue requests (reconstructions are finished)?
    */