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

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  * 
  4.  * Copyright (c) 1999-2000 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: IXMLDOMNodeImpl.inl,v 1.7 2001/01/19 15:17:56 tng Exp $
  58.  */
  59. #include <dom/DOM_Node.hpp>
  60. #include <dom/DOM_Document.hpp>
  61. #include "XMLDOMNodeList.h"
  62. #include "XMLDOMNamedNodeMap.h"
  63. #include "XMLDOMUtil.h"
  64. #include <dom/DOM_DOMException.hpp>
  65. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  66. HRESULT STDMETHODCALLTYPE IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::InterfaceSupportsErrorInfo(REFIID riid)
  67. {
  68. if(riid == *piid) return S_OK;
  69. return S_FALSE;
  70. }
  71. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  72. STDMETHODIMP
  73. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_nodeName(BSTR *pVal)
  74. {
  75. ATLTRACE(_T("IXMLDOMNodeImpl::get_nodeNamen"));
  76. if (NULL == pVal)
  77. return E_POINTER;
  78. *pVal = NULL;
  79. try
  80. {
  81. DOMString val = get_DOM_Node().getNodeName();
  82. *pVal = SysAllocStringLen(val.rawBuffer(),val.length());
  83. }
  84. catch(DOM_DOMException& ex) 
  85. {
  86. return MakeHRESULT(ex);
  87. }
  88. catch(...)
  89. {
  90. return E_FAIL;
  91. }
  92. return S_OK;
  93. }
  94. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  95. STDMETHODIMP
  96. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_nodeValue(VARIANT *pVal)
  97. {
  98. ATLTRACE(_T("IXMLDOMNodeImpl::get_nodeValuen"));
  99. if (NULL == pVal)
  100. return E_POINTER;
  101. ::VariantInit(pVal);
  102. try
  103. {
  104. DOMString val = get_DOM_Node().getNodeValue();
  105. if (val != 0)
  106. {
  107. V_VT(pVal)   = VT_BSTR;
  108. V_BSTR(pVal) = SysAllocStringLen(val.rawBuffer(),val.length());
  109. }
  110. else
  111. V_VT(pVal) = VT_NULL;
  112. }
  113. catch(DOM_DOMException& ex) 
  114. {
  115. return MakeHRESULT(ex);
  116. }
  117. catch(...)
  118. {
  119. return E_FAIL;
  120. }
  121. return S_OK;
  122. }
  123. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  124. STDMETHODIMP
  125. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::put_nodeValue(VARIANT newVal)
  126. {
  127. ATLTRACE(_T("IXMLDOMNodeImpl::put_nodeValuen"));
  128. try
  129. {
  130. if(V_VT(&newVal) == VT_BSTR)
  131. {
  132. get_DOM_Node().setNodeValue(V_BSTR(&newVal));
  133. }
  134. //
  135. //   coerce to BSTR or throw error
  136. //
  137. else 
  138. {
  139. get_DOM_Node().setNodeValue((BSTR) (_bstr_t) newVal);
  140. }
  141. }
  142. catch(DOM_DOMException& ex) 
  143. {
  144. return MakeHRESULT(ex);
  145. }
  146. catch(...)
  147. {
  148. return E_FAIL;
  149. }
  150. return S_OK;
  151. }
  152. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  153. STDMETHODIMP
  154. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_nodeType(DOMNodeType *pVal)
  155. {
  156. ATLTRACE(_T("IXMLDOMNodeImpl::get_nodeTypen"));
  157. if (NULL == pVal)
  158. return E_POINTER;
  159. *pVal = get_DOMNodeType();
  160. return S_OK;
  161. }
  162. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  163. STDMETHODIMP
  164. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_parentNode(IXMLDOMNode **pVal)
  165. {
  166. ATLTRACE(_T("IXMLDOMNodeImpl::get_parentNoden"));
  167. if (NULL == pVal)
  168. return E_POINTER;
  169. *pVal = NULL;
  170. HRESULT hr = S_OK;
  171. try
  172. {
  173. DOM_Node n = get_DOM_Node().getParentNode();
  174. if(!n.isNull()) {
  175. hr = wrapNode(m_pIXMLDOMDocument, n,IID_IXMLDOMNode,reinterpret_cast<LPVOID *> (pVal));
  176. }
  177. }
  178. catch(DOM_DOMException& ex) 
  179. {
  180. return MakeHRESULT(ex);
  181. }
  182. catch(...)
  183. {
  184. return E_FAIL;
  185. }
  186. return hr;
  187. }
  188. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  189. STDMETHODIMP
  190. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_childNodes(IXMLDOMNodeList * *pVal)
  191. {
  192. ATLTRACE(_T("IXMLDOMNodeImpl::get_childNodesn"));
  193. if (NULL == pVal)
  194. return E_POINTER;
  195. *pVal = NULL;
  196. CXMLDOMNodeListObj *pObj = NULL;
  197. HRESULT hr = CXMLDOMNodeListObj::CreateInstance(&pObj);
  198. if (S_OK != hr) 
  199. return hr;
  200. pObj->AddRef();
  201. pObj->SetOwnerDoc(m_pIXMLDOMDocument);
  202. try
  203. {
  204. pObj->m_container = get_DOM_Node().getChildNodes();
  205. }
  206. catch(DOM_DOMException& ex) 
  207. {
  208. pObj->Release(); 
  209. return MakeHRESULT(ex);
  210. }
  211. catch(...)
  212. {
  213. pObj->Release(); 
  214. return E_FAIL;
  215. }
  216. hr = pObj->QueryInterface(IID_IXMLDOMNodeList, reinterpret_cast<LPVOID*> (pVal));
  217. if (S_OK != hr) 
  218. *pVal = NULL;
  219. pObj->Release();
  220. return hr;
  221. }
  222. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  223. STDMETHODIMP
  224. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_firstChild(IXMLDOMNode **pVal)
  225. {
  226. ATLTRACE(_T("IXMLDOMNodeImpl::get_firstChildn"));
  227. if (NULL == pVal)
  228. return E_POINTER;
  229. *pVal = NULL;
  230. HRESULT hr = S_OK;
  231. try
  232. {
  233. DOM_Node n = get_DOM_Node().getFirstChild();
  234. //
  235. //   returns Nothing if no children
  236. //
  237. if(!n.isNull())
  238. hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
  239. }
  240. catch(DOM_DOMException& ex) 
  241. {
  242. return MakeHRESULT(ex);
  243. }
  244. catch(...)
  245. {
  246. return E_FAIL;
  247. }
  248. return hr;
  249. }
  250. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  251. STDMETHODIMP
  252. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_lastChild(IXMLDOMNode **pVal)
  253. {
  254. ATLTRACE(_T("IXMLDOMNodeImpl::get_lastChildn"));
  255. if (NULL == pVal)
  256. return E_POINTER;
  257. *pVal = NULL;
  258. HRESULT hr = S_OK;
  259. try
  260. {
  261. DOM_Node n = get_DOM_Node().getLastChild();
  262. if(!n.isNull())
  263. hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
  264. }
  265. catch(DOM_DOMException& ex) 
  266. {
  267. return MakeHRESULT(ex);
  268. }
  269. catch(...)
  270. {
  271. return E_FAIL;
  272. }
  273. return hr;
  274. }
  275. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  276. STDMETHODIMP
  277. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_previousSibling(IXMLDOMNode * *pVal)
  278. {
  279. ATLTRACE(_T("IXMLDOMNodeImpl::get_previousSiblingn"));
  280. if (NULL == pVal)
  281. return E_POINTER;
  282. *pVal = NULL;
  283. HRESULT hr = S_OK;
  284. try
  285. {
  286. DOM_Node n = get_DOM_Node().getPreviousSibling();
  287. if(!n.isNull())
  288. hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
  289. }
  290. catch(DOM_DOMException& ex) 
  291. {
  292. return MakeHRESULT(ex);
  293. }
  294. catch(...)
  295. {
  296. return E_FAIL;
  297. }
  298. return hr;
  299. }
  300. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  301. STDMETHODIMP
  302. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_nextSibling(IXMLDOMNode * *pVal)
  303. {
  304. ATLTRACE(_T("IXMLDOMNodeImpl::get_nextSiblingn"));
  305. if (NULL == pVal)
  306. return E_POINTER;
  307. *pVal = NULL;
  308. HRESULT hr = S_OK;
  309. try
  310. {
  311. DOM_Node n = get_DOM_Node().getNextSibling();
  312. if(!n.isNull())
  313. hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
  314. }
  315. catch(DOM_DOMException& ex) 
  316. {
  317. return MakeHRESULT(ex);
  318. }
  319. catch(...)
  320. {
  321. return E_FAIL;
  322. }
  323. return hr;
  324. }
  325. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  326. STDMETHODIMP
  327. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_attributes(IXMLDOMNamedNodeMap * *pVal)
  328. {
  329. ATLTRACE(_T("IXMLDOMNodeImpl::get_attributesn"));
  330. if (NULL == pVal)
  331. return E_POINTER;
  332. *pVal = NULL;
  333. DOM_NamedNodeMap map;
  334. try
  335. {
  336. map = get_DOM_Node().getAttributes();
  337. }
  338. catch(DOM_DOMException& ex) 
  339. {
  340. return MakeHRESULT(ex);
  341. }
  342. catch(...)
  343. {
  344. return E_FAIL;
  345. }
  346. if ((map == 0) || (NODE_ELEMENT  != get_DOMNodeType()))
  347. //&&
  348. //NODE_ENTITY   != get_DOMNodeType() &&
  349. //NODE_NOTATION != get_DOMNodeType()) 
  350. return S_OK;
  351. CXMLDOMNamedNodeMapObj *pObj = NULL;
  352. HRESULT hr = CXMLDOMNamedNodeMapObj::CreateInstance(&pObj);
  353. if (S_OK != hr) 
  354. return hr;
  355. pObj->AddRef();
  356. pObj->SetOwnerDoc(m_pIXMLDOMDocument);
  357. pObj->m_container = map;
  358. hr = pObj->QueryInterface(IID_IXMLDOMNamedNodeMap, reinterpret_cast<LPVOID*> (pVal));
  359. if (S_OK != hr) 
  360. *pVal = NULL;
  361. pObj->Release();
  362. return hr;
  363. }
  364. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  365. STDMETHODIMP
  366. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::insertBefore(IXMLDOMNode *newChild, VARIANT refChild, IXMLDOMNode **outNewChild)
  367. {
  368. ATLTRACE(_T("IXMLDOMNodeImpl::insertBeforen"));
  369. if (NULL == outNewChild)
  370. return E_POINTER;
  371. *outNewChild = NULL;
  372. if (NULL == newChild)
  373. return E_INVALIDARG;
  374. if (V_VT(&refChild) != VT_DISPATCH && V_VT(&refChild) != VT_NULL)
  375. return E_INVALIDARG;
  376. if (V_VT(&refChild) == VT_NULL) 
  377. return appendChild(newChild,outNewChild); 
  378. CComQIPtr<IIBMXMLDOMNodeIdentity,&IID_IIBMXMLDOMNodeIdentity> pNewChild(newChild);
  379. if (!pNewChild)
  380. return E_NOINTERFACE;
  381. long id = 0;
  382. HRESULT hr = pNewChild->get_NodeId(&id);
  383. if (S_OK != hr)
  384. return hr;
  385. DOM_Node *pNewChildNode = reinterpret_cast<DOM_Node*> (id);
  386. if (NULL == pNewChildNode)
  387. return E_INVALIDARG;
  388. CComQIPtr<IIBMXMLDOMNodeIdentity,&IID_IIBMXMLDOMNodeIdentity> pRefChild(V_DISPATCH(&refChild));
  389. if (!pRefChild)
  390. return E_NOINTERFACE;
  391. id = 0;
  392. hr = pRefChild->get_NodeId(&id);
  393. if (S_OK != hr)
  394. return hr;
  395. DOM_Node *pRefChildNode = reinterpret_cast<DOM_Node*> (id);
  396. if (NULL == pRefChildNode)
  397. return E_INVALIDARG;
  398. try
  399. {
  400. DOM_Node n = get_DOM_Node().insertBefore(*pNewChildNode, *pRefChildNode);
  401. hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (outNewChild));
  402. }
  403. catch(DOM_DOMException& ex) 
  404. {
  405. return MakeHRESULT(ex);
  406. }
  407. catch(...)
  408. {
  409. return E_FAIL;
  410. }
  411. return hr;
  412. }
  413. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  414. STDMETHODIMP
  415. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::replaceChild(IXMLDOMNode *newChild, IXMLDOMNode *oldChild, IXMLDOMNode * *outNewChild)
  416. {
  417. ATLTRACE(_T("IXMLDOMNodeImpl::replaceChildn"));
  418. if (NULL == outNewChild)
  419. return E_POINTER;
  420. *outNewChild = NULL;
  421. if (NULL == oldChild)
  422. return E_INVALIDARG;
  423. if (NULL == newChild)
  424. return removeChild(oldChild,outNewChild);
  425. CComQIPtr<IIBMXMLDOMNodeIdentity,&IID_IIBMXMLDOMNodeIdentity> pNewChild(newChild);
  426. if (!pNewChild)
  427. return E_NOINTERFACE;
  428. long id = 0;
  429. HRESULT hr = pNewChild->get_NodeId(&id);
  430. if (S_OK != hr)
  431. return hr;
  432. DOM_Node *pNewChildNode = reinterpret_cast<DOM_Node*> (id);
  433. if (NULL == pNewChildNode)
  434. return E_INVALIDARG;
  435. CComQIPtr<IIBMXMLDOMNodeIdentity,&IID_IIBMXMLDOMNodeIdentity> pOldChild(oldChild);
  436. if (!pOldChild)
  437. return E_NOINTERFACE;
  438. id = 0;
  439. hr = pOldChild->get_NodeId(&id);
  440. if (S_OK != hr)
  441. return hr;
  442. DOM_Node *pOldChildNode = reinterpret_cast<DOM_Node*> (id);
  443. if (NULL == pOldChildNode)
  444. return E_INVALIDARG;
  445. try
  446. {
  447. DOM_Node n = get_DOM_Node().replaceChild(*pNewChildNode, *pOldChildNode);
  448. hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (outNewChild));
  449. }
  450. catch(DOM_DOMException& ex) 
  451. {
  452. return MakeHRESULT(ex);
  453. }
  454. catch(...)
  455. {
  456. return E_FAIL;
  457. }
  458. return S_OK;
  459. }
  460. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  461. STDMETHODIMP
  462. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::removeChild(IXMLDOMNode *child, IXMLDOMNode * *oldChild)
  463. {
  464. ATLTRACE(_T("IXMLDOMNodeImpl::removeChildn"));
  465. if (NULL == oldChild)
  466. return E_POINTER;
  467. *oldChild = NULL;
  468. if (NULL == child)
  469. return E_INVALIDARG;
  470. CComQIPtr<IIBMXMLDOMNodeIdentity,&IID_IIBMXMLDOMNodeIdentity> pChild(child);
  471. if (!pChild)
  472. return E_NOINTERFACE;
  473. long id = 0;
  474. HRESULT hr = pChild->get_NodeId(&id);
  475. if (S_OK != hr)
  476. return hr;
  477. DOM_Node *pChildNode = reinterpret_cast<DOM_Node*> (id);
  478. if (NULL == pChildNode)
  479. return E_INVALIDARG;
  480. try
  481. {
  482. DOM_Node n = get_DOM_Node().removeChild(*pChildNode);
  483. if(!n.isNull())
  484. hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (oldChild));
  485. }
  486. catch(DOM_DOMException& ex) 
  487. {
  488. return MakeHRESULT(ex);
  489. }
  490. catch(...)
  491. {
  492. return E_FAIL;
  493. }
  494. return S_OK;
  495. }
  496. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  497. STDMETHODIMP
  498. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::appendChild(IXMLDOMNode *newChild, IXMLDOMNode * *outNewChild)
  499. {
  500. ATLTRACE(_T("IXMLDOMNodeImpl::appendChildn"));
  501. if (NULL == outNewChild)
  502. return E_POINTER;
  503. *outNewChild = NULL;
  504. if (NULL == newChild)
  505. return E_INVALIDARG;
  506. CComQIPtr<IIBMXMLDOMNodeIdentity,&IID_IIBMXMLDOMNodeIdentity> pNewChild(newChild);
  507. if (!pNewChild)
  508. return E_NOINTERFACE;
  509. long id = 0;
  510. HRESULT hr = pNewChild->get_NodeId(&id);
  511. if (S_OK != hr)
  512. return hr;
  513. DOM_Node *pNewChildNode = reinterpret_cast<DOM_Node*> (id);
  514. if (NULL == pNewChildNode)
  515. return E_INVALIDARG;
  516. try
  517. {
  518. DOM_Node n = get_DOM_Node().appendChild(*pNewChildNode);
  519. hr = wrapNode(m_pIXMLDOMDocument,n,IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (outNewChild));
  520. }
  521. catch(DOM_DOMException& ex) 
  522. {
  523. return MakeHRESULT(ex);
  524. }
  525. catch(...)
  526. {
  527. return E_FAIL;
  528. }
  529. return S_OK;
  530. }
  531. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  532. STDMETHODIMP
  533. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::hasChildNodes(VARIANT_BOOL *hasChild)
  534. {
  535. ATLTRACE(_T("IXMLDOMNodeImpl::hasChildNodesn"));
  536. if (NULL == hasChild)
  537. return E_POINTER;
  538. *hasChild = VARIANT_FALSE;
  539. try
  540. {
  541. *hasChild = (get_DOM_Node().hasChildNodes()) ? VARIANT_TRUE : VARIANT_FALSE;
  542. }
  543. catch(DOM_DOMException& ex) 
  544. {
  545. return MakeHRESULT(ex);
  546. }
  547. catch(...)
  548. {
  549. return E_FAIL;
  550. }
  551. return S_OK;
  552. }
  553. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  554. STDMETHODIMP
  555. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_ownerDocument(IXMLDOMDocument **pVal)
  556. {
  557. ATLTRACE(_T("IXMLDOMNodeImpl::get_ownerDocumentn"));
  558. if (NULL == pVal)
  559. return E_POINTER;
  560. *pVal = NULL;
  561. if (get_DOMNodeType() != NODE_DOCUMENT)
  562. {
  563. *pVal = m_pIXMLDOMDocument;
  564. if (*pVal != NULL)
  565. (*pVal)->AddRef();
  566. }
  567. return S_OK;
  568. }
  569. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  570. STDMETHODIMP
  571. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::cloneNode(VARIANT_BOOL deep, IXMLDOMNode **pVal)
  572. {
  573. ATLTRACE(_T("IXMLDOMNodeImpl::cloneNoden"));
  574. if (NULL == pVal)
  575. return E_POINTER;
  576. *pVal = NULL;
  577. HRESULT hr = S_OK;
  578. try
  579. {
  580. hr = wrapNode(m_pIXMLDOMDocument,get_DOM_Node().cloneNode((VARIANT_TRUE == deep) ? true : false),IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (pVal));
  581. }
  582. catch(DOM_DOMException& ex) 
  583. {
  584. return MakeHRESULT(ex);
  585. }
  586. catch(...)
  587. {
  588. return E_FAIL;
  589. }
  590. return hr;
  591. }
  592. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  593. STDMETHODIMP
  594. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_nodeTypeString(BSTR *pVal)
  595. {
  596. ATLTRACE(_T("IXMLDOMNodeImpl::get_nodeTypeStringn"));
  597. USES_CONVERSION;
  598. if (NULL == pVal)
  599. return E_POINTER;
  600. *pVal = ::SysAllocString(g_DomNodeName[get_DOMNodeType()]);
  601. return S_OK;
  602. }
  603. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  604. STDMETHODIMP
  605. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_text(BSTR *pVal)
  606. {
  607. ATLTRACE(_T("IXMLDOMNodeImpl::get_textn"));
  608. if (NULL == pVal)
  609. return E_POINTER;
  610. DOMString val = GetText(get_DOM_Node());
  611. *pVal = SysAllocStringLen(val.rawBuffer(),val.length());
  612. return S_OK;
  613. }
  614. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  615. STDMETHODIMP
  616. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::put_text(BSTR newVal)
  617. {
  618. ATLTRACE(_T("IXMLDOMNodeImpl::put_textn"));
  619. DOMNodeType type = get_DOMNodeType();
  620. if (NODE_DOCUMENT_FRAGMENT == type ||
  621. NODE_DOCUMENT_TYPE    == type ||
  622. NODE_ENTITY    == type ||
  623. NODE_ENTITY_REFERENCE  == type ||
  624. NODE_NOTATION    == type)
  625. return E_ACCESSDENIED;
  626. try
  627. {
  628. if(NODE_ELEMENT == type)
  629. {
  630. //
  631. //   remove all child elements
  632. //
  633. DOM_Node elem = get_DOM_Node();
  634. DOM_Node child = elem.getLastChild();
  635. while(!child.isNull())
  636. {
  637. elem.removeChild(child);
  638. child = elem.getLastChild();
  639. }
  640. DOM_Document doc = elem.getOwnerDocument();
  641. elem.appendChild(doc.createTextNode(newVal));
  642. }
  643. else
  644. get_DOM_Node().setNodeValue(newVal);
  645. }
  646. catch(DOM_DOMException& ex) 
  647. {
  648. return MakeHRESULT(ex);
  649. }
  650. catch(...)
  651. {
  652. return E_FAIL;
  653. }
  654. return S_OK;
  655. }
  656. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  657. STDMETHODIMP
  658. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_specified(VARIANT_BOOL *pVal)
  659. {
  660. ATLTRACE(_T("IXMLDOMNodeImpl::get_specifiedn"));
  661. *pVal = VARIANT_TRUE;
  662. return S_OK;
  663. }
  664. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  665. STDMETHODIMP
  666. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_definition(IXMLDOMNode * *pVal)
  667. {
  668. ATLTRACE(_T("IXMLDOMNodeImpl::get_definitionn"));
  669. return E_NOTIMPL;
  670. }
  671. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  672. STDMETHODIMP
  673. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_nodeTypedValue(VARIANT *pVal)
  674. {
  675. ATLTRACE(_T("IXMLDOMNodeImpl::get_nodeTypedValuen"));
  676. return get_nodeValue(pVal);
  677. }
  678. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  679. STDMETHODIMP
  680. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::put_nodeTypedValue(VARIANT newVal)
  681. {
  682. ATLTRACE(_T("IXMLDOMNodeImpl::put_nodeTypedValuen"));
  683. return put_nodeValue(newVal);
  684. }
  685. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  686. STDMETHODIMP
  687. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_dataType(VARIANT *pVal)
  688. {
  689. ATLTRACE(_T("IXMLDOMNodeImpl::get_dataTypen"));
  690. return E_NOTIMPL;
  691. }
  692. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  693. STDMETHODIMP
  694. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::put_dataType(BSTR dataTypeName)
  695. {
  696. ATLTRACE(_T("IXMLDOMNodeImpl::put_dataTypen"));
  697. return E_NOTIMPL;
  698. }
  699. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  700. STDMETHODIMP
  701. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_xml(BSTR *pVal)
  702. {
  703. ATLTRACE(_T("IXMLDOMNodeImpl::get_xmln"));
  704. if (NULL == pVal)
  705. return E_POINTER;
  706. *pVal = NULL;
  707. _bstr_t text;
  708. try {
  709. GetXML(get_DOM_Node(),text);
  710. }
  711. catch(DOM_DOMException& ex) 
  712. {
  713. return MakeHRESULT(ex);
  714. }
  715. catch(...)
  716. {
  717. return E_FAIL;
  718. }
  719. *pVal = text.copy();
  720. return S_OK;
  721. }
  722. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  723. STDMETHODIMP
  724. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::transformNode(IXMLDOMNode *stylesheet, BSTR *xmlString)
  725. {
  726. ATLTRACE(_T("IXMLDOMNodeImpl::transformNoden"));
  727. return E_NOTIMPL;
  728. }
  729. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  730. STDMETHODIMP
  731. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::selectNodes(BSTR queryString, IXMLDOMNodeList * *resultList)
  732. {
  733. ATLTRACE(_T("IXMLDOMNodeImpl::selectNodesn"));
  734. return E_NOTIMPL;
  735. }
  736. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  737. STDMETHODIMP
  738. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::selectSingleNode(BSTR queryString, IXMLDOMNode * *resultNode)
  739. {
  740. ATLTRACE(_T("IXMLDOMNodeImpl::selectSingleNoden"));
  741. return E_NOTIMPL;
  742. }
  743. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  744. STDMETHODIMP
  745. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_parsed(VARIANT_BOOL *pVal)
  746. {
  747. ATLTRACE(_T("IXMLDOMNodeImpl::get_parsedn"));
  748. if (NULL == pVal)
  749. return E_POINTER;
  750. *pVal = VARIANT_TRUE;
  751. return S_OK;
  752. }
  753. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  754. STDMETHODIMP
  755. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_namespaceURI(BSTR *pVal)
  756. {
  757. ATLTRACE(_T("IXMLDOMNodeImpl::get_namespaceURIn"));
  758. if (NULL == pVal)
  759. return E_POINTER;
  760. *pVal = NULL;
  761. try {
  762. DOMString val = get_DOM_Node().getNamespaceURI();
  763. *pVal = SysAllocStringLen(val.rawBuffer(),val.length());
  764. }
  765. catch(DOM_DOMException& ex) 
  766. {
  767. return MakeHRESULT(ex);
  768. }
  769. catch(...)
  770. {
  771. return E_FAIL;
  772. }
  773. return S_OK;
  774. }
  775. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  776. STDMETHODIMP
  777. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_prefix(BSTR *pVal)
  778. {
  779. ATLTRACE(_T("IXMLDOMNodeImpl::get_prefixn"));
  780. if (NULL == pVal)
  781. return E_POINTER;
  782. *pVal = NULL;
  783. try {
  784. DOMString val = get_DOM_Node().getPrefix();
  785. *pVal = SysAllocStringLen(val.rawBuffer(),val.length());
  786. }
  787. catch(DOM_DOMException& ex) 
  788. {
  789. return MakeHRESULT(ex);
  790. }
  791. catch(...)
  792. {
  793. return E_FAIL;
  794. }
  795. return S_OK;
  796. }
  797. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  798. STDMETHODIMP
  799. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::get_baseName(BSTR *pVal)
  800. {
  801. ATLTRACE(_T("IXMLDOMNodeImpl::get_baseNamen"));
  802. if (NULL == pVal)
  803. return E_POINTER;
  804. *pVal = NULL;
  805. try {
  806. DOMString val = get_DOM_Node().getLocalName();
  807. *pVal = SysAllocStringLen(val.rawBuffer(),val.length());
  808. }
  809. catch(DOM_DOMException& ex) 
  810. {
  811. return MakeHRESULT(ex);
  812. }
  813. catch(...)
  814. {
  815. return E_FAIL;
  816. }
  817. return S_OK;
  818. }
  819. template <class T, const IID* piid, const GUID* plibid, WORD wMajor,WORD wMinor, class tihclass>
  820. STDMETHODIMP
  821. IXMLDOMNodeImpl<T,piid,plibid,wMajor,wMinor,tihclass>::transformNodeToObject(IXMLDOMNode *stylesheet, VARIANT outputObject)
  822. {
  823. ATLTRACE(_T("IXMLDOMNodeImpl::transformNodeToObjectn"));
  824. return E_NOTIMPL;
  825. }