print active/inactive information
[oweals/gnunet.git] / src / include / gnunet_psyc_service.h
index eb17c93510afc19fbb527ed0a13c6abd6bdac0d4..4806767fbb7db7a0b79dff92691c307b446e8e99 100644 (file)
@@ -110,9 +110,10 @@ enum GNUNET_PSYC_ChannelFlags
    * Past messages are only available to slaves who were admitted at the time
    * they were sent to the channel.
    */
-  GNUNET_PSYC_CHANNEL_RESTRICTED_HISTORY = 1 << 1,
+  GNUNET_PSYC_CHANNEL_RESTRICTED_HISTORY = 1 << 1
 };
 
+
 /**
  * PSYC channel policies.
  */
@@ -132,7 +133,7 @@ enum GNUNET_PSYC_Policy
    */
   GNUNET_PSYC_CHANNEL_PRIVATE
     = GNUNET_PSYC_CHANNEL_ADMISSION_CONTROL
-    | GNUNET_PSYC_CHANNEL_RESTRICTED_HISTORY,
+    | GNUNET_PSYC_CHANNEL_RESTRICTED_HISTORY
 
 #if IDEAS_FOR_FUTURE
   /**
@@ -152,9 +153,7 @@ enum GNUNET_PSYC_Policy
    */
   GNUNET_PSYC_CHANNEL_CLOSED
     = GNUNET_PSYC_CHANNEL_ADMISSION_CONTROL,
-,
 #endif
-
 };
 
 
@@ -163,13 +162,37 @@ enum GNUNET_PSYC_MessageFlags
   /**
    * Historic message, retrieved from PSYCstore.
    */
-  GNUNET_PSYC_MESSAGE_HISTORIC = 1
+  GNUNET_PSYC_MESSAGE_HISTORIC = 1 << 0,
+
+  /**
+   * Request from slave to master.
+   */
+  GNUNET_PSYC_MESSAGE_REQUEST = 1 << 1,
+
+  /**
+   * Message can be delivered out of order.
+   */
+  GNUNET_PSYC_MESSAGE_ORDER_ANY = 1 << 2
+};
+
+
+/**
+ * Values for the @a state_delta field of GNUNET_PSYC_MessageHeader.
+ */
+enum GNUNET_PSYC_StateDeltaValues
+{
+  GNUNET_PSYC_STATE_RESET = 0,
+
+  GNUNET_PSYC_STATE_NOT_MODIFIED = UINT64_MAX
 };
 
+
 GNUNET_NETWORK_STRUCT_BEGIN
 
 /**
  * Header of a PSYC message.
+ *
+ * Only present when receiving a message.
  */
 struct GNUNET_PSYC_MessageHeader
 {
@@ -187,6 +210,7 @@ struct GNUNET_PSYC_MessageHeader
 
   /**
    * Number of the message this message part belongs to.
+   * Monotonically increasing from 1.
    */
   uint64_t message_id GNUNET_PACKED;
 
@@ -217,6 +241,12 @@ struct GNUNET_PSYC_MessageMethod
    */
   uint32_t flags GNUNET_PACKED;
 
+  /**
+   * Number of message IDs since the last message that contained state
+   * operations. @see enum GNUNET_PSYC_StateDeltaValues
+   */
+  uint64_t state_delta GNUNET_PACKED;
+
   /* Followed by NUL-terminated method name. */
 };
 
@@ -251,6 +281,7 @@ struct GNUNET_PSYC_MessageModifier
 
 GNUNET_NETWORK_STRUCT_END
 
+
 #define GNUNET_PSYC_MODIFIER_MAX_PAYLOAD        \
   GNUNET_MULTICAST_FRAGMENT_MAX_PAYLOAD         \
   - sizeof (struct GNUNET_PSYC_MessageModifier)
@@ -263,6 +294,7 @@ GNUNET_NETWORK_STRUCT_END
   GNUNET_MULTICAST_FRAGMENT_MAX_PAYLOAD         \
   - sizeof (struct GNUNET_MessageHeader)
 
+
 /**
  * Handle that identifies a join request.
  *
@@ -275,8 +307,10 @@ struct GNUNET_PSYC_JoinHandle;
 /**
  * Method called from PSYC upon receiving part of a message.
  *
- * @param cls Closure.
- * @param msg Message part, one of the following types:
+ * @param cls  Closure.
+ * @param message_id  Sequence number of the message.
+ * @param flags  OR'ed GNUNET_PSYC_MessageFlags
+ * @param msg  Message part, one of the following types:
  * - GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_HEADER
  * - GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_METHOD
  * - GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_MODIFIER
@@ -293,26 +327,18 @@ typedef void
 /**
  * Method called from PSYC upon receiving a join request.
  *
- * @param cls Closure.
- * @param slave  requesting to join.
- * @param method_name Method name in the join request.
- * @param variable_count Number of elements in the @a variables array.
- * @param variables Transient variables for the join request.
- * @param data Data stream given to the method (might not be zero-terminated
- *             if data is binary).
- * @param data_size Number of bytes in @a data.
- * @param jh Join handle to use with GNUNET_PSYC_join_decision()
+ * @param cls  Closure.
+ * @param slave_key  Public key of the slave requesting join.
+ * @param join_msg  Join message sent along with the request.
+ * @param jh  Join handle to use with GNUNET_PSYC_join_decision()
  */
 typedef void
-(*GNUNET_PSYC_JoinCallback) (void *cls,
-                             const struct GNUNET_CRYPTO_EddsaPublicKey
-                             *slave_key,
-                             const char *method_name,
-                             size_t variable_count,
-                             const struct GNUNET_ENV_Modifier *variables,
-                             const void *data,
-                             size_t data_size,
-                             struct GNUNET_PSYC_JoinHandle *jh);
+(*GNUNET_PSYC_JoinRequestCallback) (void *cls,
+                                    const struct
+                                    GNUNET_CRYPTO_EddsaPublicKey *slave_key,
+                                    const struct
+                                    GNUNET_PSYC_MessageHeader *join_msg,
+                                    struct GNUNET_PSYC_JoinHandle *jh);
 
 
 /**
@@ -321,32 +347,30 @@ typedef void
  * Must be called once and only once in response to an invocation of the
  * #GNUNET_PSYC_JoinCallback.
  *
- * @param jh Join request handle.
- * @param is_admitted #GNUNET_YES if joining is approved,
- *        #GNUNET_NO if it is disapproved.
- * @param relay_count Number of relays given.
- * @param relays Array of suggested peers that might be useful relays to use
+ * @param jh  Join request handle.
+ * @param is_admitted  #GNUNET_YES    if the join is approved,
+ *                     #GNUNET_NO     if it is disapproved,
+ *                     #GNUNET_SYSERR if we cannot answer the request.
+ * @param relay_count  Number of relays given.
+ * @param relays  Array of suggested peers that might be useful relays to use
  *        when joining the multicast group (essentially a list of peers that
  *        are already part of the multicast group and might thus be willing
  *        to help with routing).  If empty, only this local peer (which must
  *        be the multicast origin) is a good candidate for building the
  *        multicast tree.  Note that it is unnecessary to specify our own
  *        peer identity in this array.
- * @param method_name Method name for the message transmitted with the response.
- * @param env Environment containing transient variables for the message,
- *        or NULL.
- * @param data Data of the message.
- * @param data_size Size of @a data.
+ * @param join_resp  Application-dependent join response message to send along
+ *        with the decision.
+ *
+ * @return #GNUNET_OK on success,
+ *         #GNUNET_SYSERR if @a join_resp is too large.
  */
-void
+int
 GNUNET_PSYC_join_decision (struct GNUNET_PSYC_JoinHandle *jh,
                            int is_admitted,
                            uint32_t relay_count,
                            const struct GNUNET_PeerIdentity *relays,
-                           const char *method_name,
-                           const struct GNUNET_ENV_Environment *env,
-                           const void *data,
-                           size_t data_size);
+                           const struct GNUNET_PSYC_MessageHeader *join_resp);
 
 
 /**
@@ -359,7 +383,7 @@ struct GNUNET_PSYC_Master;
  * Function called after the channel master started.
  *
  * @param cls Closure.
- * @param last_message_id Last message ID sent to the channel.
+ * @param max_message_id Last message ID sent to the channel.
  */
 typedef void
 (*GNUNET_PSYC_MasterStartCallback) (void *cls, uint64_t max_message_id);
@@ -377,36 +401,38 @@ typedef void
  * or part messages, the respective methods must call other PSYC functions to
  * inform PSYC about the meaning of the respective events.
  *
- * @param cfg Configuration to use (to connect to PSYC service).
- * @param channel_key ECC key that will be used to sign messages for this
+ * @param cfg  Configuration to use (to connect to PSYC service).
+ * @param channel_key  ECC key that will be used to sign messages for this
  *        PSYC session. The public key is used to identify the PSYC channel.
  *        Note that end-users will usually not use the private key directly, but
  *        rather look it up in GNS for places managed by other users, or select
  *        a file with the private key(s) when setting up their own channels
  *        FIXME: we'll likely want to use NOT the p521 curve here, but a cheaper
  *        one in the future.
- * @param policy Channel policy specifying join and history restrictions.
+ * @param policy  Channel policy specifying join and history restrictions.
  *        Used to automate join decisions.
- * @param message_cb Function to invoke on message parts received from slaves.
- * @param join_cb Function to invoke when a peer wants to join.
- * @param master_started_cb Function to invoke after the channel master started.
- * @param cls Closure for @a method and @a join_cb.
+ * @param master_start_cb  Function to invoke after the channel master started.
+ * @param join_request_cb  Function to invoke when a slave wants to join.
+ * @param message_cb  Function to invoke on message parts sent to the channel
+ *        and received from slaves
+ * @param cls  Closure for @a method and @a join_cb.
+ *
  * @return Handle for the channel master, NULL on error.
  */
 struct GNUNET_PSYC_Master *
 GNUNET_PSYC_master_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
                           const struct GNUNET_CRYPTO_EddsaPrivateKey *channel_key,
                           enum GNUNET_PSYC_Policy policy,
+                          GNUNET_PSYC_MasterStartCallback master_start_cb,
+                          GNUNET_PSYC_JoinRequestCallback join_request_cb,
                           GNUNET_PSYC_MessageCallback message_cb,
-                          GNUNET_PSYC_JoinCallback join_cb,
-                          GNUNET_PSYC_MasterStartCallback master_started_cb,
                           void *cls);
 
 
 /**
  * Function called to provide data for a transmission via PSYC.
  *
- * Note that returning #GNUNET_OK or #GNUNET_SYSERR (but not #GNUNET_NO)
+ * Note that returning #GNUNET_YES or #GNUNET_SYSERR (but not #GNUNET_NO)
  * invalidates the respective transmission handle.
  *
  * @param cls Closure.
@@ -422,10 +448,48 @@ GNUNET_PSYC_master_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
  *         #GNUNET_YES if this completes the transmission (all data supplied)
  */
 typedef int
-(*GNUNET_PSYC_MasterTransmitNotify) (void *cls,
-                                     uint16_t *data_size,
-                                     void *data);
+(*GNUNET_PSYC_TransmitNotifyData) (void *cls,
+                                   uint16_t *data_size,
+                                   void *data);
 
+/**
+ * Function called to provide a modifier for a transmission via PSYC.
+ *
+ * Note that returning #GNUNET_YES or #GNUNET_SYSERR (but not #GNUNET_NO)
+ * invalidates the respective transmission handle.
+ *
+ * @param cls Closure.
+ * @param[in,out] data_size  Initially set to the number of bytes available in
+ *         @a data, should be set to the number of bytes written to data.
+ * @param[out] data  Where to write the modifier's name and value.
+ *         The function must copy at most @a data_size bytes to @a data.
+ *         When this callback is first called for a modifier, @a data should
+ *         contain: "name\0value".  If the whole value does not fit, subsequent
+ *         calls to this function should write continuations of the value to
+ *         @a data.
+ * @param[out] oper  Where to write the operator of the modifier.
+ *         Only needed during the first call to this callback at the beginning
+ *         of the modifier.  In case of subsequent calls asking for value
+ *         continuations @a oper is set to #NULL.
+ * @param[out] full_value_size  Where to write the full size of the value.
+ *         Only needed during the first call to this callback at the beginning
+ *         of the modifier.  In case of subsequent calls asking for value
+ *         continuations @a value_size is set to #NULL.
+ * @return #GNUNET_SYSERR on error (fatal, aborts transmission)
+ *         #GNUNET_NO on success, if more data is to be transmitted later.
+ *         Should be used if @a data_size was not big enough to take all the
+ *         data for the modifier's value (the name must be always returned
+ *         during the first call to this callback).
+ *         If 0 is returned in @a data_size the transmission is paused,
+ *         and can be resumed with GNUNET_PSYC_master_transmit_resume().
+ *         #GNUNET_YES if this completes the modifier (the whole value is supplied).
+ */
+typedef int
+(*GNUNET_PSYC_TransmitNotifyModifier) (void *cls,
+                                       uint16_t *data_size,
+                                       void *data,
+                                       uint8_t *oper,
+                                       uint32_t *full_value_size);
 
 /**
  * Flags for transmitting messages to a channel by the master.
@@ -433,22 +497,29 @@ typedef int
 enum GNUNET_PSYC_MasterTransmitFlags
 {
   GNUNET_PSYC_MASTER_TRANSMIT_NONE = 0,
+
   /**
    * Whether this message should reset the channel state,
    * i.e. remove all previously stored state variables.
    */
-  GNUNET_PSYC_MASTER_TRANSMIT_RESET_STATE = 1 << 0,
+
+  GNUNET_PSYC_MASTER_TRANSMIT_STATE_RESET = 1 << 0,
 
   /**
-   * Whether we need to increment the group generation counter after
-   * transmitting this message.
+   * Whether this message contains any state modifiers.
    */
-  GNUNET_PSYC_MASTER_TRANSMIT_INC_GROUP_GEN = 1 << 1,
+  GNUNET_PSYC_MASTER_TRANSMIT_STATE_MODIFY = 1 << 1,
 
   /**
    * Add PSYC header variable with the hash of the current channel state.
    */
-  GNUNET_PSYC_MASTER_TRANSMIT_ADD_STATE_HASH = 1 << 2
+  GNUNET_PSYC_MASTER_TRANSMIT_STATE_HASH = 1 << 2,
+
+  /**
+   * Whether we need to increment the group generation counter after
+   * transmitting this message.
+   */
+  GNUNET_PSYC_MASTER_TRANSMIT_INC_GROUP_GEN = 1 << 3
 };
 
 
@@ -472,8 +543,8 @@ struct GNUNET_PSYC_MasterTransmitHandle;
 struct GNUNET_PSYC_MasterTransmitHandle *
 GNUNET_PSYC_master_transmit (struct GNUNET_PSYC_Master *master,
                              const char *method_name,
-                             GNUNET_PSYC_MasterTransmitNotify notify_mod,
-                             GNUNET_PSYC_MasterTransmitNotify notify_data,
+                             GNUNET_PSYC_TransmitNotifyModifier notify_mod,
+                             GNUNET_PSYC_TransmitNotifyData notify_data,
                              void *notify_cls,
                              enum GNUNET_PSYC_MasterTransmitFlags flags);
 
@@ -512,13 +583,30 @@ struct GNUNET_PSYC_Slave;
 
 
 /**
- * Function called after the slave joined.
+ * Function called after the slave connected to the PSYC service.
  *
  * @param cls Closure.
  * @param max_message_id Last message ID sent to the channel.
  */
 typedef void
-(*GNUNET_PSYC_SlaveJoinCallback) (void *cls, uint64_t max_message_id);
+(*GNUNET_PSYC_SlaveConnectCallback) (void *cls, uint64_t max_message_id);
+
+
+/**
+ * Method called to inform about the decision in response to a join request.
+ *
+ * If @a is_admitted is not #GNUNET_YES, then sending messages to the channel is
+ * not possible, but earlier history can be still queried.
+ *
+ * @param cls  Closure.
+ * @param is_admitted  #GNUNET_YES or #GNUNET_NO or #GNUNET_SYSERR
+ * @param join_msg  Application-dependent join message from the origin.
+ */
+typedef void
+(*GNUNET_PSYC_JoinDecisionCallback) (void *cls,
+                                     int is_admitted,
+                                     const struct
+                                     GNUNET_PSYC_MessageHeader *join_msg);
 
 
 /**
@@ -531,26 +619,28 @@ typedef void
  * notification on failure (as the channel may simply take days to approve,
  * and disapproval is simply being ignored).
  *
- * @param cfg Configuration to use.
- * @param channel_key ECC public key that identifies the channel we wish to join.
- * @param slave_key ECC private-public key pair that identifies the slave, and
+ * @param cfg  Configuration to use.
+ * @param channel_key  ECC public key that identifies the channel we wish to join.
+ * @param slave_key  ECC private-public key pair that identifies the slave, and
  *        used by multicast to sign the join request and subsequent unicast
  *        requests sent to the master.
- * @param origin Peer identity of the origin.
- * @param relay_count Number of peers in the @a relays array.
- * @param relays Peer identities of members of the multicast group, which serve
+ * @param origin  Peer identity of the origin.
+ * @param relay_count  Number of peers in the @a relays array.
+ * @param relays  Peer identities of members of the multicast group, which serve
  *        as relays and used to join the group at.
- * @param message_cb Function to invoke on message parts received from the
+ * @param message_cb  Function to invoke on message parts received from the
  *        channel, typically at least contains method handlers for @e join and
  *        @e part.
- * @param join_cb function invoked once we have joined with the current
- *        message ID of the channel
- * @param slave_joined_cb Function to invoke when a peer wants to join.
- * @param cls Closure for @a message_cb and @a slave_joined_cb.
- * @param method_name Method name for the join request.
- * @param env Environment containing transient variables for the request, or NULL.
- * @param data Payload for the join message.
- * @param data_size Number of bytes in @a data.
+ * @param slave_connect_cb  Function invoked once we have connected to the
+ *        PSYC service.
+ * @param join_decision_cb  Function invoked once we have received a join
+ *       decision.
+ * @param cls  Closure for @a message_cb and @a slave_joined_cb.
+ * @param method_name  Method name for the join request.
+ * @param env  Environment containing transient variables for the request, or NULL.
+ * @param data  Payload for the join message.
+ * @param data_size  Number of bytes in @a data.
+ *
  * @return Handle for the slave, NULL on error.
  */
 struct GNUNET_PSYC_Slave *
@@ -561,8 +651,8 @@ GNUNET_PSYC_slave_join (const struct GNUNET_CONFIGURATION_Handle *cfg,
                         uint32_t relay_count,
                         const struct GNUNET_PeerIdentity *relays,
                         GNUNET_PSYC_MessageCallback message_cb,
-                        GNUNET_PSYC_JoinCallback join_cb,
-                        GNUNET_PSYC_SlaveJoinCallback slave_joined_cb,
+                        GNUNET_PSYC_SlaveConnectCallback slave_connect_cb,
+                        GNUNET_PSYC_JoinDecisionCallback join_decision_cb,
                         void *cls,
                         const char *method_name,
                         const struct GNUNET_ENV_Environment *env,
@@ -582,29 +672,6 @@ void
 GNUNET_PSYC_slave_part (struct GNUNET_PSYC_Slave *slave);
 
 
-/**
- * Function called to provide data for a transmission to the channel master
- * (a.k.a. the @e host of the channel).
- *
- * Note that returning #GNUNET_OK or #GNUNET_SYSERR (but not #GNUNET_NO)
- * invalidates the respective transmission handle.
- *
- * @param cls Closure.
- * @param[in,out] data_size Initially set to the number of bytes available in
- *        @a data, should be set to the number of bytes written to data
- *        (IN/OUT).
- * @param[out] data Where to write the body of the message to give to the method;
- *        function must copy at most @a *data_size bytes to @a data.
- * @return #GNUNET_SYSERR on error (fatal, aborts transmission).
- *         #GNUNET_NO on success, if more data is to be transmitted later.
- *         #GNUNET_YES if this completes the transmission (all data supplied).
- */
-typedef int
-(*GNUNET_PSYC_SlaveTransmitNotify) (void *cls,
-                                    size_t *data_size,
-                                    char *data);
-
-
 /**
  * Flags for transmitting messages to the channel master by a slave.
  */
@@ -625,8 +692,8 @@ struct GNUNET_PSYC_SlaveTransmitHandle;
  *
  * @param slave Slave handle.
  * @param method_name Which (PSYC) method should be invoked (on host).
- * @param env Environment containing transient variables for the message, or NULL.
- * @param notify Function to call when we are allowed to transmit (to get data).
+ * @param notify_mod Function to call to obtain modifiers.
+ * @param notify_data Function to call to obtain fragments of the data.
  * @param notify_cls Closure for @a notify.
  * @param flags Flags for the message being transmitted.
  * @return Transmission handle, NULL on error (i.e. more than one request queued).
@@ -634,8 +701,8 @@ struct GNUNET_PSYC_SlaveTransmitHandle;
 struct GNUNET_PSYC_SlaveTransmitHandle *
 GNUNET_PSYC_slave_transmit (struct GNUNET_PSYC_Slave *slave,
                             const char *method_name,
-                            const struct GNUNET_ENV_Environment *env,
-                            GNUNET_PSYC_SlaveTransmitNotify notify,
+                            GNUNET_PSYC_TransmitNotifyModifier notify_mod,
+                            GNUNET_PSYC_TransmitNotifyData notify_data,
                             void *notify_cls,
                             enum GNUNET_PSYC_SlaveTransmitFlags flags);
 
@@ -646,7 +713,7 @@ GNUNET_PSYC_slave_transmit (struct GNUNET_PSYC_Slave *slave,
  * @param th Handle of the request that is being resumed.
  */
 void
-GNUNET_PSYC_slave_transmit_resume (struct GNUNET_PSYC_MasterTransmitHandle *th);
+GNUNET_PSYC_slave_transmit_resume (struct GNUNET_PSYC_SlaveTransmitHandle *th);
 
 
 /**