Annotation of embedaddon/strongswan/src/libcharon/plugins/vici/vici_message.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2015 Tobias Brunner
        !             3:  * HSR Hochschule fuer Technik Rapperswil
        !             4:  *
        !             5:  * Copyright (C) 2014 Martin Willi
        !             6:  * Copyright (C) 2014 revosec AG
        !             7:  *
        !             8:  * This program is free software; you can redistribute it and/or modify it
        !             9:  * under the terms of the GNU General Public License as published by the
        !            10:  * Free Software Foundation; either version 2 of the License, or (at your
        !            11:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
        !            12:  *
        !            13:  * This program is distributed in the hope that it will be useful, but
        !            14:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            15:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
        !            16:  * for more details.
        !            17:  */
        !            18: 
        !            19: /**
        !            20:  * @defgroup vici_message vici_message
        !            21:  * @{ @ingroup vici
        !            22:  */
        !            23: 
        !            24: #ifndef VICI_MESSAGE_H_
        !            25: #define VICI_MESSAGE_H_
        !            26: 
        !            27: #include <library.h>
        !            28: 
        !            29: typedef struct vici_message_t vici_message_t;
        !            30: typedef struct vici_parse_context_t vici_parse_context_t;
        !            31: typedef enum vici_type_t vici_type_t;
        !            32: 
        !            33: /**
        !            34:  * Vici message encoding types
        !            35:  */
        !            36: enum vici_type_t {
        !            37:        /** never used in an argument list, needed by dump as initial value */
        !            38:        VICI_START =         0,
        !            39: 
        !            40:        /** begin of new section, argument is section name as char* */
        !            41:        VICI_SECTION_START = 1,
        !            42:        /** end of current section, no arguments */
        !            43:        VICI_SECTION_END =   2,
        !            44:        /** key/value, arguments are key as char*, value as chunk_t */
        !            45:        VICI_KEY_VALUE =     3,
        !            46:        /** list start, argument is list name as char* */
        !            47:        VICI_LIST_START =    4,
        !            48:        /** list item, argument is item value as chunk_t */
        !            49:        VICI_LIST_ITEM =     5,
        !            50:        /** end of list, no arguments */
        !            51:        VICI_LIST_END =      6,
        !            52: 
        !            53:        /** end of argument list, no arguments (never encoded) */
        !            54:        VICI_END =           7
        !            55: };
        !            56: 
        !            57: /**
        !            58:  * Callback function for key/value and list items, invoked by parse().
        !            59:  *
        !            60:  * @param user         user data, as passed to parse()
        !            61:  * @param message      message currently parsing
        !            62:  * @param name         name of key or list
        !            63:  * @param value                parsed value
        !            64:  * @return                     TRUE if parsed successfully
        !            65:  */
        !            66: typedef bool (*vici_value_cb_t)(void *user, vici_message_t *message,
        !            67:                                                                char *name, chunk_t value);
        !            68: 
        !            69: /**
        !            70:  * Callback function for sections, invoked by parse().
        !            71:  *
        !            72:  * @param user         user data, as passed to parse()
        !            73:  * @param message      message currently parsing
        !            74:  * @param ctx          parse context, to pass to recursive parse() invocations.
        !            75:  * @param name         name of the section
        !            76:  * @return                     TRUE if parsed successfully
        !            77:  */
        !            78: typedef bool (*vici_section_cb_t)(void *user, vici_message_t *message,
        !            79:                                                                  vici_parse_context_t *ctx, char *name);
        !            80: 
        !            81: /**
        !            82:  * Names for vici encoding types
        !            83:  */
        !            84: extern enum_name_t *vici_type_names;
        !            85: 
        !            86: /**
        !            87:  * Vici message representation, encoding/decoding routines.
        !            88:  */
        !            89: struct vici_message_t {
        !            90: 
        !            91:        /**
        !            92:         * Create an enumerator over message contents.
        !            93:         *
        !            94:         * The enumerator takes a fixed list of arguments, but depending on the
        !            95:         * type may set not all of them. It returns VICI_END as last argument
        !            96:         * to indicate the message end, and returns FALSE if parsing the message
        !            97:         * failed.
        !            98:         *
        !            99:         * @return              enumerator over (vici_type_t, char*, chunk_t)
        !           100:         */
        !           101:        enumerator_t* (*create_enumerator)(vici_message_t *this);
        !           102: 
        !           103:        /**
        !           104:         * Get the value of a key/value pair as a string.
        !           105:         *
        !           106:         * @param def   default value if not found
        !           107:         * @param fmt   printf style format string for key, with sections
        !           108:         * @param ...   arguments to fmt string
        !           109:         * @return              string
        !           110:         */
        !           111:        char* (*get_str)(vici_message_t *this, char *def, char *fmt, ...);
        !           112: 
        !           113:        /**
        !           114:         * Get the value of a key/value pair as a string, va_list variant.
        !           115:         *
        !           116:         * @param def   default value if not found
        !           117:         * @param fmt   printf style format string for key, with sections
        !           118:         * @param args  arguments to fmt string
        !           119:         * @return              string
        !           120:         */
        !           121:        char* (*vget_str)(vici_message_t *this, char *def, char *fmt, va_list args);
        !           122: 
        !           123:        /**
        !           124:         * Get the value of a key/value pair as integer.
        !           125:         *
        !           126:         * @param def   default value if not found
        !           127:         * @param fmt   printf style format string for key, with sections
        !           128:         * @param ...   arguments to fmt string
        !           129:         * @return              value
        !           130:         */
        !           131:        int (*get_int)(vici_message_t *this, int def, char *fmt, ...);
        !           132: 
        !           133:        /**
        !           134:         * Get the value of a key/value pair as integer, va_list variant
        !           135:         *
        !           136:         * @param def   default value if not found
        !           137:         * @param fmt   printf style format string for key, with sections
        !           138:         * @param args  arguments to fmt string
        !           139:         * @return              value
        !           140:         */
        !           141:        int (*vget_int)(vici_message_t *this, int def, char *fmt, va_list args);
        !           142: 
        !           143:        /**
        !           144:         * Get the value of a key/value pair as boolean.
        !           145:         *
        !           146:         * @param def   default value if not found
        !           147:         * @param fmt   printf style format string for key, with sections
        !           148:         * @param ...   arguments to fmt string
        !           149:         * @return              value
        !           150:         */
        !           151:        bool (*get_bool)(vici_message_t *this, bool def, char *fmt, ...);
        !           152: 
        !           153:        /**
        !           154:         * Get the value of a key/value pair as boolean, va_list variant
        !           155:         *
        !           156:         * @param def   default value if not found
        !           157:         * @param fmt   printf style format string for key, with sections
        !           158:         * @param args  arguments to fmt string
        !           159:         * @return              value
        !           160:         */
        !           161:        bool (*vget_bool)(vici_message_t *this, bool def, char *fmt, va_list args);
        !           162: 
        !           163:        /**
        !           164:         * Get the raw value of a key/value pair.
        !           165:         *
        !           166:         * @param def   default value if not found
        !           167:         * @param fmt   printf style format string for key, with sections
        !           168:         * @param ...   arguments to fmt string
        !           169:         * @return              value
        !           170:         */
        !           171:        chunk_t (*get_value)(vici_message_t *this, chunk_t def, char *fmt, ...);
        !           172: 
        !           173:        /**
        !           174:         * Get the raw value of a key/value pair, va_list variant.
        !           175:         *
        !           176:         * @param def   default value if not found
        !           177:         * @param fmt   printf style format string for key, with sections
        !           178:         * @param args  arguments to fmt string
        !           179:         * @return              value
        !           180:         */
        !           181:        chunk_t (*vget_value)(vici_message_t *this, chunk_t def,
        !           182:                                                 char *fmt, va_list args);
        !           183: 
        !           184:        /**
        !           185:         * Get encoded message.
        !           186:         *
        !           187:         * @return              message data, points to internal data
        !           188:         */
        !           189:        chunk_t (*get_encoding)(vici_message_t *this);
        !           190: 
        !           191:        /**
        !           192:         * Parse a message using callback functions.
        !           193:         *
        !           194:         * Any of the callbacks may be NULL to skip this kind of item. Callbacks are
        !           195:         * invoked for the current section level only. To descent into sections,
        !           196:         * call parse() from within a section callback using the provided parse
        !           197:         * context.
        !           198:         *
        !           199:         * @param ctx           parse context, NULL for root level
        !           200:         * @param section       callback invoked for each section
        !           201:         * @param kv            callback invoked for key/value pairs
        !           202:         * @param li            callback invoked for list items
        !           203:         * @param user          user data to pass to callbacks
        !           204:         * @return                      TRUE if parsed successfully
        !           205:         */
        !           206:        bool (*parse)(vici_message_t *this, vici_parse_context_t *ctx,
        !           207:                                  vici_section_cb_t section, vici_value_cb_t kv,
        !           208:                                  vici_value_cb_t li, void *user);
        !           209: 
        !           210:        /**
        !           211:         * Dump a message text representation to a FILE stream.
        !           212:         *
        !           213:         * @param label         label to print for message
        !           214:         * @param pretty        use pretty print with indentation
        !           215:         * @param out           FILE stream to dump to
        !           216:         * @return                      TRUE if message valid
        !           217:         */
        !           218:        bool (*dump)(vici_message_t *this, char *label, bool pretty, FILE *out);
        !           219: 
        !           220:        /**
        !           221:         * Destroy a vici_message_t.
        !           222:         */
        !           223:        void (*destroy)(vici_message_t *this);
        !           224: };
        !           225: 
        !           226: /**
        !           227:  * Create a vici_message from encoded data.
        !           228:  *
        !           229:  * @param data                 message encoding
        !           230:  * @param cleanup              TRUE to free data during
        !           231:  * @return                             message representation
        !           232:  */
        !           233: vici_message_t *vici_message_create_from_data(chunk_t data, bool cleanup);
        !           234: 
        !           235: /**
        !           236:  * Create a vici_message from an enumerator.
        !           237:  *
        !           238:  * The enumerator uses the same signature as the enumerator returned
        !           239:  * by create_enumerator(), and gets destroyed by this function. It should
        !           240:  * return VICI_END to close the message, return FALSE to indicate a failure.
        !           241:  *
        !           242:  * @param enumerator   enumerator over (vici_type_t, char*, chunk_t)
        !           243:  * @return                             message representation, NULL on error
        !           244:  */
        !           245: vici_message_t *vici_message_create_from_enumerator(enumerator_t *enumerator);
        !           246: 
        !           247: /**
        !           248:  * Create vici message from a variable argument list.
        !           249:  *
        !           250:  * @param type                 first type beginning message
        !           251:  * @param ...                  vici_type_t and args, terminated by VICI_END
        !           252:  * @return                             message representation, NULL on error
        !           253:  */
        !           254: vici_message_t *vici_message_create_from_args(vici_type_t type, ...);
        !           255: 
        !           256: /**
        !           257:  * Check if a chunk has a printable string, and print it to buf.
        !           258:  *
        !           259:  * @param chunk                        chunk containing potential string
        !           260:  * @param buf                  buffer to write string to
        !           261:  * @param size                 size of buf
        !           262:  * @return                             TRUE if printable and string written to buf
        !           263:  */
        !           264: bool vici_stringify(chunk_t chunk, char *buf, size_t size);
        !           265: 
        !           266: /**
        !           267:  * Verify the occurrence of a given type for given section/list nesting
        !           268:  */
        !           269: bool vici_verify_type(vici_type_t type, u_int section, bool list);
        !           270: 
        !           271: #endif /** VICI_MESSAGE_H_ @}*/

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>