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

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-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) 1999, 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: XMLDOMNamedNodeMap.cpp,v 1.6 2001/05/11 13:25:06 tng Exp $
  58.  */
  59. #include "stdafx.h"
  60. #include "xml4com.h"
  61. #include "XMLDOMNamedNodeMap.h"
  62. #include "XMLDOMUtil.h"
  63. #include "IXMLDOMNodeImpl.h"
  64. typedef CComEnumOnSTL<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT>, NodeContainerImpl<DOM_NamedNodeMap> >
  65. CComEnumUnknownOnNamedNodeContainer;
  66. STDMETHODIMP CXMLDOMNamedNodeMap::getNamedItem(BSTR name, IXMLDOMNode  **pVal)
  67. {
  68. ATLTRACE(_T("CXMLDOMNamedNodeMap::getNamedItemn"));
  69. if (NULL == pVal)
  70. return E_POINTER;
  71. *pVal = NULL;
  72. HRESULT hr = S_OK;
  73. if (m_container == 0)
  74. return S_OK;
  75. try
  76. {
  77. DOM_Node n = m_container.getNamedItem(name);
  78. if(!n.isNull())
  79. hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
  80. }
  81. catch(DOM_DOMException& ex)
  82. {
  83. return MakeHRESULT(ex);
  84. }
  85. catch(...)
  86. {
  87. return E_FAIL;
  88. }
  89. return hr;
  90. }
  91. STDMETHODIMP CXMLDOMNamedNodeMap::setNamedItem(IXMLDOMNode  *newItem, IXMLDOMNode  **pVal)
  92. {
  93. ATLTRACE(_T("CXMLDOMNamedNodeMap::setNamedItemn"));
  94. if (NULL == pVal)
  95. return E_POINTER;
  96. *pVal = NULL;
  97. if (m_container == 0)
  98. return S_OK;
  99. if (NULL == newItem)
  100. return E_INVALIDARG;
  101. CComQIPtr<IIBMXMLDOMNodeIdentity,&IID_IIBMXMLDOMNodeIdentity> pNewItem(newItem);
  102. if (!pNewItem)
  103. return E_NOINTERFACE;
  104. long id = 0;
  105. HRESULT hr = pNewItem->get_NodeId(&id);
  106. if (S_OK != hr)
  107. return hr;
  108. DOM_Node *pNewItemNode = reinterpret_cast<DOM_Node*> (id);
  109. if (NULL == pNewItemNode)
  110. return E_INVALIDARG;
  111. try
  112. {
  113. DOMString  name = pNewItemNode->getNodeName();
  114. //
  115. //  returns old node
  116. //
  117. DOM_Node n = m_container.setNamedItem(*pNewItemNode);
  118. if(!n.isNull())
  119. hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
  120. }
  121. catch(DOM_DOMException& ex)
  122. {
  123. return MakeHRESULT(ex);
  124. }
  125. catch(...)
  126. {
  127. return E_FAIL;
  128. }
  129. return hr;
  130. }
  131. STDMETHODIMP CXMLDOMNamedNodeMap::removeNamedItem(BSTR name, IXMLDOMNode  **pVal)
  132. {
  133. ATLTRACE(_T("CXMLDOMNamedNodeMap::removeNamedItemn"));
  134. if (NULL == pVal)
  135. return E_POINTER;
  136. *pVal = NULL;
  137. HRESULT hr = S_OK;
  138. if (m_container == 0)
  139. return S_OK;
  140. try
  141. {
  142. DOM_Node n = m_container.removeNamedItem(name);
  143. if(!n.isNull())
  144. hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
  145. }
  146. //
  147. //   if we had a failure, return success anyway
  148. //
  149. catch(...)
  150. {
  151. }
  152. return hr;
  153. }
  154. STDMETHODIMP CXMLDOMNamedNodeMap::get_item(long index, IXMLDOMNode  **pVal)
  155. {
  156. ATLTRACE(_T("CXMLDOMNamedNodeMap::get_itemn"));
  157. if (NULL == pVal)
  158. return E_POINTER;
  159. *pVal = NULL;
  160. HRESULT hr = S_OK;
  161. try
  162. {
  163. if (m_container == 0 || index < 0)
  164. return E_INVALIDARG;
  165. long length =  m_container.getLength();
  166. if (index < length)
  167. hr = wrapNode(m_pIXMLDOMDocument,m_container.item(index),IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
  168. }
  169. catch(DOM_DOMException& ex)
  170. {
  171. return MakeHRESULT(ex);
  172. }
  173. catch(...)
  174. {
  175. return E_FAIL;
  176. }
  177. return hr;
  178. }
  179. STDMETHODIMP CXMLDOMNamedNodeMap::get_length(long  *pVal)
  180. {
  181. ATLTRACE(_T("CXMLDOMNamedNodeMap::get_lengthn"));
  182. if (NULL == pVal)
  183. return E_POINTER;
  184. *pVal = 0;
  185. if (m_container == 0)
  186. return S_OK;
  187. try
  188. {
  189. *pVal = m_container.getLength();
  190. }
  191. catch(DOM_DOMException& ex)
  192. {
  193. return MakeHRESULT(ex);
  194. }
  195. catch(...)
  196. {
  197. return E_FAIL;
  198. }
  199. return S_OK;
  200. }
  201. STDMETHODIMP CXMLDOMNamedNodeMap::getQualifiedItem(BSTR baseName, BSTR namespaceURI, IXMLDOMNode  **pVal)
  202. {
  203. ATLTRACE(_T("CXMLDOMNamedNodeMap::getQualifiedItemn"));
  204. if (NULL == pVal)
  205. return E_POINTER;
  206. *pVal = NULL;
  207. if (m_container == 0)
  208. return S_OK;
  209. HRESULT hr = S_OK;
  210. try
  211. {
  212. DOM_Node n = m_container.getNamedItemNS(namespaceURI,baseName);
  213. if(!n.isNull())
  214. hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
  215. }
  216. catch(DOM_DOMException& ex)
  217. {
  218. return MakeHRESULT(ex);
  219. }
  220. catch(...)
  221. {
  222. return E_FAIL;
  223. }
  224. return S_OK;
  225. }
  226. STDMETHODIMP CXMLDOMNamedNodeMap::removeQualifiedItem(BSTR baseName, BSTR namespaceURI, IXMLDOMNode  **pVal)
  227. {
  228. ATLTRACE(_T("CXMLDOMNamedNodeMap::removeQualifiedItemn"));
  229. if (NULL == pVal)
  230. return E_POINTER;
  231. *pVal = NULL;
  232. if (m_container == 0)
  233. return S_OK;
  234. HRESULT hr = S_OK;
  235. try
  236. {
  237. DOM_Node n = m_container.removeNamedItemNS(namespaceURI,baseName);
  238. if(!n.isNull())
  239. hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
  240. }
  241. catch(DOM_DOMException& ex)
  242. {
  243. return MakeHRESULT(ex);
  244. }
  245. catch(...)
  246. {
  247. return E_FAIL;
  248. }
  249. return S_OK;
  250. }
  251. STDMETHODIMP CXMLDOMNamedNodeMap::nextNode(IXMLDOMNode  **pVal)
  252. {
  253. ATLTRACE(_T("CXMLDOMNamedNodeMap::nextNoden"));
  254. if (NULL == pVal)
  255. return E_POINTER;
  256. *pVal = NULL;
  257. if (m_container == 0)
  258. return S_OK;
  259. int length = m_container.getLength();
  260. if (0 == length)
  261. return S_OK;
  262. if (m_NextNodeIndex >= length)
  263. return S_OK;
  264. HRESULT hr = S_OK;
  265. try
  266. {
  267. DOM_Node n = m_container.item(m_NextNodeIndex);
  268. if(!n.isNull())
  269. hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
  270. }
  271. catch(DOM_DOMException& ex)
  272. {
  273. return MakeHRESULT(ex);
  274. }
  275. catch(...)
  276. {
  277. return E_FAIL;
  278. }
  279. ++m_NextNodeIndex;
  280. return hr;
  281. }
  282. STDMETHODIMP CXMLDOMNamedNodeMap::reset()
  283. {
  284. ATLTRACE(_T("CXMLDOMNamedNodeMap::resetn"));
  285. m_NextNodeIndex = 0;
  286. return S_OK;
  287. }
  288. STDMETHODIMP CXMLDOMNamedNodeMap::get__newEnum(IUnknown  **pVal)
  289. {
  290. ATLTRACE(_T("CXMLDOMNamedNodeMap::get__newEnumn"));
  291. if (NULL == pVal)
  292. return E_POINTER;
  293. *pVal = NULL;
  294. CComObject<CComEnumUnknownOnNamedNodeContainer> *pe = NULL;
  295. HRESULT hr = CComObject<CComEnumUnknownOnNamedNodeContainer>::CreateInstance(&pe);
  296. if (S_OK != hr)
  297. return hr;
  298. pe->AddRef();
  299. hr = pe->Init(GetUnknown(),*this);
  300. if (S_OK == hr)
  301. hr = pe->QueryInterface(pVal);
  302. pe->Release();
  303. return hr;
  304. }
  305. HRESULT CXMLDOMNamedNodeMap::InterfaceSupportsErrorInfo(REFIID riid)
  306. {
  307. if(riid == IID_IXMLDOMNamedNodeMap) return S_OK;
  308. return S_FALSE;
  309. }