Annotation of win32/gnome/gdome2-x.x.x/libgdome/gdomecore/gdome-xml-pi.c, revision 1.2
1.1 paf 1: /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */
2: /* gdome-xml-pi.c
3: *
4: * Copyright (C) 1999 Raph Levien <raph@acm.org>
5: * Copyright (C) 2000 Mathieu Lacage <mathieu@gnu.org>
6: * Copyright (C) 2001 Paolo Casarini <paolo@casarini.org>
7: *
8: * This library is free software; you can redistribute it and/or
9: * modify it under the terms of the GNU Lesser General Public
10: * License as published by the Free Software Foundation; either
11: * version 2.1 of the License, or (at your option) any later version.
12: *
13: * This library 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 GNU
16: * Lesser General Public License for more details.
17: *
18: * You should have received a copy of the GNU Lesser General Public
19: * License along with this library; if not, write to the Free Software
20: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21: */
22:
23: #include <stdlib.h>
24: #include <string.h>
25: #include <glib.h>
26: #include "gdome.h"
27: #include "gdome-events.h"
28: #include <libxml/tree.h>
29: #include <libxml/parser.h>
30: #include <libxml/xmlmemory.h>
31: #include "gdome-xml-util.h"
32: #include "gdome-xml-str.h"
33: #include "gdome-xml-node.h"
34: #include "gdome-xml-xmlutil.h"
35: #include "gdome-evt-event.h"
36: #include "gdome-evt-mevent.h"
37: #include "gdome-evt-propagation.h"
38: #include "gdome-xml-pi.h"
39: #include "gdome-xml-document.h"
40:
41: const GdomeProcessingInstructionVtab gdome_xml_pi_vtab = {
42: {
43: gdome_xml_n_ref,
44: gdome_xml_n_unref,
45: gdome_xml_pi_query_interface,
46: gdome_xml_n_nodeName,
47: gdome_xml_n_nodeValue,
48: gdome_xml_n_set_nodeValue,
49: gdome_xml_n_nodeType,
50: gdome_xml_n_parentNode,
51: gdome_xml_n_childNodes,
52: gdome_xml_n_firstChild,
53: gdome_xml_n_lastChild,
54: gdome_xml_n_previousSibling,
55: gdome_xml_n_nextSibling,
56: gdome_xml_n_attributes,
57: gdome_xml_n_ownerDocument,
58: gdome_xml_n_insertBefore,
59: gdome_xml_n_replaceChild,
60: gdome_xml_n_removeChild,
61: gdome_xml_n_appendChild,
62: gdome_xml_n_hasChildNodes,
63: gdome_xml_n_cloneNode,
64: gdome_xml_n_normalize,
65: gdome_xml_n_isSupported,
66: gdome_xml_n_namespaceURI,
67: gdome_xml_n_prefix,
68: gdome_xml_n_set_prefix,
69: gdome_xml_n_localName,
70: gdome_xml_n_hasAttributes,
71: gdome_xml_n_addEventListener,
72: gdome_xml_n_removeEventListener,
73: gdome_xml_n_dispatchEvent,
74: gdome_xml_n_subTreeDispatchEvent
75: },
76: gdome_xml_pi_target,
77: gdome_xml_pi_data,
78: gdome_xml_pi_set_data
79: };
80:
81: /**
82: * gdome_xml_pi_query_interface:
83: * @self: Node Object ref
84: * @interface: interface needed
85: * @exc: Exception Object ref
86: *
87: * Returns: a reference to this object that implements the @interface needed,
88: * or %NULL if the @interface is not supported by this Object.
89: */
90: gpointer
1.2 ! paf 91: gdome_xml_pi_query_interface (xmlNode *self, const char *interface, GdomeException *exc)
1.1 paf 92: {
93: Gdome_xml_ProcessingInstruction *priv = (Gdome_xml_ProcessingInstruction *)self;
94:
95: g_return_val_if_fail (priv != NULL, NULL);
96: g_return_val_if_fail (GDOME_XML_IS_PI (priv), NULL);
97: g_return_val_if_fail (interface != NULL, NULL);
98: g_return_val_if_fail (exc != NULL, NULL);
99:
100: if (!strcmp (interface, "Node") ||
101: !strcmp (interface, "ProcessingInstruction") ||
102: !strcmp (interface, "EventTarget")) {
103: priv->refcnt++;
104: return self;
105: }
106: else
107: return NULL;
108: }
109:
110: /**
111: * gdome_xml_pi_target:
112: * @self: ProcessingInstruction Object ref
113: * @exc: Exception Object ref
114: *
115: * Returns: the target of this processing instruction. XML defines this as being
116: * the first token following the markup that begins the processing instruction.
117: */
118: GdomeDOMString *
119: gdome_xml_pi_target (GdomeProcessingInstruction *self, GdomeException *exc)
120: {
121: Gdome_xml_ProcessingInstruction *priv = (Gdome_xml_ProcessingInstruction *)self;
122:
123: g_return_val_if_fail (priv != NULL, NULL);
124: g_return_val_if_fail (GDOME_XML_IS_PI (priv), NULL);
125: g_return_val_if_fail (exc != NULL, NULL);
126:
127: return gdome_xml_str_mkref_dup((gchar *)gdome_xmlGetName (priv->n));
128: }
129:
130: /**
131: * gdome_xml_pi_data:
132: * @self: ProcessingInstruction Object ref
133: * @exc: Exception Object ref
134: *
135: * Returns: the content of this processing instruction. This is from the first
136: * non white space character after the target to the character immediately
137: * preceding the %?>.
138: */
139: GdomeDOMString *
140: gdome_xml_pi_data (GdomeProcessingInstruction *self, GdomeException *exc)
141: {
142: Gdome_xml_ProcessingInstruction *priv = (Gdome_xml_ProcessingInstruction *)self;
143:
144: g_return_val_if_fail (priv != NULL, NULL);
145: g_return_val_if_fail (GDOME_XML_IS_PI (priv), NULL);
146: g_return_val_if_fail (exc != NULL, NULL);
147:
148: return gdome_xml_str_mkref_xml (xmlNodeGetContent (priv->n));
149: }
150:
151: /**
152: * gdome_xml_pi_set_data:
153: * @self: ProcessingInstruction Object ref
154: * @data: The string of data to be set
155: * @exc: Exception Object ref
156: *
157: * Set the content of this processing instruction.
158: *
159: * %GDOME_NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
160: */
161: void
162: gdome_xml_pi_set_data (GdomeProcessingInstruction *self, GdomeDOMString *data, GdomeException *exc)
163: {
164: Gdome_xml_ProcessingInstruction *priv = (Gdome_xml_ProcessingInstruction *)self;
165: GdomeMutationEvent *mev;
166: GdomeDOMString *prevValue;
1.2 ! paf 167: xmlNode *parent;
1.1 paf 168:
169: g_return_if_fail (priv != NULL);
170: g_return_if_fail (GDOME_XML_IS_PI (priv));
171: g_return_if_fail (data != NULL);
172: g_return_if_fail (exc != NULL);
173:
174: if (GDOME_ISREADONLY (priv)) {
175: *exc = GDOME_NO_MODIFICATION_ALLOWED_ERR;
176: return;
177: }
178:
179: xmlNodeSetContent (priv->n, (xmlChar *)data->str);
180:
1.2 ! paf 181: if (gdome_xml_n_eventEnabledByCode ((xmlNode *) self, DOM_CHARACTER_DATA_MODIFIED_EVENT_TYPE)) {
1.1 paf 182: /* Fire DOMCharacterDataModified */
183: mev = gdome_evt_mevnt_mkref ();
184: prevValue = gdome_xml_pi_data (self, exc);
185: gdome_str_ref (data);
186: gdome_evt_mevnt_initMutationEventByCode (mev, DOM_CHARACTER_DATA_MODIFIED_EVENT_TYPE,
187: TRUE, FALSE, NULL,
188: prevValue, data, NULL, 0, exc);
1.2 ! paf 189: gdome_xml_n_dispatchEvent ((xmlNode *)self, (GdomeEvent *)mev, exc);
1.1 paf 190: gdome_xml_str_unref (data);
191: gdome_xml_str_unref (prevValue);
192: gdome_evt_mevnt_unref ((GdomeEvent *)mev, exc);
193: }
194:
1.2 ! paf 195: if (gdome_xml_n_eventEnabledByCode ((xmlNode *) self, DOM_SUBTREE_MODIFIED_EVENT_TYPE)) {
1.1 paf 196: /* Fire DOMSubtreeModified */
197: parent = gdome_xml_n_mkref (gdome_xmlGetParent (priv->n));
198: if (parent != NULL) {
199: mev = gdome_evt_mevnt_mkref ();
200: gdome_evt_mevnt_initMutationEventByCode (mev, DOM_SUBTREE_MODIFIED_EVENT_TYPE,
201: TRUE, FALSE, NULL,
202: NULL, NULL, NULL, 0, exc);
203: gdome_xml_n_dispatchEvent (parent, (GdomeEvent *)mev, exc);
204: gdome_xml_n_unref (parent, exc);
205: gdome_evt_mevnt_unref ((GdomeEvent *)mev, exc);
206: }
207: }
208: }
E-mail: