| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- /*
- * Copyright (C) 2015 Tobias Brunner
- * HSR Hochschule fuer Technik Rapperswil
- *
- * Copyright (C) 2014 Martin Willi
- * Copyright (C) 2014 revosec AG
- *
- * This program 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 2 of the License, or (at your
- * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
- *
- * This program 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.
- */
- /**
- * @defgroup vici_message vici_message
- * @{ @ingroup vici
- */
- #ifndef VICI_MESSAGE_H_
- #define VICI_MESSAGE_H_
- #include <library.h>
- typedef struct vici_message_t vici_message_t;
- typedef struct vici_parse_context_t vici_parse_context_t;
- typedef enum vici_type_t vici_type_t;
- /**
- * Vici message encoding types
- */
- enum vici_type_t {
- /** never used in an argument list, needed by dump as initial value */
- VICI_START = 0,
- /** begin of new section, argument is section name as char* */
- VICI_SECTION_START = 1,
- /** end of current section, no arguments */
- VICI_SECTION_END = 2,
- /** key/value, arguments are key as char*, value as chunk_t */
- VICI_KEY_VALUE = 3,
- /** list start, argument is list name as char* */
- VICI_LIST_START = 4,
- /** list item, argument is item value as chunk_t */
- VICI_LIST_ITEM = 5,
- /** end of list, no arguments */
- VICI_LIST_END = 6,
- /** end of argument list, no arguments (never encoded) */
- VICI_END = 7
- };
- /**
- * Callback function for key/value and list items, invoked by parse().
- *
- * @param user user data, as passed to parse()
- * @param message message currently parsing
- * @param name name of key or list
- * @param value parsed value
- * @return TRUE if parsed successfully
- */
- typedef bool (*vici_value_cb_t)(void *user, vici_message_t *message,
- char *name, chunk_t value);
- /**
- * Callback function for sections, invoked by parse().
- *
- * @param user user data, as passed to parse()
- * @param message message currently parsing
- * @param ctx parse context, to pass to recursive parse() invocations.
- * @param name name of the section
- * @return TRUE if parsed successfully
- */
- typedef bool (*vici_section_cb_t)(void *user, vici_message_t *message,
- vici_parse_context_t *ctx, char *name);
- /**
- * Names for vici encoding types
- */
- extern enum_name_t *vici_type_names;
- /**
- * Vici message representation, encoding/decoding routines.
- */
- struct vici_message_t {
- /**
- * Create an enumerator over message contents.
- *
- * The enumerator takes a fixed list of arguments, but depending on the
- * type may set not all of them. It returns VICI_END as last argument
- * to indicate the message end, and returns FALSE if parsing the message
- * failed.
- *
- * @return enumerator over (vici_type_t, char*, chunk_t)
- */
- enumerator_t* (*create_enumerator)(vici_message_t *this);
- /**
- * Get the value of a key/value pair as a string.
- *
- * @param def default value if not found
- * @param fmt printf style format string for key, with sections
- * @param ... arguments to fmt string
- * @return string
- */
- char* (*get_str)(vici_message_t *this, char *def, char *fmt, ...);
- /**
- * Get the value of a key/value pair as a string, va_list variant.
- *
- * @param def default value if not found
- * @param fmt printf style format string for key, with sections
- * @param args arguments to fmt string
- * @return string
- */
- char* (*vget_str)(vici_message_t *this, char *def, char *fmt, va_list args);
- /**
- * Get the value of a key/value pair as integer.
- *
- * @param def default value if not found
- * @param fmt printf style format string for key, with sections
- * @param ... arguments to fmt string
- * @return value
- */
- int (*get_int)(vici_message_t *this, int def, char *fmt, ...);
- /**
- * Get the value of a key/value pair as integer, va_list variant
- *
- * @param def default value if not found
- * @param fmt printf style format string for key, with sections
- * @param args arguments to fmt string
- * @return value
- */
- int (*vget_int)(vici_message_t *this, int def, char *fmt, va_list args);
- /**
- * Get the value of a key/value pair as boolean.
- *
- * @param def default value if not found
- * @param fmt printf style format string for key, with sections
- * @param ... arguments to fmt string
- * @return value
- */
- bool (*get_bool)(vici_message_t *this, bool def, char *fmt, ...);
- /**
- * Get the value of a key/value pair as boolean, va_list variant
- *
- * @param def default value if not found
- * @param fmt printf style format string for key, with sections
- * @param args arguments to fmt string
- * @return value
- */
- bool (*vget_bool)(vici_message_t *this, bool def, char *fmt, va_list args);
- /**
- * Get the raw value of a key/value pair.
- *
- * @param def default value if not found
- * @param fmt printf style format string for key, with sections
- * @param ... arguments to fmt string
- * @return value
- */
- chunk_t (*get_value)(vici_message_t *this, chunk_t def, char *fmt, ...);
- /**
- * Get the raw value of a key/value pair, va_list variant.
- *
- * @param def default value if not found
- * @param fmt printf style format string for key, with sections
- * @param args arguments to fmt string
- * @return value
- */
- chunk_t (*vget_value)(vici_message_t *this, chunk_t def,
- char *fmt, va_list args);
- /**
- * Get encoded message.
- *
- * @return message data, points to internal data
- */
- chunk_t (*get_encoding)(vici_message_t *this);
- /**
- * Parse a message using callback functions.
- *
- * Any of the callbacks may be NULL to skip this kind of item. Callbacks are
- * invoked for the current section level only. To descent into sections,
- * call parse() from within a section callback using the provided parse
- * context.
- *
- * @param ctx parse context, NULL for root level
- * @param section callback invoked for each section
- * @param kv callback invoked for key/value pairs
- * @param li callback invoked for list items
- * @param user user data to pass to callbacks
- * @return TRUE if parsed successfully
- */
- bool (*parse)(vici_message_t *this, vici_parse_context_t *ctx,
- vici_section_cb_t section, vici_value_cb_t kv,
- vici_value_cb_t li, void *user);
- /**
- * Dump a message text representation to a FILE stream.
- *
- * @param label label to print for message
- * @param pretty use pretty print with indentation
- * @param out FILE stream to dump to
- * @return TRUE if message valid
- */
- bool (*dump)(vici_message_t *this, char *label, bool pretty, FILE *out);
- /**
- * Destroy a vici_message_t.
- */
- void (*destroy)(vici_message_t *this);
- };
- /**
- * Create a vici_message from encoded data.
- *
- * @param data message encoding
- * @param cleanup TRUE to free data during
- * @return message representation
- */
- vici_message_t *vici_message_create_from_data(chunk_t data, bool cleanup);
- /**
- * Create a vici_message from an enumerator.
- *
- * The enumerator uses the same signature as the enumerator returned
- * by create_enumerator(), and gets destroyed by this function. It should
- * return VICI_END to close the message, return FALSE to indicate a failure.
- *
- * @param enumerator enumerator over (vici_type_t, char*, chunk_t)
- * @return message representation, NULL on error
- */
- vici_message_t *vici_message_create_from_enumerator(enumerator_t *enumerator);
- /**
- * Create vici message from a variable argument list.
- *
- * @param type first type beginning message
- * @param ... vici_type_t and args, terminated by VICI_END
- * @return message representation, NULL on error
- */
- vici_message_t *vici_message_create_from_args(vici_type_t type, ...);
- /**
- * Check if a chunk has a printable string, and print it to buf.
- *
- * @param chunk chunk containing potential string
- * @param buf buffer to write string to
- * @param size size of buf
- * @return TRUE if printable and string written to buf
- */
- bool vici_stringify(chunk_t chunk, char *buf, size_t size);
- /**
- * Verify the occurrence of a given type for given section/list nesting
- */
- bool vici_verify_type(vici_type_t type, u_int section, bool list);
- #endif /** VICI_MESSAGE_H_ @}*/
|