Annotation of win32/gnome/gdome2-x.x.x/libgdome/gdomecore/gdome-xml-pi.c, revision 1.1

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
        !            91: gdome_xml_pi_query_interface (GdomeNode *self, const char *interface, GdomeException *exc)
        !            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;
        !           167:   GdomeNode *parent;
        !           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: 
        !           181:  if (gdome_xml_n_eventEnabledByCode ((GdomeNode *) self, DOM_CHARACTER_DATA_MODIFIED_EVENT_TYPE)) {
        !           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);
        !           189:    gdome_xml_n_dispatchEvent ((GdomeNode *)self, (GdomeEvent *)mev, exc);
        !           190:    gdome_xml_str_unref (data);
        !           191:    gdome_xml_str_unref (prevValue);
        !           192:    gdome_evt_mevnt_unref ((GdomeEvent *)mev, exc);
        !           193:  }
        !           194: 
        !           195:  if (gdome_xml_n_eventEnabledByCode ((GdomeNode *) self, DOM_SUBTREE_MODIFIED_EVENT_TYPE)) {
        !           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: