Merged silc_1_0_branch to trunk.
[silc.git] / lib / silccore / silcargument.h
1 /*
2
3   silcargument.h 
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
6
7   Copyright (C) 2001 - 2002 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; version 2 of the License.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18 */
19
20 /****h* silccore/SILC Argument Interface
21  *
22  * DESCRIPTION
23  *
24  * Implementation of the Argument Payload, that is used to include 
25  * argument to other payload that needs arguments.
26  *
27  ***/
28
29 #ifndef SILCPAYLOAD_H
30 #define SILCPAYLOAD_H
31
32 /****s* silccore/SilcArgumentAPI/SilcArgumentPayload
33  *
34  * NAME
35  * 
36  *    typedef struct SilcArgumentPayloadStruct *SilcArgumentPayload;
37  *
38  * DESCRIPTION
39  *
40  *    This context is the actual Argument Payload and is allocated
41  *    by silc_argument_payload_parse and given as argument usually to
42  *    all silc_argument_payload_* functions.  It is freed by the
43  *    silc_argument_payload_free function.
44  *
45  ***/
46 typedef struct SilcArgumentPayloadStruct *SilcArgumentPayload;
47
48 /****f* silccore/SilcArgumentAPI/silc_argument_payload_parse
49  *
50  * SYNOPSIS
51  *
52  *    SilcArgumentPayload 
53  *    silc_argument_payload_parse(const unsigned char *payload,
54  *                                SilcUInt32 payload_len,
55  *                                SilcUInt32 argc);
56  *
57  * DESCRIPTION
58  *
59  *    Parses arguments and returns them into Argument Payload structure.
60  *    the `buffer' is raw Argument Payload data buffer. The `argc' is
61  *    the number of arguments in the Argument Payload. The caller must
62  *    know the number of the arguments. This is always known as the
63  *    Argument payload is associated with other payloads which defines
64  *    the number of the arguments.
65  *
66  ***/
67 SilcArgumentPayload silc_argument_payload_parse(const unsigned char *payload,
68                                                 SilcUInt32 payload_len,
69                                                 SilcUInt32 argc);
70
71 /****f* silccore/SilcArgumentAPI/silc_argument_payload_encode
72  *
73  * SYNOPSIS
74  *
75  *    SilcBuffer silc_argument_payload_encode(SilcUInt32 argc,
76  *                                            unsigned char **argv,
77  *                                            SilcUInt32 *argv_lens,
78  *                                            SilcUInt32 *argv_types);
79  *
80  * DESCRIPTION
81  *
82  *    Encodes arguments in to Argument Paylods returning them to SilcBuffer.
83  *    The `argv' is the array of the arguments, the `argv_lens' array of
84  *    the length of the `argv' arguments and the `argv_types' array of
85  *    the argument types of the `argv' arguments. The `argc' is the 
86  *    number of arguments.
87  *
88  ***/
89 SilcBuffer silc_argument_payload_encode(SilcUInt32 argc,
90                                         unsigned char **argv,
91                                         SilcUInt32 *argv_lens,
92                                         SilcUInt32 *argv_types);
93
94 /****f* silccore/SilcArgumentAPI/silc_argument_payload_encode_one
95  *
96  * SYNOPSIS
97  *
98  *    SilcBuffer silc_argument_payload_encode_one(SilcBuffer args,
99  *                                                unsigned char *arg,
100  *                                                SilcUInt32 arg_len,
101  *                                                SilcUInt32 arg_type);
102  *
103  * DESCRIPTION
104  *
105  *    Same as silc_argument_payload_encode but encodes one argument to
106  *    the buffer `args' and returns the buffer.  The returned buffer
107  *    may be different than the `args'.  If `args' is NULL for the first
108  *    argument this allocates the buffer and returns it.
109  *
110  ***/
111 SilcBuffer silc_argument_payload_encode_one(SilcBuffer args,
112                                             unsigned char *arg,
113                                             SilcUInt32 arg_len,
114                                             SilcUInt32 arg_type);
115
116 /****f* silccore/SilcArgumentAPI/silc_argument_payload_encode_payload
117  *
118  * SYNOPSIS
119  *
120  *    SilcBuffer 
121  *    silc_argument_payload_encode_payload(SilcArgumentPayload payload);
122  *
123  * DESCRIPTION
124  *
125  *    Same as silc_argument_payload_encode but encodes the payload from
126  *    already allocated SilcArgumentPayload structure instead of raw data.
127  *
128  ***/
129 SilcBuffer silc_argument_payload_encode_payload(SilcArgumentPayload payload);
130
131 /****f* silccore/SilcArgumentAPI/silc_argument_payload_free
132  *
133  * SYNOPSIS
134  *
135  *    void silc_argument_payload_free(SilcArgumentPayload payload);
136  *
137  * DESCRIPTION
138  *
139  *    Frees the Argument Payload and all data in it.
140  *
141  ***/
142 void silc_argument_payload_free(SilcArgumentPayload payload);
143
144 /****f* silccore/SilcArgumentAPI/silc_argument_get_arg_num
145  *
146  * SYNOPSIS
147  *
148  *    SilcUInt32 silc_argument_get_arg_num(SilcArgumentPayload payload);
149  *
150  * DESCRIPTION
151  *
152  *    Returns the number of argument in the Argument Payload.
153  *
154  ***/
155 SilcUInt32 silc_argument_get_arg_num(SilcArgumentPayload payload);
156
157 /****f* silccore/SilcArgumentAPI/silc_argument_get_first_arg
158  *
159  * SYNOPSIS
160  *
161  *    unsigned char *silc_argument_get_first_arg(SilcArgumentPayload payload,
162  *                                               SilcUInt32 *type,
163  *                                               SilcUInt32 *ret_len);
164  *
165  * DESCRIPTION
166  *
167  *    Returns the first argument in the Argument Payload. The lenght
168  *    of the argument is returned to `ret_len'. The caller must not
169  *    free the returned argument. Returns NULL on error.
170  *
171  ***/
172 unsigned char *silc_argument_get_first_arg(SilcArgumentPayload payload,
173                                            SilcUInt32 *type,
174                                            SilcUInt32 *ret_len);
175
176 /****f* silccore/SilcArgumentAPI/silc_argument_get_next_arg
177  *
178  * SYNOPSIS
179  *
180  *    unsigned char *silc_argument_get_next_arg(SilcArgumentPayload payload,
181  *                                              SilcUInt32 *ret_len);
182  *
183  * DESCRIPTION
184  *
185  *    Returns next argument from the Argument Payload. The length of
186  *    the argument is returned to `ret_len'. The caller must not free
187  *    the returned argument. This returns NULL when there are no more
188  *    arguments in the payload.
189  *
190  ***/
191 unsigned char *silc_argument_get_next_arg(SilcArgumentPayload payload,
192                                           SilcUInt32 *type,
193                                           SilcUInt32 *ret_len);
194
195 /****f* silccore/SilcArgumentAPI/silc_argument_get_arg_type
196  *
197  * SYNOPSIS
198  *
199  *    unsigned char *silc_argument_get_arg_type(SilcArgumentPayload payload,
200  *                                              SilcUInt32 type,
201  *                                              SilcUInt32 *ret_len);
202  *
203  * DESCRIPTION
204  *
205  *    Returns argument by type. The returned argument has type `type'
206  *    in the Argument Payload. Each argument has their own type (or zero
207  *    if no specific type is set). The length of the argument is returned
208  *    to the `ret_len'. The caller must not free the returned argument.
209  *    Returns NULL on error.
210  *
211  ***/
212 unsigned char *silc_argument_get_arg_type(SilcArgumentPayload payload,
213                                           SilcUInt32 type,
214                                           SilcUInt32 *ret_len);
215
216 #endif