IDNodeImpl.cpp
上传用户:huihehuasu
上传日期:2007-01-10
资源大小:6948k
文件大小:13k
源码类别:

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 2001 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 2001, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Id: IDNodeImpl.cpp,v 1.3 2001/06/04 14:55:34 tng Exp $
  58.  */
  59. // This class doesn't support having any children, and implements the behavior
  60. // of an empty NodeList as far getChildNodes is concerned.
  61. // The ParentNode subclass overrides this behavior.
  62. #include "IDNodeImpl.hpp"
  63. #include "IDOM_DOMException.hpp"
  64. #include "IDCasts.hpp"
  65. #include "IDDocumentImpl.hpp"
  66. #include "IDDOMImplementation.hpp"
  67. #include <util/XMLUniDefs.hpp>
  68. #include <stdio.h>
  69. #include <assert.h>
  70. const unsigned short IDNodeImpl::READONLY     = 0x1<<0;
  71. const unsigned short IDNodeImpl::SYNCDATA     = 0x1<<1;
  72. const unsigned short IDNodeImpl::SYNCCHILDREN = 0x1<<2;
  73. const unsigned short IDNodeImpl::OWNED        = 0x1<<3;
  74. const unsigned short IDNodeImpl::FIRSTCHILD   = 0x1<<4;
  75. const unsigned short IDNodeImpl::SPECIFIED    = 0x1<<5;
  76. const unsigned short IDNodeImpl::IGNORABLEWS  = 0x1<<6;
  77. const unsigned short IDNodeImpl::SETVALUE     = 0x1<<7;
  78. const unsigned short IDNodeImpl::ID_ATTR      = 0x1<<8;
  79. const unsigned short IDNodeImpl::USERDATA     = 0x1<<9;
  80. const unsigned short IDNodeImpl::LEAFNODETYPE = 0x1<<10;
  81. const unsigned short IDNodeImpl::CHILDNODE    = 0x1<<11;
  82. IDNodeImpl::IDNodeImpl(IDOM_Node *ownerNode)
  83. {
  84.     this->flags = 0;
  85.     // as long as we do not have any owner, fOwnerNode is our ownerDocument
  86.     fOwnerNode  = ownerNode;
  87. };
  88. // This only makes a shallow copy, cloneChildren must also be called for a
  89. // deep clone
  90. IDNodeImpl::IDNodeImpl(const IDNodeImpl &other) {
  91.     this->flags = other.flags;
  92.     this->isReadOnly(false);
  93.     // Need to break the association w/ original parent
  94.     this->fOwnerNode = other.getOwnerDocument();
  95.     this->isOwned(false);
  96. };
  97. IDNodeImpl::~IDNodeImpl() {
  98.     //
  99.     //   Note:  With IDOM memory mgmt, destructors are not called for nodes.
  100.     // if (hasUserData())
  101.     // {
  102.     // setUserData(0);
  103.     // }
  104. };
  105. IDOM_Node * IDNodeImpl::appendChild(IDOM_Node *newChild)
  106. {
  107.     // Only node types that don't allow children will use this default function.
  108.     //   Others will go to IDParentNode::appendChild.
  109.     throw IDOM_DOMException(IDOM_DOMException::HIERARCHY_REQUEST_ERR,0);
  110.     return 0;
  111.     //  return insertBefore(newChild, 0);
  112. };
  113. IDOM_NamedNodeMap * IDNodeImpl::getAttributes() const {
  114.     return 0;                   // overridden in ElementImpl
  115. };
  116. static IDOM_NodeList *gEmptyNodeList;  // idom_revisit - make a singleton empty node list somewhere, shomehow.
  117. IDOM_NodeList *IDNodeImpl::getChildNodes() const {
  118.     return gEmptyNodeList;       // overridden in ParentNode
  119. };
  120. IDOM_Node * IDNodeImpl::getFirstChild() const {
  121.     return 0;                   // overridden in ParentNode
  122. };
  123. IDOM_Node * IDNodeImpl::getLastChild() const
  124. {
  125.     return 0;                   // overridden in ParentNode
  126. };
  127. IDOM_Node * IDNodeImpl::getNextSibling() const {
  128.     return 0;                // overridden in ChildNode
  129. };
  130. const XMLCh * IDNodeImpl::getNodeValue() const {
  131.     return 0;                    // Overridden by anything that has a value
  132. }
  133. //
  134. //  Unlike the external getOwnerDocument, this one returns the owner document
  135. //     for document nodes as well as all of the other node types.
  136. //
  137. IDOM_Document *IDNodeImpl::getOwnerDocument() const
  138. {
  139.     if (!this->isLeafNode())
  140.     {
  141.         IDElementImpl *ep = (IDElementImpl *)castToNode(this);
  142.         return ep->fParent.fOwnerDocument;
  143.     }
  144.     //  Leaf node types - those that cannot have children, like Text.
  145.     if (isOwned()) {
  146.         return fOwnerNode->getOwnerDocument();
  147.     } else {
  148.         assert (fOwnerNode->getNodeType() == IDOM_Node::DOCUMENT_NODE);
  149.         return  (IDOM_Document *)fOwnerNode;
  150.     }
  151. };
  152. void IDNodeImpl::setOwnerDocument(IDOM_Document *doc) {
  153.     // if we have an owner we rely on it to have it right
  154.     // otherwise fOwnerNode is our ownerDocument
  155.     if (!isOwned()) {
  156.         // idom_revisit.  Problem with storage for doctype nodes that were created
  157.         //                on the system heap in advance of having a document.
  158.         fOwnerNode = doc;
  159.     }
  160. }
  161. IDOM_Node * IDNodeImpl::getParentNode() const
  162. {
  163.     return 0;                // overridden in ChildNode
  164. };
  165. IDOM_Node*  IDNodeImpl::getPreviousSibling() const
  166. {
  167.     return 0;                // overridden in ChildNode
  168. };
  169. void *IDNodeImpl::getUserData() const
  170. {
  171.     void *userData = 0;
  172. #ifdef idom_revisit
  173.     if (hasUserData()) {
  174.         userData =  (IDDocumentImpl *)getOwnerDocument()->getUserData(this);
  175.     }
  176. #endif
  177.   return userData;
  178. };
  179. bool IDNodeImpl::hasChildNodes() const
  180. {
  181.     return false;
  182. };
  183. IDOM_Node *IDNodeImpl::insertBefore(IDOM_Node *newChild, IDOM_Node *refChild) {
  184.     throw IDOM_DOMException(IDOM_DOMException::HIERARCHY_REQUEST_ERR, 0);
  185.     return 0;
  186. };
  187. IDOM_Node *IDNodeImpl::removeChild(IDOM_Node *oldChild)
  188. {
  189.     throw IDOM_DOMException(IDOM_DOMException::NOT_FOUND_ERR, 0);
  190.     return 0;
  191. };
  192. IDOM_Node *IDNodeImpl::replaceChild(IDOM_Node *newChild, IDOM_Node *oldChild)
  193. {
  194.     throw IDOM_DOMException(IDOM_DOMException::HIERARCHY_REQUEST_ERR,0);
  195.     return 0;
  196. };
  197. void IDNodeImpl::setNodeValue(const XMLCh *val)
  198. {
  199.     if (isReadOnly())
  200.         throw IDOM_DOMException(IDOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, 0);
  201.     // Default behavior is to do nothing, overridden in some subclasses
  202. };
  203. void IDNodeImpl::setReadOnly(bool readOnl, bool deep)
  204. {
  205.     this->isReadOnly(readOnl);
  206.     if (deep) {
  207.         for (IDOM_Node *mykid = castToNode(this)->getFirstChild();
  208.             mykid != 0;
  209.             mykid = mykid->getNextSibling())
  210.             if(mykid->getNodeType() != IDOM_Node::ENTITY_REFERENCE_NODE)
  211.                 castToNodeImpl(mykid)->setReadOnly(readOnl,true);
  212.     }
  213. }
  214. void IDNodeImpl::setUserData(void * val)
  215. {
  216. IDDocumentImpl *doc = (IDDocumentImpl *)this->getOwnerDocument();
  217.     doc->setUserData(val);
  218. if (val)
  219. hasUserData(true);
  220. else
  221. hasUserData(false);
  222. };
  223. //Introduced in DOM Level 2
  224. void IDNodeImpl::normalize()
  225. {
  226.     // does nothing by default, overridden by subclasses
  227. };
  228. bool IDNodeImpl::supports(const XMLCh *feature, const XMLCh *version) const
  229. {
  230.     return IDOM_DOMImplementation::getImplementation()->hasFeature(feature, version);
  231. }
  232. const XMLCh *IDNodeImpl::getNamespaceURI() const
  233. {
  234.     return 0;
  235. }
  236. const XMLCh *IDNodeImpl::getPrefix() const
  237. {
  238.     return 0;
  239. }
  240. const XMLCh *IDNodeImpl::getLocalName() const
  241. {
  242.     return 0;
  243. }
  244. void IDNodeImpl::setPrefix(const XMLCh *fPrefix)
  245. {
  246.     throw IDOM_DOMException(IDOM_DOMException::NAMESPACE_ERR, 0);
  247. }
  248. static const XMLCh s_xml[] = {chLatin_x, chLatin_m, chLatin_l, chNull};
  249. static const XMLCh s_xmlURI[] =    // "http://www.w3.org/XML/1998/namespace"
  250.     { chLatin_h, chLatin_t, chLatin_t, chLatin_p, chColon, chForwardSlash, chForwardSlash,
  251.       chLatin_w, chLatin_w, chLatin_w, chPeriod, chLatin_w, chDigit_3, chPeriod,
  252.       chLatin_o, chLatin_r, chLatin_g, chForwardSlash, chLatin_X, chLatin_M, chLatin_L, chForwardSlash,
  253.       chDigit_1, chDigit_9, chDigit_9, chDigit_8, chForwardSlash,
  254.       chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chLatin_p, chLatin_a, chLatin_c, chLatin_e,
  255.       chNull};
  256. static const XMLCh s_xmlns[] = {chLatin_x, chLatin_m, chLatin_l, chLatin_n, chLatin_s, chNull};
  257. static const XMLCh s_xmlnsURI[] = // "http://www.w3.org/2000/xmlns/"
  258.     {  chLatin_h, chLatin_t, chLatin_t, chLatin_p, chColon, chForwardSlash, chForwardSlash,
  259.        chLatin_w, chLatin_w, chLatin_w, chPeriod, chLatin_w, chDigit_3, chPeriod,
  260.        chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
  261.        chDigit_2, chDigit_0, chDigit_0, chDigit_0, chForwardSlash,
  262.        chLatin_x, chLatin_m, chLatin_l, chLatin_n, chLatin_s, chForwardSlash, chNull};
  263. const XMLCh *IDNodeImpl::getXmlString()      {return s_xml;};
  264. const XMLCh *IDNodeImpl::getXmlURIString()   {return s_xmlURI;};
  265. const XMLCh *IDNodeImpl::getXmlnsString()    {return s_xmlns;};
  266. const XMLCh *IDNodeImpl::getXmlnsURIString() {return s_xmlnsURI;};
  267. //Return a URI mapped from the given prefix and namespaceURI as below
  268. // prefix   namespaceURI output
  269. //---------------------------------------------------
  270. // "xml"      xmlURI            xmlURI
  271. // "xml"    otherwise         NAMESPACE_ERR
  272. // "xmlns"    xmlnsURI          xmlnsURI (nType = ATTRIBUTE_NODE only)
  273. // "xmlns"    otherwise         NAMESPACE_ERR (nType = ATTRIBUTE_NODE only)
  274. //   != null   null or ""        NAMESPACE_ERR
  275. // else       any      namesapceURI
  276. const XMLCh* IDNodeImpl::mapPrefix(const XMLCh *prefix,
  277.                                      const XMLCh *namespaceURI, short nType)
  278. {
  279.     static const XMLCh s_xml[] = {chLatin_x, chLatin_m, chLatin_l, chNull};
  280.     static const XMLCh s_xmlURI[] =    // "http://www.w3.org/XML/1998/namespace"
  281.     { chLatin_h, chLatin_t, chLatin_t, chLatin_p, chColon, chForwardSlash, chForwardSlash,
  282.       chLatin_w, chLatin_w, chLatin_w, chPeriod, chLatin_w, chDigit_3, chPeriod,
  283.       chLatin_o, chLatin_r, chLatin_g, chForwardSlash, chLatin_X, chLatin_M, chLatin_L, chForwardSlash,
  284.       chDigit_1, chDigit_9, chDigit_9, chDigit_8, chForwardSlash,
  285.       chLatin_n, chLatin_a, chLatin_m, chLatin_e, chLatin_s, chLatin_p, chLatin_a, chLatin_c, chLatin_e,
  286.       chNull};
  287.     static const XMLCh s_xmlns[] = {chLatin_x, chLatin_m, chLatin_l, chLatin_n, chLatin_s, chNull};
  288.     static const XMLCh s_xmlnsURI[] = // "http://www.w3.org/2000/xmlns/"
  289.     {  chLatin_h, chLatin_t, chLatin_t, chLatin_p, chColon, chForwardSlash, chForwardSlash,
  290.        chLatin_w, chLatin_w, chLatin_w, chPeriod, chLatin_w, chDigit_3, chPeriod,
  291.        chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
  292.        chDigit_2, chDigit_0, chDigit_0, chDigit_0, chForwardSlash,
  293.        chLatin_x, chLatin_m, chLatin_l, chLatin_n, chLatin_s, chForwardSlash, chNull};
  294.     if (prefix == 0)
  295.         return namespaceURI;
  296.     if (XMLString::compareString(prefix, s_xml) == 0)  {
  297.         if (XMLString::compareString(namespaceURI, s_xmlURI) == 0)
  298.             return s_xmlURI;
  299.         throw IDOM_DOMException(IDOM_DOMException::NAMESPACE_ERR, 0);
  300.     } else if (nType == IDOM_Node::ATTRIBUTE_NODE && XMLString::compareString(prefix, s_xmlns) == 0) {
  301.         if (XMLString::compareString(namespaceURI, s_xmlnsURI) == 0)
  302.             return s_xmlnsURI;
  303.         throw IDOM_DOMException(IDOM_DOMException::NAMESPACE_ERR, 0);
  304.     } else if (namespaceURI == 0 || *namespaceURI == 0) {
  305.         throw IDOM_DOMException(IDOM_DOMException::NAMESPACE_ERR, 0);
  306.     } else
  307.         return namespaceURI;
  308.     return namespaceURI;
  309. }