2 * This file is part of GNUnet.
3 * (C) 2013 Christian Grothoff (and other contributing authors)
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.
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.
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.
22 * @file include/gnunet_env_lib.h
23 * @brief Library providing operations for the @e environment of
24 * PSYC and Social messages, and for (de)serializing variable values.
25 * @author Gabor X Toth
29 #ifndef GNUNET_ENV_LIB_H
30 #define GNUNET_ENV_LIB_H
35 #if 0 /* keep Emacsens' auto-indent happy */
42 * Possible operations on PSYC state (persistent) and transient variables (per message).
44 enum GNUNET_ENV_Operator
47 * Set value of a transient variable.
49 GNUNET_ENV_OP_SET = ':',
52 * Assign value for a persistent state variable.
54 * If an assigned value is NULL, the variable is deleted.
56 GNUNET_ENV_OP_ASSIGN = '=',
59 * Augment state variable.
61 * Used for appending strings, adding numbers, and adding new items to a list or dictionary.
63 GNUNET_ENV_OP_AUGMENT = '+',
66 * Diminish state variable.
68 * Used for subtracting numbers, and removing items from a list or dictionary.
70 GNUNET_ENV_OP_DIMINISH = '-',
73 * Update state variable.
75 * Used for modifying a single item of a list or dictionary.
77 GNUNET_ENV_OP_UPDATE = '@',
82 * PSYC variable types.
86 GNUNET_ENV_TYPE_DATA = 0,
87 GNUNET_ENV_TYPE_NUMBER,
94 * PSYC state modifier.
96 struct GNUNET_ENV_Modifier {
100 enum GNUNET_ENV_Operator oper;
120 struct GNUNET_ENV_Modifier *next;
125 struct GNUNET_ENV_Modifier *prev;
130 * Environment for a message.
132 * Contains modifiers.
134 struct GNUNET_ENV_Environment;
138 * Create an environment.
140 * @return A newly allocated environment.
142 struct GNUNET_ENV_Environment *
143 GNUNET_ENV_environment_create ();
147 * Add a modifier to the environment.
149 * @param env The environment.
150 * @param oper Operation to perform.
151 * @param name Name of the variable.
152 * @param value Value of the variable.
153 * @param value_size Size of @a value.
156 GNUNET_ENV_environment_add (struct GNUNET_ENV_Environment *env,
157 enum GNUNET_ENV_Operator oper, const char *name,
158 const void *value, size_t value_size);
163 * Remove a modifier at the beginning of the environment.
166 GNUNET_ENV_environment_shift (struct GNUNET_ENV_Environment *env,
167 enum GNUNET_ENV_Operator *oper, const char **name,
168 const void **value, size_t *value_size);
172 * Get the modifier at the beginning of the environment.
175 GNUNET_ENV_environment_head (struct GNUNET_ENV_Environment *env,
176 enum GNUNET_ENV_Operator *oper, const char **name,
177 const void **value, size_t *value_size);
181 * Iterator for modifiers in the environment.
183 * @param cls Closure.
184 * @param mod Modifier.
186 * @return #GNUNET_YES to continue iterating,
187 * #GNUNET_NO to stop.
190 (*GNUNET_ENV_Iterator) (void *cls, enum GNUNET_ENV_Operator oper,
191 const char *name, const char *value,
192 uint32_t value_size);
196 * Iterate through all modifiers in the environment.
198 * @param env The environment.
199 * @param it Iterator.
200 * @param it_cls Closure for iterator.
203 GNUNET_ENV_environment_iterate (const struct GNUNET_ENV_Environment *env,
204 GNUNET_ENV_Iterator it, void *it_cls);
208 * Get the number of modifiers in the environment.
210 * @param env The environment.
212 * @return Number of modifiers.
215 GNUNET_ENV_environment_get_count (const struct GNUNET_ENV_Environment *env);
219 * Destroy an environment.
221 * @param env The environment to destroy.
224 GNUNET_ENV_environment_destroy (struct GNUNET_ENV_Environment *env);
228 * Get the type of variable.
230 * @param name Name of the variable.
232 * @return Variable type.
235 GNUNET_ENV_var_get_type (char *name);
239 * Perform an operation on a variable.
241 * @param name Name of variable.
242 * @param current_value Current value of variable.
243 * @param current_value_size Size of @a current_value.
244 * @param oper Operator.
245 * @param args Arguments for the operation.
246 * @param args_size Size of @a args.
247 * @param return_value Return value.
248 * @param return_value_size Size of @a return_value.
250 * @return #GNUNET_OK on success, else #GNUNET_SYSERR
253 GNUNET_ENV_operation (char *name, void *current_value, size_t current_value_size,
254 enum GNUNET_ENV_Operator oper, void *args, size_t args_size,
255 void **return_value, size_t *return_value_size);
259 * Get the variable's value as an integer.
261 * @param size Size of value.
262 * @param value Raw value of variable.
263 * @param[out] number Value converted to a 64-bit integer.
265 * @return #GNUNET_OK on success, #GNUNET_SYSERR if an error occurred (e.g. the value is invalid).
268 GNUNET_ENV_value_to_number (size_t size, const void *value, int64_t *number);
272 * Get the variable's value as a list.
274 * @param size Size of value.
275 * @param value Raw value of variable.
276 * @param[out] list A newly created list holding the elements.
278 * @return #GNUNET_OK on success, #GNUNET_SYSERR if an error occurred (e.g. the value is invalid).
281 GNUNET_ENV_value_to_list (size_t size, const void *value, struct GNUNET_CONTAINER_SList **list);
285 * Get the variable's value as a dictionary.
287 * @param size Size of value.
288 * @param value Raw value of variable.
289 * @param[out] dict A newly created hashmap holding the elements of the dictionary.
291 * @return #GNUNET_OK on success, #GNUNET_SYSERR if an error occurred (e.g. the value is invalid).
294 GNUNET_ENV_value_to_dict (size_t size, const void *value, struct GNUNET_CONTAINER_MultiHashMap **dict);
298 * Create a PSYC variable value from an integer.
300 * @param number The number to convert.
301 * @param[out] value_size Size of returned value.
303 * @return A newly allocated value or NULL on error.
306 GNUNET_ENV_value_from_number (int64_t number, size_t *value_size);
310 * Create a PSYC variable value from a list.
312 * @param list The list to convert.
313 * @param[out] value_size Size of returned value.
315 * @return A newly allocated value or NULL on error.
318 GNUNET_ENV_value_from_list (struct GNUNET_CONTAINER_SList *list, size_t *value_size);
322 * Create a PSYC variable value from a dictionary.
324 * @param dict The dict to convert.
325 * @param[out] value_size Size of returned value.
327 * @return A newly allocated value or NULL on error.
330 GNUNET_ENV_value_from_dict (struct GNUNET_CONTAINER_MultiHashMap *dict, size_t *value_size);
333 #if 0 /* keep Emacsens' auto-indent happy */
340 /* ifndef GNUNET_ENV_LIB_H */
342 /* end of gnunet_env_lib.h */