new timeout tests for WLAN and bluetooth
[oweals/gnunet.git] / src / set / gnunet-service-set.h
index e69f2a09a0280004d2c661088b5cbcf88c944511..95a24119b3c0722b564f03c9ef950974a8807454 100644 (file)
@@ -55,8 +55,8 @@ struct OperationState;
 
 /* forward declarations */
 struct Set;
-struct TunnelContext;
 struct ElementEntry;
+struct Operation;
 
 
 /**
@@ -91,7 +91,12 @@ struct OperationSpecification
   uint32_t salt;
 
   /**
-   * ID used to identify responses to a client.
+   * Remote peers element count
+   */
+  uint32_t remote_element_count;
+
+  /**
+   * ID used to identify an operation between service and client
    */
   uint32_t client_request_id;
 
@@ -100,6 +105,11 @@ struct OperationSpecification
    * with a set.
    */
   struct Set *set;
+
+  /**
+   * When are elements sent to the client, and which elements are sent?
+   */
+  enum GNUNET_SET_ResultMode result_mode;
 };
 
 
@@ -130,7 +140,7 @@ typedef void (*AddRemoveImpl) (struct SetState *state, struct ElementEntry *ee);
  *
  * @param op the set operation, contains implementation-specific data
  */
-typedef void (*PeerDisconnectImpl) (struct OperationState *op);
+typedef void (*PeerDisconnectImpl) (struct Operation *op);
 
 
 /**
@@ -146,13 +156,9 @@ typedef void (*DestroySetImpl) (struct SetState *state);
  * Signature of functions that implement the creation of set operations
  * (currently evaluate and accept).
  *
- * @param spec specification of the set operation to be created
- * @param tunnel the tunnel with the other peer
- * @param tc tunnel context
+ * @param op operation that is created, should be initialized by the implementation
  */
-typedef void (*OpCreateImpl) (struct OperationSpecification *spec,
-                              struct GNUNET_MESH_Tunnel *tunnel,
-                              struct TunnelContext *tc);
+typedef void (*OpCreateImpl) (struct Operation *op);
 
 
 /**
@@ -164,20 +170,15 @@ typedef void (*OpCreateImpl) (struct OperationSpecification *spec,
  * @return GNUNET_OK on success, GNUNET_SYSERR to
  *         destroy the operation and the tunnel
  */
-typedef int (*MsgHandlerImpl) (struct OperationState *op,
+typedef int (*MsgHandlerImpl) (struct Operation *op,
                                const struct GNUNET_MessageHeader *msg);
 
-typedef void (*CancelImpl) (struct SetState *set,
-                            uint32_t request_id);
-
-
 /**
- * Signature of functions that implement sending all the set's
- * elements to the client.
+ * Signature of functions that implement operation cancellation
  *
- * @param set set that should be iterated over
+ * @param op operation state
  */
-typedef void (*IterateImpl) (struct Set *set);
+typedef void (*CancelImpl) (struct Operation *op);
 
 
 /**
@@ -233,11 +234,6 @@ struct SetVT
    * its ID.
    */
   CancelImpl cancel;
-
-  /**
-   * Callback for iterating over all set elements.
-   */
-  IterateImpl iterate;
 };
 
 
@@ -258,6 +254,7 @@ struct ElementEntry
 
   /**
    * Hash of the element.
+   * For set union:
    * Will be used to derive the different IBF keys
    * for different salts.
    */
@@ -284,11 +281,78 @@ struct ElementEntry
   /**
    * GNUNET_YES if the element is a remote element, and does not belong
    * to the operation's set.
+   *
+   * //TODO: Move to Union, unless additional set-operations are implemented ever
    */
   int remote;
 };
 
 
+struct Operation
+{
+  /**
+   * V-Table for the operation belonging
+   * to the tunnel contest.
+   *
+   * Used for all operation specific operations after receiving the ops request
+   */
+  const struct SetVT *vt;
+
+  /**
+   * Tunnel to the peer.
+   */
+  struct GNUNET_MESH_Channel *channel;
+
+  /**
+   * Message queue for the tunnel.
+   */
+  struct GNUNET_MQ_Handle *mq;
+
+  /**
+   * GNUNET_YES if this is not a "real" set operation yet, and we still
+   * need to wait for the other peer to give us more details.
+   */
+  int is_incoming;
+
+  /**
+   * Generation in which the operation handle
+   * was created.
+   */
+  unsigned int generation_created;
+
+  /**
+   * Detail information about the set operation,
+   * including the set to use.
+   * When 'spec' is NULL, the operation is not yet entirely
+   * initialized.
+   */
+  struct OperationSpecification *spec;
+
+  /**
+   * Operation-specific operation state.
+   */
+  struct OperationState *state;
+
+  /**
+   * Evaluate operations are held in
+   * a linked list.
+   */
+  struct Operation *next;
+
+   /**
+    * Evaluate operations are held in
+    * a linked list.
+    */
+  struct Operation *prev;
+
+  /**
+   * Set to GNUNET_YES if the set service should not free
+   * the operation, as it is still needed (e.g. in some scheduled task).
+   */
+  int keep;
+};
+
+
 /**
  * A set that supports a specific operation
  * with other peers.
@@ -314,6 +378,9 @@ struct Set
   /**
    * Virtual table for this set.
    * Determined by the operation type of this set.
+   *
+   * Used only for Add/remove of elements and when receiving an incoming
+   * operation from a remote peer.
    */
   const struct SetVT *vt;
 
@@ -348,38 +415,47 @@ struct Set
    * previously executed operations on this set
    */
   unsigned int current_generation;
-};
 
-
-/**
- * Information about a tunnel we are connected to.
- * Used as tunnel context with mesh.
- */
-struct TunnelContext
-{
   /**
-   * V-Table for the operation belonging
-   * to the tunnel contest.
+   * Evaluate operations are held in
+   * a linked list.
    */
-  const struct SetVT *vt;
+  struct Operation *ops_head;
 
   /**
-   * Implementation-specific operation state.
+   * Evaluate operations are held in
+   * a linked list.
    */
-  struct OperationState *op;
+  struct Operation *ops_tail;
 };
 
 
+/**
+ * Destroy the given operation.  Call the implementation-specific cancel function
+ * of the operation.  Disconnects from the remote peer.
+ * Does not disconnect the client, as there may be multiple operations per set.
+ *
+ * @param op operation to destroy
+ */
+void
+_GSS_operation_destroy (struct Operation *op);
+
+
 /**
  * Get the table with implementing functions for
  * set union.
+ *
+ * @return the operation specific VTable
  */
 const struct SetVT *
 _GSS_union_vt (void);
 
+
 /**
  * Get the table with implementing functions for
  * set intersection.
+ *
+ * @return the operation specific VTable
  */
 const struct SetVT *
 _GSS_intersection_vt (void);