Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef ___nodecontainerimpl_h___
00023 #define ___nodecontainerimpl_h___
00024
00025 template <class T>
00026 class NodeContainerImpl
00027 {
00028 public:
00029
00030 class iterator
00031 {
00032 public:
00033 iterator()
00034 :m_container(NULL)
00035 ,m_NextNodeIndex(0)
00036 ,m_pIXMLDOMDocument(NULL)
00037 {
00038 VariantInit(&m_NextVar);
00039 V_VT(&m_NextVar) = VT_NULL;
00040 }
00041
00042 iterator(const T* container,int idx,IXMLDOMDocument *p)
00043 :m_container(container)
00044 ,m_NextNodeIndex(idx)
00045 ,m_pIXMLDOMDocument(p)
00046 {
00047 VariantInit(&m_NextVar);
00048 V_VT(&m_NextVar) = VT_NULL;
00049 if (m_pIXMLDOMDocument != NULL)
00050 m_pIXMLDOMDocument->AddRef();
00051 }
00052
00053 ~iterator()
00054 {
00055 VariantClear(&m_NextVar);
00056 if (m_pIXMLDOMDocument != NULL)
00057 m_pIXMLDOMDocument->Release();
00058 }
00059
00060 bool operator !=(const iterator& rhs)
00061 {
00062 return (m_NextNodeIndex != rhs.m_NextNodeIndex);
00063 }
00064
00065 iterator& operator=(const iterator& rhs)
00066 {
00067 if (this != &rhs) {
00068 if (m_pIXMLDOMDocument != NULL) {
00069 m_pIXMLDOMDocument->Release() ;
00070 m_pIXMLDOMDocument = NULL ;
00071 }
00072 m_container = rhs.m_container ;
00073 m_NextNodeIndex = rhs.m_NextNodeIndex ;
00074 m_NextVar = rhs.m_NextVar ;
00075 m_pIXMLDOMDocument = rhs.m_pIXMLDOMDocument ;
00076 if (m_pIXMLDOMDocument != NULL) {
00077 m_pIXMLDOMDocument->AddRef() ;
00078 }
00079 }
00080 return *this ;
00081 }
00082
00083
00084 VARIANT& operator*()
00085 {
00086 if (m_container == 0)
00087 return m_NextVar;
00088
00089 int length = m_container->getLength();
00090 if (m_NextNodeIndex >= length)
00091 return m_NextVar;
00092
00093 CComPtr<IXMLDOMNode> pNode;
00094 HRESULT hr = wrapNode(m_pIXMLDOMDocument,m_container->item(m_NextNodeIndex),IID_IXMLDOMNode, reinterpret_cast<LPVOID *> (&pNode));
00095 if (S_OK == hr) {
00096 CComQIPtr<IDispatch,&IID_IDispatch> pDisp(pNode);
00097 if (pNode) {
00098 VariantClear(&m_NextVar);
00099 V_VT(&m_NextVar) = VT_DISPATCH;
00100 V_DISPATCH(&m_NextVar) = pDisp.Detach();
00101 }
00102 }
00103
00104 return m_NextVar;
00105 }
00106
00107 iterator operator++(int)
00108 {
00109 return iterator(m_container,m_NextNodeIndex++,m_pIXMLDOMDocument);
00110 }
00111
00112 private:
00113
00114 const T* m_container;
00115 int m_NextNodeIndex;
00116 IXMLDOMDocument *m_pIXMLDOMDocument;
00117 VARIANT m_NextVar;
00118 };
00119
00120 typedef iterator const_iterator;
00121
00122 NodeContainerImpl()
00123 :m_NextNodeIndex(0)
00124 ,m_pIXMLDOMDocument(NULL)
00125 {}
00126
00127 iterator begin()
00128 {
00129 return iterator(m_container,0,m_pIXMLDOMDocument);
00130 }
00131
00132 iterator end()
00133 {
00134 if (m_container == 0)
00135 return iterator(m_container,0,m_pIXMLDOMDocument);
00136 else
00137 return iterator(m_container,m_container->getLength(),m_pIXMLDOMDocument);
00138 }
00139
00140 void SetOwnerDoc(IXMLDOMDocument *p)
00141 {
00142 m_pIXMLDOMDocument = p;
00143 if (m_pIXMLDOMDocument != NULL)
00144 m_pIXMLDOMDocument->AddRef();
00145 }
00146
00147 T* m_container;
00148
00149 protected:
00150
00151 int m_NextNodeIndex;
00152 IXMLDOMDocument *m_pIXMLDOMDocument;
00153
00154 void ReleaseOwnerDoc()
00155 {
00156 if (m_pIXMLDOMDocument != NULL) {
00157 m_pIXMLDOMDocument->Release();
00158 m_pIXMLDOMDocument = NULL;
00159 }
00160 }
00161 };
00162
00163 #endif // ___nodecontainerimpl_h___