diff options
Diffstat (limited to 'include/plist')
| -rw-r--r-- | include/plist/plist.h | 332 | 
1 files changed, 306 insertions, 26 deletions
diff --git a/include/plist/plist.h b/include/plist/plist.h index 76ce0ec..2c0df11 100644 --- a/include/plist/plist.h +++ b/include/plist/plist.h @@ -29,72 +29,352 @@ extern "C" {  #include <stdint.h>  #include <sys/types.h> +/** + * \mainpage libplist : A library to handle Apple Property Lists + * \defgroup PublicAPI Public libplist API + */ +/*@{*/ + + +/** + * The basic plist abstract data type. + */  typedef void* plist_t; +/** + * The enumeration of plist node types. + */  typedef enum { -	PLIST_BOOLEAN, -	PLIST_UINT, -	PLIST_REAL, -	PLIST_STRING, -	PLIST_UNICODE, -	PLIST_ARRAY, -	PLIST_DICT, -	PLIST_DATE, -	PLIST_DATA, -	PLIST_KEY, -	PLIST_NONE +	PLIST_BOOLEAN,  /**< Boolean, scalar type */ +	PLIST_UINT,     /**< Unsigned integer, scalar type */ +	PLIST_REAL,     /**< Real, scalar type */ +	PLIST_STRING,   /**< ASCII string, scalar type */ +	PLIST_UNICODE,  /**< Unicode strin, scalar type */ +	PLIST_ARRAY,    /**< Ordered array, structured type */ +	PLIST_DICT,     /**< Unordered dictionary (key/value pair), structured type */ +	PLIST_DATE,     /**< Date, scalar type */ +	PLIST_DATA,     /**< Binary data, scalar type */ +	PLIST_KEY,      /**< Key in dictionaries (ASCII String), scalar type */ +	PLIST_NONE      /**< No type */  } plist_type; -//Plist creation and edition -//utilitary functions to create root nodes (supposed to be dict or array) + +/******************************************** + *                                          * + *          Creation & Destruction          * + *                                          * + ********************************************/ + +/** + * Create a new root plist_t type #PLIST_DICT + * + * @return the created plist + * @sa #plist_type + */  plist_t plist_new_dict(); + +/** + * Create a new root plist_t type #PLIST_ARRAY + * + * @return the created plist + * @sa #plist_type + */  plist_t plist_new_array(); +/** + * Destruct a plist_t node and all its children recursively + * + * @param plist the plist to free + */ +void plist_free(plist_t plist); -//Plist edition, only work for dict and array node +/******************************************** + *                                          * + *            Tree navigation               * + *                                          * + ********************************************/ + +/** + * Get the first child of a node + * + * @param node the first child + */ +plist_t plist_get_first_child(plist_t node); + + +/** + * Get the next sibling of a node + * + * @param node the next sibling + */ +plist_t plist_get_next_sibling(plist_t node); + + +/** + * Get the previous sibling of a node + * + * @param node the previous sibling + */ +plist_t plist_get_prev_sibling(plist_t node); + +/******************************************** + *                                          * + *                Setters                   * + *                                          * + ********************************************/ + +/** + * Add a subnode to a node. The node must be of a structured type + * (ie #PLIST_DICT or #PLIST_ARRAY). This function fails silently + * if subnode already has a father. + * + * @param node the node to add a children to + * @param subnode the children node + */  void plist_add_sub_node(plist_t node, plist_t subnode); +/** + * Add a subnode of type #PLIST_KEY to a node. The node must be of a structured type + * (ie #PLIST_DICT or #PLIST_ARRAY). + * + * @param node the node to add a children to + * @param val the key value encoded as an ASCII string (must be null terminated) + */  void plist_add_sub_key_el(plist_t node, const char* val); + +/** + * Add a subnode of type #PLIST_STRING to a node. The node must be of a structured type + * (ie #PLIST_DICT or #PLIST_ARRAY). + * + * @param node the node to add a children to + * @param val the string value encoded as an ASCII string (must be null terminated) + */  void plist_add_sub_string_el(plist_t node, const char* val); + +/** + * Add a subnode of type #PLIST_BOOLEAN to a node. The node must be of a structured type + * (ie #PLIST_DICT or #PLIST_ARRAY). + * + * @param node the node to add a children to + * @param val the boolean value (TRUE or FALSE) + */  void plist_add_sub_bool_el(plist_t node, uint8_t val); + +/** + * Add a subnode of type #PLIST_UINT to a node. The node must be of a structured type + * (ie #PLIST_DICT or #PLIST_ARRAY). + * + * @param node the node to add a children to + * @param val the unsigned integer value + */  void plist_add_sub_uint_el(plist_t node, uint64_t val); + +/** + * Add a subnode of type #PLIST_REAL to a node. The node must be of a structured type + * (ie #PLIST_DICT or #PLIST_ARRAY). + * + * @param node the node to add a children to + * @param val the real value + */  void plist_add_sub_real_el(plist_t node, double val); + +/** + * Add a subnode of type #PLIST_DATA to a node. The node must be of a structured type + * (ie #PLIST_DICT or #PLIST_ARRAY). + * + * @param node the node to add a children to + * @param val the binary buffer + * @param length the length of the buffer + */  void plist_add_sub_data_el(plist_t node, const char* val, uint64_t length); + +/** + * Add a subnode of type #PLIST_UNICODE to a node. The node must be of a structured type + * (ie #PLIST_DICT or #PLIST_ARRAY). + * + * @param node the node to add a children to + * @param val the unicode string encoded in UTF-8 (must be null terminated) + */  void plist_add_sub_unicode_el(plist_t node, const char* val); -void plist_add_sub_date_el(plist_t node, int32_t sec, int32_t usec); -//plist free -void plist_free(plist_t plist); +/** + * Add a subnode of type #PLIST_DATE to a node. The node must be of a structured type + * (ie #PLIST_DICT or #PLIST_ARRAY). + * + * @param node the node to add a children to + * @param sec the number of seconds since 01/01/2001 + * @param usec the number of microseconds + */ +void plist_add_sub_date_el(plist_t node, int32_t sec, int32_t usec); -//plist navigation -plist_t plist_get_first_child(plist_t node); -plist_t plist_get_next_sibling(plist_t node); -plist_t plist_get_prev_sibling(plist_t node); -//utili function to find first (and only the first encountred) corresponding node -plist_t plist_find_node_by_key(plist_t plist, const char *value); -plist_t plist_find_node_by_string(plist_t plist, const char *value); +/******************************************** + *                                          * + *                Getters                   * + *                                          * + ********************************************/ -//Plist reading +/** + * Get the #plist_type of a node. + * + * @param node the node + * @return the type of the node + */  plist_type plist_get_node_type(plist_t node); +/** + * Get the value of a #PLIST_KEY node. + * This function does nothing if node is not of type #PLIST_KEY + * + * @param node the node + * @param val a pointer to a C-string. This function allocates the memory, + *            caller is responsible for freeing it. + */  void plist_get_key_val(plist_t node, char** val); + +/** + * Get the value of a #PLIST_STRING node. + * This function does nothing if node is not of type #PLIST_STRING + * + * @param node the node + * @param val a pointer to a C-string. This function allocates the memory, + *            caller is responsible for freeing it. + */  void plist_get_string_val(plist_t node, char** val); + +/** + * Get the value of a #PLIST_BOOLEAN node. + * This function does nothing if node is not of type #PLIST_BOOLEAN + * + * @param node the node + * @param val a pointer to a uint8_t variable. + */  void plist_get_bool_val(plist_t node, uint8_t* val); + +/** + * Get the value of a #PLIST_UINT node. + * This function does nothing if node is not of type #PLIST_UINT + * + * @param node the node + * @param val a pointer to a uint64_t variable. + */  void plist_get_uint_val(plist_t node, uint64_t* val); + +/** + * Get the value of a #PLIST_REAL node. + * This function does nothing if node is not of type #PLIST_REAL + * + * @param node the node + * @param val a pointer to a double variable. + */  void plist_get_real_val(plist_t node, double* val); + +/** + * Get the value of a #PLIST_DATA node. + * This function does nothing if node is not of type #PLIST_DATA + * + * @param node the node + * @param val a pointer to an unallocated char buffer. This function allocates the memory, + *            caller is responsible for freeing it. + */  void plist_get_data_val(plist_t node, char** val, uint64_t* length); + +/** + * Get the value of a #PLIST_UNICODE node. + * This function does nothing if node is not of type #PLIST_UNICODE + * + * @param node the node + * @param val a pointer to a C-string. This function allocates the memory, + *            caller is responsible for freeing it. Data is UTF-8 encoded. + */  void plist_get_unicode_val(plist_t node, char** val); + +/** + * Get the value of a #PLIST_DATE node. + * This function does nothing if node is not of type #PLIST_DATE + * + * @param node the node + * @param sec a pointer to an int32_t variable. Represents the number of seconds since 01/01/2001. + * @param usec a pointer to an int32_t variable. Represents the number of microseconds + */  void plist_get_date_val(plist_t node, int32_t* sec, int32_t* usec); -//import and export functions + +/******************************************** + *                                          * + *            Import & Export               * + *                                          * + ********************************************/ + +/** + * Export the #plist_t structure to XML format. + * + * @param plist the root node to export + * @param plist_xml a pointer to a C-string. This function allocates the memory, + *            caller is responsible for freeing it. Data is UTF-8 encoded. + * @param length a pointer to an uint32_t variable. Represents the length of the allocated buffer. + */  void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length); + +/** + * Export the #plist_t structure to binary format. + * + * @param plist the root node to export + * @param plist_bin a pointer to a char* buffer. This function allocates the memory, + *            caller is responsible for freeing it. + * @param length a pointer to an uint32_t variable. Represents the length of the allocated buffer. + */  void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length); +/** + * Import the #plist_t structure from XML format. + * + * @param plist_xml a pointer to the xml buffer. + * @param length length of the buffer to read. + * @param plist a pointer to the imported plist. + */  void plist_from_xml(const char *plist_xml, uint32_t length, plist_t * plist); + +/** + * Import the #plist_t structure from binary format. + * + * @param plist_bin a pointer to the xml buffer. + * @param length length of the buffer to read. + * @param plist a pointer to the imported plist. + */  void plist_from_bin(const char *plist_bin, uint32_t length, plist_t * plist); + + +/******************************************** + *                                          * + *                 Utils                    * + *                                          * + ********************************************/ + +/** + * Find the first encountered #PLIST_KEY node mathing that key. + * Search is breath first order. + * + * @param plist the root node of the plist structure. + * @param value the ASCII Key to match. + */ +plist_t plist_find_node_by_key(plist_t plist, const char *value); + +/** + * Find the first encountered #PLIST_STRING node mathing that string. + * Search is breath first order. + * + * @param plist the root node of the plist structure. + * @param value the ASCII String to match. + */ +plist_t plist_find_node_by_string(plist_t plist, const char *value); + + +/*@}*/ + +  #ifdef __cplusplus  }  #endif  | 
