psyc/social: request history & state from psycstore; more documentation, tests, cleanup
[oweals/gnunet.git] / src / include / gnunet_psyc_service.h
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2012, 2013 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 include/gnunet_psyc_service.h
23  * @brief PSYC service; high-level access to the PSYC protocol
24  *        note that clients of this API are NOT expected to
25  *        understand the PSYC message format, only the semantics!
26  *        Parsing (and serializing) the PSYC stream format is done
27  *        within the implementation of the libgnunetpsyc library,
28  *        and this API deliberately exposes as little as possible
29  *        of the actual data stream format to the application!
30  * @author Christian Grothoff
31  * @author Gabor X Toth
32  *
33  * NOTE:
34  * - this API does not know about psyc's "root" and "places";
35  *   there is no 'root' in GNUnet-Psyc as we're decentralized;
36  *   'places' and 'persons' are combined within the same
37  *   abstraction, that of a "channel".  Channels are identified
38  *   and accessed in this API using a public/private key.
39  *   Higher-level applications should use NAMES within GNS
40  *   to obtain public keys, and the distinction between
41  *   'places' and 'persons' can then be made with the help
42  *   of the naming system (and/or conventions).
43  *   Channels are (as in PSYC) organized into a hierarchy; each
44  *   channel master (the one with the private key) is then
45  *   the operator of the multicast group (its Origin in
46  *   the terminology of the multicast API).
47  * - The API supports passing large amounts of data using
48  *   'streaming' for the argument passed to a method.  State
49  *   and variables must fit into memory and cannot be streamed
50  *   (thus, no passing of 4 GB of data in a variable;
51  *   once we implement this, we might want to create a
52  *   @c \#define for the maximum size of a variable).
53  * - PSYC defines standard variables, methods, etc.  This
54  *   library deliberately abstracts over all of these; a
55  *   higher-level API should combine the naming system (GNS)
56  *   and standard methods (message, join, part, warn,
57  *   fail, error) and variables (action, color, time,
58  *   tag, etc.).  However, this API does take over the
59  *   routing variables, specifically 'context' (channel),
60  *   and 'source'.  We only kind-of support 'target', as
61  *   the target is either everyone in the group or the
62  *   origin, and never just a single member of the group;
63  *   for such individual messages, an application needs to
64  *   construct an 'inbox' channel where the master (only)
65  *   receives messages (but never forwards; private responses
66  *   would be transmitted by joining the senders 'inbox'
67  *   channel -- or a inbox#bob subchannel).  The
68  *   goal for all of this is to keep the abstractions in this
69  *   API minimal: interaction with multicast, try \& slice,
70  *   state/variable/channel management.  Higher-level
71  *   operations belong elsewhere (so maybe this API should
72  *   be called 'PSYC-low', whereas a higher-level API
73  *   implementing defaults for standard methods and
74  *   variables might be called 'PSYC-std' or 'PSYC-high'.
75  */
76
77 #ifndef GNUNET_PSYC_SERVICE_H
78 #define GNUNET_PSYC_SERVICE_H
79
80 #ifdef __cplusplus
81 extern "C"
82 {
83 #if 0                           /* keep Emacsens' auto-indent happy */
84 }
85 #endif
86 #endif
87
88 #include "gnunet_util_lib.h"
89 #include "gnunet_env_lib.h"
90 #include "gnunet_multicast_service.h"
91 //Mingw work around
92 #ifdef MINGW
93     # ifndef  UINT64_MAX
94     # define  UINT64_MAX 0xffffffffffffffffULL
95     # endif
96 #endif
97
98 /**
99  * Version number of GNUnet-PSYC API.
100  */
101 #define GNUNET_PSYC_VERSION 0x00000000
102
103
104 /**
105  * Policy flags for a channel.
106  */
107 enum GNUNET_PSYC_ChannelFlags
108 {
109   /**
110    * Admission must be confirmed by the master.
111    */
112   GNUNET_PSYC_CHANNEL_ADMISSION_CONTROL = 1 << 0,
113
114   /**
115    * Past messages are only available to slaves who were admitted at the time
116    * they were sent to the channel.
117    */
118   GNUNET_PSYC_CHANNEL_RESTRICTED_HISTORY = 1 << 1
119 };
120
121
122 /**
123  * PSYC channel policies.
124  */
125 enum GNUNET_PSYC_Policy
126 {
127   /**
128    * Anyone can join the channel, without announcing his presence;
129    * all messages are always public and can be distributed freely.
130    * Joins may be announced, but this is not required.
131    */
132   GNUNET_PSYC_CHANNEL_ANONYMOUS = 0,
133
134   /**
135    * The master must approve membership to the channel, messages must only be
136    * distributed to current channel slaves.  This includes the channel
137    * state as well as transient messages.
138    */
139   GNUNET_PSYC_CHANNEL_PRIVATE
140     = GNUNET_PSYC_CHANNEL_ADMISSION_CONTROL
141     | GNUNET_PSYC_CHANNEL_RESTRICTED_HISTORY
142
143 #if IDEAS_FOR_FUTURE
144   /**
145    * Anyone can freely join the channel (no approval required);
146    * however, messages must only be distributed to current channel
147    * slaves, so the master must still acknowledge that the slave
148    * joined before transient messages are delivered.  As approval is
149    * guaranteed, the presistent channel state can be synchronized freely
150    * immediately, prior to master confirmation.
151    */
152   GNUNET_PSYC_CHANNEL_OPEN
153     = GNUNET_PSYC_CHANNEL_RESTRICTED_HISTORY,
154
155   /**
156    * The master must approve joins to the channel, but past messages can be
157    * freely distributed to slaves.
158    */
159   GNUNET_PSYC_CHANNEL_CLOSED
160     = GNUNET_PSYC_CHANNEL_ADMISSION_CONTROL,
161 #endif
162 };
163
164
165 enum GNUNET_PSYC_MessageFlags
166 {
167   /**
168    * Default / no flags.
169    */
170   GNUNET_PSYC_MESSAGE_DEFAULT = 0,
171
172   /**
173    * Historic message, retrieved from PSYCstore.
174    */
175   GNUNET_PSYC_MESSAGE_HISTORIC = 1 << 0,
176
177   /**
178    * Request from slave to master.
179    */
180   GNUNET_PSYC_MESSAGE_REQUEST = 1 << 1,
181
182   /**
183    * Message can be delivered out of order.
184    */
185   GNUNET_PSYC_MESSAGE_ORDER_ANY = 1 << 2
186 };
187
188
189 /**
190  * Values for the @a state_delta field of GNUNET_PSYC_MessageHeader.
191  */
192 enum GNUNET_PSYC_StateDeltaValues
193 {
194   GNUNET_PSYC_STATE_RESET = 0,
195
196   GNUNET_PSYC_STATE_NOT_MODIFIED = UINT64_MAX
197 };
198
199
200 GNUNET_NETWORK_STRUCT_BEGIN
201
202 /**
203  * A PSYC message.
204  *
205  * Used for single-fragment messages e.g. in a join request or response.
206  */
207 struct GNUNET_PSYC_Message
208 {
209   /**
210    * Message header with size and type information.
211    */
212   struct GNUNET_MessageHeader header;
213
214   /* Followed by concatenated PSYC message parts:
215    * messages with GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_* types
216    */
217 };
218
219
220 /**
221  * Header of a PSYC message.
222  *
223  * Only present when receiving a message.
224  */
225 struct GNUNET_PSYC_MessageHeader
226 {
227   /**
228    * Generic message header with size and type information.
229    */
230   struct GNUNET_MessageHeader header;
231
232   /**
233    * Flags for this message fragment.
234    *
235    * @see enum GNUNET_PSYC_MessageFlags
236    */
237   uint32_t flags GNUNET_PACKED;
238
239   /**
240    * Number of the message this message part belongs to.
241    * Monotonically increasing from 1.
242    */
243   uint64_t message_id GNUNET_PACKED;
244
245   /**
246    * Byte offset of this @e fragment of the @e message.
247    * FIXME: use data_offset instead
248    */
249   uint64_t fragment_offset GNUNET_PACKED;
250
251   /**
252    * Sending slave's public key.
253    * Not set if the message is from the master.
254    */
255   struct GNUNET_CRYPTO_EcdsaPublicKey slave_key;
256
257   /* Followed by concatenated PSYC message parts:
258    * messages with GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_* types
259    */
260 };
261
262
263 /**
264  * The method of a message.
265  */
266 struct GNUNET_PSYC_MessageMethod
267 {
268   /**
269    * Type: GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_METHOD
270    */
271   struct GNUNET_MessageHeader header;
272
273   /**
274    * OR'ed GNUNET_PSYC_MasterTransmitFlags
275    */
276   uint32_t flags GNUNET_PACKED;
277
278   /**
279    * Number of message IDs since the last message that contained state
280    * operations. @see enum GNUNET_PSYC_StateDeltaValues
281    */
282   uint64_t state_delta GNUNET_PACKED;
283
284   /* Followed by NUL-terminated method name. */
285 };
286
287
288 /**
289  * A modifier of a message.
290  */
291 struct GNUNET_PSYC_MessageModifier
292 {
293   /**
294    * Type: GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_MODIFIER
295    */
296   struct GNUNET_MessageHeader header;
297
298   /**
299    * Size of value.
300    */
301   uint32_t value_size GNUNET_PACKED;
302
303   /**
304    * Size of name, including NUL terminator.
305    */
306   uint16_t name_size GNUNET_PACKED;
307
308   /**
309    * enum GNUNET_ENV_Operator
310    */
311   uint8_t oper;
312
313   /* Followed by NUL-terminated name, then the value. */
314 };
315
316
317 struct GNUNET_PSYC_CountersResultMessage
318 {
319   /**
320    * Type: GNUNET_MESSAGE_TYPE_PSYC_RESULT_COUNTERS
321    */
322   struct GNUNET_MessageHeader header;
323
324   /**
325    * Status code for the operation.
326    */
327   uint32_t result_code GNUNET_PACKED;
328
329   /**
330    * Last message ID sent to the channel.
331    */
332   uint64_t max_message_id GNUNET_PACKED;
333 };
334
335
336 /**
337  * Join request sent to a PSYC master.
338  */
339 struct GNUNET_PSYC_JoinRequestMessage
340 {
341   /**
342    * Type: GNUNET_MESSAGE_TYPE_PSYC_MASTER_JOIN_REQUEST
343    */
344   struct GNUNET_MessageHeader header;
345   /**
346    * Public key of the joining slave.
347    */
348   struct GNUNET_CRYPTO_EcdsaPublicKey slave_key;
349
350   /* Followed by struct GNUNET_MessageHeader join_request */
351 };
352
353
354 /**
355  * Join decision sent in reply to a join request.
356  */
357 struct GNUNET_PSYC_JoinDecisionMessage
358 {
359   /**
360    * Type: GNUNET_MESSAGE_TYPE_PSYC_JOIN_DECISION
361    */
362   struct GNUNET_MessageHeader header;
363
364   /**
365    * #GNUNET_YES if the slave was admitted.
366    */
367   int32_t is_admitted;
368
369   /**
370    * Public key of the joining slave.
371    * Only set when the master is sending the decision,
372    * not set when a slave is receiving it.
373    */
374   struct GNUNET_CRYPTO_EcdsaPublicKey slave_key;
375
376   /* Followed by struct GNUNET_MessageHeader join_response */
377 };
378
379
380 enum GNUNET_PSYC_HistoryReplayFlags
381 {
382   /**
383    * Replay locally available messages.
384    */
385   GNUNET_PSYC_HISTORY_REPLAY_LOCAL  = 0,
386
387   /**
388    * Replay messages from remote peers if not found locally.
389    */
390   GNUNET_PSYC_HISTORY_REPLAY_REMOTE = 1,
391 };
392
393
394 struct GNUNET_PSYC_HistoryRequestMessage
395 {
396   /**
397    * Type: GNUNET_MESSAGE_TYPE_PSYC_CHANNEL_HISTORY_REPLAY
398    */
399   struct GNUNET_MessageHeader header;
400
401   /**
402    * @see enum GNUNET_PSYC_HistoryReplayFlags
403    */
404   uint32_t flags GNUNET_PACKED;
405
406   /**
407    * ID for this operation.
408    */
409   uint64_t op_id GNUNET_PACKED;
410
411   uint64_t start_message_id GNUNET_PACKED;
412
413   uint64_t end_message_id GNUNET_PACKED;
414
415   uint64_t message_limit GNUNET_PACKED;
416
417   /* Followed by NUL-terminated method name prefix. */
418 };
419
420
421 struct GNUNET_PSYC_StateRequestMessage
422 {
423   /**
424    * Types:
425    * - GNUNET_MESSAGE_TYPE_PSYC_CHANNEL_STATE_GET
426    * - GNUNET_MESSAGE_TYPE_PSYC_CHANNEL_STATE_GET_PREFIX
427    */
428   struct GNUNET_MessageHeader header;
429
430   uint32_t reserved GNUNET_PACKED;
431
432   /**
433    * ID for this operation.
434    */
435   uint64_t op_id GNUNET_PACKED;
436
437   /* Followed by NUL-terminated name. */
438 };
439
440
441 /**** service -> library ****/
442
443
444 /**
445  * Answer from service to client about last operation.
446  */
447 struct GNUNET_PSYC_OperationResultMessage
448 {
449   /**
450    * Types:
451    * - GNUNET_MESSAGE_TYPE_PSYC_RESULT_CODE
452    * - GNUNET_MESSAGE_TYPE_PSYC_CHANNEL_STATE_RESULT
453    */
454   struct GNUNET_MessageHeader header;
455
456   uint32_t reserved GNUNET_PACKED;
457
458   /**
459    * Operation ID.
460    */
461   uint64_t op_id GNUNET_PACKED;
462
463   /**
464    * Status code for the operation.
465    */
466   uint64_t result_code GNUNET_PACKED;
467
468   /* Followed by:
469    * - on error: NUL-terminated error message
470    * - on success: one of the following message types
471    *
472    *   For a STATE_RESULT, one of:
473    *   - GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_MODIFIER
474    *   - GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_MOD_CONT
475    *   - GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_END
476    */
477 };
478
479 GNUNET_NETWORK_STRUCT_END
480
481
482 #define GNUNET_PSYC_MODIFIER_MAX_PAYLOAD        \
483   GNUNET_MULTICAST_FRAGMENT_MAX_PAYLOAD         \
484   - sizeof (struct GNUNET_PSYC_MessageModifier)
485
486 #define GNUNET_PSYC_MOD_CONT_MAX_PAYLOAD        \
487   GNUNET_MULTICAST_FRAGMENT_MAX_PAYLOAD         \
488   - sizeof (struct GNUNET_MessageHeader)
489
490 #define GNUNET_PSYC_DATA_MAX_PAYLOAD            \
491   GNUNET_MULTICAST_FRAGMENT_MAX_PAYLOAD         \
492   - sizeof (struct GNUNET_MessageHeader)
493
494
495 /**
496  * PSYC message part processing states.
497  */
498 enum GNUNET_PSYC_MessageState
499 {
500   GNUNET_PSYC_MESSAGE_STATE_START    = 0,
501   GNUNET_PSYC_MESSAGE_STATE_HEADER   = 1,
502   GNUNET_PSYC_MESSAGE_STATE_METHOD   = 2,
503   GNUNET_PSYC_MESSAGE_STATE_MODIFIER = 3,
504   GNUNET_PSYC_MESSAGE_STATE_MOD_CONT = 4,
505   GNUNET_PSYC_MESSAGE_STATE_DATA     = 5,
506   GNUNET_PSYC_MESSAGE_STATE_END      = 6,
507   GNUNET_PSYC_MESSAGE_STATE_CANCEL   = 7,
508   GNUNET_PSYC_MESSAGE_STATE_ERROR    = 8,
509 };
510
511
512 /**
513  * Handle that identifies a join request.
514  *
515  * Used to match calls to #GNUNET_PSYC_JoinCallback to the
516  * corresponding calls to GNUNET_PSYC_join_decision().
517  */
518 struct GNUNET_PSYC_JoinHandle;
519
520
521 /**
522  * Method called from PSYC upon receiving a message.
523  *
524  * @param cls  Closure.
525  * @param message_id  Sequence number of the message.
526  * @param flags  OR'ed GNUNET_PSYC_MessageFlags
527  * @param msg  Message part, one of the following types:
528  */
529 typedef void
530 (*GNUNET_PSYC_MessageCallback) (void *cls,
531                                 uint64_t message_id,
532                                 uint32_t flags,
533                                 const struct GNUNET_PSYC_MessageHeader *msg);
534
535
536 /**
537  * Method called from PSYC upon receiving part of a message.
538  *
539  * @param cls  Closure.
540  * @param message_id  Sequence number of the message.
541  * @param data_offset  Byte offset of data, only set if @a msg has a type
542  *                     #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_DATA
543  * @param flags  OR'ed GNUNET_PSYC_MessageFlags
544  * @param msg  Message part, one of the following types:
545  * - #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_HEADER
546  * - #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_METHOD
547  * - #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_MODIFIER
548  * - #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_MOD_CONT
549  * - #GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_DATA
550  * or NULL if an error occurred while receiving a message.
551  */
552 typedef void
553 (*GNUNET_PSYC_MessagePartCallback) (void *cls,
554                                     uint64_t message_id,
555                                     uint64_t data_offset,
556                                     uint32_t flags,
557                                     const struct GNUNET_MessageHeader *msg);
558
559
560 /**
561  * Method called from PSYC upon receiving a join request.
562  *
563  * @param cls  Closure.
564  * @param slave_key  Public key of the slave requesting join.
565  * @param join_msg  Join message sent along with the request.
566  * @param jh  Join handle to use with GNUNET_PSYC_join_decision()
567  */
568 typedef void
569 (*GNUNET_PSYC_JoinRequestCallback) (void *cls,
570                                     const struct GNUNET_PSYC_JoinRequestMessage *req,
571                                     const struct GNUNET_CRYPTO_EcdsaPublicKey *slave_key,
572                                     const struct GNUNET_PSYC_Message *join_msg,
573                                     struct GNUNET_PSYC_JoinHandle *jh);
574
575
576 /**
577  * Function to call with the decision made for a join request.
578  *
579  * Must be called once and only once in response to an invocation of the
580  * #GNUNET_PSYC_JoinCallback.
581  *
582  * @param jh  Join request handle.
583  * @param is_admitted
584  *   #GNUNET_YES    if the join is approved,
585  *   #GNUNET_NO     if it is disapproved,
586  *   #GNUNET_SYSERR if we cannot answer the request.
587  * @param relay_count  Number of relays given.
588  * @param relays  Array of suggested peers that might be useful relays to use
589  *        when joining the multicast group (essentially a list of peers that
590  *        are already part of the multicast group and might thus be willing
591  *        to help with routing).  If empty, only this local peer (which must
592  *        be the multicast origin) is a good candidate for building the
593  *        multicast tree.  Note that it is unnecessary to specify our own
594  *        peer identity in this array.
595  * @param join_resp  Application-dependent join response message to send along
596  *        with the decision.
597  *
598  * @return #GNUNET_OK on success,
599  *         #GNUNET_SYSERR if @a join_resp is too large.
600  */
601 int
602 GNUNET_PSYC_join_decision (struct GNUNET_PSYC_JoinHandle *jh,
603                            int is_admitted,
604                            uint32_t relay_count,
605                            const struct GNUNET_PeerIdentity *relays,
606                            const struct GNUNET_PSYC_Message *join_resp);
607
608
609 /**
610  * Handle for the master of a PSYC channel.
611  */
612 struct GNUNET_PSYC_Master;
613
614
615 /**
616  * Function called after connected to the PSYC service
617  * and the channel master started.
618  *
619  * Also called when reconnected to the service
620  * after the connection closed unexpectedly.
621  *
622  * @param cls
623  *        Closure.
624  * @param result
625  *        #GNUNET_YES if there were already messages sent to the channel,
626  *        #GNUNET_NO  if the message history is empty,
627  *        #GNUNET_SYSERR on error.
628  * @param max_message_id
629  *        Last message ID sent to the channel.
630  */
631 typedef void
632 (*GNUNET_PSYC_MasterStartCallback) (void *cls, int result,
633                                     uint64_t max_message_id);
634
635
636 /**
637  * Start a PSYC master channel.
638  *
639  * Will start a multicast group identified by the given ECC key.  Messages
640  * received from group members will be given to the respective handler methods.
641  * If a new member wants to join a group, the "join" method handler will be
642  * invoked; the join handler must then generate a "join" message to approve the
643  * joining of the new member.  The channel can also change group membership
644  * without explicit requests.  Note that PSYC doesn't itself "understand" join
645  * or part messages, the respective methods must call other PSYC functions to
646  * inform PSYC about the meaning of the respective events.
647  *
648  * @param cfg  Configuration to use (to connect to PSYC service).
649  * @param channel_key  ECC key that will be used to sign messages for this
650  *        PSYC session. The public key is used to identify the PSYC channel.
651  *        Note that end-users will usually not use the private key directly, but
652  *        rather look it up in GNS for places managed by other users, or select
653  *        a file with the private key(s) when setting up their own channels
654  *        FIXME: we'll likely want to use NOT the p521 curve here, but a cheaper
655  *        one in the future.
656  * @param policy  Channel policy specifying join and history restrictions.
657  *        Used to automate join decisions.
658  * @param master_start_cb  Function to invoke after the channel master started.
659  * @param join_request_cb  Function to invoke when a slave wants to join.
660  * @param message_cb  Function to invoke on message parts sent to the channel
661  *        and received from slaves
662  * @param cls  Closure for @a method and @a join_cb.
663  *
664  * @return Handle for the channel master, NULL on error.
665  */
666 struct GNUNET_PSYC_Master *
667 GNUNET_PSYC_master_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
668                           const struct GNUNET_CRYPTO_EddsaPrivateKey *channel_key,
669                           enum GNUNET_PSYC_Policy policy,
670                           GNUNET_PSYC_MasterStartCallback master_start_cb,
671                           GNUNET_PSYC_JoinRequestCallback join_request_cb,
672                           GNUNET_PSYC_MessageCallback message_cb,
673                           GNUNET_PSYC_MessagePartCallback message_part_cb,
674                           void *cls);
675
676
677 /**
678  * Function called to provide data for a transmission via PSYC.
679  *
680  * Note that returning #GNUNET_YES or #GNUNET_SYSERR (but not #GNUNET_NO)
681  * invalidates the respective transmission handle.
682  *
683  * @param cls Closure.
684  * @param[in,out] data_size Initially set to the number of bytes available in
685  *        @a data, should be set to the number of bytes written to data.
686  * @param[out] data Where to write the body of the message to give to the
687  *         method. The function must copy at most @a data_size bytes to @a data.
688  * @return #GNUNET_SYSERR on error (fatal, aborts transmission)
689  *         #GNUNET_NO on success, if more data is to be transmitted later.
690  *         Should be used if @a data_size was not big enough to take all the
691  *         data.  If 0 is returned in @a data_size the transmission is paused,
692  *         and can be resumed with GNUNET_PSYC_master_transmit_resume().
693  *         #GNUNET_YES if this completes the transmission (all data supplied)
694  */
695 typedef int
696 (*GNUNET_PSYC_TransmitNotifyData) (void *cls,
697                                    uint16_t *data_size,
698                                    void *data);
699
700 /**
701  * Function called to provide a modifier for a transmission via PSYC.
702  *
703  * Note that returning #GNUNET_YES or #GNUNET_SYSERR (but not #GNUNET_NO)
704  * invalidates the respective transmission handle.
705  *
706  * @param cls Closure.
707  * @param[in,out] data_size  Initially set to the number of bytes available in
708  *         @a data, should be set to the number of bytes written to data.
709  * @param[out] data  Where to write the modifier's name and value.
710  *         The function must copy at most @a data_size bytes to @a data.
711  *         When this callback is first called for a modifier, @a data should
712  *         contain: "name\0value".  If the whole value does not fit, subsequent
713  *         calls to this function should write continuations of the value to
714  *         @a data.
715  * @param[out] oper  Where to write the operator of the modifier.
716  *         Only needed during the first call to this callback at the beginning
717  *         of the modifier.  In case of subsequent calls asking for value
718  *         continuations @a oper is set to #NULL.
719  * @param[out] full_value_size  Where to write the full size of the value.
720  *         Only needed during the first call to this callback at the beginning
721  *         of the modifier.  In case of subsequent calls asking for value
722  *         continuations @a value_size is set to #NULL.
723  * @return #GNUNET_SYSERR on error (fatal, aborts transmission)
724  *         #GNUNET_NO on success, if more data is to be transmitted later.
725  *         Should be used if @a data_size was not big enough to take all the
726  *         data for the modifier's value (the name must be always returned
727  *         during the first call to this callback).
728  *         If 0 is returned in @a data_size the transmission is paused,
729  *         and can be resumed with GNUNET_PSYC_master_transmit_resume().
730  *         #GNUNET_YES if this completes the modifier (the whole value is supplied).
731  */
732 typedef int
733 (*GNUNET_PSYC_TransmitNotifyModifier) (void *cls,
734                                        uint16_t *data_size,
735                                        void *data,
736                                        uint8_t *oper,
737                                        uint32_t *full_value_size);
738
739 /**
740  * Flags for transmitting messages to a channel by the master.
741  */
742 enum GNUNET_PSYC_MasterTransmitFlags
743 {
744   GNUNET_PSYC_MASTER_TRANSMIT_NONE = 0,
745
746   /**
747    * Whether this message should reset the channel state,
748    * i.e. remove all previously stored state variables.
749    */
750
751   GNUNET_PSYC_MASTER_TRANSMIT_STATE_RESET = 1 << 0,
752
753   /**
754    * Whether this message contains any state modifiers.
755    */
756   GNUNET_PSYC_MASTER_TRANSMIT_STATE_MODIFY = 1 << 1,
757
758   /**
759    * Add PSYC header variable with the hash of the current channel state.
760    */
761   GNUNET_PSYC_MASTER_TRANSMIT_STATE_HASH = 1 << 2,
762
763   /**
764    * Whether we need to increment the group generation counter after
765    * transmitting this message.
766    */
767   GNUNET_PSYC_MASTER_TRANSMIT_INC_GROUP_GEN = 1 << 3
768 };
769
770
771 /**
772  * Handle for a pending PSYC transmission operation.
773  */
774 struct GNUNET_PSYC_MasterTransmitHandle;
775
776
777 /**
778  * Send a message to call a method to all members in the PSYC channel.
779  *
780  * @param master Handle to the PSYC channel.
781  * @param method_name Which method should be invoked.
782  * @param notify_mod Function to call to obtain modifiers.
783  * @param notify_data Function to call to obtain fragments of the data.
784  * @param notify_cls Closure for @a notify_mod and @a notify_data.
785  * @param flags Flags for the message being transmitted.
786  * @return Transmission handle, NULL on error (i.e. more than one request queued).
787  */
788 struct GNUNET_PSYC_MasterTransmitHandle *
789 GNUNET_PSYC_master_transmit (struct GNUNET_PSYC_Master *master,
790                              const char *method_name,
791                              GNUNET_PSYC_TransmitNotifyModifier notify_mod,
792                              GNUNET_PSYC_TransmitNotifyData notify_data,
793                              void *notify_cls,
794                              enum GNUNET_PSYC_MasterTransmitFlags flags);
795
796
797 /**
798  * Resume transmission to the channel.
799  *
800  * @param th Handle of the request that is being resumed.
801  */
802 void
803 GNUNET_PSYC_master_transmit_resume (struct GNUNET_PSYC_MasterTransmitHandle *th);
804
805
806 /**
807  * Abort transmission request to channel.
808  *
809  * @param th Handle of the request that is being aborted.
810  */
811 void
812 GNUNET_PSYC_master_transmit_cancel (struct GNUNET_PSYC_MasterTransmitHandle *th);
813
814
815 /**
816  * Stop a PSYC master channel.
817  *
818  * @param master
819  *        PSYC channel master to stop.
820  * @param keep_active
821  *        Keep place active after last application disconnected.
822  * @param stop_cb
823  *        Function called after the master stopped
824  *        and disconnected from the psyc service.
825  * @param stop_cls
826  *        Closure for @a part_cb.
827  */
828 void
829 GNUNET_PSYC_master_stop (struct GNUNET_PSYC_Master *master,
830                          int keep_active,
831                          GNUNET_ContinuationCallback stop_cb,
832                          void *stop_cls);
833
834
835 /**
836  * Handle for a PSYC channel slave.
837  */
838 struct GNUNET_PSYC_Slave;
839
840
841 /**
842  * Function called after the slave connected to the PSYC service.
843  *
844  * Also called when reconnected to the service
845  * after the connection closed unexpectedly.
846  *
847  * @param cls
848  *        Closure.
849  * @param result
850  *        #GNUNET_YES if there were already messages sent to the channel,
851  *        #GNUNET_NO  if the message history is empty,
852  *        #GNUNET_SYSERR on error.
853  * @param max_message_id
854  *        Last message ID sent to the channel.
855  */
856 typedef void
857 (*GNUNET_PSYC_SlaveConnectCallback) (void *cls, int result,
858                                      uint64_t max_message_id);
859
860
861 /**
862  * Method called to inform about the decision in response to a join request.
863  *
864  * If @a is_admitted is not #GNUNET_YES, then sending messages to the channel is
865  * not possible, but earlier history can be still queried.
866  *
867  * @param cls  Closure.
868  * @param is_admitted  #GNUNET_YES or #GNUNET_NO or #GNUNET_SYSERR
869  * @param join_msg  Application-dependent join message from the origin.
870  */
871 typedef void
872 (*GNUNET_PSYC_JoinDecisionCallback) (void *cls,
873                                      const struct GNUNET_PSYC_JoinDecisionMessage *dcsn,
874                                      int is_admitted,
875                                      const struct GNUNET_PSYC_Message *join_msg);
876
877
878 /**
879  * Join a PSYC channel.
880  *
881  * The entity joining is always the local peer.  The user must immediately use
882  * the GNUNET_PSYC_slave_transmit() functions to transmit a @e join_msg to the
883  * channel; if the join request succeeds, the channel state (and @e recent
884  * method calls) will be replayed to the joining member.  There is no explicit
885  * notification on failure (as the channel may simply take days to approve,
886  * and disapproval is simply being ignored).
887  *
888  * @param cfg  Configuration to use.
889  * @param channel_key  ECC public key that identifies the channel we wish to join.
890  * @param slave_key  ECC private-public key pair that identifies the slave, and
891  *        used by multicast to sign the join request and subsequent unicast
892  *        requests sent to the master.
893  * @param origin  Peer identity of the origin.
894  * @param relay_count  Number of peers in the @a relays array.
895  * @param relays  Peer identities of members of the multicast group, which serve
896  *        as relays and used to join the group at.
897  * @param message_cb  Function to invoke on message parts received from the
898  *        channel, typically at least contains method handlers for @e join and
899  *        @e part.
900  * @param slave_connect_cb  Function invoked once we have connected to the
901  *        PSYC service.
902  * @param join_decision_cb  Function invoked once we have received a join
903  *        decision.
904  * @param cls  Closure for @a message_cb and @a slave_joined_cb.
905  * @param method_name  Method name for the join request.
906  * @param env  Environment containing transient variables for the request, or NULL.
907  * @param data  Payload for the join message.
908  * @param data_size  Number of bytes in @a data.
909  *
910  * @return Handle for the slave, NULL on error.
911  */
912 struct GNUNET_PSYC_Slave *
913 GNUNET_PSYC_slave_join (const struct GNUNET_CONFIGURATION_Handle *cfg,
914                         const struct GNUNET_CRYPTO_EddsaPublicKey *channel_key,
915                         const struct GNUNET_CRYPTO_EcdsaPrivateKey *slave_key,
916                         const struct GNUNET_PeerIdentity *origin,
917                         uint32_t relay_count,
918                         const struct GNUNET_PeerIdentity *relays,
919                         GNUNET_PSYC_MessageCallback message_cb,
920                         GNUNET_PSYC_MessagePartCallback message_part_cb,
921                         GNUNET_PSYC_SlaveConnectCallback slave_connect_cb,
922                         GNUNET_PSYC_JoinDecisionCallback join_decision_cb,
923                         void *cls,
924                         const struct GNUNET_PSYC_Message *join_msg);
925
926
927 /**
928  * Part a PSYC channel.
929  *
930  * Will terminate the connection to the PSYC service.  Polite clients should
931  * first explicitly send a part request (via GNUNET_PSYC_slave_transmit()).
932  *
933  * @param slave
934  *        Slave handle.
935  * @param keep_active
936  *        Keep place active after last application disconnected.
937  * @param part_cb
938  *        Function called after the slave parted the channel
939  *        and disconnected from the psyc service.
940  * @param part_cls
941  *        Closure for @a part_cb.
942  */
943 void
944 GNUNET_PSYC_slave_part (struct GNUNET_PSYC_Slave *slave,
945                         int keep_active,
946                         GNUNET_ContinuationCallback part_cb,
947                         void *part_cls);
948
949
950 /**
951  * Flags for transmitting messages to the channel master by a slave.
952  */
953 enum GNUNET_PSYC_SlaveTransmitFlags
954 {
955   GNUNET_PSYC_SLAVE_TRANSMIT_NONE = 0
956 };
957
958
959 /**
960  * Handle for a pending PSYC transmission operation.
961  */
962 struct GNUNET_PSYC_SlaveTransmitHandle;
963
964
965 /**
966  * Request a message to be sent to the channel master.
967  *
968  * @param slave Slave handle.
969  * @param method_name Which (PSYC) method should be invoked (on host).
970  * @param notify_mod Function to call to obtain modifiers.
971  * @param notify_data Function to call to obtain fragments of the data.
972  * @param notify_cls Closure for @a notify.
973  * @param flags Flags for the message being transmitted.
974  * @return Transmission handle, NULL on error (i.e. more than one request queued).
975  */
976 struct GNUNET_PSYC_SlaveTransmitHandle *
977 GNUNET_PSYC_slave_transmit (struct GNUNET_PSYC_Slave *slave,
978                             const char *method_name,
979                             GNUNET_PSYC_TransmitNotifyModifier notify_mod,
980                             GNUNET_PSYC_TransmitNotifyData notify_data,
981                             void *notify_cls,
982                             enum GNUNET_PSYC_SlaveTransmitFlags flags);
983
984
985 /**
986  * Resume transmission to the master.
987  *
988  * @param th Handle of the request that is being resumed.
989  */
990 void
991 GNUNET_PSYC_slave_transmit_resume (struct GNUNET_PSYC_SlaveTransmitHandle *th);
992
993
994 /**
995  * Abort transmission request to master.
996  *
997  * @param th Handle of the request that is being aborted.
998  */
999 void
1000 GNUNET_PSYC_slave_transmit_cancel (struct GNUNET_PSYC_SlaveTransmitHandle *th);
1001
1002
1003 /**
1004  * Handle to access PSYC channel operations for both the master and slaves.
1005  */
1006 struct GNUNET_PSYC_Channel;
1007
1008
1009 /**
1010  * Convert a channel @a master to a @e channel handle to access the @e channel
1011  * APIs.
1012  *
1013  * @param master Channel master handle.
1014  * @return Channel handle, valid for as long as @a master is valid.
1015  */
1016 struct GNUNET_PSYC_Channel *
1017 GNUNET_PSYC_master_get_channel (struct GNUNET_PSYC_Master *master);
1018
1019
1020 /**
1021  * Convert @a slave to a @e channel handle to access the @e channel APIs.
1022  *
1023  * @param slave Slave handle.
1024  * @return Channel handle, valid for as long as @a slave is valid.
1025  */
1026 struct GNUNET_PSYC_Channel *
1027 GNUNET_PSYC_slave_get_channel (struct GNUNET_PSYC_Slave *slave);
1028
1029
1030 /**
1031  * Add a slave to the channel's membership list.
1032  *
1033  * Note that this will NOT generate any PSYC traffic, it will merely update the
1034  * local database to modify how we react to <em>membership test</em> queries.
1035  * The channel master still needs to explicitly transmit a @e join message to
1036  * notify other channel members and they then also must still call this function
1037  * in their respective methods handling the @e join message.  This way, how @e
1038  * join and @e part operations are exactly implemented is still up to the
1039  * application; for example, there might be a @e part_all method to kick out
1040  * everyone.
1041  *
1042  * Note that channel slaves are explicitly trusted to execute such methods
1043  * correctly; not doing so correctly will result in either denying other slaves
1044  * access or offering access to channel data to non-members.
1045  *
1046  * @param channel
1047  *        Channel handle.
1048  * @param slave_key
1049  *        Identity of channel slave to add.
1050  * @param announced_at
1051  *        ID of the message that announced the membership change.
1052  * @param effective_since
1053  *        Addition of slave is in effect since this message ID.
1054  * @param result_cb
1055  *        Function to call with the result of the operation.
1056  *        The @e result_code argument is #GNUNET_OK on success, or
1057  *        #GNUNET_SYSERR on error.  In case of an error, the @e data argument
1058  *        can contain an optional error message.
1059  * @param cls
1060  *        Closure for @a result_cb.
1061  */
1062 void
1063 GNUNET_PSYC_channel_slave_add (struct GNUNET_PSYC_Channel *channel,
1064                                const struct GNUNET_CRYPTO_EcdsaPublicKey *slave_key,
1065                                uint64_t announced_at,
1066                                uint64_t effective_since,
1067                                GNUNET_ResultCallback result_cb,
1068                                void *cls);
1069
1070
1071 /**
1072  * Remove a slave from the channel's membership list.
1073  *
1074  * Note that this will NOT generate any PSYC traffic, it will merely update the
1075  * local database to modify how we react to <em>membership test</em> queries.
1076  * The channel master still needs to explicitly transmit a @e part message to
1077  * notify other channel members and they then also must still call this function
1078  * in their respective methods handling the @e part message.  This way, how
1079  * @e join and @e part operations are exactly implemented is still up to the
1080  * application; for example, there might be a @e part_all message to kick out
1081  * everyone.
1082  *
1083  * Note that channel members are explicitly trusted to perform these
1084  * operations correctly; not doing so correctly will result in either
1085  * denying members access or offering access to channel data to
1086  * non-members.
1087  *
1088  * @param channel
1089  *        Channel handle.
1090  * @param slave_key
1091  *        Identity of channel slave to remove.
1092  * @param announced_at
1093  *        ID of the message that announced the membership change.
1094  * @param result_cb
1095  *        Function to call with the result of the operation.
1096  *        The @e result_code argument is #GNUNET_OK on success, or
1097  *        #GNUNET_SYSERR on error.  In case of an error, the @e data argument
1098  *        can contain an optional error message.
1099  * @param cls
1100  *        Closure for @a result_cb.
1101  */
1102 void
1103 GNUNET_PSYC_channel_slave_remove (struct GNUNET_PSYC_Channel *channel,
1104                                   const struct GNUNET_CRYPTO_EcdsaPublicKey
1105                                   *slave_key,
1106                                   uint64_t announced_at,
1107                                   GNUNET_ResultCallback result_cb,
1108                                   void *cls);
1109
1110
1111 /**
1112  * History request handle.
1113  */
1114 struct GNUNET_PSYC_HistoryRequest;
1115
1116
1117 /**
1118  * Request to replay a part of the message history of the channel.
1119  *
1120  * Historic messages (but NOT the state at the time) will be replayed (given to
1121  * the normal method handlers) if available and if access is permitted.
1122  *
1123  * @param channel
1124  *        Which channel should be replayed?
1125  * @param start_message_id
1126  *        Earliest interesting point in history.
1127  * @param end_message_id
1128  *        Last (inclusive) interesting point in history.
1129  * @param method_prefix
1130  *        Retrieve only messages with a matching method prefix.
1131  * @param flags
1132  *        OR'ed enum GNUNET_PSYC_HistoryReplayFlags
1133  * @param result_cb
1134  *        Function to call when the requested history has been fully replayed.
1135  *        Once this function has been called, the client must not call
1136  *        GNUNET_PSYC_channel_history_replay_cancel() anymore.
1137  * @param cls
1138  *        Closure for the callbacks.
1139  *
1140  * @return Handle to cancel history replay operation.
1141  */
1142 struct GNUNET_PSYC_HistoryRequest *
1143 GNUNET_PSYC_channel_history_replay (struct GNUNET_PSYC_Channel *channel,
1144                                     uint64_t start_message_id,
1145                                     uint64_t end_message_id,
1146                                     const char *method_prefix,
1147                                     uint32_t flags,
1148                                     GNUNET_PSYC_MessageCallback message_cb,
1149                                     GNUNET_PSYC_MessagePartCallback message_part_cb,
1150                                     GNUNET_ResultCallback result_cb,
1151                                     void *cls);
1152
1153
1154 /**
1155  * Request to replay the latest messages from the message history of the channel.
1156  *
1157  * Historic messages (but NOT the state at the time) will be replayed (given to
1158  * the normal method handlers) if available and if access is permitted.
1159  *
1160  * @param channel
1161  *        Which channel should be replayed?
1162  * @param message_limit
1163  *        Maximum number of messages to replay.
1164  * @param flags
1165  *        OR'ed enum GNUNET_PSYC_HistoryReplayFlags
1166  * @param finish_cb
1167  *        Function to call when the requested history has been fully replayed
1168  *        (counting message IDs might not suffice, as some messages might be
1169  *        secret and thus the listener would not know the story is finished
1170  *        without being told explicitly)o once this function has been called, the
1171  *        client must not call GNUNET_PSYC_channel_history_replay_cancel() anymore.
1172  * @param cls
1173  *        Closure for the callbacks.
1174  *
1175  * @return Handle to cancel history replay operation.
1176  */
1177 struct GNUNET_PSYC_HistoryRequest *
1178 GNUNET_PSYC_channel_history_replay_latest (struct GNUNET_PSYC_Channel *channel,
1179                                            uint64_t message_limit,
1180                                            const char *method_prefix,
1181                                            uint32_t flags,
1182                                            GNUNET_PSYC_MessageCallback message_cb,
1183                                            GNUNET_PSYC_MessagePartCallback message_part_cb,
1184                                            GNUNET_ResultCallback result_cb,
1185                                            void *cls);
1186
1187
1188 void
1189 GNUNET_PSYC_channel_history_replay_cancel (struct GNUNET_PSYC_Channel *channel,
1190                                            struct GNUNET_PSYC_HistoryRequest *hr);
1191
1192
1193 /**
1194  * Function called to inform a member about stored state values for a channel.
1195  *
1196  * @param cls Closure.
1197  * @param name Name of the state variable.  A NULL value indicates that there
1198  *        are no more state variables to be returned.
1199  * @param value Value of the state variable.
1200  * @param value_size Number of bytes in @a value.
1201  */
1202 typedef void
1203 (*GNUNET_PSYC_StateVarCallback) (void *cls,
1204                                  const char *name,
1205                                  const void *value,
1206                                  size_t value_size);
1207
1208
1209 /**
1210  * State request handle.
1211  */
1212 struct GNUNET_PSYC_StateRequest;
1213
1214
1215 /**
1216  * Retrieve the best matching channel state variable.
1217  *
1218  * If the requested variable name is not present in the state, the nearest
1219  * less-specific name is matched; for example, requesting "_a_b" will match "_a"
1220  * if "_a_b" does not exist.
1221  *
1222  * @param channel
1223  *        Channel handle.
1224  * @param full_name
1225  *        Full name of the requested variable.
1226  *        The actual variable returned might have a shorter name.
1227  * @param var_cb
1228  *        Function called once when a matching state variable is found.
1229  *        Not called if there's no matching state variable.
1230  * @param result_cb
1231  *        Function called after the operation finished.
1232  *        (i.e. all state variables have been returned via @a state_cb)
1233  * @param cls
1234  *        Closure for the callbacks.
1235  */
1236 struct GNUNET_PSYC_StateRequest *
1237 GNUNET_PSYC_channel_state_get (struct GNUNET_PSYC_Channel *channel,
1238                                const char *full_name,
1239                                GNUNET_PSYC_StateVarCallback var_cb,
1240                                GNUNET_ResultCallback result_cb,
1241                                void *cls);
1242
1243
1244 /**
1245  * Return all channel state variables whose name matches a given prefix.
1246  *
1247  * A name matches if it starts with the given @a name_prefix, thus requesting
1248  * the empty prefix ("") will match all values; requesting "_a_b" will also
1249  * return values stored under "_a_b_c".
1250  *
1251  * The @a state_cb is invoked on all matching state variables asynchronously, as
1252  * the state is stored in and retrieved from the PSYCstore,
1253  *
1254  * @param channel
1255  *        Channel handle.
1256  * @param name_prefix
1257  *        Prefix of the state variable name to match.
1258  * @param var_cb
1259  *        Function called once when a matching state variable is found.
1260  *        Not called if there's no matching state variable.
1261  * @param result_cb
1262  *        Function called after the operation finished.
1263  *        (i.e. all state variables have been returned via @a state_cb)
1264  * @param cls
1265  *        Closure for the callbacks.
1266  */
1267 struct GNUNET_PSYC_StateRequest *
1268 GNUNET_PSYC_channel_state_get_prefix (struct GNUNET_PSYC_Channel *channel,
1269                                       const char *name_prefix,
1270                                       GNUNET_PSYC_StateVarCallback var_cb,
1271                                       GNUNET_ResultCallback result_cb,
1272                                       void *cls);
1273
1274 /**
1275  * Cancel a state request operation.
1276  *
1277  * @param sr
1278  *        Handle for the operation to cancel.
1279  */
1280 void
1281 GNUNET_PSYC_channel_state_get_cancel (struct GNUNET_PSYC_StateRequest *sr);
1282
1283
1284
1285 #if 0                           /* keep Emacsens' auto-indent happy */
1286 {
1287 #endif
1288 #ifdef __cplusplus
1289 }
1290 #endif
1291
1292 /* ifndef GNUNET_PSYC_SERVICE_H */
1293 #endif
1294 /* end of gnunet_psyc_service.h */