Frameworks/libpurple.framework/Versions/0.6.2/Headers/xmlnode.h
author Zachary West <zacw@adium.im>
Fri Aug 21 13:25:11 2009 -0700 (2009-08-21)
changeset 2592 e8d15275025e
parent 2571 Frameworks/libpurple.framework/Versions/0.6.0/Headers/xmlnode.h@75fb8ee8f2e6
permissions -rw-r--r--
im.pidgin.adium.1-4 at 267c6165e02e34318a1823960bd04c0639952f73
Evan@653
     1
/**
Evan@653
     2
 * @file xmlnode.h XML DOM functions
Evan@653
     3
 * @ingroup core
Evan@653
     4
 */
Evan@653
     5
Evan@653
     6
/* purple
Evan@653
     7
 *
Evan@653
     8
 * Purple is the legal property of its developers, whose names are too numerous
Evan@653
     9
 * to list here.  Please refer to the COPYRIGHT file distributed with this
Evan@653
    10
 * source distribution.
Evan@653
    11
 *
Evan@653
    12
 * This program is free software; you can redistribute it and/or modify
Evan@653
    13
 * it under the terms of the GNU General Public License as published by
Evan@653
    14
 * the Free Software Foundation; either version 2 of the License, or
Evan@653
    15
 * (at your option) any later version.
Evan@653
    16
 *
Evan@653
    17
 * This program is distributed in the hope that it will be useful,
Evan@653
    18
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Evan@653
    19
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Evan@653
    20
 * GNU General Public License for more details.
Evan@653
    21
 *
Evan@653
    22
 * You should have received a copy of the GNU General Public License
Evan@653
    23
 * along with this program; if not, write to the Free Software
Evan@653
    24
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
Evan@653
    25
 */
Evan@653
    26
#ifndef _PURPLE_XMLNODE_H_
Evan@653
    27
#define _PURPLE_XMLNODE_H_
Evan@653
    28
Evan@1427
    29
#include <glib.h>
Evan@1427
    30
Evan@653
    31
#ifdef __cplusplus
Evan@653
    32
extern "C" {
Evan@653
    33
#endif
Evan@653
    34
Evan@653
    35
/**
Evan@653
    36
 * The valid types for an xmlnode
Evan@653
    37
 */
Evan@653
    38
typedef enum _XMLNodeType
Evan@653
    39
{
Evan@653
    40
	XMLNODE_TYPE_TAG,		/**< Just a tag */
Evan@653
    41
	XMLNODE_TYPE_ATTRIB,		/**< Has attributes */
Evan@653
    42
	XMLNODE_TYPE_DATA		/**< Has data */
Evan@653
    43
} XMLNodeType;
Evan@653
    44
Evan@653
    45
/**
Evan@653
    46
 * An xmlnode.
Evan@653
    47
 */
Evan@653
    48
typedef struct _xmlnode xmlnode;
Evan@653
    49
struct _xmlnode
Evan@653
    50
{
Evan@653
    51
	char *name;			/**< The name of the node. */
Evan@653
    52
	char *xmlns;		/**< The namespace of the node */
Evan@653
    53
	XMLNodeType type;		/**< The type of the node. */
Evan@653
    54
	char *data;			/**< The data for the node. */
Evan@653
    55
	size_t data_sz;			/**< The size of the data. */
Evan@2571
    56
	xmlnode *parent;            /**< The parent node or @c NULL.*/
Evan@2571
    57
	xmlnode *child;             /**< The child node or @c NULL.*/
Evan@2571
    58
	xmlnode *lastchild;         /**< The last child node or @c NULL.*/
Evan@2571
    59
	xmlnode *next;              /**< The next node or @c NULL. */
Evan@653
    60
	char *prefix;               /**< The namespace prefix if any. */
Evan@653
    61
	GHashTable *namespace_map;  /**< The namespace map. */
Evan@653
    62
};
Evan@653
    63
Evan@653
    64
/**
Evan@653
    65
 * Creates a new xmlnode.
Evan@653
    66
 *
Evan@653
    67
 * @param name The name of the node.
Evan@653
    68
 *
Evan@653
    69
 * @return The new node.
Evan@653
    70
 */
Evan@653
    71
xmlnode *xmlnode_new(const char *name);
Evan@653
    72
Evan@653
    73
/**
Evan@653
    74
 * Creates a new xmlnode child.
Evan@653
    75
 *
Evan@653
    76
 * @param parent The parent node.
Evan@653
    77
 * @param name   The name of the child node.
Evan@653
    78
 *
Evan@653
    79
 * @return The new child node.
Evan@653
    80
 */
Evan@653
    81
xmlnode *xmlnode_new_child(xmlnode *parent, const char *name);
Evan@653
    82
Evan@653
    83
/**
Evan@653
    84
 * Inserts a node into a node as a child.
Evan@653
    85
 *
Evan@653
    86
 * @param parent The parent node to insert child into.
Evan@653
    87
 * @param child  The child node to insert into parent.
Evan@653
    88
 */
Evan@653
    89
void xmlnode_insert_child(xmlnode *parent, xmlnode *child);
Evan@653
    90
Evan@653
    91
/**
Evan@653
    92
 * Gets a child node named name.
Evan@653
    93
 *
Evan@653
    94
 * @param parent The parent node.
Evan@653
    95
 * @param name   The child's name.
Evan@653
    96
 *
Evan@653
    97
 * @return The child or NULL.
Evan@653
    98
 */
Evan@653
    99
xmlnode *xmlnode_get_child(const xmlnode *parent, const char *name);
Evan@653
   100
Evan@653
   101
/**
Evan@653
   102
 * Gets a child node named name in a namespace.
Evan@653
   103
 *
Evan@653
   104
 * @param parent The parent node.
Evan@653
   105
 * @param name   The child's name.
Evan@653
   106
 * @param xmlns  The namespace.
Evan@653
   107
 *
Evan@653
   108
 * @return The child or NULL.
Evan@653
   109
 */
Evan@653
   110
xmlnode *xmlnode_get_child_with_namespace(const xmlnode *parent, const char *name, const char *xmlns);
Evan@653
   111
Evan@653
   112
/**
Evan@653
   113
 * Gets the next node with the same name as node.
Evan@653
   114
 *
Evan@653
   115
 * @param node The node of a twin to find.
Evan@653
   116
 *
Evan@653
   117
 * @return The twin of node or NULL.
Evan@653
   118
 */
Evan@653
   119
xmlnode *xmlnode_get_next_twin(xmlnode *node);
Evan@653
   120
Evan@653
   121
/**
Evan@653
   122
 * Inserts data into a node.
Evan@653
   123
 *
Evan@653
   124
 * @param node   The node to insert data into.
Evan@653
   125
 * @param data   The data to insert.
Evan@653
   126
 * @param size   The size of the data to insert.  If data is
Evan@653
   127
 *               null-terminated you can pass in -1.
Evan@653
   128
 */
Evan@653
   129
void xmlnode_insert_data(xmlnode *node, const char *data, gssize size);
Evan@653
   130
Evan@653
   131
/**
Evan@653
   132
 * Gets (escaped) data from a node.
Evan@653
   133
 *
Evan@653
   134
 * @param node The node to get data from.
Evan@653
   135
 *
Evan@653
   136
 * @return The data from the node or NULL. This data is in raw escaped format.
Evan@653
   137
 *         You must g_free this string when finished using it.
Evan@653
   138
 */
zacw@2504
   139
char *xmlnode_get_data(const xmlnode *node);
Evan@653
   140
Evan@653
   141
/**
Evan@653
   142
 * Gets unescaped data from a node.
Evan@653
   143
 *
Evan@653
   144
 * @param node The node to get data from.
Evan@653
   145
 *
Evan@653
   146
 * @return The data from the node, in unescaped form.   You must g_free
Evan@653
   147
 *         this string when finished using it.
Evan@653
   148
 */
zacw@2504
   149
char *xmlnode_get_data_unescaped(const xmlnode *node);
Evan@653
   150
Evan@653
   151
/**
Evan@653
   152
 * Sets an attribute for a node.
Evan@653
   153
 *
Evan@653
   154
 * @param node  The node to set an attribute for.
Evan@653
   155
 * @param attr  The name of the attribute.
Evan@653
   156
 * @param value The value of the attribute.
Evan@653
   157
 */
Evan@653
   158
void xmlnode_set_attrib(xmlnode *node, const char *attr, const char *value);
Evan@653
   159
Evan@1427
   160
#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_XMLNODE_C_)
Evan@653
   161
/**
Evan@653
   162
 * Sets a prefixed attribute for a node
Evan@653
   163
 *
Evan@653
   164
 * @param node   The node to set an attribute for.
Evan@653
   165
 * @param attr   The name of the attribute to set
Evan@653
   166
 * @param prefix The prefix of the attribute to ste
Evan@653
   167
 * @param value  The value of the attribute
Evan@1427
   168
 *
Evan@1427
   169
 * @deprecated Use xmlnode_set_attrib_full instead.
Evan@653
   170
 */
Evan@653
   171
void xmlnode_set_attrib_with_prefix(xmlnode *node, const char *attr, const char *prefix, const char *value);
Evan@653
   172
Evan@653
   173
/**
Evan@653
   174
 * Sets a namespaced attribute for a node
Evan@653
   175
 *
Evan@653
   176
 * @param node  The node to set an attribute for.
Evan@653
   177
 * @param attr  The name of the attribute to set
Evan@653
   178
 * @param xmlns The namespace of the attribute to ste
Evan@653
   179
 * @param value The value of the attribute
Evan@1427
   180
 *
Evan@1427
   181
 * @deprecated Use xmlnode_set_attrib_full instead.
Evan@653
   182
 */
Evan@653
   183
void xmlnode_set_attrib_with_namespace(xmlnode *node, const char *attr, const char *xmlns, const char *value);
Evan@1427
   184
#endif /* PURPLE_DISABLE_DEPRECATED */
Evan@1427
   185
Evan@1427
   186
/**
Evan@1427
   187
 * Sets a namespaced attribute for a node
Evan@1427
   188
 *
Evan@1427
   189
 * @param node   The node to set an attribute for.
Evan@1427
   190
 * @param attr   The name of the attribute to set
Evan@1427
   191
 * @param xmlns  The namespace of the attribute to ste
Evan@1427
   192
 * @param prefix The prefix of the attribute to ste
Evan@1427
   193
 * @param value  The value of the attribute
Evan@1427
   194
 *
Evan@1427
   195
 * @since 2.6.0
Evan@1427
   196
 */
Evan@1427
   197
void xmlnode_set_attrib_full(xmlnode *node, const char *attr, const char *xmlns,
Evan@1427
   198
	const char *prefix, const char *value);
Evan@653
   199
Evan@653
   200
/**
Evan@653
   201
 * Gets an attribute from a node.
Evan@653
   202
 *
Evan@653
   203
 * @param node The node to get an attribute from.
Evan@653
   204
 * @param attr The attribute to get.
Evan@653
   205
 *
Evan@653
   206
 * @return The value of the attribute.
Evan@653
   207
 */
Evan@653
   208
const char *xmlnode_get_attrib(xmlnode *node, const char *attr);
Evan@653
   209
Evan@653
   210
/**
Evan@653
   211
 * Gets a namespaced attribute from a node
Evan@653
   212
 *
Evan@653
   213
 * @param node  The node to get an attribute from.
Evan@653
   214
 * @param attr  The attribute to get
Evan@653
   215
 * @param xmlns The namespace of the attribute to get
Evan@653
   216
 *
Evan@653
   217
 * @return The value of the attribute/
Evan@653
   218
 */
Evan@653
   219
const char *xmlnode_get_attrib_with_namespace(xmlnode *node, const char *attr, const char *xmlns);
Evan@653
   220
Evan@653
   221
/**
Evan@653
   222
 * Removes an attribute from a node.
Evan@653
   223
 *
Evan@653
   224
 * @param node The node to remove an attribute from.
Evan@653
   225
 * @param attr The attribute to remove.
Evan@653
   226
 */
Evan@653
   227
void xmlnode_remove_attrib(xmlnode *node, const char *attr);
Evan@653
   228
Evan@653
   229
/**
Evan@653
   230
 * Removes a namespaced attribute from a node
Evan@653
   231
 *
Evan@653
   232
 * @param node  The node to remove an attribute from
Evan@653
   233
 * @param attr  The attribute to remove
Evan@653
   234
 * @param xmlns The namespace of the attribute to remove
Evan@653
   235
 */
Evan@653
   236
void xmlnode_remove_attrib_with_namespace(xmlnode *node, const char *attr, const char *xmlns);
Evan@653
   237
Evan@653
   238
/**
Evan@653
   239
 * Sets the namespace of a node
Evan@653
   240
 *
Evan@653
   241
 * @param node The node to qualify
Evan@653
   242
 * @param xmlns The namespace of the node
Evan@653
   243
 */
Evan@653
   244
void xmlnode_set_namespace(xmlnode *node, const char *xmlns);
Evan@653
   245
Evan@653
   246
/**
Evan@653
   247
 * Returns the namespace of a node
Evan@653
   248
 *
Evan@653
   249
 * @param node The node to get the namepsace from
Evan@653
   250
 * @return The namespace of this node
Evan@653
   251
 */
Evan@653
   252
const char *xmlnode_get_namespace(xmlnode *node);
Evan@653
   253
Evan@653
   254
/**
Evan@653
   255
 * Sets the prefix of a node
Evan@653
   256
 *
Evan@653
   257
 * @param node   The node to qualify
Evan@653
   258
 * @param prefix The prefix of the node
Evan@653
   259
 */
Evan@653
   260
void xmlnode_set_prefix(xmlnode *node, const char *prefix);
Evan@653
   261
Evan@653
   262
/**
Evan@653
   263
 * Returns the prefix of a node
Evan@653
   264
 *
Evan@653
   265
 * @param node The node to get the prefix from
Evan@653
   266
 * @return The prefix of this node
Evan@653
   267
 */
Evan@770
   268
const char *xmlnode_get_prefix(const xmlnode *node);
Evan@653
   269
Evan@653
   270
/**
zacw@1759
   271
 * Gets the parent node.
zacw@1759
   272
 *
zacw@1759
   273
 * @param child The child node.
zacw@1759
   274
 *
zacw@1759
   275
 * @return The parent or NULL.
zacw@1759
   276
 *
zacw@1759
   277
 * @since 2.6.0
zacw@1759
   278
 */
zacw@1759
   279
xmlnode *xmlnode_get_parent(const xmlnode *child);
zacw@1759
   280
zacw@1759
   281
/**
Evan@653
   282
 * Returns the node in a string of xml.
Evan@653
   283
 *
Evan@653
   284
 * @param node The starting node to output.
Evan@653
   285
 * @param len  Address for the size of the string.
Evan@653
   286
 *
Evan@653
   287
 * @return The node represented as a string.  You must
Evan@653
   288
 *         g_free this string when finished using it.
Evan@653
   289
 */
Evan@770
   290
char *xmlnode_to_str(const xmlnode *node, int *len);
Evan@653
   291
Evan@653
   292
/**
Evan@653
   293
 * Returns the node in a string of human readable xml.
Evan@653
   294
 *
Evan@653
   295
 * @param node The starting node to output.
Evan@653
   296
 * @param len  Address for the size of the string.
Evan@653
   297
 *
Evan@653
   298
 * @return The node as human readable string including
Evan@653
   299
 *         tab and new line characters.  You must
Evan@653
   300
 *         g_free this string when finished using it.
Evan@653
   301
 */
Evan@770
   302
char *xmlnode_to_formatted_str(const xmlnode *node, int *len);
Evan@653
   303
Evan@653
   304
/**
Evan@653
   305
 * Creates a node from a string of XML.  Calling this on the
Evan@653
   306
 * root node of an XML document will parse the entire document
Evan@653
   307
 * into a tree of nodes, and return the xmlnode of the root.
Evan@653
   308
 *
Evan@653
   309
 * @param str  The string of xml.
Evan@653
   310
 * @param size The size of the string, or -1 if @a str is
Evan@653
   311
 *             NUL-terminated.
Evan@653
   312
 *
Evan@653
   313
 * @return The new node.
Evan@653
   314
 */
Evan@653
   315
xmlnode *xmlnode_from_str(const char *str, gssize size);
Evan@653
   316
Evan@653
   317
/**
Evan@653
   318
 * Creates a new node from the source node.
Evan@653
   319
 *
Evan@653
   320
 * @param src The node to copy.
Evan@653
   321
 *
Evan@653
   322
 * @return A new copy of the src node.
Evan@653
   323
 */
Evan@653
   324
xmlnode *xmlnode_copy(const xmlnode *src);
Evan@653
   325
Evan@653
   326
/**
Evan@653
   327
 * Frees a node and all of its children.
Evan@653
   328
 *
Evan@653
   329
 * @param node The node to free.
Evan@653
   330
 */
Evan@653
   331
void xmlnode_free(xmlnode *node);
Evan@653
   332
Evan@1427
   333
/**
Evan@1427
   334
 * Creates a node from a XML File.  Calling this on the
Evan@1427
   335
 * root node of an XML document will parse the entire document
Evan@1427
   336
 * into a tree of nodes, and return the xmlnode of the root.
Evan@1427
   337
 *
zacw@2069
   338
 * @param dir  The directory where the file is located
zacw@2069
   339
 * @param filename  The filename
zacw@2069
   340
 * @param description  A description of the file being parsed. Displayed to
zacw@2069
   341
 * 			the user if the file cannot be read.
zacw@2069
   342
 * @param process  The subsystem that is calling xmlnode_from_file. Used as
zacw@2069
   343
 * 			the category for debugging.
Evan@1427
   344
 *
zacw@2069
   345
 * @return The new node or NULL if an error occurred.
Evan@1427
   346
 *
Evan@1427
   347
 * @since 2.6.0
Evan@1427
   348
 */
Evan@1427
   349
xmlnode *xmlnode_from_file(const char *dir, const char *filename,
Evan@1427
   350
			   const char *description, const char *process);
Evan@1427
   351
Evan@653
   352
#ifdef __cplusplus
Evan@653
   353
}
Evan@653
   354
#endif
Evan@653
   355
Evan@653
   356
#endif /* _PURPLE_XMLNODE_H_ */