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