Improved UTF-8 encoding and decoding, improved toolkit doc,
[silc.git] / lib / silccore / silccommand.h
1 /*
2  
3   silccommand.h
4  
5   Author: Pekka Riikonen <priikone@silcnet.org>
6  
7   Copyright (C) 1997 - 2001 Pekka Riikonen
8  
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 2 of the License, or
12   (at your option) any later version.
13  
14   This program is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19 */
20
21 /****h* silccore/SILC Command Interface
22  *
23  * DESCRIPTION
24  *
25  * Implementation of the Command Payload. The Command Payload is used to
26  * send commands and also command replies usually between client and
27  * server.
28  *
29  ***/
30
31 #ifndef SILCCOMMAND_H
32 #define SILCCOMMAND_H
33
34 /****f* silccore/SilcCommandAPI/SilcCommandCb
35  *
36  * SYNOPSIS
37  *
38  *    typedef void (*SilcCommandCb)(void *context, void *context2);
39  *
40  * DESCRIPTION
41  *
42  *    Command function callback. The actual command function pointer.
43  *    This is generic command callback that the application may choose to
44  *    use with its command routines.  However, none of the generic
45  *    routines depend on this callback so application may freely define
46  *    their own command callback if desired.
47  *
48  ***/
49 typedef void (*SilcCommandCb)(void *context, void *context2);
50
51 /****s* silccore/SilcCommandAPI/SilcCommandPayload
52  *
53  * NAME
54  * 
55  *    typedef struct SilcCommandPayloadStruct *SilcCommandPayload;
56  *
57  * DESCRIPTION
58  *
59  *    This context is the actual Command Payload and is allocated
60  *    by silc_command_payload_parse and given as argument usually to
61  *    all silc_command_payload_* functions.  It is freed by the
62  *    silc_command_payload_free function.
63  *
64  ***/
65 typedef struct SilcCommandPayloadStruct *SilcCommandPayload;
66
67 /****d* silccore/SilcCommandAPI/SilcCommandFlags
68  *
69  * NAME
70  * 
71  *    typedef enum { ... } SilcCommandFlags;
72  *
73  * DESCRIPTION
74  *
75  *    Command flags that set how the commands behave on different
76  *    situations. These can be OR'es together to set multiple flags.
77  *    The application is resoponsible of implementing the behaviour
78  *    of these flags. These are here just to define generic flags.
79  *    The server usually makes use of these flags.
80  *
81  * SOURCE
82  */
83 typedef enum {
84   SILC_CF_NONE           = 0,
85
86   /* Command may only be used once per (about) 2 seconds. Bursts up
87      to 5 commands are allowed though. */
88   SILC_CF_LAG            = (1L << 1),
89
90   /* Command may only be used once per (about) 2 seconds. No bursts
91      are allowed at all. */
92   SILC_CF_LAG_STRICT     = (1L << 2),
93
94   /* Command is available for registered connections (connections
95      whose ID has been created. */
96   SILC_CF_REG            = (1L << 3),
97
98   /* Command is available only for server operators */
99   SILC_CF_OPER           = (1L << 4),
100
101   /* Command is available only for SILC (router) operators. If this 
102      is set SILC_CF_OPER is not necessary to be set. */
103   SILC_CF_SILC_OPER      = (1L << 5),
104
105 } SilcCommandFlag;
106 /***/
107
108 /****d* silccore/SilcCommandAPI/SilcCommand
109  *
110  * NAME
111  * 
112  *    typedef unsigned char SilcCommand;
113  *
114  * DESCRIPTION
115  *
116  *    The SilcCommand type definition and the commands. The commands
117  *    listed here are the official SILC Commands and they have client
118  *    and server counterparts.
119  *
120  * SOURCE
121  */
122 typedef unsigned char SilcCommand;
123
124 /* All SILC commands. These are commands that have client and server
125    counterparts. */
126 #define SILC_COMMAND_NONE               0
127 #define SILC_COMMAND_WHOIS              1
128 #define SILC_COMMAND_WHOWAS             2
129 #define SILC_COMMAND_IDENTIFY           3
130 #define SILC_COMMAND_NICK               4
131 #define SILC_COMMAND_LIST               5
132 #define SILC_COMMAND_TOPIC              6
133 #define SILC_COMMAND_INVITE             7
134 #define SILC_COMMAND_QUIT               8
135 #define SILC_COMMAND_KILL               9
136 #define SILC_COMMAND_INFO               10
137 #define SILC_COMMAND_STATS              11
138 #define SILC_COMMAND_PING               12
139 #define SILC_COMMAND_OPER               13
140 #define SILC_COMMAND_JOIN               14
141 #define SILC_COMMAND_MOTD               15
142 #define SILC_COMMAND_UMODE              16
143 #define SILC_COMMAND_CMODE              17
144 #define SILC_COMMAND_CUMODE             18
145 #define SILC_COMMAND_KICK               19
146 #define SILC_COMMAND_BAN                20
147 #define SILC_COMMAND_DETACH             21
148 #define SILC_COMMAND_WATCH              22
149 #define SILC_COMMAND_SILCOPER           23
150 #define SILC_COMMAND_LEAVE              24
151 #define SILC_COMMAND_USERS              25
152 #define SILC_COMMAND_GETKEY             26
153 #define SILC_COMMAND_SERVICE            27
154
155 /* Private range start */
156 #define SILC_COMMAND_PRIVATE            200
157
158 #define SILC_COMMAND_PRIV_CONNECT       200
159 #define SILC_COMMAND_PRIV_CLOSE         201
160 #define SILC_COMMAND_PRIV_SHUTDOWN      202
161
162 /* Reserved */
163 #define SILC_COMMAND_RESERVED           255
164 /***/
165
166 /* Prototypes */
167
168 /****f* silccore/SilcCommandAPI/silc_command_payload_parse
169  *
170  * SYNOPSIS
171  *
172  *    SilcCommandPayload 
173  *    silc_command_payload_parse(const unsigned char *payload,
174  *                               SilcUInt32 payload_len);
175  *
176  * DESCRIPTION
177  *
178  *    Parses command payload returning new command payload structure. The
179  *    `buffer' is the raw payload.
180  *
181  ***/
182 SilcCommandPayload silc_command_payload_parse(const unsigned char *payload,
183                                               SilcUInt32 payload_len);
184
185 /****f* silccore/SilcCommandAPI/silc_command_payload_encode
186  *
187  * SYNOPSIS
188  *
189  *    SilcBuffer silc_command_payload_encode(SilcCommand cmd,
190  *                                           SilcUInt32 argc,
191  *                                           unsigned char **argv,
192  *                                           SilcUInt32 *argv_lens,
193  *                                           SilcUInt32 *argv_types,
194  *                                           SilcUInt16 ident);
195  *
196  * DESCRIPTION
197  *
198  *     Encodes Command Payload returning it to SilcBuffer.
199  *
200  ***/
201 SilcBuffer silc_command_payload_encode(SilcCommand cmd,
202                                        SilcUInt32 argc,
203                                        unsigned char **argv,
204                                        SilcUInt32 *argv_lens,
205                                        SilcUInt32 *argv_types,
206                                        SilcUInt16 ident);
207
208 /****f* silccore/SilcCommandAPI/silc_command_payload_encode_payload
209  *
210  * SYNOPSIS
211  *
212  *    SilcBuffer 
213  *    silc_command_payload_encode_payload(SilcCommandPayload payload);
214  *
215  * DESCRIPTION
216  *
217  *    Same as silc_command_payload_encode but encodes the buffer from
218  *    SilcCommandPayload structure instead of raw data.
219  *
220  ***/
221 SilcBuffer silc_command_payload_encode_payload(SilcCommandPayload payload);
222
223 /****f* silccore/SilcCommandAPI/silc_command_payload_encode_va
224  *
225  * SYNOPSIS
226  *
227  *    SilcBuffer silc_command_payload_encode_va(SilcCommand cmd, 
228  *                                              SilcUInt16 ident, 
229  *                                              SilcUInt32 argc, ...);
230  *
231  * DESCRIPTION
232  *
233  *    Encodes Command payload with variable argument list. The arguments
234  *    must be: SilcUInt32, unsigned char *, unsigned int, ... One 
235  *    {SilcUInt32, unsigned char * and unsigned int} forms one argument, 
236  *    thus `argc' in case when sending one {SilcUInt32, unsigned char * 
237  *    and SilcUInt32} equals one (1) and when sending two of those it
238  *    equals two (2), and so on. This has to be preserved or bad things
239  *    will happen. The variable arguments is: {type, data, data_len}.
240  *
241  ***/
242 SilcBuffer silc_command_payload_encode_va(SilcCommand cmd, 
243                                           SilcUInt16 ident, 
244                                           SilcUInt32 argc, ...);
245
246 /****f* silccore/SilcCommandAPI/silc_command_payload_encode_vap
247  *
248  * SYNOPSIS
249  *
250  *    SilcBuffer silc_command_payload_encode_vap(SilcCommand cmd, 
251  *                                               SilcUInt16 ident, 
252  *                                               SilcUInt32 argc, va_list ap);
253  *
254  * DESCRIPTION
255  *
256  *    This is equivalent to the silc_command_payload_encode_va except
257  *    takes the va_list as argument.
258  *
259  ***/
260 SilcBuffer silc_command_payload_encode_vap(SilcCommand cmd, 
261                                            SilcUInt16 ident, 
262                                            SilcUInt32 argc, va_list ap);
263
264 /****f* silccore/SilcCommandAPI/silc_command_reply_payload_encode_va
265  *
266  * SYNOPSIS
267  *
268  *    SilcBuffer 
269  *    silc_command_reply_payload_encode_va(SilcCommand cmd, 
270  *                                         SilcStatus status,
271  *                                         SilcStatus error,
272  *                                         SilcUInt16 ident,
273  *                                         SilcUInt32 argc, ...);
274  *
275  * DESCRIPTION
276  *
277  *    Same as silc_command_payload_encode_va except that this is used to 
278  *    encode strictly command reply packets.  The `argc' must not count 
279  *    `status' and `error' as arguments.  The `status' includes the
280  *    command reply status.  If single reply will be sent then it includes
281  *    SILC_STATUS_OK if error did not occur.  It includes an error value
282  *    if error did occur.  In this case `error' field is ignored.  If
283  *    there will be multiple successful command replies then the `status'
284  *    includes a list value and `error' is ignored.  If there will
285  *    multiple error replies the `status' includes a list value, and
286  *    the `error' includes an error value.  Thus, the `error' value is
287  *    specified only if there will be list of errors.
288  *
289  * NOTES
290  *
291  *    Protocol defines that it is possible to send both list of successful
292  *    and list of error replies at the same time, as long as the error
293  *    replies are sent after the successful replies.
294  *
295  ***/
296 SilcBuffer 
297 silc_command_reply_payload_encode_va(SilcCommand cmd, 
298                                      SilcStatus status,
299                                      SilcStatus error,
300                                      SilcUInt16 ident,
301                                      SilcUInt32 argc, ...);
302
303 /****f* silccore/SilcCommandAPI/silc_command_reply_payload_encode_vap
304  *
305  * SYNOPSIS
306  *
307  *    SilcBuffer 
308  *    silc_command_reply_payload_encode_vap(SilcCommand cmd, 
309  *                                          SilcStatus status,
310  *                                          SilcStatus error,
311  *                                          SilcUInt16 ident, SilcUInt32 argc,
312  *                                          va_list ap);
313  *
314  * DESCRIPTION
315  *
316  *    This is equivalent to the silc_command_reply_payload_encode_va except
317  *    takes the va_list as argument.
318  *
319  ***/
320 SilcBuffer 
321 silc_command_reply_payload_encode_vap(SilcCommand cmd, 
322                                       SilcStatus status,
323                                       SilcStatus error,
324                                       SilcUInt16 ident, SilcUInt32 argc, 
325                                       va_list ap);
326
327 /****f* silccore/SilcCommandAPI/silc_command_free
328  *
329  * SYNOPSIS
330  *
331  *    void silc_command_payload_free(SilcCommandPayload payload);
332  *
333  * DESCRIPTION
334  *
335  *    Frees the Command Payload and all data in it.
336  *
337  ***/
338 void silc_command_payload_free(SilcCommandPayload payload);
339
340 /****f* silccore/SilcCommandAPI/silc_command_get
341  *
342  * SYNOPSIS
343  *
344  *    SilcCommand silc_command_get(SilcCommandPayload payload);
345  *
346  * DESCRIPTION
347  *
348  *    Return the command from the payload.
349  *
350  ***/
351 SilcCommand silc_command_get(SilcCommandPayload payload);
352
353 /****f* silccore/SilcCommandAPI/silc_command_get_args
354  *
355  * SYNOPSIS
356  *
357  *    SilcArgumentPayload silc_command_get_args(SilcCommandPayload payload);
358  *
359  * DESCRIPTION
360  *
361  *    Return the Arguments Payload containing the arguments from the
362  *    Command Payload. The caller must not free it.
363  *
364  ***/
365 SilcArgumentPayload silc_command_get_args(SilcCommandPayload payload);
366
367 /****f* silccore/SilcCommandAPI/silc_command_get_ident
368  *
369  * SYNOPSIS
370  *
371  *    SilcUInt16 silc_command_get_ident(SilcCommandPayload payload);
372  *
373  * DESCRIPTION
374  *
375  *    Return the command identifier from the payload. The identifier can
376  *    be used to identify which command reply belongs to which command.
377  *    The client sets the identifier to the payload and server must return
378  *    the same identifier in the command reply.
379  *
380  ***/
381 SilcUInt16 silc_command_get_ident(SilcCommandPayload payload);
382
383 /****f* silccore/SilcCommandAPI/silc_command_get_status
384  *
385  * SYNOPSIS
386  *
387  *    bool silc_command_get_status(SilcCommandPayload payload, 
388  *                                 SilcStatus *status,
389  *                                 SilcStatus *error);
390  *
391  * DESCRIPTION
392  *
393  *    This function returns the command reply status into `status' and
394  *    error status, if error occurred into the `error'.  The function
395  *    returns TRUE if command reply status is not error, and FALSE if
396  *    error occurred.  In this case the `error' will include the actual
397  *    error status.  The `status' can be in this case some list value
398  *    which indicates that there will be list of errors.
399  *
400  ***/
401 bool silc_command_get_status(SilcCommandPayload payload, 
402                              SilcStatus *status,
403                              SilcStatus *error);
404
405 /****f* silccore/SilcCommandAPI/silc_command_set_ident
406  *
407  * SYNOPSIS
408  *
409  *    void silc_command_set_ident(SilcCommandPayload payload, 
410  *                                SilcUInt16 ident);
411  *
412  * DESCRIPTION
413  *
414  *    Function to set identifier to already allocated Command Payload. Command
415  *    payloads are frequentlly resent in SILC and thusly this makes it easy
416  *    to set the identifier without encoding new Command Payload. 
417  *
418  ***/
419 void silc_command_set_ident(SilcCommandPayload payload, SilcUInt16 ident);
420
421 /****f* silccore/SilcCommandAPI/silc_command_set_command
422  *
423  * SYNOPSIS
424  *
425  *    void silc_command_set_command(SilcCommandPayload payload, 
426  *                                  SilcCommand command);
427  *
428  * DESCRIPTION
429  *
430  *    Function to set the command to already allocated Command Payload. This
431  *    makes it easy to change the command in the payload without encoding new
432  *    Command Payload.
433  *
434  ***/
435 void silc_command_set_command(SilcCommandPayload payload, SilcCommand command);
436
437 #endif