00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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___