Annotation of win32/gnome/gdome2-x.x.x/libgdome/gdomecore/gdome-xml-node.c, revision 1.1
1.1 ! paf 1: /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */
! 2: /* gdome-xml-node.c
! 3: *
! 4: * Copyright (C) 1999 Raph Levien <raph@acm.org>
! 5: * Copyright (C) 2000 Mathieu Lacage <mathieu@gnu.org>
! 6: * Copyright (C) 2000 Anders Carlsson <andersca@gnu.org>
! 7: * Copyright (C) 2001 Paolo Casarini <paolo@casarini.org>
! 8: *
! 9: * This library is free software; you can redistribute it and/or
! 10: * modify it under the terms of the GNU Lesser General Public
! 11: * License as published by the Free Software Foundation; either
! 12: * version 2.1 of the License, or (at your option) any later version.
! 13: *
! 14: * This library is distributed in the hope that it will be useful,
! 15: * but WITHOUT ANY WARRANTY; without even the implied warranty of
! 16: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 17: * Lesser General Public License for more details.
! 18: *
! 19: * You should have received a copy of the GNU Lesser General Public
! 20: * License along with this library; if not, write to the Free Software
! 21: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
! 22: */
! 23:
! 24: #ifdef HAVE_CONFIG_H
! 25: # include <config.h>
! 26: #endif
! 27: //paf #include <sys/time.h>
! 28: //paf #include <unistd.h>
! 29: #include <stdlib.h>
! 30: #include <string.h>
! 31: #include "gdome.h"
! 32: #include "gdome-events.h"
! 33: #include "gdome-refdebug.h"
! 34: #include "gdome-treegc.h"
! 35: #include <libxml/tree.h>
! 36: #include <libxml/parser.h>
! 37: #include <libxml/xmlmemory.h>
! 38: #include <libxml/hash.h>
! 39: #include "gdome-xml-util.h"
! 40: #include "gdome-xml-xmlmemory.h"
! 41: #include "gdome-xml-xmlutil.h"
! 42: #include "gdome-xml-xmldtdutil.h"
! 43: #include "gdome-xml-str.h"
! 44: #include "gdome-evt-event.h"
! 45: #include "gdome-evt-eventl.h"
! 46: #include "gdome-evt-mevent.h"
! 47: #include "gdome-evt-propagation.h"
! 48: #include "gdome-xml-nodel.h"
! 49: #include "gdome-xml-node.h"
! 50: #include "gdome-xml-document.h"
! 51: #include "gdome-xml-element.h"
! 52: #include "gdome-xml-attribute.h"
! 53: #include "gdome-xml-cdata.h"
! 54: #include "gdome-xml-entityref.h"
! 55: #include "gdome-xml-text.h"
! 56: #include "gdome-xml-cdatas.h"
! 57: #include "gdome-xml-comment.h"
! 58: #include "gdome-xml-entity.h"
! 59: #include "gdome-xml-pi.h"
! 60: #include "gdome-xml-notation.h"
! 61: #include "gdome-xml-documentt.h"
! 62: #include "gdome-xml-documentf.h"
! 63: #include "gdome-xml-domimpl.h"
! 64: #include "gdome-xpath.h"
! 65: #include "gdome-xml-xpns.h"
! 66:
! 67: /* indexed by node type
! 68: first one is NULL because there
! 69: is no node type number 0
! 70: cf: spec p25 (DOM 1). interface Node.
! 71: */
! 72: const void * gdome_xml_vtabs[] = {
! 73: NULL,
! 74: &gdome_xml_el_vtab,
! 75: &gdome_xml_a_vtab,
! 76: &gdome_xml_t_vtab,
! 77: &gdome_xml_cds_vtab,
! 78: &gdome_xml_er_vtab,
! 79: &gdome_xml_ent_vtab,
! 80: &gdome_xml_pi_vtab,
! 81: &gdome_xml_c_vtab,
! 82: &gdome_xml_doc_vtab,
! 83: &gdome_xml_dt_vtab,
! 84: &gdome_xml_df_vtab,
! 85: &gdome_xml_not_vtab,
! 86: &gdome_xml_doc_vtab,
! 87: &gdome_xml_dt_vtab,
! 88: NULL,
! 89: NULL,
! 90: &gdome_xml_ent_vtab
! 91: };
! 92:
! 93: /***************
! 94: * Virtual Table
! 95: **************/
! 96: const GdomeNodeVtab gdome_xml_n_vtab =
! 97: {
! 98: gdome_xml_n_ref,
! 99: gdome_xml_n_unref,
! 100: gdome_xml_n_query_interface,
! 101: gdome_xml_n_nodeName,
! 102: gdome_xml_n_nodeValue,
! 103: gdome_xml_n_set_nodeValue,
! 104: gdome_xml_n_nodeType,
! 105: gdome_xml_n_parentNode,
! 106: gdome_xml_n_childNodes,
! 107: gdome_xml_n_firstChild,
! 108: gdome_xml_n_lastChild,
! 109: gdome_xml_n_previousSibling,
! 110: gdome_xml_n_nextSibling,
! 111: gdome_xml_n_attributes,
! 112: gdome_xml_n_ownerDocument,
! 113: gdome_xml_n_insertBefore,
! 114: gdome_xml_n_replaceChild,
! 115: gdome_xml_n_removeChild,
! 116: gdome_xml_n_appendChild,
! 117: gdome_xml_n_hasChildNodes,
! 118: gdome_xml_n_cloneNode,
! 119: gdome_xml_n_normalize,
! 120: gdome_xml_n_isSupported,
! 121: gdome_xml_n_namespaceURI,
! 122: gdome_xml_n_prefix,
! 123: gdome_xml_n_set_prefix,
! 124: gdome_xml_n_localName,
! 125: gdome_xml_n_hasAttributes,
! 126: gdome_xml_n_addEventListener,
! 127: gdome_xml_n_removeEventListener,
! 128: gdome_xml_n_dispatchEvent,
! 129: gdome_xml_n_subTreeDispatchEvent,
! 130: gdome_xml_n_canAppend
! 131: };
! 132:
! 133:
! 134: /* function to get the xmlNode from a GdomeNode */
! 135: xmlNode *
! 136: gdome_xml_n_get_xmlNode (GdomeNode *node)
! 137: {
! 138: Gdome_xml_Node *xmlnode;
! 139:
! 140: xmlnode = (Gdome_xml_Node *)node;
! 141:
! 142: return xmlnode->n;
! 143: }
! 144:
! 145: /***********************************************************
! 146: ***** Constructor and Reference Count Implementation ******
! 147: ***********************************************************/
! 148:
! 149: /**
! 150: * gdome_xml_n_mkref:
! 151: * @n: The libxml node of which a Gdome reference is wanted
! 152: *
! 153: * Constructor of the Node structure.
! 154: * Returns: the reference to the Gdome node wanted.
! 155: */
! 156: GdomeNode *
! 157: gdome_xml_n_mkref (xmlNode *n) {
! 158: Gdome_xml_Node *result = NULL;
! 159: xmlElementType type;
! 160:
! 161: if (n == NULL)
! 162: return NULL;
! 163:
! 164: type = n->type;
! 165: if (n->_private && type != XML_NAMESPACE_DECL) {
! 166: result = (Gdome_xml_Node *)n->_private;
! 167: result->refcnt++;
! 168: } else {
! 169: switch (type) {
! 170: case XML_ELEMENT_NODE:
! 171: case XML_TEXT_NODE:
! 172: case XML_CDATA_SECTION_NODE:
! 173: case XML_ENTITY_REF_NODE:
! 174: case XML_PI_NODE:
! 175: case XML_COMMENT_NODE:
! 176: case XML_NOTATION_NODE:
! 177: case XML_DOCUMENT_FRAG_NODE:
! 178: case XML_ATTRIBUTE_NODE:
! 179: case XML_ENTITY_DECL: /*libxml use this instead of XML_ENTITY_NODE*/
! 180: result = g_new (Gdome_xml_Node, 1);
! 181:
! 182: result->refcnt = 1;
! 183: result->vtab = (GdomeNodeVtab *)gdome_xml_vtabs[n->type];
! 184: result->super.user_data = NULL;
! 185: result->n = n;
! 186: if (type == XML_NOTATION_NODE || type == XML_ENTITY_NODE || type == XML_ENTITY_DECL)
! 187: result->accessType = GDOME_READONLY_NODE;
! 188: else
! 189: result->accessType = GDOME_READWRITE_NODE;
! 190: result->ll = NULL;
! 191:
! 192: n->_private = result;
! 193:
! 194: #ifdef DEBUG_REFCNT
! 195: gdome_refdbg_addRef ((void *)result, GDOME_REFDBG_NODE);
! 196: #endif
! 197: gdome_treegc_addNode ((GdomeNode *)result);
! 198:
! 199: break;
! 200: case XML_DOCUMENT_TYPE_NODE:
! 201: case XML_DTD_NODE:
! 202: return (GdomeNode *)gdome_xml_dt_mkref ((xmlDtd *)n);
! 203: case XML_HTML_DOCUMENT_NODE:
! 204: case XML_DOCUMENT_NODE:
! 205: return (GdomeNode *)gdome_xml_doc_mkref ((xmlDoc *)n);
! 206: case XML_NAMESPACE_DECL:
! 207: return (GdomeNode *)gdome_xml_xpns_mkref ((xmlNs *)n);
! 208: default:
! 209: g_warning ("gdome_xml_n_mkref: invalid node type");
! 210: break;
! 211: }
! 212: }
! 213: return (GdomeNode *)result;
! 214: }
! 215:
! 216: /**
! 217: * gdome_xml_n_ref:
! 218: * @self: Node Object ref
! 219: * @exc: Exception Object ref
! 220: *
! 221: * Increase the reference count of the specified Node.
! 222: */
! 223: void
! 224: gdome_xml_n_ref (GdomeNode *self, GdomeException *exc) {
! 225: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 226:
! 227: g_return_if_fail (priv != NULL);
! 228: g_return_if_fail (GDOME_XML_IS_N (priv));
! 229: g_return_if_fail (exc != NULL);
! 230:
! 231: priv->refcnt++;
! 232: }
! 233:
! 234: /**
! 235: * gdome_xml_n_unref:
! 236: * @self: Node Object ref
! 237: * @exc: Exception Object ref
! 238: *
! 239: * Decrease the reference count of the specified Node. Free the Node structure
! 240: * if the Node will have zero reference.
! 241: */
! 242: void
! 243: gdome_xml_n_unref (GdomeNode *self, GdomeException *exc) {
! 244: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 245: xmlElementType type;
! 246:
! 247: g_return_if_fail (priv != NULL);
! 248: g_return_if_fail (GDOME_XML_IS_N (priv));
! 249: g_return_if_fail (exc != NULL);
! 250:
! 251: type = gdome_xmlGetType (priv->n);
! 252: switch (type) {
! 253: case XML_DOCUMENT_TYPE_NODE:
! 254: case XML_DTD_NODE:
! 255: return gdome_xml_dt_unref (self, exc);
! 256: case XML_DOCUMENT_NODE:
! 257: return gdome_xml_doc_unref (self, exc);
! 258: default:
! 259: if (priv->refcnt > 0)
! 260: priv->refcnt--;
! 261:
! 262: if (priv->refcnt == 0 && priv->ll == NULL) {
! 263: xmlNode *n = (xmlNode *)priv->n;
! 264:
! 265: gdome_treegc_delNode (self);
! 266:
! 267: n->_private = NULL;
! 268: if (type != XML_NOTATION_NODE &&
! 269: type != XML_ENTITY_DECL &&
! 270: n->parent == NULL)
! 271: gdome_xmlFreeSubtree (n);
! 272: else {
! 273: if (type == XML_ATTRIBUTE_NODE)
! 274: if (gdome_xmlIsNsDecl ((xmlAttr *)n))
! 275: gdome_xmlFreeSubtree (n);
! 276: }
! 277:
! 278: #ifdef DEBUG_REFCNT
! 279: gdome_refdbg_delRef ((void *)self, GDOME_REFDBG_NODE);
! 280: #endif
! 281: g_free (self);
! 282: }
! 283: }
! 284: }
! 285:
! 286: /**
! 287: * gdome_xml_n_query_interface:
! 288: * @self: Node Object ref
! 289: * @interface: interface needed
! 290: * @exc: Exception Object ref
! 291: *
! 292: * Returns: a reference to this object that implements the @interface needed,
! 293: * or %NULL if the @interface is not supported by this Object.
! 294: */
! 295: gpointer
! 296: gdome_xml_n_query_interface (GdomeNode *self, const char *interface, GdomeException *exc)
! 297: {
! 298: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 299:
! 300: g_return_val_if_fail (priv != NULL, NULL);
! 301: g_return_val_if_fail (GDOME_XML_IS_N (priv), NULL);
! 302: g_return_val_if_fail (interface != NULL, NULL);
! 303: g_return_val_if_fail (exc != NULL, NULL);
! 304:
! 305: if (!strcmp (interface, "Node") ||
! 306: !strcmp (interface, "EventTarget")) {
! 307: priv->refcnt++;
! 308: return self;
! 309: }
! 310: else
! 311: return NULL;
! 312: }
! 313:
! 314: /**************************************
! 315: ***** Attributes implementation ******
! 316: **************************************/
! 317:
! 318: /**
! 319: * gdome_xml_n_attributes:
! 320: * @self: Node Object ref
! 321: * @exc: Exception Object ref
! 322: *
! 323: * Returns: a NamedNodeMap containing the attributes of this node (if it is an
! 324: * Element) or %NULL otherwise.
! 325: */
! 326: GdomeNamedNodeMap *
! 327: gdome_xml_n_attributes (GdomeNode *self, GdomeException *exc)
! 328: {
! 329: g_return_val_if_fail (self != NULL, NULL);
! 330: g_return_val_if_fail (GDOME_XML_IS_N (self), NULL);
! 331: g_return_val_if_fail (exc != NULL, NULL);
! 332:
! 333: if (GDOME_XML_IS_EL (self))
! 334: return gdome_el_attributes((GdomeElement *)self, exc);
! 335:
! 336: return NULL;
! 337: }
! 338:
! 339: /**
! 340: * gdome_xml_n_childNodes:
! 341: * @self: Node Object ref
! 342: * @exc: Exception Object ref
! 343: *
! 344: * Returns: a NodeList that contains all children of this node. If there are no
! 345: * children, this is a NodeList containing no nodes. Note that attributes are
! 346: * not considered to be children of element nodes - use gdome_n_attributes to
! 347: * obtain the attributes.
! 348: */
! 349: GdomeNodeList *
! 350: gdome_xml_n_childNodes (GdomeNode *self, GdomeException *exc)
! 351: {
! 352: g_return_val_if_fail (self != NULL, NULL);
! 353: g_return_val_if_fail (GDOME_XML_IS_N (self), NULL);
! 354: g_return_val_if_fail (exc != NULL, NULL);
! 355:
! 356: if (GDOME_XML_IS_NS(self))
! 357: return NULL;
! 358:
! 359: return gdome_xml_nl_mkref ((GdomeNode*)self, NULL, NULL, GDOME_READONLY_NODE);
! 360: }
! 361:
! 362: /**
! 363: * gdome_xml_n_firstChild:
! 364: * @self: Node Object ref
! 365: * @exc: Exception Object ref
! 366: *
! 367: * Returns: the first child of this node. If there is no such node,
! 368: * this returns %NULL.
! 369: */
! 370: GdomeNode *
! 371: gdome_xml_n_firstChild (GdomeNode *self, GdomeException *exc)
! 372: {
! 373: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 374:
! 375: g_return_val_if_fail (priv != NULL, NULL);
! 376: g_return_val_if_fail (GDOME_XML_IS_N (priv), NULL);
! 377: g_return_val_if_fail (exc != NULL, NULL);
! 378:
! 379: switch (gdome_xmlGetType (priv->n)) {
! 380: case XML_DOCUMENT_TYPE_NODE:
! 381: case XML_DTD_NODE:
! 382: case XML_PI_NODE:
! 383: case XML_COMMENT_NODE:
! 384: case XML_TEXT_NODE:
! 385: case XML_CDATA_SECTION_NODE:
! 386: case XML_NOTATION_NODE:
! 387: case XML_NAMESPACE_DECL:
! 388: return NULL;
! 389: case XML_DOCUMENT_NODE:
! 390: case XML_DOCUMENT_FRAG_NODE:
! 391: case XML_ENTITY_REF_NODE:
! 392: case XML_ELEMENT_NODE:
! 393: case XML_ATTRIBUTE_NODE:
! 394: case XML_ENTITY_NODE:
! 395: case XML_ENTITY_DECL:
! 396: return gdome_xml_n_mkref (gdome_xmlGetFirstChild (priv->n));
! 397: default:
! 398: g_warning ("gdome_xml_n_firstChild: invalid node type");
! 399: return NULL;
! 400: }
! 401: }
! 402:
! 403: /**
! 404: * gdome_xml_n_lastChild:
! 405: * @self: Node Object ref
! 406: * @exc: Exception Object ref
! 407: *
! 408: * Returns: the last child of this node. If there is no such node,
! 409: * this returns %NULL.
! 410: */
! 411: GdomeNode *
! 412: gdome_xml_n_lastChild (GdomeNode *self, GdomeException *exc)
! 413: {
! 414: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 415:
! 416: g_return_val_if_fail (priv != NULL, NULL);
! 417: g_return_val_if_fail (GDOME_XML_IS_N (priv), NULL);
! 418: g_return_val_if_fail (exc != NULL, NULL);
! 419:
! 420: switch (gdome_xmlGetType (priv->n)) {
! 421: case XML_DOCUMENT_TYPE_NODE:
! 422: case XML_DTD_NODE:
! 423: case XML_PI_NODE:
! 424: case XML_COMMENT_NODE:
! 425: case XML_TEXT_NODE:
! 426: case XML_CDATA_SECTION_NODE:
! 427: case XML_NOTATION_NODE:
! 428: case XML_NAMESPACE_DECL:
! 429: return NULL;
! 430: case XML_DOCUMENT_NODE:
! 431: case XML_DOCUMENT_FRAG_NODE:
! 432: case XML_ENTITY_REF_NODE:
! 433: case XML_ELEMENT_NODE:
! 434: case XML_ATTRIBUTE_NODE:
! 435: case XML_ENTITY_NODE:
! 436: case XML_ENTITY_DECL:
! 437: return gdome_xml_n_mkref (gdome_xmlGetLastChild (priv->n));
! 438: default:
! 439: g_warning ("gdome_xml_n_lastChild: invalid node type");
! 440: return NULL;
! 441: }
! 442: }
! 443:
! 444: /**
! 445: * gdome_xml_n_localName:
! 446: * @self: Node Objects ref
! 447: * @exc: Exception Object ref
! 448: *
! 449: * Returns: the local part of the qualified name of this node.
! 450: * For nodes of any type other than %GDOME_ELEMENT_NODE and
! 451: * %GDOME_ATTRIBUTE_NODE and nodes created with a DOM Level 1 method, this is
! 452: * always %NULL.
! 453: */
! 454: GdomeDOMString *
! 455: gdome_xml_n_localName (GdomeNode *self, GdomeException *exc)
! 456: {
! 457: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 458:
! 459: g_return_val_if_fail (priv != NULL, NULL);
! 460: g_return_val_if_fail (GDOME_XML_IS_N (priv), NULL);
! 461: g_return_val_if_fail (exc != NULL, NULL);
! 462:
! 463: if((gdome_xmlGetType(priv->n) == XML_ELEMENT_NODE ||
! 464: gdome_xmlGetType(priv->n) == XML_ATTRIBUTE_NODE) &&
! 465: gdome_xmlGetNs(priv->n) != NULL)
! 466: return gdome_xml_str_mkref_dup ((gchar *)gdome_xmlGetName (priv->n));
! 467: else
! 468: return NULL;
! 469: }
! 470:
! 471: /**
! 472: * gdome_xml_n_namespaceURI:
! 473: * @self: Node Objects ref
! 474: * @exc: Exception Object ref
! 475: *
! 476: * Returns: the namespace URI of this node, or %NULL if it is unspecified.
! 477: * For nodes of any type other than %GDOME_ELEMENT_NODE and
! 478: * %GDOME_ATTRIBUTE_NODE and nodes created with a DOM Level 1 method, this is
! 479: * always %NULL.
! 480: */
! 481: GdomeDOMString *
! 482: gdome_xml_n_namespaceURI (GdomeNode *self, GdomeException *exc)
! 483: {
! 484: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 485:
! 486: g_return_val_if_fail (priv != NULL, NULL);
! 487: g_return_val_if_fail (GDOME_XML_IS_N (priv), NULL);
! 488: g_return_val_if_fail (exc != NULL, NULL);
! 489:
! 490: if((gdome_xmlGetType(priv->n) == XML_ELEMENT_NODE ||
! 491: gdome_xmlGetType(priv->n) == XML_ATTRIBUTE_NODE ||
! 492: gdome_xmlGetType(priv->n) == XML_NAMESPACE_DECL) &&
! 493: gdome_xmlGetNs(priv->n) != NULL)
! 494: return gdome_xml_str_mkref_dup ((gchar *)gdome_xmlGetNsURI (priv->n));
! 495: else
! 496: return NULL;
! 497: }
! 498:
! 499: /**
! 500: * gdome_xml_n_nextSibling:
! 501: * @self: Node Object ref
! 502: * @exc: Exception Object ref
! 503: *
! 504: * Returns: the node immediately following this node. If there is no such
! 505: * node, this returns %NULL.
! 506: */
! 507: GdomeNode *
! 508: gdome_xml_n_nextSibling (GdomeNode *self, GdomeException *exc)
! 509: {
! 510: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 511:
! 512: g_return_val_if_fail (priv != NULL, NULL);
! 513: g_return_val_if_fail (GDOME_XML_IS_N (priv), NULL);
! 514: g_return_val_if_fail (exc != NULL, NULL);
! 515:
! 516: if(GDOME_XML_IS_A (priv) || GDOME_XML_IS_NS (priv))
! 517: return NULL;
! 518: else
! 519: return gdome_xml_n_mkref (gdome_xmlGetNext (priv->n));
! 520: }
! 521:
! 522: /**
! 523: * gdome_xml_n_nodeName:
! 524: * @self: Node Object ref
! 525: * @exc: Exception Object ref
! 526: *
! 527: * Returns: the name of this node, depending on its type.
! 528: */
! 529: GdomeDOMString *
! 530: gdome_xml_n_nodeName (GdomeNode *self, GdomeException *exc)
! 531: {
! 532: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 533: GdomeDOMString *ret = NULL;
! 534:
! 535: g_return_val_if_fail (priv != NULL, NULL);
! 536: g_return_val_if_fail (GDOME_XML_IS_N (priv), NULL);
! 537: g_return_val_if_fail (exc != NULL, NULL);
! 538:
! 539: switch (gdome_xmlGetType (priv->n)) {
! 540: case XML_ATTRIBUTE_NODE:
! 541: ret = gdome_a_name((GdomeAttr *)self, exc);
! 542: break;
! 543: case XML_ELEMENT_NODE:
! 544: ret = gdome_el_tagName((GdomeElement *)self, exc);
! 545: break;
! 546: case XML_DOCUMENT_TYPE_NODE:
! 547: case XML_DTD_NODE:
! 548: ret = gdome_dt_name((GdomeDocumentType *)self, exc);
! 549: break;
! 550: case XML_PI_NODE:
! 551: ret = gdome_pi_target((GdomeProcessingInstruction *)self, exc);
! 552: break;
! 553: case XML_ENTITY_NODE:
! 554: case XML_ENTITY_DECL: /*libxml use this instead of XML_ENTITY_NODE*/
! 555: case XML_ENTITY_REF_NODE:
! 556: case XML_NOTATION_NODE:
! 557: ret = gdome_xml_str_mkref_dup((gchar *)gdome_xmlGetName (priv->n));
! 558: break;
! 559: case XML_CDATA_SECTION_NODE:
! 560: ret = gdome_xml_str_mkref_dup("#cdata-section");
! 561: break;
! 562: case XML_COMMENT_NODE:
! 563: ret = gdome_xml_str_mkref_dup("#comment");
! 564: break;
! 565: case XML_DOCUMENT_NODE:
! 566: ret = gdome_xml_str_mkref_dup("#document");
! 567: break;
! 568: case XML_DOCUMENT_FRAG_NODE:
! 569: ret = gdome_xml_str_mkref_dup("#document-fragment");
! 570: break;
! 571: case XML_TEXT_NODE:
! 572: ret = gdome_xml_str_mkref_dup("#text");
! 573: break;
! 574: case XML_NAMESPACE_DECL:
! 575: ret = gdome_xml_str_mkref_dup(gdome_xmlGetNsPrefix(priv->n));
! 576: break;
! 577: default:
! 578: g_warning ("gdome_n_name: wrong Node Type.");
! 579: }
! 580:
! 581: return ret;
! 582: }
! 583:
! 584: /**
! 585: * gdome_xml_n_nodeType:
! 586: * @self: Node Object ref
! 587: * @exc: Exception Object ref
! 588: *
! 589: * Returns: an integer bigger than %0 representing the type of the underlying
! 590: * object or %0 on error.
! 591: */
! 592: unsigned short
! 593: gdome_xml_n_nodeType (GdomeNode *self, GdomeException *exc)
! 594: {
! 595: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 596: xmlElementType type;
! 597:
! 598: g_return_val_if_fail (priv != NULL, 0);
! 599: g_return_val_if_fail (GDOME_XML_IS_N (priv), 0);
! 600: g_return_val_if_fail (exc != NULL, 0);
! 601:
! 602: type = gdome_xmlGetType(priv->n);
! 603: if (type == XML_DTD_NODE)
! 604: return XML_DOCUMENT_TYPE_NODE;
! 605: else if (type == XML_ENTITY_DECL)
! 606: return XML_ENTITY_NODE;
! 607: else if (type == XML_NAMESPACE_DECL)
! 608: return GDOME_XPATH_NAMESPACE_NODE;
! 609: else
! 610: return type;
! 611: }
! 612:
! 613: /**
! 614: * gdome_xml_n_nodeValue:
! 615: * @self: Node Object ref
! 616: * @exc: Exception Object ref
! 617: *
! 618: * Returns: the value of this node, depending on its type.
! 619: */
! 620: GdomeDOMString *
! 621: gdome_xml_n_nodeValue (GdomeNode *self, GdomeException *exc)
! 622: {
! 623: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 624: GdomeDOMString *ret = NULL;
! 625:
! 626: g_return_val_if_fail (priv != NULL, 0);
! 627: g_return_val_if_fail (GDOME_XML_IS_N (priv), NULL);
! 628: g_return_val_if_fail (exc != NULL, 0);
! 629:
! 630: switch (gdome_xmlGetType (priv->n)) {
! 631: case XML_ATTRIBUTE_NODE:
! 632: ret = gdome_a_value ((GdomeAttr *)self, exc);
! 633: break;
! 634: case XML_PI_NODE:
! 635: ret = gdome_pi_data ((GdomeProcessingInstruction *)self, exc);
! 636: break;
! 637: case XML_CDATA_SECTION_NODE:
! 638: case XML_COMMENT_NODE:
! 639: case XML_TEXT_NODE:
! 640: ret = gdome_xml_str_mkref_own (xmlNodeGetContent (priv->n));
! 641: break;
! 642: case XML_ELEMENT_NODE:
! 643: case XML_ENTITY_NODE:
! 644: case XML_ENTITY_REF_NODE:
! 645: case XML_DOCUMENT_NODE:
! 646: case XML_DOCUMENT_TYPE_NODE:
! 647: case XML_DOCUMENT_FRAG_NODE:
! 648: case XML_NOTATION_NODE:
! 649: case XML_DTD_NODE:
! 650: case XML_ENTITY_DECL:
! 651: case XML_NAMESPACE_DECL:
! 652: break;
! 653: default:
! 654: g_warning ("could not recognize the Node Type.");
! 655: }
! 656:
! 657: return ret;
! 658: }
! 659:
! 660: /**
! 661: * gdome_xml_n_ownerDocument:
! 662: * @self: Node Objects ref
! 663: * @exc: Exception Object ref
! 664: *
! 665: * Returns: the documment object associated with this node. This is also the
! 666: * Document object used to create new nodes. When this node is a Document or a
! 667: * DocumentType which is not used with any Document yet, this is %NULL.
! 668: */
! 669: GdomeDocument *
! 670: gdome_xml_n_ownerDocument (GdomeNode *self, GdomeException *exc)
! 671: {
! 672: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 673:
! 674: g_return_val_if_fail (priv != NULL, NULL);
! 675: g_return_val_if_fail (GDOME_XML_IS_N (priv), NULL);
! 676: g_return_val_if_fail (exc != NULL, NULL);
! 677:
! 678: if (gdome_xmlGetType (priv->n) == XML_DOCUMENT_NODE)
! 679: return NULL;
! 680: else
! 681: return (GdomeDocument *)gdome_xml_n_mkref ((xmlNode *)gdome_xmlGetOwner (priv->n));
! 682: }
! 683:
! 684: /**
! 685: * gdome_xml_n_parentNode:
! 686: * @self: Node Object ref
! 687: * @exc: Exception Object ref
! 688: *
! 689: * Returns: the parent of this node. All nodes, except Attr,
! 690: * Document, DocumentFragment, Entity, and Notation may have a parent. However,
! 691: * if a node has just been created and not yet added to the tree, or if it has
! 692: * been removed from the tree, this is %NULL.
! 693: */
! 694: GdomeNode *
! 695: gdome_xml_n_parentNode (GdomeNode *self, GdomeException *exc)
! 696: {
! 697: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 698:
! 699: g_return_val_if_fail (priv != NULL, NULL);
! 700: g_return_val_if_fail (GDOME_XML_IS_N (priv), NULL);
! 701: g_return_val_if_fail (exc != NULL, NULL);
! 702:
! 703: if(GDOME_XML_IS_TREE_N (priv))
! 704: return gdome_xml_n_mkref (gdome_xmlGetParent (priv->n));
! 705: else
! 706: return NULL;
! 707: }
! 708:
! 709: /**
! 710: * gdome_xml_n_prefix:
! 711: * @self: Node Objects ref
! 712: * @exc: Exception Object ref
! 713: *
! 714: * Returns: the namespace prefix of this node, or %NULL if it is unspecified.
! 715: * For nodes of any type other than %GDOME_ELEMENT_NODE and
! 716: * %GDOME_ATTRIBUTE_NODE and nodes created with a DOM Level 1 method, this is
! 717: * always %NULL.
! 718: */
! 719: GdomeDOMString *
! 720: gdome_xml_n_prefix (GdomeNode *self, GdomeException *exc)
! 721: {
! 722: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 723:
! 724: g_return_val_if_fail (priv != NULL, 0);
! 725: g_return_val_if_fail (GDOME_XML_IS_N (priv), 0);
! 726: g_return_val_if_fail (exc != NULL, 0);
! 727:
! 728: if((gdome_xmlGetType(priv->n) == XML_ELEMENT_NODE ||
! 729: gdome_xmlGetType(priv->n) == XML_ATTRIBUTE_NODE ||
! 730: gdome_xmlGetType(priv->n) == XML_NAMESPACE_DECL) &&
! 731: gdome_xmlGetNs(priv->n) != NULL)
! 732: return gdome_xml_str_mkref_dup ((gchar *)gdome_xmlGetNsPrefix (priv->n));
! 733: else
! 734: return NULL;
! 735: }
! 736:
! 737: /**
! 738: * gdome_xml_n_previousSibling:
! 739: * @self: Node Object ref
! 740: * @exc: Exception Object ref
! 741: *
! 742: * Returns: the node immediately preceding this node. If there is no such
! 743: * node, this returns %NULL.
! 744: */
! 745: GdomeNode *
! 746: gdome_xml_n_previousSibling (GdomeNode *self, GdomeException *exc)
! 747: {
! 748: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 749:
! 750: g_return_val_if_fail (priv != NULL, NULL);
! 751: g_return_val_if_fail (GDOME_XML_IS_N (priv), NULL);
! 752: g_return_val_if_fail (exc != NULL, NULL);
! 753:
! 754: if(GDOME_XML_IS_A (priv) || GDOME_XML_IS_NS (priv))
! 755: return NULL;
! 756: else
! 757: return gdome_xml_n_mkref (gdome_xmlGetPrev (priv->n));
! 758: }
! 759:
! 760: /**
! 761: * gdome_xml_n_set_nodeValue:
! 762: * @self: Node Object ref
! 763: * @nodeValue: The new value for this node.
! 764: * @exc: Exception Object ref
! 765: *
! 766: * Sets The value of this node, depending on its type.
! 767: *
! 768: * %GDOME_NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
! 769: */
! 770: void
! 771: gdome_xml_n_set_nodeValue (GdomeNode *self, GdomeDOMString *nodeValue, GdomeException *exc)
! 772: {
! 773: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 774:
! 775: g_return_if_fail (priv != NULL);
! 776: g_return_if_fail (GDOME_XML_IS_N (priv));
! 777: g_return_if_fail (nodeValue != NULL);
! 778: g_return_if_fail (exc != NULL);
! 779:
! 780: if (GDOME_ISREADONLY (priv)) {
! 781: *exc = GDOME_NO_MODIFICATION_ALLOWED_ERR;
! 782: return;
! 783: }
! 784:
! 785: switch (gdome_xmlGetType(priv->n)) {
! 786: case XML_ATTRIBUTE_NODE:
! 787: gdome_xml_a_set_value ((GdomeAttr *)self, nodeValue, exc);
! 788: break;
! 789: case XML_PI_NODE:
! 790: gdome_xml_pi_set_data ((GdomeProcessingInstruction *)self, nodeValue, exc);
! 791: break;
! 792: case XML_CDATA_SECTION_NODE:
! 793: case XML_COMMENT_NODE:
! 794: case XML_TEXT_NODE:
! 795: gdome_xml_cd_set_data ((GdomeCharacterData *)self, nodeValue, exc);
! 796: break;
! 797: case XML_ELEMENT_NODE:
! 798: case XML_ENTITY_NODE:
! 799: case XML_ENTITY_REF_NODE:
! 800: case XML_DOCUMENT_NODE:
! 801: case XML_DOCUMENT_TYPE_NODE:
! 802: case XML_DOCUMENT_FRAG_NODE:
! 803: case XML_NOTATION_NODE:
! 804: case XML_DTD_NODE:
! 805: case XML_NAMESPACE_DECL:
! 806: break;
! 807: default:
! 808: g_warning ("could not recognize the Node Type.");
! 809: }
! 810: }
! 811:
! 812: /**
! 813: * gdome_xml_n_set_prefix:
! 814: * @self: Node Object ref
! 815: * @prefix: The new prefix for this node.
! 816: * @exc: Exception Object ref
! 817: *
! 818: * Sets a new nemaspace prefix for this node.
! 819: *
! 820: * %GDOME_NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
! 821: * %GDOME_NAMESPACE_ERR: Raised if the specified @prefix is malformed per the
! 822: * Namespaces in XML specification, if the namespaceURI of this node is %NULL,
! 823: * if the specified prefix is "xml" and the namespaceURI of this node is
! 824: * different from "http://www.w3.org/XML/1998/namespace", if this node is an
! 825: * attribute and the specified prefix is "xmlns" and the namespaceURI of this
! 826: * node is different from "http://www.w3.org/2000/xmlns/", or if this node is
! 827: * an attribute and the qualifiedName of this node is "xmlns".
! 828: */
! 829: void
! 830: gdome_xml_n_set_prefix (GdomeNode *self, GdomeDOMString *prefix, GdomeException *exc)
! 831: {
! 832: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 833: xmlNs *ns;
! 834:
! 835: g_return_if_fail (priv != NULL);
! 836: g_return_if_fail (GDOME_XML_IS_N (priv));
! 837: g_return_if_fail (prefix != NULL);
! 838: g_return_if_fail (exc != NULL);
! 839:
! 840: if (GDOME_ISREADONLY (priv)) {
! 841: *exc = GDOME_NO_MODIFICATION_ALLOWED_ERR;
! 842: return;
! 843: }
! 844:
! 845: if((gdome_xmlGetType(priv->n) == XML_ELEMENT_NODE ||
! 846: gdome_xmlGetType(priv->n) == XML_ATTRIBUTE_NODE) &&
! 847: gdome_xmlGetNs(priv->n) != NULL &&
! 848: !xmlStrEqual(gdome_xmlGetNsPrefix (priv->n), (xmlChar *)prefix->str)) {
! 849:
! 850: /* tests for NAMESPACE_ERR */
! 851: gchar *nsURI = (gchar *)gdome_xmlGetNsURI (priv->n);
! 852: if (nsURI == NULL ||
! 853: (!strcmp (prefix->str, "xml") &&
! 854: strcmp (nsURI, "http://www.w3.org/XML/1998/namespace")) ||
! 855: (gdome_xmlGetType(priv->n) == XML_ATTRIBUTE_NODE &&
! 856: !strcmp (prefix->str, "xmlns") &&
! 857: strcmp (nsURI, GDOME_XMLNS_NAMESPACE)) ||
! 858: (gdome_xmlGetType(priv->n) == XML_ATTRIBUTE_NODE &&
! 859: !strcmp (gdome_xmlGetName(priv->n), "xmlns"))) {
! 860: *exc = GDOME_NAMESPACE_ERR;
! 861: return;
! 862: }
! 863: ns = gdome_xmlNewNs (priv->n->doc, gdome_xmlGetNsURI (priv->n), (xmlChar *)prefix->str);
! 864: gdome_xmlSetNs(priv->n, ns);
! 865: }
! 866: }
! 867:
! 868: /**************************************
! 869: ******* Methods implementation *******
! 870: **************************************/
! 871:
! 872: /**
! 873: * gdome_xml_n_appendChild:
! 874: * @self: Node Object ref
! 875: * @newChild: The node to add
! 876: * @exc: Exception Object ref
! 877: *
! 878: * Adds the node @newChild to the end of the list of children of this node.
! 879: * If the @newChild is already in the tree, it is first removed. If it is a
! 880: * DocumentFragment node, the entire contents of the document fragment are
! 881: * moved into the child list of this node
! 882: *
! 883: * %GDOME_HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not
! 884: * allow children of the type of the @newChild node, or if the node to append is
! 885: * one of this node's ancestors or this node itself.
! 886: * %GDOME_WRONG_DOCUMENT_ERR: Raised if @newChild was created from a different
! 887: * document than the one that created this node.
! 888: * %GDOME_NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
! 889: * Returns: the node added.
! 890: */
! 891: GdomeNode *
! 892: gdome_xml_n_appendChild (GdomeNode *self, GdomeNode *newChild, GdomeException *exc)
! 893: {
! 894: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 895: Gdome_xml_Node *new_priv = (Gdome_xml_Node *)newChild;
! 896: GdomeMutationEvent *mev;
! 897: xmlNode *ret;
! 898:
! 899: g_return_val_if_fail (priv != NULL, NULL);
! 900: g_return_val_if_fail (GDOME_XML_IS_N (priv), NULL);
! 901: g_return_val_if_fail (new_priv != NULL, NULL);
! 902: g_return_val_if_fail (GDOME_XML_IS_N (new_priv), NULL);
! 903: g_return_val_if_fail (exc != NULL, NULL);
! 904:
! 905: if (!gdome_xml_n_canAppend (self, newChild, exc)) {
! 906: *exc = GDOME_HIERARCHY_REQUEST_ERR;
! 907: return NULL;
! 908: }
! 909:
! 910: if (gdome_xmlGetOwner(new_priv->n) != gdome_xmlGetOwner(priv->n)) {
! 911: *exc = GDOME_WRONG_DOCUMENT_ERR;
! 912: return NULL;
! 913: }
! 914:
! 915: if (GDOME_ISREADONLY (priv)) {
! 916: *exc = GDOME_NO_MODIFICATION_ALLOWED_ERR;
! 917: return NULL;
! 918: }
! 919:
! 920: /* If the newChild is already in the tree, it is first removed. */
! 921: if (gdome_xmlGetParent(new_priv->n) != NULL)
! 922: gdome_xmlUnlinkChild(gdome_xmlGetParent(new_priv->n), new_priv->n);
! 923:
! 924: ret = gdome_xmlAppendChild(priv->n, new_priv->n);
! 925:
! 926: /* Delete children list for DocumentFragment Node */
! 927: if (gdome_xmlGetType (new_priv->n) == XML_DOCUMENT_FRAG_NODE) {
! 928: gdome_xmlSetFirstChild(new_priv->n, NULL);
! 929: gdome_xmlSetLastChild(new_priv->n, NULL);
! 930: }
! 931:
! 932: if (gdome_xml_n_eventEnabledByCode (self, DOM_NODE_INSERTED_EVENT_TYPE)) {
! 933: /* Fire DOMNodeInserted */
! 934: mev = gdome_evt_mevnt_mkref ();
! 935: gdome_xml_n_ref (self, exc);
! 936: gdome_evt_mevnt_initMutationEventByCode (mev, DOM_NODE_INSERTED_EVENT_TYPE,
! 937: TRUE, FALSE, self,
! 938: NULL, NULL, NULL, 0, exc);
! 939: gdome_xml_n_dispatchEvent (newChild, (GdomeEvent *)mev, exc);
! 940: gdome_xml_n_unref (self, exc);
! 941: gdome_evt_mevnt_unref ((GdomeEvent *)mev, exc);
! 942: }
! 943:
! 944: if (gdome_xml_n_eventEnabledByCode (self, DOM_NODE_INSERTED_INTO_DOCUMENT_EVENT_TYPE)) {
! 945: /* Fire DOMNodeInsertedIntoDocument */
! 946: mev = gdome_evt_mevnt_mkref ();
! 947: gdome_evt_mevnt_initMutationEventByCode (mev, DOM_NODE_INSERTED_INTO_DOCUMENT_EVENT_TYPE,
! 948: FALSE, FALSE, NULL,
! 949: NULL, NULL, NULL, 0, exc);
! 950: gdome_xml_n_dispatchEvent (newChild, (GdomeEvent *)mev, exc);
! 951: gdome_xml_n_subTreeDispatchEvent (newChild, (GdomeEvent *)mev, exc);
! 952: gdome_evt_mevnt_unref ((GdomeEvent *)mev, exc);
! 953: }
! 954:
! 955: if (gdome_xml_n_eventEnabledByCode (self, DOM_SUBTREE_MODIFIED_EVENT_TYPE)) {
! 956: /* Fire DOMSubtreeModified */
! 957: mev = gdome_evt_mevnt_mkref ();
! 958: gdome_evt_mevnt_initMutationEventByCode (mev, DOM_SUBTREE_MODIFIED_EVENT_TYPE,
! 959: TRUE, FALSE, NULL,
! 960: NULL, NULL, NULL, 0, exc);
! 961: gdome_xml_n_dispatchEvent (self, (GdomeEvent *)mev, exc);
! 962: gdome_evt_mevnt_unref ((GdomeEvent *)mev, exc);
! 963: }
! 964:
! 965: return gdome_xml_n_mkref (ret);
! 966: }
! 967:
! 968: /**
! 969: * gdome_xml_n_cloneNode:
! 970: * @self: Node Object ref
! 971: * @deep: If true, recursively clone the subtree under the specified node;
! 972: * if false, clone only the node itself (and its attributes, if it is
! 973: * an Element).
! 974: * @exc: Exception Object ref
! 975: *
! 976: * Makes a duplicate of this node, i.e., serves as a generic copy
! 977: * constructor for nodes. The duplicate node has no parent; (parentNode is
! 978: * %NULL).
! 979: * %GDOME_DOCUMENT_TYPE_NODE, %GDOME_NOTATION_NODE and %GDOME_ENTITY_NODE
! 980: * nodes are not supported.
! 981: *
! 982: * %GDOME_NOT_SUPPORTED_ERR: Raised if the type of node being cloned is not
! 983: * supported.
! 984: * Returns: the duplicate node.
! 985: */
! 986: GdomeNode *
! 987: gdome_xml_n_cloneNode (GdomeNode *self, GdomeBoolean deep, GdomeException *exc)
! 988: {
! 989: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 990: xmlNode *n = NULL;
! 991: xmlElementType type;
! 992:
! 993: g_return_val_if_fail (priv != NULL, NULL);
! 994: g_return_val_if_fail (GDOME_XML_IS_N (priv), NULL);
! 995: g_return_val_if_fail (exc != NULL, NULL);
! 996:
! 997: type = gdome_xmlGetType (priv->n);
! 998: if (type == XML_ENTITY_NODE ||
! 999: type == XML_ENTITY_DECL ||
! 1000: type == XML_NOTATION_NODE ||
! 1001: type == XML_DOCUMENT_TYPE_NODE ||
! 1002: type == XML_DTD_NODE ||
! 1003: type == XML_NAMESPACE_DECL )
! 1004: *exc = GDOME_NOT_SUPPORTED_ERR;
! 1005: else if (type == XML_DOCUMENT_NODE)
! 1006: n = (xmlNode *)xmlCopyDoc ((xmlDoc *)priv->n, deep);
! 1007: else if (type == XML_ATTRIBUTE_NODE) {
! 1008: n = (xmlNode *)xmlCopyProp (NULL, (xmlAttr *)priv->n);
! 1009: if (gdome_xmlGetOwner (n) == NULL)
! 1010: gdome_xmlSetOwner (n , gdome_xmlGetOwner (priv->n));
! 1011: }
! 1012: else
! 1013: n = xmlDocCopyNode (priv->n, gdome_xmlGetOwner(priv->n), deep);
! 1014:
! 1015: if (*exc)
! 1016: return NULL;
! 1017: else
! 1018: return gdome_xml_n_mkref (n);
! 1019: }
! 1020:
! 1021: /**
! 1022: * gdome_xml_n_hasAttributes:
! 1023: * @self: Node Object ref
! 1024: * @exc: Exception Object ref
! 1025: *
! 1026: * Returns: %TRUE if this node has any attributes, %FALSE otherwise.
! 1027: */
! 1028: GdomeBoolean
! 1029: gdome_xml_n_hasAttributes (GdomeNode *self, GdomeException *exc) {
! 1030: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 1031:
! 1032: g_return_val_if_fail (priv != NULL, 0);
! 1033: g_return_val_if_fail (GDOME_XML_IS_N (priv), 0);
! 1034: g_return_val_if_fail (exc != NULL, 0);
! 1035:
! 1036: if (GDOME_XML_IS_EL (priv))
! 1037: return (gdome_xmlGetAttrList (priv->n) != NULL);
! 1038: else
! 1039: return FALSE;
! 1040: }
! 1041:
! 1042: /**
! 1043: * gdome_xml_n_hasChildNodes:
! 1044: * @self: Node Object ref
! 1045: * @exc: Exception Object ref
! 1046: *
! 1047: * Returns: %TRUE if this node has any children, %FALSE otherwise.
! 1048: */
! 1049: GdomeBoolean
! 1050: gdome_xml_n_hasChildNodes (GdomeNode *self, GdomeException *exc) {
! 1051: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 1052:
! 1053: g_return_val_if_fail (priv != NULL, 0);
! 1054: g_return_val_if_fail (GDOME_XML_IS_N (priv), 0);
! 1055: g_return_val_if_fail (exc != NULL, 0);
! 1056:
! 1057: switch (gdome_xmlGetType (priv->n)) {
! 1058: case XML_DOCUMENT_TYPE_NODE:
! 1059: case XML_DTD_NODE:
! 1060: case XML_PI_NODE:
! 1061: case XML_COMMENT_NODE:
! 1062: case XML_TEXT_NODE:
! 1063: case XML_CDATA_SECTION_NODE:
! 1064: case XML_NOTATION_NODE:
! 1065: case XML_NAMESPACE_DECL:
! 1066: return FALSE;
! 1067: case XML_DOCUMENT_NODE:
! 1068: case XML_DOCUMENT_FRAG_NODE:
! 1069: case XML_ENTITY_REF_NODE:
! 1070: case XML_ELEMENT_NODE:
! 1071: case XML_ATTRIBUTE_NODE:
! 1072: case XML_ENTITY_NODE:
! 1073: case XML_ENTITY_DECL:
! 1074: return (gdome_xmlGetFirstChild (priv->n) != NULL);
! 1075: default:
! 1076: g_warning ("gdome_xml_n_hasChildNodes: invalid node type");
! 1077: return FALSE;
! 1078: }
! 1079: }
! 1080:
! 1081: /**
! 1082: * gdome_xml_n_insertBefore:
! 1083: * @self: Node Object ref
! 1084: * @newChild: The new node to put in the child list
! 1085: * @refChild: the reference node, i.e., the node before which the new node
! 1086: * must be inserted.
! 1087: * @exc: Exception Object ref
! 1088: *
! 1089: * Inserts the node @newChild before the existing child node @refChild. If
! 1090: * @refChild is %NULL, insert @newChild at the end of the list of children.
! 1091: * If @newChild is a DocumentFragment node, all of its children are inserted,
! 1092: * in the same order, before @refChild. If the @newChild is already in the
! 1093: * tree, it is first removed.
! 1094: *
! 1095: * %GDOME_HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not
! 1096: * allow children of the type of the @newChild node, or if the node to insert is
! 1097: * one of this node's ancestors or this node itself.
! 1098: * %GDOME_WRONG_DOCUMENT_ERR: Raised if @newChild was created from a different
! 1099: * document than the one that created this node.
! 1100: * %GDOME_NOT_FOUND_ERR: Raised if @refChild is not a child of this node.
! 1101: * %GDOME_NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
! 1102: * Returns: the node being inserted.
! 1103: */
! 1104: GdomeNode *
! 1105: gdome_xml_n_insertBefore (GdomeNode *self, GdomeNode *newChild, GdomeNode *refChild, GdomeException *exc)
! 1106: {
! 1107: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 1108: Gdome_xml_Node *new_priv = (Gdome_xml_Node *)newChild;
! 1109: Gdome_xml_Node *ref_priv = (Gdome_xml_Node *)refChild;
! 1110: GdomeMutationEvent *mev;
! 1111: xmlNode *ret = NULL;
! 1112:
! 1113: g_return_val_if_fail (priv != NULL, NULL);
! 1114: g_return_val_if_fail (GDOME_XML_IS_N (priv), NULL);
! 1115: g_return_val_if_fail (new_priv != NULL, NULL);
! 1116: g_return_val_if_fail (GDOME_XML_IS_N (new_priv), NULL);
! 1117: g_return_val_if_fail (exc != NULL, NULL);
! 1118:
! 1119: if (!gdome_xml_n_canAppend (self, newChild, exc)) {
! 1120: *exc = GDOME_HIERARCHY_REQUEST_ERR;
! 1121: return NULL;
! 1122: }
! 1123:
! 1124: if (gdome_xmlGetOwner(new_priv->n) != gdome_xmlGetOwner(priv->n)) {
! 1125: *exc = GDOME_WRONG_DOCUMENT_ERR;
! 1126: return NULL;
! 1127: }
! 1128:
! 1129: if (GDOME_ISREADONLY (priv)) {
! 1130: *exc = GDOME_NO_MODIFICATION_ALLOWED_ERR;
! 1131: return NULL;
! 1132: }
! 1133:
! 1134: /* If refChild is null, insert newChild at the end of the list of children.*/
! 1135: if(ref_priv == NULL)
! 1136: return gdome_xml_n_appendChild (self, newChild, exc);
! 1137: else
! 1138: g_return_val_if_fail (GDOME_XML_IS_N (ref_priv), NULL);
! 1139:
! 1140: /* If the newChild is already in the tree, it is first removed. */
! 1141: if (gdome_xmlGetParent(new_priv->n) != NULL) {
! 1142: if (gdome_xml_n_eventEnabledByCode (self, DOM_NODE_REMOVED_EVENT_TYPE)) {
! 1143: /* Fire DOMNodeRemoved */
! 1144: mev = gdome_evt_mevnt_mkref ();
! 1145: gdome_xml_n_ref (self, exc);
! 1146: gdome_evt_mevnt_initMutationEventByCode (mev, DOM_NODE_REMOVED_EVENT_TYPE,
! 1147: TRUE, FALSE, self,
! 1148: NULL, NULL, NULL, 0, exc);
! 1149: gdome_xml_n_dispatchEvent (newChild, (GdomeEvent *)mev, exc);
! 1150: gdome_xml_n_unref (self, exc);
! 1151: gdome_evt_mevnt_unref ((GdomeEvent *)mev, exc);
! 1152: }
! 1153:
! 1154: if (gdome_xml_n_eventEnabledByCode (self, DOM_NODE_REMOVED_FROM_DOCUMENT_EVENT_TYPE)) {
! 1155: /* Fire DOMNodeRemovedFromDocument */
! 1156: mev = gdome_evt_mevnt_mkref ();
! 1157: gdome_evt_mevnt_initMutationEventByCode (mev, DOM_NODE_REMOVED_FROM_DOCUMENT_EVENT_TYPE,
! 1158: FALSE, FALSE, NULL,
! 1159: NULL, NULL, NULL, 0, exc);
! 1160: gdome_xml_n_dispatchEvent (newChild, (GdomeEvent *)mev, exc);
! 1161: gdome_xml_n_subTreeDispatchEvent (newChild, (GdomeEvent *)mev, exc);
! 1162: gdome_evt_mevnt_unref ((GdomeEvent *)mev, exc);
! 1163: }
! 1164:
! 1165: gdome_xmlUnlinkChild(gdome_xmlGetParent(new_priv->n), new_priv->n);
! 1166: }
! 1167:
! 1168: if ((ret = gdome_xmlInsertBeforeChild(priv->n, new_priv->n, ref_priv->n)) == NULL) {
! 1169: *exc = GDOME_NOT_FOUND_ERR;
! 1170: return NULL;
! 1171: }
! 1172:
! 1173: /* Unlink children list for DocumentFragment Node */
! 1174: if (gdome_xmlGetType (new_priv->n) == XML_DOCUMENT_FRAG_NODE) {
! 1175: gdome_xmlSetFirstChild(new_priv->n, NULL);
! 1176: gdome_xmlSetLastChild(new_priv->n, NULL);
! 1177: }
! 1178:
! 1179: if (gdome_xml_n_eventEnabledByCode (self, DOM_NODE_INSERTED_EVENT_TYPE)) {
! 1180: /* Fire DOMNodeInserted */
! 1181: mev = gdome_evt_mevnt_mkref ();
! 1182: gdome_xml_n_ref (self, exc);
! 1183: gdome_evt_mevnt_initMutationEventByCode (mev, DOM_NODE_INSERTED_EVENT_TYPE,
! 1184: TRUE, FALSE, self,
! 1185: NULL, NULL, NULL, 0, exc);
! 1186: gdome_xml_n_dispatchEvent (newChild, (GdomeEvent *)mev, exc);
! 1187: gdome_xml_n_unref (self, exc);
! 1188: gdome_evt_mevnt_unref ((GdomeEvent *)mev, exc);
! 1189: }
! 1190:
! 1191: if (gdome_xml_n_eventEnabledByCode (self, DOM_NODE_INSERTED_INTO_DOCUMENT_EVENT_TYPE)) {
! 1192: /* Fire DOMNodeInsertedIntoDocument */
! 1193: mev = gdome_evt_mevnt_mkref ();
! 1194: gdome_evt_mevnt_initMutationEventByCode (mev, DOM_NODE_INSERTED_INTO_DOCUMENT_EVENT_TYPE,
! 1195: FALSE, FALSE, NULL,
! 1196: NULL, NULL, NULL, 0, exc);
! 1197: gdome_xml_n_dispatchEvent (newChild, (GdomeEvent *)mev, exc);
! 1198: gdome_xml_n_subTreeDispatchEvent (newChild, (GdomeEvent *)mev, exc);
! 1199: gdome_evt_mevnt_unref ((GdomeEvent *)mev, exc);
! 1200: }
! 1201:
! 1202: if (gdome_xml_n_eventEnabledByCode (self, DOM_SUBTREE_MODIFIED_EVENT_TYPE)) {
! 1203: /* Fire DOMSubtreeModified */
! 1204: mev = gdome_evt_mevnt_mkref ();
! 1205: gdome_evt_mevnt_initMutationEventByCode (mev, DOM_SUBTREE_MODIFIED_EVENT_TYPE,
! 1206: TRUE, FALSE, NULL,
! 1207: NULL, NULL, NULL, 0, exc);
! 1208: gdome_xml_n_dispatchEvent (self, (GdomeEvent *)mev, exc);
! 1209: gdome_evt_mevnt_unref ((GdomeEvent *)mev, exc);
! 1210: }
! 1211:
! 1212: return gdome_xml_n_mkref (ret);
! 1213: }
! 1214:
! 1215: /**
! 1216: * gdome_xml_n_isSupported:
! 1217: * @self: Node Object ref
! 1218: * @feature: The name of the feature to test.
! 1219: * @version: This is the version number of the feature to test. In Level 2,
! 1220: * version 1, this is the string "2.0". If the version is not
! 1221: * specified, supporting any version of the feature will cause the
! 1222: * method to return %TRUE.
! 1223: * @exc: Exception Object ref
! 1224: *
! 1225: * Tests whether the DOM implementation implements a specific feature and that
! 1226: * feature is supported by this node.
! 1227: * Returns: %TRUE if the specified feature is supported on this node, %FALSE
! 1228: * otherwise.
! 1229: */
! 1230: GdomeBoolean
! 1231: gdome_xml_n_isSupported (GdomeNode *self, GdomeDOMString *feature, GdomeDOMString *version, GdomeException *exc)
! 1232: {
! 1233: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 1234: GdomeBoolean ret;
! 1235: GdomeDOMImplementation *domimpl;
! 1236:
! 1237: g_return_val_if_fail (priv != NULL, FALSE);
! 1238: g_return_val_if_fail (GDOME_XML_IS_N (priv), FALSE);
! 1239: g_return_val_if_fail (feature != NULL, FALSE);
! 1240: g_return_val_if_fail (exc != NULL, FALSE);
! 1241:
! 1242: if (version == NULL)
! 1243: return TRUE;
! 1244:
! 1245: domimpl = gdome_xml_di_mkref();
! 1246: ret = gdome_xml_di_hasFeature (domimpl, feature, version, exc);
! 1247: gdome_xml_di_unref (domimpl, exc);
! 1248:
! 1249: return ret;
! 1250: }
! 1251:
! 1252: /**
! 1253: * gdome_xml_n_normalize:
! 1254: * @self: Node Object ref
! 1255: * @exc: Exception Object ref
! 1256: *
! 1257: * Puts all Text nodes in the full depth of the sub-tree underneath this Node,
! 1258: * including attribute nodes, into a "normal" form where only structure (e.g.,
! 1259: * elements, comments, processing instructions, CDATA sections, and entity
! 1260: * references) separates Text nodes, i.e., there are neither adjacent Text
! 1261: * nodes nor empty Text nodes.
! 1262: */
! 1263: void
! 1264: gdome_xml_n_normalize (GdomeNode *self, GdomeException *exc)
! 1265: {
! 1266: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 1267: GdomeNode *child = NULL, *new_child = NULL;
! 1268: GdomeNode *next = NULL, *new_next = NULL;
! 1269: GdomeDOMString *str = NULL;
! 1270: GdomeNode *result = NULL;
! 1271:
! 1272: g_return_if_fail (priv != NULL);
! 1273: g_return_if_fail (GDOME_XML_IS_N (priv));
! 1274: g_return_if_fail (exc != NULL);
! 1275:
! 1276: /* this is a generic implementation, not optimized for speed */
! 1277: child = gdome_n_firstChild (self, exc);
! 1278: while (child != NULL) {
! 1279: unsigned short type;
! 1280:
! 1281: type = gdome_n_nodeType (child, exc);
! 1282: if (type == GDOME_TEXT_NODE) {
! 1283: next = gdome_n_nextSibling (child, exc);
! 1284: while (next != NULL) {
! 1285: if (gdome_n_nodeType (next, exc) != GDOME_TEXT_NODE) {
! 1286: gdome_n_unref (next, exc);
! 1287: break;
! 1288: }
! 1289: str = gdome_cd_data ((GdomeCharacterData *)next, exc);
! 1290: gdome_cd_appendData ((GdomeCharacterData *)child, str, exc);
! 1291: gdome_str_unref (str);
! 1292: new_next = gdome_n_nextSibling (next, exc);
! 1293: result = gdome_n_removeChild (self, next, exc);
! 1294: gdome_n_unref (result, exc);
! 1295: gdome_n_unref (next, exc);
! 1296: next = new_next;
! 1297: }
! 1298: } else if (type == GDOME_ELEMENT_NODE) {
! 1299: GdomeNamedNodeMap *nnm;
! 1300: gulong i, n;
! 1301:
! 1302: gdome_n_normalize (child, exc);
! 1303: nnm = gdome_n_attributes (child, exc);
! 1304: n = gdome_nnm_length (nnm, exc);
! 1305: for (i = 0; i < n; i++) {
! 1306: GdomeNode *attr;
! 1307:
! 1308: attr = gdome_nnm_item (nnm, i, exc);
! 1309: gdome_n_normalize (attr, exc);
! 1310: gdome_n_unref (attr, exc);
! 1311: }
! 1312: gdome_nnm_unref (nnm, exc);
! 1313: }
! 1314: new_child = gdome_n_nextSibling (child, exc);
! 1315: gdome_n_unref (child, exc);
! 1316: child = new_child;
! 1317: }
! 1318: }
! 1319:
! 1320: /**
! 1321: * gdome_xml_n_removeChild:
! 1322: * @self: Node Object ref
! 1323: * @oldChild: The node being removed
! 1324: * @exc: Exception Object ref
! 1325: *
! 1326: * Removes the child node indicated by @oldChild from the list of children, and
! 1327: * returns it.
! 1328: *
! 1329: * %GDOME_NOT_FOUND_ERR: Raised if @oldChild is not a child of this node.
! 1330: * %GDOME_NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
! 1331: * Returns: the node removed.
! 1332: */
! 1333: GdomeNode *
! 1334: gdome_xml_n_removeChild (GdomeNode *self, GdomeNode *oldChild, GdomeException *exc)
! 1335: {
! 1336: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 1337: Gdome_xml_Node *old_priv = (Gdome_xml_Node *)oldChild;
! 1338: GdomeMutationEvent *mev;
! 1339: xmlNode *ret;
! 1340:
! 1341: g_return_val_if_fail (priv != NULL, NULL);
! 1342: g_return_val_if_fail (GDOME_XML_IS_N (priv), NULL);
! 1343: g_return_val_if_fail (old_priv != NULL, NULL);
! 1344: g_return_val_if_fail (GDOME_XML_IS_TREE_N (old_priv), NULL);
! 1345: g_return_val_if_fail (exc != NULL, NULL);
! 1346:
! 1347: if (GDOME_ISREADONLY (priv)) {
! 1348: *exc = GDOME_NO_MODIFICATION_ALLOWED_ERR;
! 1349: return NULL;
! 1350: }
! 1351:
! 1352: if (gdome_xml_n_eventEnabledByCode (self, DOM_NODE_REMOVED_EVENT_TYPE)) {
! 1353: /* Fire DOMNodeRemoved */
! 1354: mev = gdome_evt_mevnt_mkref ();
! 1355: gdome_xml_n_ref (self, exc);
! 1356: gdome_evt_mevnt_initMutationEventByCode (mev, DOM_NODE_REMOVED_EVENT_TYPE,
! 1357: TRUE, FALSE, self,
! 1358: NULL, NULL, NULL, 0, exc);
! 1359: gdome_xml_n_dispatchEvent (oldChild, (GdomeEvent *)mev, exc);
! 1360: gdome_xml_n_unref (self, exc);
! 1361: gdome_evt_mevnt_unref ((GdomeEvent *)mev, exc);
! 1362: }
! 1363:
! 1364: if (gdome_xml_n_eventEnabledByCode (self, DOM_NODE_REMOVED_FROM_DOCUMENT_EVENT_TYPE)) {
! 1365: /* Fire DOMNodeRemovedFromDocument */
! 1366: mev = gdome_evt_mevnt_mkref ();
! 1367: gdome_evt_mevnt_initMutationEventByCode (mev, DOM_NODE_REMOVED_FROM_DOCUMENT_EVENT_TYPE,
! 1368: FALSE, FALSE, NULL,
! 1369: NULL, NULL, NULL, 0, exc);
! 1370: gdome_xml_n_dispatchEvent (oldChild, (GdomeEvent *)mev, exc);
! 1371: gdome_xml_n_subTreeDispatchEvent (oldChild, (GdomeEvent *)mev, exc);
! 1372: gdome_evt_mevnt_unref ((GdomeEvent *)mev, exc);
! 1373: }
! 1374:
! 1375: if (gdome_xml_n_eventEnabledByCode (self, DOM_SUBTREE_MODIFIED_EVENT_TYPE)) {
! 1376: /* Fire DOMSubtreeModified */
! 1377: mev = gdome_evt_mevnt_mkref ();
! 1378: gdome_evt_mevnt_initMutationEventByCode (mev, DOM_SUBTREE_MODIFIED_EVENT_TYPE,
! 1379: TRUE, FALSE, NULL,
! 1380: NULL, NULL, NULL, 0, exc);
! 1381: gdome_xml_n_dispatchEvent (self, (GdomeEvent *)mev, exc);
! 1382: gdome_evt_mevnt_unref ((GdomeEvent *)mev, exc);
! 1383: }
! 1384:
! 1385: if ((ret = gdome_xmlUnlinkChild(priv->n, old_priv->n)) == NULL) {
! 1386: *exc = GDOME_NOT_FOUND_ERR;
! 1387: return NULL;
! 1388: }
! 1389:
! 1390: return gdome_xml_n_mkref (ret);
! 1391: }
! 1392:
! 1393: /**
! 1394: * gdome_xml_n_replaceChild:
! 1395: * @self: Node Object ref
! 1396: * @newChild: The new node to put in the child list
! 1397: * @oldChild: The node being replaced in the list
! 1398: * @exc: Exception Object ref
! 1399: *
! 1400: * Replaces the child node @oldChild with @newChild in the list of children,
! 1401: * and returns the @oldChild node. If @newChild is a DocumentFragment object,
! 1402: * @oldChild is replaced by all of the DocumentFragment children, which are
! 1403: * inserted in the same order. If the @newChild is already in the tree, it is
! 1404: * first removed.
! 1405: *
! 1406: * %GDOME_HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does
! 1407: * not allow children of the type of the @newChild node, or if the node to put
! 1408: * in is one of this node's ancestors or this node itself.
! 1409: * %GDOME_WRONG_DOCUMENT_ERR: Raised if @newChild was created from a different
! 1410: * document than the one that created this node.
! 1411: * %GDOME_NOT_FOUND_ERR: Raised if @oldChild is not a child of this node.
! 1412: * %GDOME_NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
! 1413: * Returns: the node replaced.
! 1414: */
! 1415: GdomeNode *
! 1416: gdome_xml_n_replaceChild (GdomeNode *self, GdomeNode *newChild, GdomeNode *oldChild, GdomeException *exc)
! 1417: {
! 1418: GdomeNode *ret = NULL;
! 1419: GdomeNode *refChild = NULL;
! 1420:
! 1421: g_return_val_if_fail (self != NULL, NULL);
! 1422: g_return_val_if_fail (GDOME_XML_IS_N (self), NULL);
! 1423: g_return_val_if_fail (newChild != NULL, NULL);
! 1424: g_return_val_if_fail (GDOME_XML_IS_N (newChild), NULL);
! 1425: g_return_val_if_fail (oldChild != NULL, NULL);
! 1426: g_return_val_if_fail (GDOME_XML_IS_N (oldChild), NULL);
! 1427: g_return_val_if_fail (exc != NULL, NULL);
! 1428:
! 1429: if (GDOME_ISREADONLY (self)) {
! 1430: *exc = GDOME_NO_MODIFICATION_ALLOWED_ERR;
! 1431: return NULL;
! 1432: }
! 1433:
! 1434: refChild = gdome_n_nextSibling (oldChild, exc);
! 1435: if (gdome_n_removeChild (self, oldChild, exc)) {
! 1436: if (gdome_n_insertBefore (self, newChild, refChild, exc)) {
! 1437: gdome_n_unref (newChild, exc);
! 1438: ret = oldChild;
! 1439: } else {
! 1440: gdome_n_unref (oldChild, exc);
! 1441: ret = NULL;
! 1442: }
! 1443: }
! 1444:
! 1445: if (refChild)
! 1446: gdome_n_unref (refChild, exc);
! 1447:
! 1448: return ret;
! 1449: }
! 1450:
! 1451: /**
! 1452: * gdome_xml_n_addEventListener:
! 1453: * @self: Node Object ref
! 1454: * @type: the event type for which the user is registering
! 1455: * @listener: the listener parameter takes an interface implemented by the
! 1456: * user which contains the methods to be called when the event occurs.
! 1457: * @useCapture: if %TRUE, useCapture indicates that the user wishes to initiate
! 1458: * capture. After initiating capture, all events of the specified
! 1459: * type will be dispatched to the registered EventListener before
! 1460: * being dispatched to any EventTargets beneath them in the tree.
! 1461: * Events which are bubbling upward through the tree will not
! 1462: * trigger an EventListener designated to use capture.
! 1463: * @exc: Exception Object ref
! 1464: *
! 1465: * This method allows the registration of event listeners on the event target.
! 1466: * If an EventListener is added to an EventTarget while it is processing an
! 1467: * event, it will not be triggered by the current actions but may be triggered
! 1468: * during a later stage of event flow, such as the bubbling phase.
! 1469: * If multiple identical EventListeners are registered on the same EventTarget
! 1470: * with the same parameters the duplicate instances are discarded. They do not
! 1471: * cause the EventListener to be called twice and since they are discarded
! 1472: * they do not need to be removed with the removeEventListener method.
! 1473: */
! 1474: void
! 1475: gdome_xml_n_addEventListener (GdomeNode *self, GdomeDOMString *type,
! 1476: GdomeEventListener *listener, GdomeBoolean useCapture,
! 1477: GdomeException *exc)
! 1478: {
! 1479: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 1480: Gdome_xml_ListenerList *ll = NULL;
! 1481: Gdome_xml_ListenerList *temp;
! 1482: guint32 codeType;
! 1483:
! 1484: g_return_if_fail (priv != NULL);
! 1485: g_return_if_fail (GDOME_XML_IS_N (priv));
! 1486: g_return_if_fail (listener != NULL);
! 1487: g_return_if_fail (type != NULL);
! 1488: g_return_if_fail (exc != NULL);
! 1489:
! 1490: /* duplicate instances are discarted */
! 1491: codeType = gdome_evt_evnt_codeOfName (type->str);
! 1492: temp = priv->ll;
! 1493: while (temp) {
! 1494: if (temp->listener == listener &&
! 1495: temp->type == codeType &&
! 1496: temp->useCapture == useCapture) {
! 1497: return;
! 1498: }
! 1499: temp = temp->next;
! 1500: }
! 1501:
! 1502: /* create a new ListenerList entry*/
! 1503: ll = g_new (Gdome_xml_ListenerList, 1);
! 1504: ll->type = codeType;
! 1505: gdome_evt_evntl_ref (listener, exc);
! 1506: ll->listener = listener;
! 1507: ll->useCapture = useCapture;
! 1508:
! 1509: /* add it at begin of the ListenerList of the target */
! 1510: ll->next = priv->ll;
! 1511: priv->ll = ll;
! 1512: }
! 1513:
! 1514: /**
! 1515: * gdome_xml_n_removeEventListener:
! 1516: * @self: Node Object ref
! 1517: * @type: Specifies the event type of the EventListener being removed.
! 1518: * @listener: The EventListener parameter indicates the EventListener to be
! 1519: * removed.
! 1520: * @useCapture: Specifies whether the EventListener being removed was
! 1521: * registered as a capturing listener or not. If a listener was
! 1522: * registered twice, one with capture and one without, each must
! 1523: * be removed separately. Removal of a capturing listener does
! 1524: * not affect a non-capturing version of the same listener, and
! 1525: * vice versa.
! 1526: * @exc: Exception Object ref
! 1527: *
! 1528: * This method allows the removal of event listeners from the event target. If
! 1529: * an EventListener is removed from an EventTarget while it is processing an
! 1530: * event, it will not be triggered by the current actions. EventListeners can
! 1531: * never be invoked after being removed. Calling removeEventListener with
! 1532: * arguments which do not identify any currently registered EventListener on
! 1533: * the EventTarget has no effect.
! 1534: */
! 1535: void
! 1536: gdome_xml_n_removeEventListener (GdomeNode *self, GdomeDOMString *type,
! 1537: GdomeEventListener *listener, GdomeBoolean useCapture,
! 1538: GdomeException *exc)
! 1539: {
! 1540: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 1541: Gdome_xml_ListenerList *temp, *prev = NULL;
! 1542: guint32 codeType;
! 1543:
! 1544: g_return_if_fail (priv != NULL);
! 1545: g_return_if_fail (GDOME_XML_IS_N (priv));
! 1546: g_return_if_fail (listener != NULL);
! 1547: g_return_if_fail (type != NULL);
! 1548: g_return_if_fail (exc != NULL);
! 1549:
! 1550: codeType = gdome_evt_evnt_codeOfName (type->str);
! 1551: temp = priv->ll;
! 1552: while (temp) {
! 1553: if (useCapture == temp->useCapture &&
! 1554: temp->listener == listener &&
! 1555: temp->type == codeType) {
! 1556: if (prev)
! 1557: prev->next = temp->next;
! 1558: else {
! 1559: g_assert (priv->ll == temp);
! 1560: priv->ll = priv->ll->next;
! 1561: }
! 1562: temp->next = NULL;
! 1563: gdome_evt_evntl_unref (listener, exc);
! 1564: g_free (temp);
! 1565: break;
! 1566: }
! 1567: prev = temp;
! 1568: temp = temp->next;
! 1569: }
! 1570: }
! 1571:
! 1572:
! 1573: /**
! 1574: * gdome_xml_n_dispatchEvent:
! 1575: * @self: Node Object ref
! 1576: * @evt: Specifies the event type, behavior, and contextual information to be
! 1577: * used in processing the event.
! 1578: * @exc: Exception Object ref
! 1579: *
! 1580: * This method allows the dispatch of events into the implementations event
! 1581: * model. Events dispatched in this manner will have the same capturing and
! 1582: * bubbling behavior as events dispatched directly by the implementation. The
! 1583: * target of the event is the EventTarget on which dispatchEvent is called.
! 1584: *
! 1585: * GDOME_UNSPECIFIED_EVENT_TYPE_ERR: Raised if the Event's type was not
! 1586: * specified by initializing the event before dispatchEvent was called.
! 1587: * Specification of the Event's type as %NULL or an empty string will also
! 1588: * trigger this exception.
! 1589: * Returns: if preventDefault was called the value is %FALSE, else the value
! 1590: * is %TRUE.
! 1591: */
! 1592: GdomeBoolean
! 1593: gdome_xml_n_dispatchEvent (GdomeNode *self, GdomeEvent *evt, GdomeException *exc)
! 1594: {
! 1595: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 1596: Gdome_evt_Event *ev_priv = (Gdome_evt_Event *)evt;
! 1597:
! 1598: g_return_val_if_fail (priv != NULL, FALSE);
! 1599: g_return_val_if_fail (GDOME_XML_IS_N (priv), FALSE);
! 1600: g_return_val_if_fail (evt != NULL, FALSE);
! 1601: g_return_val_if_fail (exc != NULL, FALSE);
! 1602:
! 1603: if (ev_priv->type == 0) {
! 1604: *exc = GDOME_EVENT_EXCEPTION + GDOME_UNSPECIFIED_EVENT_TYPE_ERR;
! 1605: return FALSE;
! 1606: }
! 1607:
! 1608: gdome_xml_n_ref (self, exc);
! 1609: ev_priv->target = self;
! 1610: gdome_evt_fireEvent (evt);
! 1611: gdome_xml_n_unref (self, exc);
! 1612:
! 1613: return !ev_priv->default_prevented;
! 1614: }
! 1615:
! 1616: /**
! 1617: * gdome_xml_n_subTreeDispatchEvent:
! 1618: * @self: Node Object ref
! 1619: * @evt: Specifies the event type, behavior, and contextual information to be
! 1620: * used in processing the event.
! 1621: * @exc: Exception Object ref
! 1622: *
! 1623: * This method allows the dispatch of events into the implementations event
! 1624: * model. Events dispatched in this manner will have the same capturing and
! 1625: * bubbling behavior as events dispatched directly by the implementation. The
! 1626: * target of the event is any nodes in the subtree of the EventTarget on which
! 1627: * dispatchEvent is called.
! 1628: *
! 1629: * GDOME_UNSPECIFIED_EVENT_TYPE_ERR: Raised if the Event's type was not
! 1630: * specified by initializing the event before dispatchEvent was called.
! 1631: * Specification of the Event's type as %NULL or an empty string will also
! 1632: * trigger this exception.
! 1633: */
! 1634: void
! 1635: gdome_xml_n_subTreeDispatchEvent (GdomeNode *self, GdomeEvent *evt, GdomeException *exc)
! 1636: {
! 1637: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 1638: GdomeNode *child, *temp;
! 1639:
! 1640: g_return_if_fail (priv != NULL);
! 1641: g_return_if_fail (GDOME_XML_IS_N (priv));
! 1642: g_return_if_fail (evt != NULL);
! 1643: g_return_if_fail (exc != NULL);
! 1644:
! 1645: child = gdome_xml_n_firstChild (self, exc);
! 1646:
! 1647: while (child) {
! 1648: gdome_xml_n_dispatchEvent (child, evt, exc);
! 1649: gdome_xml_n_subTreeDispatchEvent (child, evt, exc);
! 1650: temp = gdome_xml_n_nextSibling (child, exc);
! 1651: gdome_xml_n_unref (child, exc);
! 1652: child = temp;
! 1653: }
! 1654: }
! 1655:
! 1656: /**
! 1657: * gdome_xml_n_canAppend:
! 1658: * @self: Node Object ref
! 1659: * @newChild: The Node Object ref of the node to test
! 1660: * @exc: Exception Object ref
! 1661: *
! 1662: * Tests if a @newChild can be added in the child list of this node.
! 1663: * Returns: %TRUE if @newChild can be added, %FALSE otherwise.
! 1664: */
! 1665: GdomeBoolean
! 1666: gdome_xml_n_canAppend (GdomeNode *self, GdomeNode *newChild, GdomeException *exc)
! 1667: {
! 1668: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 1669: Gdome_xml_Node *new_priv = (Gdome_xml_Node *)newChild;
! 1670: xmlElementType new_type;
! 1671: GdomeBoolean ret = TRUE;
! 1672:
! 1673: g_return_val_if_fail (priv != NULL, FALSE);
! 1674: g_return_val_if_fail (GDOME_XML_IS_N (priv), FALSE);
! 1675: g_return_val_if_fail (new_priv != NULL, FALSE);
! 1676: g_return_val_if_fail (GDOME_XML_IS_N (new_priv), FALSE);
! 1677: g_return_val_if_fail (exc != NULL, FALSE);
! 1678:
! 1679: /* Check if self can have a child of newChild type */
! 1680: new_type = gdome_xmlGetType (new_priv->n);
! 1681: if (new_type == XML_DOCUMENT_FRAG_NODE)
! 1682: return TRUE;
! 1683: switch (gdome_xmlGetType (priv->n)) {
! 1684: case XML_DOCUMENT_TYPE_NODE:
! 1685: case XML_DTD_NODE:
! 1686: case XML_PI_NODE:
! 1687: case XML_COMMENT_NODE:
! 1688: case XML_TEXT_NODE:
! 1689: case XML_CDATA_SECTION_NODE:
! 1690: case XML_NOTATION_NODE:
! 1691: ret = FALSE;
! 1692: break;
! 1693: case XML_DOCUMENT_NODE:
! 1694: /* Element (max of one), ProcessingInstruction, Comment, DocumentType (max of one) */
! 1695: if ((new_type != XML_ELEMENT_NODE &&
! 1696: new_type != XML_PI_NODE &&
! 1697: new_type != XML_COMMENT_NODE &&
! 1698: new_type != XML_DTD_NODE &&
! 1699: new_type != XML_DOCUMENT_TYPE_NODE) ||
! 1700: (new_type == XML_ELEMENT_NODE &&
! 1701: xmlDocGetRootElement ((xmlDoc *)priv->n) != NULL) ||
! 1702: ((new_type == XML_DTD_NODE ||
! 1703: new_type == XML_DOCUMENT_TYPE_NODE) &&
! 1704: ((xmlDoc *)priv->n)->intSubset != NULL))
! 1705: ret = FALSE;
! 1706: break;
! 1707: case XML_DOCUMENT_FRAG_NODE:
! 1708: case XML_ENTITY_REF_NODE:
! 1709: case XML_ELEMENT_NODE:
! 1710: case XML_ENTITY_NODE:
! 1711: case XML_ENTITY_DECL:
! 1712: /* Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference */
! 1713: if (new_type != XML_ELEMENT_NODE &&
! 1714: new_type != XML_PI_NODE &&
! 1715: new_type != XML_COMMENT_NODE &&
! 1716: new_type != XML_TEXT_NODE &&
! 1717: new_type != XML_CDATA_SECTION_NODE &&
! 1718: new_type != XML_ENTITY_REF_NODE)
! 1719: ret = FALSE;
! 1720: break;
! 1721: case XML_ATTRIBUTE_NODE:
! 1722: /* Text, EntityReference */
! 1723: if (new_type != XML_TEXT_NODE &&
! 1724: new_type != XML_ENTITY_REF_NODE)
! 1725: ret = FALSE;
! 1726: break;
! 1727: default:
! 1728: g_warning ("gdome_xml_n_canAppend: invalid node type");
! 1729: ret = FALSE;
! 1730: break;
! 1731: }
! 1732:
! 1733: /* Check if newChild is an ancestor of self */
! 1734: if (ret) {
! 1735: xmlNode *p = priv->n;
! 1736: while (p != NULL) {
! 1737: if (p == new_priv->n) {
! 1738: ret = FALSE;
! 1739: break;
! 1740: }
! 1741: p = gdome_xmlGetParent (p);
! 1742: }
! 1743: }
! 1744:
! 1745: return ret;
! 1746: }
! 1747:
! 1748: /**
! 1749: * gdome_xml_n_eventEnabledByCode:
! 1750: * @self: Node Objects ref
! 1751: * @code: The event type to check
! 1752: *
! 1753: * Returns: TRUE if the specified event type is enabled
! 1754: */
! 1755: GdomeBoolean
! 1756: gdome_xml_n_eventEnabledByCode (GdomeNode *self, guint32 code)
! 1757: {
! 1758: Gdome_xml_Node *priv = (Gdome_xml_Node *)self;
! 1759: GdomeException exc = 0;
! 1760: GdomeDocument *doc;
! 1761: GdomeBoolean res;
! 1762:
! 1763: g_return_val_if_fail (priv != NULL, FALSE);
! 1764: g_return_val_if_fail (GDOME_XML_IS_N (priv), FALSE);
! 1765:
! 1766: doc = gdome_xml_doc_mkref (gdome_xmlGetOwnerOrSelf (priv->n));
! 1767: g_assert(doc != NULL);
! 1768:
! 1769: res = gdome_xml_doc_eventEnabledByCode (doc, code);
! 1770:
! 1771: gdome_doc_unref(doc, &exc);
! 1772: g_assert(exc == 0);
! 1773:
! 1774: return res;
! 1775: }
E-mail: