99c24398d4963572512bc825afa407ed378c9e1c
[silc.git] / lib / silccore / silcpayload.h
1 /*
2
3   silcpayload.h
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
6
7   Copyright (C) 2000 - 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/SilcGenericPayloadAPI
22  *
23  * DESCRIPTION
24  *
25  * Implementation of the generic payloads described in the protocol
26  * specification; ID Payload and Argument Payload. The ID Payload is
27  * used to represent an ID. The Argument Payload is used to include
28  * arguments to other payloads that needs arguments.
29  *
30  ***/
31
32 #ifndef SILCPAYLOAD_H
33 #define SILCPAYLOAD_H
34
35 /****s* silccore/SilcGenericPayloadAPI/SilcIDPayload
36  *
37  * NAME
38  * 
39  *    typedef struct SilcIDPayloadStruct *SilcIDPayload;
40  *
41  * DESCRIPTION
42  *
43  *    This context is the actual ID Payload and is allocated by
44  *    silc_id_payload_parse and given as argument usually to all
45  *    silc_id_payload_* functions.  It is freed by the function
46  *    silc_id_payload_free.
47  *
48  ***/
49 typedef struct SilcIDPayloadStruct *SilcIDPayload;
50
51 /****s* silccore/SilcGenericPayloadAPI/SilcArgumentPayload
52  *
53  * NAME
54  * 
55  *    typedef struct SilcArgumentPayloadStruct *SilcArgumentPayload;
56  *
57  * DESCRIPTION
58  *
59  *    This context is the actual Argument Payload and is allocated
60  *    by silc_argument_payload_parse and given as argument usually to
61  *    all silc_argument_payload_* functions.  It is freed by the
62  *    silc_argument_payload_free function.
63  *
64  ***/
65 typedef struct SilcArgumentPayloadStruct *SilcArgumentPayload;
66
67 /* Prototypes */
68
69 /****f* silccore/SilcGenericPayloadAPI/silc_id_payload_parse
70  *
71  * SYNOPSIS
72  *
73  *    SilcIDPayload silc_id_payload_parse(SilcBuffer buffer);
74  *
75  * DESCRIPTION
76  *
77  *    Parses buffer and return ID payload into payload structure. The
78  *    `buffer' is raw payload buffer.
79  *
80  ***/
81 SilcIDPayload silc_id_payload_parse(SilcBuffer buffer);
82
83 /****f* silccore/SilcGenericPayloadAPI/silc_id_payload_parse_data
84  *
85  * SYNOPSIS
86  *
87  *    SilcIDPayload silc_id_payload_parse_data(unsigned char *data, 
88  *                                             uint32 len);
89  *
90  * DESCRIPTION
91  *
92  *    Parses buffer and return ID payload into payload structure. The
93  *    `data' and `len' are the raw payload buffer. This is equivalent
94  *    to the silc_id_payload_parse function.
95  *
96  ***/
97 SilcIDPayload silc_id_payload_parse_data(unsigned char *data, 
98                                          uint32 len);
99
100 /****f* silccore/SilcGenericPayloadAPI/silc_id_payload_parse_id
101  *
102  * SYNOPSIS
103  *
104  *    void *silc_id_payload_parse_id(unsigned char *data, uint32 len);
105  *
106  * DESCRIPTION
107  *
108  *    Return ID directly from the raw ID Payload data buffer. The
109  *    caller must free the returned ID.
110  *
111  ***/
112 void *silc_id_payload_parse_id(unsigned char *data, uint32 len);
113
114 /****f* silccore/SilcGenericPayloadAPI/silc_id_payload_encode
115  *
116  * SYNOPSIS
117  *
118  *    SilcBuffer silc_id_payload_encode(void *id, SilcIdType type);
119  *
120  * DESCRIPTION
121  *
122  *    Encodes ID Payload. The `id' is the ID of the type `type' to put
123  *    into the payload. Returns the encoded payload buffer.
124  *
125  ***/
126 SilcBuffer silc_id_payload_encode(void *id, SilcIdType type);
127
128 /****f* silccore/SilcGenericPayloadAPI/silc_id_payload_free
129  *
130  * SYNOPSIS
131  *
132  *    void silc_id_payload_free(SilcIDPayload payload);
133  *
134  * DESCRIPTION
135  *
136  *    Frees the ID Payload and all data in it.
137  *
138  ***/
139 void silc_id_payload_free(SilcIDPayload payload);
140
141 /****f* silccore/SilcGenericPayloadAPI/silc_id_payload_get_type
142  *
143  * SYNOPSIS
144  *
145  *    SilcIdType silc_id_payload_get_type(SilcIDPayload payload);
146  *
147  * DESCRIPTION
148  *
149  *    Returns the ID type from the ID Payload. The type tells the
150  *    type of the ID in the payload.
151  *
152  ***/
153 SilcIdType silc_id_payload_get_type(SilcIDPayload payload);
154
155 /****f* silccore/SilcGenericPayloadAPI/silc_id_payload_get_id
156  *
157  * SYNOPSIS
158  *
159  *    void *silc_id_payload_get_id(SilcIDPayload payload);
160  *
161  * DESCRIPTION
162  *
163  *    Returns the ID in the ID Payload. The caller must free the
164  *    returned ID.
165  *
166  ***/
167 void *silc_id_payload_get_id(SilcIDPayload payload);
168
169 /****f* silccore/SilcGenericPayloadAPI/silc_id_payload_get_data
170  *
171  * SYNOPSIS
172  *
173  *    unsigned char *silc_id_payload_get_data(SilcIDPayload payload);
174  *
175  * DESCRIPTION
176  *
177  *    Returns the raw ID data from the ID Payload. The data is duplicated
178  *    and the caller must free it.
179  *
180  ***/
181 unsigned char *silc_id_payload_get_data(SilcIDPayload payload);
182
183 /****f* silccore/SilcGenericPayloadAPI/silc_id_payload_get_len
184  *
185  * SYNOPSIS
186  *
187  *    uint32 silc_id_payload_get_len(SilcIDPayload payload);
188  *
189  * DESCRIPTION
190  *
191  *    Returns the length of the ID in the ID Payload.
192  *
193  ***/
194 uint32 silc_id_payload_get_len(SilcIDPayload payload);
195
196 /****f* silccore/SilcGenericPayloadAPI/silc_argument_payload_parse
197  *
198  * SYNOPSIS
199  *
200  *    SilcArgumentPayload silc_argument_payload_parse(SilcBuffer buffer,
201  *                                                    uint32 argc);
202  *
203  * DESCRIPTION
204  *
205  *    Parses arguments and returns them into Argument Payload structure.
206  *    the `buffer' is raw Argument Payload data buffer. The `argc' is
207  *    the number of arguments in the Argument Payload. The caller must
208  *    know the number of the arguments. This is always known as the
209  *    Argument payload is associated with other payloads which defines
210  *    the number of the arguments.
211  *
212  ***/
213 SilcArgumentPayload silc_argument_payload_parse(SilcBuffer buffer,
214                                                 uint32 argc);
215
216 /****f* silccore/SilcGenericPayloadAPI/silc_argument_payload_encode
217  *
218  * SYNOPSIS
219  *
220  *    SilcBuffer silc_argument_payload_encode(uint32 argc,
221  *                                            unsigned char **argv,
222  *                                            uint32 *argv_lens,
223  *                                            uint32 *argv_types);
224  *
225  * DESCRIPTION
226  *
227  *    Encodes arguments in to Argument Paylods returning them to SilcBuffer.
228  *    The `argv' is the array of the arguments, the `argv_lens' array of
229  *    the length of the `argv' arguments and the `argv_types' array of
230  *    the argument types of the `argv' arguments. The `argc' is the 
231  *    number of arguments.
232  *
233  ***/
234 SilcBuffer silc_argument_payload_encode(uint32 argc,
235                                         unsigned char **argv,
236                                         uint32 *argv_lens,
237                                         uint32 *argv_types);
238
239 /****f* silccore/SilcGenericPayloadAPI/silc_argument_payload_encode_payload
240  *
241  * SYNOPSIS
242  *
243  *    SilcBuffer 
244  *    silc_argument_payload_encode_payload(SilcArgumentPayload payload);
245  *
246  * DESCRIPTION
247  *
248  *    Same as silc_argument_payload_encode but encodes the payload from
249  *    already allocated SilcArgumentPayload structure instead of raw data.
250  *
251  ***/
252 SilcBuffer silc_argument_payload_encode_payload(SilcArgumentPayload payload);
253
254 /****f* silccore/SilcGenericPayloadAPI/silc_argument_payload_free
255  *
256  * SYNOPSIS
257  *
258  *    void silc_argument_payload_free(SilcArgumentPayload payload);
259  *
260  * DESCRIPTION
261  *
262  *    Frees the Argument Payload and all data in it.
263  *
264  ***/
265 void silc_argument_payload_free(SilcArgumentPayload payload);
266
267 /****f* silccore/SilcGenericPayloadAPI/silc_argument_get_arg_num
268  *
269  * SYNOPSIS
270  *
271  *    uint32 silc_argument_get_arg_num(SilcArgumentPayload payload);
272  *
273  * DESCRIPTION
274  *
275  *    Returns the number of argument in the Argument Payload.
276  *
277  ***/
278 uint32 silc_argument_get_arg_num(SilcArgumentPayload payload);
279
280 /****f* silccore/SilcGenericPayloadAPI/silc_argument_get_first_arg
281  *
282  * SYNOPSIS
283  *
284  *    unsigned char *silc_argument_get_first_arg(SilcArgumentPayload payload,
285  *                                               uint32 *ret_len);
286  *
287  * DESCRIPTION
288  *
289  *    Returns the first argument in the Argument Payload. The lenght
290  *    of the argument is returned to `ret_len'. The caller must not
291  *    free the returned argument. Returns NULL on error.
292  *
293  ***/
294 unsigned char *silc_argument_get_first_arg(SilcArgumentPayload payload,
295                                            uint32 *ret_len);
296
297 /****f* silccore/SilcGenericPayloadAPI/silc_argument_get_next_arg
298  *
299  * SYNOPSIS
300  *
301  *    unsigned char *silc_argument_get_next_arg(SilcArgumentPayload payload,
302  *                                              uint32 *ret_len);
303  *
304  * DESCRIPTION
305  *
306  *    Returns next argument from the Argument Payload. The length of
307  *    the argument is returned to `ret_len'. The caller must not free
308  *    the returned argument. This returns NULL when there are no more
309  *    arguments in the payload.
310  *
311  ***/
312 unsigned char *silc_argument_get_next_arg(SilcArgumentPayload payload,
313                                           uint32 *ret_len);
314
315 /****f* silccore/SilcGenericPayloadAPI/silc_argument_get_arg_type
316  *
317  * SYNOPSIS
318  *
319  *    unsigned char *silc_argument_get_arg_type(SilcArgumentPayload payload,
320  *                                              uint32 type,
321  *                                              uint32 *ret_len);
322  *
323  * DESCRIPTION
324  *
325  *    Returns argument by type. The returned argument has type `type'
326  *    in the Argument Payload. Each argument has their own type (or zero
327  *    if no specific type is set). The length of the argument is returned
328  *    to the `ret_len'. The caller must not free the returned argument.
329  *    Returns NULL on error.
330  *
331  ***/
332 unsigned char *silc_argument_get_arg_type(SilcArgumentPayload payload,
333                                           uint32 type,
334                                           uint32 *ret_len);
335
336 #endif