1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ 2 3 /* 4 * GThumb 5 * 6 * Copyright (C) 2008 Free Software Foundation, Inc. 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 20 */ 21 22 #ifndef DOM_H 23 #define DOM_H 24 25 #include <glib.h> 26 #include <glib-object.h> 27 28 G_BEGIN_DECLS 29 30 #define DOM_ERROR dom_error_quark () 31 typedef enum { 32 DOM_ERROR_FAILED, 33 DOM_ERROR_INVALID_FORMAT 34 } DomErrorEnum; 35 36 #define DOM_TYPE_ELEMENT (dom_element_get_type ()) 37 #define DOM_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DOM_TYPE_ELEMENT, DomElement)) 38 #define DOM_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DOM_TYPE_ELEMENT, DomElementClass)) 39 #define DOM_IS_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DOM_TYPE_ELEMENT)) 40 #define DOM_IS_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DOM_TYPE_ELEMENT)) 41 #define DOM_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DOM_TYPE_ELEMENT, DomElementClass)) 42 43 typedef struct _DomElement DomElement; 44 typedef struct _DomElementClass DomElementClass; 45 typedef struct _DomElementPrivate DomElementPrivate; 46 47 #define DOM_TYPE_TEXT_NODE (dom_text_node_get_type ()) 48 #define DOM_TEXT_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DOM_TYPE_TEXT_NODE, DomTextNode)) 49 #define DOM_TEXT_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DOM_TYPE_TEXT_NODE, DomTextNodeClass)) 50 #define DOM_IS_TEXT_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DOM_TYPE_TEXT_NODE)) 51 #define DOM_IS_TEXT_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DOM_TYPE_TEXT_NODE)) 52 #define DOM_TEXT_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DOM_TYPE_TEXT_NODE, DomTextNodeClass)) 53 54 typedef struct _DomTextNode DomTextNode; 55 typedef struct _DomTextNodeClass DomTextNodeClass; 56 typedef struct _DomTextNodePrivate DomTextNodePrivate; 57 58 #define DOM_TYPE_DOCUMENT (dom_document_get_type ()) 59 #define DOM_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DOM_TYPE_DOCUMENT, DomDocument)) 60 #define DOM_DOCUMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DOM_TYPE_DOCUMENT, DomDocumentClass)) 61 #define DOM_IS_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DOM_TYPE_DOCUMENT)) 62 #define DOM_IS_DOCUMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DOM_TYPE_DOCUMENT)) 63 #define DOM_DOCUMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DOM_TYPE_DOCUMENT, DomDocumentClass)) 64 65 typedef struct _DomDocument DomDocument; 66 typedef struct _DomDocumentClass DomDocumentClass; 67 typedef struct _DomDocumentPrivate DomDocumentPrivate; 68 69 #define DOM_TYPE_DOMIZABLE (dom_domizable_get_type ()) 70 #define DOM_DOMIZABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DOM_TYPE_DOMIZABLE, DomDomizable)) 71 #define DOM_IS_DOMIZABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DOM_TYPE_DOMIZABLE)) 72 #define DOM_DOMIZABLE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), DOM_TYPE_DOMIZABLE, DomDomizableInterface)) 73 74 typedef struct _DomDomizable DomDomizable; 75 typedef struct _DomDomizableInterface DomDomizableInterface; 76 77 struct _DomElement { 78 GInitiallyUnowned parent_instance; 79 DomElementPrivate *priv; 80 81 char *tag_name; 82 char *prefix; 83 GHashTable *attributes; 84 DomElement *next_sibling; 85 DomElement *previous_sibling; 86 DomElement *parent_node; 87 GList *child_nodes; 88 DomElement *first_child; 89 DomElement *last_child; 90 }; 91 92 struct _DomElementClass { 93 GInitiallyUnownedClass parent_class; 94 95 char * (*dump) (DomElement *self, 96 int level); 97 gboolean (*equal) (DomElement *self, 98 DomElement *other); 99 }; 100 101 struct _DomTextNode { 102 DomElement parent_instance; 103 DomTextNodePrivate *priv; 104 105 char *data; 106 }; 107 108 struct _DomTextNodeClass { 109 DomElementClass parent_class; 110 }; 111 112 struct _DomDocument { 113 DomElement parent_instance; 114 DomDocumentPrivate *priv; 115 }; 116 117 struct _DomDocumentClass { 118 DomElementClass parent_class; 119 }; 120 121 struct _DomDomizableInterface { 122 GTypeInterface parent_iface; 123 124 DomElement * (*create_element) (DomDomizable *self, 125 DomDocument *doc); 126 void (*load_from_element) (DomDomizable *self, 127 DomElement *e); 128 }; 129 130 GQuark dom_error_quark (void); 131 132 /* DomElement */ 133 134 GType dom_element_get_type (void); 135 void dom_element_append_child (DomElement *self, 136 DomElement *child); 137 const char * dom_element_get_attribute (DomElement *self, 138 const char *name); 139 int dom_element_get_attribute_as_int (DomElement *self, 140 const char *name); 141 gboolean dom_element_has_attribute (DomElement *self, 142 const char *name); 143 gboolean dom_element_has_child_nodes (DomElement *self); 144 void dom_element_remove_attribute (DomElement *self, 145 const char *name); 146 DomElement * dom_element_remove_child (DomElement *self, 147 DomElement *node); 148 void dom_element_replace_child (DomElement *self, 149 DomElement *new_child, 150 DomElement *old_child); 151 void dom_element_set_attribute (DomElement *self, 152 const char *name, 153 const char *value); 154 const char * dom_element_get_inner_text (DomElement *self); 155 156 /* DomTextNode */ 157 158 GType dom_text_node_get_type (void); 159 160 /* DomDocument */ 161 162 GType dom_document_get_type (void); 163 DomDocument * dom_document_new (void); 164 DomElement * dom_document_create_element (DomDocument *self, 165 const char *tag_name, 166 ...) G_GNUC_NULL_TERMINATED; 167 DomElement * dom_document_create_text_node (DomDocument *self, 168 const char *data); 169 DomElement * dom_document_create_element_with_text (DomDocument *self, 170 const char *text, 171 const char *tag_name, 172 ...) G_GNUC_NULL_TERMINATED; 173 char * dom_document_dump (DomDocument *self, 174 gsize *len); 175 gboolean dom_document_load (DomDocument *self, 176 const char *xml, 177 gssize len, 178 GError **error); 179 gboolean dom_document_equal (DomDocument *a, 180 DomDocument *b); 181 182 /* DomDomizable */ 183 184 GType dom_domizable_get_type (void); 185 DomElement * dom_domizable_create_element (DomDomizable *self, 186 DomDocument *doc); 187 void dom_domizable_load_from_element (DomDomizable *self, 188 DomElement *e); 189 190 /* Utilities */ 191 192 gboolean dom_str_equal (const char *a, 193 const char *b); 194 int dom_str_find (const char *a, 195 const char *b); 196 197 G_END_DECLS 198 199 #endif /* DOM_H */ 200