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

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: NodeContainerImpl.h,v 1.3 2000/09/29 23:07:02 aruna1 Exp $
  58.  */
  59. #ifndef ___nodecontainerimpl_h___
  60. #define ___nodecontainerimpl_h___
  61. template <class T>
  62. class NodeContainerImpl
  63. {
  64. public:
  65. class iterator 
  66. {
  67. public:
  68. iterator()
  69. :m_container()
  70. ,m_NextNodeIndex(0)
  71. ,m_pIXMLDOMDocument(NULL)
  72. {
  73. VariantInit(&m_NextVar);
  74. V_VT(&m_NextVar) = VT_NULL;
  75. }
  76. iterator(const T& container,int idx,IXMLDOMDocument *p)
  77. :m_container(container)
  78. ,m_NextNodeIndex(idx)
  79. ,m_pIXMLDOMDocument(p)
  80. {
  81. VariantInit(&m_NextVar);
  82. V_VT(&m_NextVar) = VT_NULL;
  83. if (m_pIXMLDOMDocument != NULL)
  84. m_pIXMLDOMDocument->AddRef();
  85. }
  86. ~iterator()
  87. {
  88. VariantClear(&m_NextVar);
  89. if (m_pIXMLDOMDocument != NULL)
  90. m_pIXMLDOMDocument->Release();
  91. }
  92. bool operator !=(const iterator& rhs)
  93. {
  94. return (m_NextNodeIndex != rhs.m_NextNodeIndex);
  95. }
  96. iterator& operator=(const iterator& rhs)
  97. {
  98. if (this != &rhs) {
  99. if (m_pIXMLDOMDocument != NULL) {
  100. m_pIXMLDOMDocument->Release() ;
  101. m_pIXMLDOMDocument = NULL ;
  102. }
  103. m_container = rhs.m_container ;
  104. m_NextNodeIndex = rhs.m_NextNodeIndex ;
  105. m_NextVar = rhs.m_NextVar ;
  106. m_pIXMLDOMDocument = rhs.m_pIXMLDOMDocument ;
  107. if (m_pIXMLDOMDocument != NULL) {
  108. m_pIXMLDOMDocument->AddRef() ;
  109. }
  110. }
  111. return *this ;
  112. }
  113. VARIANT& operator*()
  114. {
  115. if (m_container == 0)
  116. return m_NextVar;
  117. int length = m_container.getLength(); 
  118. if (m_NextNodeIndex >= length)
  119. return m_NextVar;
  120. CComPtr<IXMLDOMNode> pNode;
  121. HRESULT hr = wrapNode(m_pIXMLDOMDocument,m_container.item(m_NextNodeIndex),IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (&pNode));
  122. if (S_OK == hr) {
  123. CComQIPtr<IDispatch,&IID_IDispatch> pDisp(pNode);
  124. if (pNode) {
  125. VariantClear(&m_NextVar);
  126. V_VT(&m_NextVar)    = VT_DISPATCH;
  127. V_DISPATCH(&m_NextVar) = pDisp.Detach();
  128. }
  129. }
  130. return m_NextVar;
  131. }
  132. iterator operator++(int)
  133. {
  134. return iterator(m_container,m_NextNodeIndex++,m_pIXMLDOMDocument);
  135. }
  136. private:
  137. T  m_container;
  138. int      m_NextNodeIndex;
  139. IXMLDOMDocument *m_pIXMLDOMDocument;
  140. VARIANT  m_NextVar;
  141. };
  142. NodeContainerImpl()
  143. :m_NextNodeIndex(0)
  144. ,m_pIXMLDOMDocument(NULL)
  145. {}
  146. iterator begin()
  147. {
  148. return iterator(m_container,0,m_pIXMLDOMDocument);
  149. }
  150. iterator end()
  151. {
  152. if (m_container == 0)
  153. return iterator(m_container,0,m_pIXMLDOMDocument);
  154. else
  155. return iterator(m_container,m_container.getLength(),m_pIXMLDOMDocument);
  156. }
  157. void SetOwnerDoc(IXMLDOMDocument *p)
  158. {
  159. m_pIXMLDOMDocument = p;
  160. if (m_pIXMLDOMDocument != NULL)
  161. m_pIXMLDOMDocument->AddRef();
  162. }
  163. T  m_container;
  164. protected:
  165. int  m_NextNodeIndex;
  166. IXMLDOMDocument *m_pIXMLDOMDocument;
  167. void ReleaseOwnerDoc()
  168. {
  169. if (m_pIXMLDOMDocument != NULL) {
  170. m_pIXMLDOMDocument->Release();
  171. m_pIXMLDOMDocument = NULL;
  172. }
  173. }
  174. };
  175. #endif // ___nodecontainerimpl_h___