source: NonGTP/Xerces/xercesc/com/NodeContainerImpl.h @ 188

Revision 188, 5.7 KB checked in by mattausch, 19 years ago (diff)

added xercesc to support

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