X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Finclude%2Fgnunet_env_lib.h;h=857ad45c245694e5b9a4cf1f77bbd2291eb10c19;hb=27c12911f4f2aba2d90099270d70de846e83854f;hp=0a7e195bea5dbbf12880251c4890a3de173efd8e;hpb=f78e9753a91497f1deb5e20d10868c27ab4a6013;p=oweals%2Fgnunet.git diff --git a/src/include/gnunet_env_lib.h b/src/include/gnunet_env_lib.h index 0a7e195be..857ad45c2 100644 --- a/src/include/gnunet_env_lib.h +++ b/src/include/gnunet_env_lib.h @@ -1,24 +1,24 @@ /* - This file is part of GNUnet. - (C) 2013 Christian Grothoff (and other contributing authors) - - GNUnet is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3, or (at your - option) any later version. - - GNUnet is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. -*/ - -/** + * This file is part of GNUnet. + * (C) 2013 Christian Grothoff (and other contributing authors) + * + * GNUnet is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 3, or (at your + * option) any later version. + * + * GNUnet is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNUnet; see the file COPYING. If not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/** * @file include/gnunet_env_lib.h * @brief Library providing operations for the @e environment of * PSYC and Social messages, and for (de)serializing variable values. @@ -38,38 +38,38 @@ extern "C" #endif -/** +/** * Possible operations on PSYC state (persistent) and transient variables (per message). */ enum GNUNET_ENV_Operator { - /** + /** * Set value of a transient variable. */ GNUNET_ENV_OP_SET = ':', - /** + /** * Assign value for a persistent state variable. * * If an assigned value is NULL, the variable is deleted. */ GNUNET_ENV_OP_ASSIGN = '=', - /** + /** * Augment state variable. * * Used for appending strings, adding numbers, and adding new items to a list or dictionary. */ GNUNET_ENV_OP_AUGMENT = '+', - /** + /** * Diminish state variable. * * Used for subtracting numbers, and removing items from a list or dictionary. */ GNUNET_ENV_OP_DIMINISH = '-', - /** + /** * Update state variable. * * Used for modifying a single item of a list or dictionary. @@ -78,7 +78,7 @@ enum GNUNET_ENV_Operator }; -/** +/** * PSYC variable types. */ enum GNUNET_ENV_Type @@ -90,33 +90,43 @@ enum GNUNET_ENV_Type }; -/** +/** * PSYC state modifier. */ struct GNUNET_ENV_Modifier { - /** + /** * State operation. */ enum GNUNET_ENV_Operator oper; - /** + /** * Variable name. */ const char *name; - /** + /** * Size of @a value. */ size_t value_size; - /** + /** * Value of variable. */ const void *value; + + /** + * Next modifier. + */ + struct GNUNET_ENV_Modifier *next; + + /** + * Previous modifier. + */ + struct GNUNET_ENV_Modifier *prev; }; -/** +/** * Environment for a message. * * Contains modifiers. @@ -124,65 +134,67 @@ struct GNUNET_ENV_Modifier { struct GNUNET_ENV_Environment; -/** +/** * Create an environment. - * + * * @return A newly allocated environment. */ struct GNUNET_ENV_Environment * GNUNET_ENV_environment_create (); -/** - * Add an operation on a variable to the environment. +/** + * Add a modifier to the environment. * * @param env The environment. * @param oper Operation to perform. * @param name Name of the variable. - * @param value_size Size of @a value. * @param value Value of the variable. - * - * @return #GNUNET_OK on success, #GNUNET_SYSERR on error. + * @param value_size Size of @a value. */ -int -GNUNET_ENV_environment_operation (struct GNUNET_ENV_Environment *env, - enum GNUNET_ENV_Operator oper, - const char *name, - size_t value_size, const void *value); +void +GNUNET_ENV_environment_add_mod (struct GNUNET_ENV_Environment *env, + enum GNUNET_ENV_Operator oper, const char *name, + const void *value, size_t value_size); -/** - * Get all modifiers in the environment. +/** + * Iterator for modifiers in the environment. * - * FIXME: use an iterator instead, as we'll likely use a SList to store the - * modifiers in the environment. + * @param cls Closure. + * @param mod Modifier. + * + * @return #GNUNET_YES to continue iterating, + * #GNUNET_NO to stop. + */ +typedef int +(*GNUNET_ENV_Iterator) (void *cls, struct GNUNET_ENV_Modifier *mod); + + +/** + * Iterate through all modifiers in the environment. * * @param env The environment. - * @param[out] modifier_count Set to the number of returned modifiers. - * - * @return Array of modifiers. + * @param it Iterator. + * @param it_cls Closure for iterator. */ -const struct GNUNET_ENV_Modifier * -GNUNET_ENV_environment_get_modifiers (const struct GNUNET_ENV_Environment *env, - size_t *modifier_count); +void +GNUNET_ENV_environment_iterate (const struct GNUNET_ENV_Environment *env, + GNUNET_ENV_Iterator it, void *it_cls); -/** - * Add list of modifiers to the environment. +/** + * Get the number of modifiers in the environment. * * @param env The environment. - * @param modifier_count Number of @a modifiers. - * @param modifiers Array of modifiers to add. - * - * @return #GNUNET_OK on success, #GNUNET_SYSERR on error. + * + * @return Number of modifiers. */ -int -GNUNET_ENV_environment_set_modifiers (const struct GNUNET_ENV_Environment *env, - size_t modifier_count, - const struct GNUNET_ENV_Modifier *modifiers); +size_t +GNUNET_ENV_environment_get_mod_count (const struct GNUNET_ENV_Environment *env); -/** +/** * Destroy an environment. * * @param env The environment to destroy. @@ -191,18 +203,18 @@ void GNUNET_ENV_environment_destroy (struct GNUNET_ENV_Environment *env); -/** +/** * Get the type of variable. * * @param name Name of the variable. - * + * * @return Variable type. */ enum GNUNET_ENV_Type GNUNET_ENV_var_get_type (char *name); -/** +/** * Perform an operation on a variable. * * @param name Name of variable. @@ -213,7 +225,7 @@ GNUNET_ENV_var_get_type (char *name); * @param args_size Size of @a args. * @param return_value Return value. * @param return_value_size Size of @a return_value. - * + * * @return #GNUNET_OK on success, else #GNUNET_SYSERR */ int @@ -222,7 +234,7 @@ GNUNET_ENV_operation (char *name, void *current_value, size_t current_value_size void **return_value, size_t *return_value_size); -/** +/** * Get the variable's value as an integer. * * @param size Size of value. @@ -235,7 +247,7 @@ int GNUNET_ENV_value_to_number (size_t size, const void *value, int64_t *number); -/** +/** * Get the variable's value as a list. * * @param size Size of value. @@ -248,7 +260,7 @@ int GNUNET_ENV_value_to_list (size_t size, const void *value, struct GNUNET_CONTAINER_SList **list); -/** +/** * Get the variable's value as a dictionary. * * @param size Size of value. @@ -261,36 +273,36 @@ int GNUNET_ENV_value_to_dict (size_t size, const void *value, struct GNUNET_CONTAINER_MultiHashMap **dict); -/** +/** * Create a PSYC variable value from an integer. * * @param number The number to convert. * @param[out] value_size Size of returned value. - * + * * @return A newly allocated value or NULL on error. */ void * GNUNET_ENV_value_from_number (int64_t number, size_t *value_size); -/** +/** * Create a PSYC variable value from a list. * * @param list The list to convert. * @param[out] value_size Size of returned value. - * + * * @return A newly allocated value or NULL on error. */ void * GNUNET_ENV_value_from_list (struct GNUNET_CONTAINER_SList *list, size_t *value_size); -/** +/** * Create a PSYC variable value from a dictionary. * * @param dict The dict to convert. * @param[out] value_size Size of returned value. - * + * * @return A newly allocated value or NULL on error. */ void *