Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

NodeContainerImpl.h

Go to the documentation of this file.
00001 /* 00002 * Copyright 1999-2000,2004 The Apache Software Foundation. 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00017 /* 00018 * $Id: NodeContainerImpl.h,v 1.3 2004/09/08 13:55:35 peiyongz Exp $ 00019 */ 00020 00021 #ifndef ___nodecontainerimpl_h___ 00022 #define ___nodecontainerimpl_h___ 00023 00024 template <class T> 00025 class NodeContainerImpl 00026 { 00027 public: 00028 00029 class iterator 00030 { 00031 public: 00032 iterator() 00033 :m_container(NULL) 00034 ,m_NextNodeIndex(0) 00035 ,m_pIXMLDOMDocument(NULL) 00036 { 00037 VariantInit(&m_NextVar); 00038 V_VT(&m_NextVar) = VT_NULL; 00039 } 00040 00041 iterator(const T* container,int idx,IXMLDOMDocument *p) 00042 :m_container(container) 00043 ,m_NextNodeIndex(idx) 00044 ,m_pIXMLDOMDocument(p) 00045 { 00046 VariantInit(&m_NextVar); 00047 V_VT(&m_NextVar) = VT_NULL; 00048 if (m_pIXMLDOMDocument != NULL) 00049 m_pIXMLDOMDocument->AddRef(); 00050 } 00051 00052 ~iterator() 00053 { 00054 VariantClear(&m_NextVar); 00055 if (m_pIXMLDOMDocument != NULL) 00056 m_pIXMLDOMDocument->Release(); 00057 } 00058 00059 bool operator !=(const iterator& rhs) 00060 { 00061 return (m_NextNodeIndex != rhs.m_NextNodeIndex); 00062 } 00063 00064 iterator& operator=(const iterator& rhs) 00065 { 00066 if (this != &rhs) { 00067 if (m_pIXMLDOMDocument != NULL) { 00068 m_pIXMLDOMDocument->Release() ; 00069 m_pIXMLDOMDocument = NULL ; 00070 } 00071 m_container = rhs.m_container ; 00072 m_NextNodeIndex = rhs.m_NextNodeIndex ; 00073 m_NextVar = rhs.m_NextVar ; 00074 m_pIXMLDOMDocument = rhs.m_pIXMLDOMDocument ; 00075 if (m_pIXMLDOMDocument != NULL) { 00076 m_pIXMLDOMDocument->AddRef() ; 00077 } 00078 } 00079 return *this ; 00080 } 00081 00082 00083 VARIANT& operator*() 00084 { 00085 if (m_container == 0) 00086 return m_NextVar; 00087 00088 int length = m_container->getLength(); 00089 if (m_NextNodeIndex >= length) 00090 return m_NextVar; 00091 00092 CComPtr<IXMLDOMNode> pNode; 00093 HRESULT hr = wrapNode(m_pIXMLDOMDocument,m_container->item(m_NextNodeIndex),IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (&pNode)); 00094 if (S_OK == hr) { 00095 CComQIPtr<IDispatch,&IID_IDispatch> pDisp(pNode); 00096 if (pNode) { 00097 VariantClear(&m_NextVar); 00098 V_VT(&m_NextVar) = VT_DISPATCH; 00099 V_DISPATCH(&m_NextVar) = pDisp.Detach(); 00100 } 00101 } 00102 00103 return m_NextVar; 00104 } 00105 00106 iterator operator++(int) 00107 { 00108 return iterator(m_container,m_NextNodeIndex++,m_pIXMLDOMDocument); 00109 } 00110 00111 private: 00112 00113 const T* m_container; 00114 int m_NextNodeIndex; 00115 IXMLDOMDocument *m_pIXMLDOMDocument; 00116 VARIANT m_NextVar; 00117 }; 00118 00119 NodeContainerImpl() 00120 :m_NextNodeIndex(0) 00121 ,m_pIXMLDOMDocument(NULL) 00122 {} 00123 00124 iterator begin() 00125 { 00126 return iterator(m_container,0,m_pIXMLDOMDocument); 00127 } 00128 00129 iterator end() 00130 { 00131 if (m_container == 0) 00132 return iterator(m_container,0,m_pIXMLDOMDocument); 00133 else 00134 return iterator(m_container,m_container->getLength(),m_pIXMLDOMDocument); 00135 } 00136 00137 void SetOwnerDoc(IXMLDOMDocument *p) 00138 { 00139 m_pIXMLDOMDocument = p; 00140 if (m_pIXMLDOMDocument != NULL) 00141 m_pIXMLDOMDocument->AddRef(); 00142 } 00143 00144 T* m_container; 00145 00146 protected: 00147 00148 int m_NextNodeIndex; 00149 IXMLDOMDocument *m_pIXMLDOMDocument; 00150 00151 void ReleaseOwnerDoc() 00152 { 00153 if (m_pIXMLDOMDocument != NULL) { 00154 m_pIXMLDOMDocument->Release(); 00155 m_pIXMLDOMDocument = NULL; 00156 } 00157 } 00158 }; 00159 00160 #endif // ___nodecontainerimpl_h___

Generated on Thu Apr 30 02:30:52 2009 for ACS C++ API by doxygen 1.3.8