Make sure to save the result calculated in ACTION_UpdateInstallStates.
[wine] / dlls / msxml3 / element.c
1 /*
2  *    DOM Document implementation
3  *
4  * Copyright 2005 Mike McCormack
5  *
6  * iface library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * iface library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #define COBJMACROS
22
23 #include "config.h"
24
25 #include <stdarg.h>
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winuser.h"
29 #include "ole2.h"
30 #include "ocidl.h"
31 #include "msxml.h"
32 #include "xmldom.h"
33 #include "msxml.h"
34
35 #include "msxml_private.h"
36
37 #include "wine/debug.h"
38
39 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
40
41 #ifdef HAVE_LIBXML2
42
43 typedef struct _domelem
44 {
45     const struct IXMLDOMElementVtbl *lpVtbl;
46     LONG ref;
47     IXMLDOMNode *node;
48 } domelem;
49
50 static inline domelem *impl_from_IXMLDOMElement( IXMLDOMElement *iface )
51 {
52     return (domelem *)((char*)iface - FIELD_OFFSET(domelem, lpVtbl));
53 }
54
55 static inline xmlNodePtr get_element( domelem *This )
56 {
57     return xmlNodePtr_from_domnode( This->node, XML_ELEMENT_NODE );
58 }
59
60 static HRESULT WINAPI domelem_QueryInterface(
61     IXMLDOMElement *iface,
62     REFIID riid,
63     void** ppvObject )
64 {
65     TRACE("%p %p %p\n", iface, debugstr_guid(riid), ppvObject);
66
67     if ( IsEqualGUID( riid, &IID_IXMLDOMElement ) ||
68          IsEqualGUID( riid, &IID_IUnknown ) ||
69          IsEqualGUID( riid, &IID_IDispatch ) ||
70          IsEqualGUID( riid, &IID_IXMLDOMNode ) )
71     {
72         *ppvObject = iface;
73     }
74     else
75         return E_NOINTERFACE;
76
77     IXMLDOMElement_AddRef( iface );
78
79     return S_OK;
80 }
81
82 static ULONG WINAPI domelem_AddRef(
83     IXMLDOMElement *iface )
84 {
85     domelem *This = impl_from_IXMLDOMElement( iface );
86     return InterlockedIncrement( &This->ref );
87 }
88
89 static ULONG WINAPI domelem_Release(
90     IXMLDOMElement *iface )
91 {
92     domelem *This = impl_from_IXMLDOMElement( iface );
93     ULONG ref;
94
95     ref = InterlockedDecrement( &This->ref );
96     if ( ref == 0 )
97     {
98         IXMLDOMNode_Release( This->node );
99         HeapFree( GetProcessHeap(), 0, This );
100     }
101
102     return ref;
103 }
104
105 static HRESULT WINAPI domelem_GetTypeInfoCount(
106     IXMLDOMElement *iface,
107     UINT* pctinfo )
108 {
109     FIXME("\n");
110     return E_NOTIMPL;
111 }
112
113 static HRESULT WINAPI domelem_GetTypeInfo(
114     IXMLDOMElement *iface,
115     UINT iTInfo, LCID lcid,
116     ITypeInfo** ppTInfo )
117 {
118     FIXME("\n");
119     return E_NOTIMPL;
120 }
121
122 static HRESULT WINAPI domelem_GetIDsOfNames(
123     IXMLDOMElement *iface,
124     REFIID riid, LPOLESTR* rgszNames,
125     UINT cNames, LCID lcid, DISPID* rgDispId )
126 {
127     FIXME("\n");
128     return E_NOTIMPL;
129 }
130
131 static HRESULT WINAPI domelem_Invoke(
132     IXMLDOMElement *iface,
133     DISPID dispIdMember, REFIID riid, LCID lcid,
134     WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
135     EXCEPINFO* pExcepInfo, UINT* puArgErr )
136 {
137     FIXME("\n");
138     return E_NOTIMPL;
139 }
140
141 static HRESULT WINAPI domelem_get_nodeName(
142     IXMLDOMElement *iface,
143     BSTR* p )
144 {
145     domelem *This = impl_from_IXMLDOMElement( iface );
146     return IXMLDOMNode_get_nodeName( This->node, p );
147 }
148
149 static HRESULT WINAPI domelem_get_nodeValue(
150     IXMLDOMElement *iface,
151     VARIANT* var1 )
152 {
153     domelem *This = impl_from_IXMLDOMElement( iface );
154     return IXMLDOMNode_get_nodeValue( This->node, var1 );
155 }
156
157 static HRESULT WINAPI domelem_put_nodeValue(
158     IXMLDOMElement *iface,
159     VARIANT var1 )
160 {
161     domelem *This = impl_from_IXMLDOMElement( iface );
162     return IXMLDOMNode_put_nodeValue( This->node, var1 );
163 }
164
165 static HRESULT WINAPI domelem_get_nodeType(
166     IXMLDOMElement *iface,
167     DOMNodeType* domNodeType )
168 {
169     domelem *This = impl_from_IXMLDOMElement( iface );
170     return IXMLDOMNode_get_nodeType( This->node, domNodeType );
171 }
172
173 static HRESULT WINAPI domelem_get_parentNode(
174     IXMLDOMElement *iface,
175     IXMLDOMNode** parent )
176 {
177     domelem *This = impl_from_IXMLDOMElement( iface );
178     return IXMLDOMNode_get_parentNode( This->node, parent );
179 }
180
181 static HRESULT WINAPI domelem_get_childNodes(
182     IXMLDOMElement *iface,
183     IXMLDOMNodeList** outList)
184 {
185     domelem *This = impl_from_IXMLDOMElement( iface );
186     return IXMLDOMNode_get_childNodes( This->node, outList );
187 }
188
189 static HRESULT WINAPI domelem_get_firstChild(
190     IXMLDOMElement *iface,
191     IXMLDOMNode** domNode)
192 {
193     domelem *This = impl_from_IXMLDOMElement( iface );
194     return IXMLDOMNode_get_firstChild( This->node, domNode );
195 }
196
197 static HRESULT WINAPI domelem_get_lastChild(
198     IXMLDOMElement *iface,
199     IXMLDOMNode** domNode)
200 {
201     domelem *This = impl_from_IXMLDOMElement( iface );
202     return IXMLDOMNode_get_lastChild( This->node, domNode );
203 }
204
205 static HRESULT WINAPI domelem_get_previousSibling(
206     IXMLDOMElement *iface,
207     IXMLDOMNode** domNode)
208 {
209     domelem *This = impl_from_IXMLDOMElement( iface );
210     return IXMLDOMNode_get_previousSibling( This->node, domNode );
211 }
212
213 static HRESULT WINAPI domelem_get_nextSibling(
214     IXMLDOMElement *iface,
215     IXMLDOMNode** domNode)
216 {
217     domelem *This = impl_from_IXMLDOMElement( iface );
218     return IXMLDOMNode_get_nextSibling( This->node, domNode );
219 }
220
221 static HRESULT WINAPI domelem_get_attributes(
222     IXMLDOMElement *iface,
223     IXMLDOMNamedNodeMap** attributeMap)
224 {
225     domelem *This = impl_from_IXMLDOMElement( iface );
226     return IXMLDOMNode_get_attributes( This->node, attributeMap );
227 }
228
229 static HRESULT WINAPI domelem_insertBefore(
230     IXMLDOMElement *iface,
231     IXMLDOMNode* newNode, VARIANT var1,
232     IXMLDOMNode** outOldNode)
233 {
234     domelem *This = impl_from_IXMLDOMElement( iface );
235     return IXMLDOMNode_insertBefore( This->node, newNode, var1, outOldNode );
236 }
237
238 static HRESULT WINAPI domelem_replaceChild(
239     IXMLDOMElement *iface,
240     IXMLDOMNode* newNode,
241     IXMLDOMNode* oldNode,
242     IXMLDOMNode** outOldNode)
243 {
244     domelem *This = impl_from_IXMLDOMElement( iface );
245     return IXMLDOMNode_replaceChild( This->node, newNode, oldNode, outOldNode );
246 }
247
248 static HRESULT WINAPI domelem_removeChild(
249     IXMLDOMElement *iface,
250     IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
251 {
252     domelem *This = impl_from_IXMLDOMElement( iface );
253     return IXMLDOMNode_removeChild( This->node, domNode, oldNode );
254 }
255
256 static HRESULT WINAPI domelem_appendChild(
257     IXMLDOMElement *iface,
258     IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
259 {
260     domelem *This = impl_from_IXMLDOMElement( iface );
261     return IXMLDOMNode_appendChild( This->node, newNode, outNewNode );
262 }
263
264 static HRESULT WINAPI domelem_hasChildNodes(
265     IXMLDOMElement *iface,
266     VARIANT_BOOL* pbool)
267 {
268     domelem *This = impl_from_IXMLDOMElement( iface );
269     return IXMLDOMNode_hasChildNodes( This->node, pbool );
270 }
271
272 static HRESULT WINAPI domelem_get_ownerDocument(
273     IXMLDOMElement *iface,
274     IXMLDOMDocument** domDocument)
275 {
276     domelem *This = impl_from_IXMLDOMElement( iface );
277     return IXMLDOMNode_get_ownerDocument( This->node, domDocument );
278 }
279
280 static HRESULT WINAPI domelem_cloneNode(
281     IXMLDOMElement *iface,
282     VARIANT_BOOL pbool, IXMLDOMNode** outNode)
283 {
284     domelem *This = impl_from_IXMLDOMElement( iface );
285     return IXMLDOMNode_cloneNode( This->node, pbool, outNode );
286 }
287
288 static HRESULT WINAPI domelem_get_nodeTypeString(
289     IXMLDOMElement *iface,
290     BSTR* p)
291 {
292     domelem *This = impl_from_IXMLDOMElement( iface );
293     return IXMLDOMNode_get_nodeTypeString( This->node, p );
294 }
295
296 static HRESULT WINAPI domelem_get_text(
297     IXMLDOMElement *iface,
298     BSTR* p)
299 {
300     domelem *This = impl_from_IXMLDOMElement( iface );
301     return IXMLDOMNode_get_text( This->node, p );
302 }
303
304 static HRESULT WINAPI domelem_put_text(
305     IXMLDOMElement *iface,
306     BSTR p)
307 {
308     domelem *This = impl_from_IXMLDOMElement( iface );
309     return IXMLDOMNode_put_text( This->node, p );
310 }
311
312 static HRESULT WINAPI domelem_get_specified(
313     IXMLDOMElement *iface,
314     VARIANT_BOOL* pbool)
315 {
316     domelem *This = impl_from_IXMLDOMElement( iface );
317     return IXMLDOMNode_get_specified( This->node, pbool );
318 }
319
320 static HRESULT WINAPI domelem_get_definition(
321     IXMLDOMElement *iface,
322     IXMLDOMNode** domNode)
323 {
324     domelem *This = impl_from_IXMLDOMElement( iface );
325     return IXMLDOMNode_get_definition( This->node, domNode );
326 }
327
328 static HRESULT WINAPI domelem_get_nodeTypedValue(
329     IXMLDOMElement *iface,
330     VARIANT* var1)
331 {
332     domelem *This = impl_from_IXMLDOMElement( iface );
333     return IXMLDOMNode_get_nodeTypedValue( This->node, var1 );
334 }
335
336 static HRESULT WINAPI domelem_put_nodeTypedValue(
337     IXMLDOMElement *iface,
338     VARIANT var1)
339 {
340     domelem *This = impl_from_IXMLDOMElement( iface );
341     return IXMLDOMNode_put_nodeTypedValue( This->node, var1 );
342 }
343
344 static HRESULT WINAPI domelem_get_dataType(
345     IXMLDOMElement *iface,
346     VARIANT* var1)
347 {
348     domelem *This = impl_from_IXMLDOMElement( iface );
349     return IXMLDOMNode_get_dataType( This->node, var1 );
350 }
351
352 static HRESULT WINAPI domelem_put_dataType(
353     IXMLDOMElement *iface,
354     BSTR p)
355 {
356     domelem *This = impl_from_IXMLDOMElement( iface );
357     return IXMLDOMNode_put_dataType( This->node, p );
358 }
359
360 static HRESULT WINAPI domelem_get_xml(
361     IXMLDOMElement *iface,
362     BSTR* p)
363 {
364     domelem *This = impl_from_IXMLDOMElement( iface );
365     return IXMLDOMNode_get_xml( This->node, p );
366 }
367
368 static HRESULT WINAPI domelem_transformNode(
369     IXMLDOMElement *iface,
370     IXMLDOMNode* domNode, BSTR* p)
371 {
372     domelem *This = impl_from_IXMLDOMElement( iface );
373     return IXMLDOMNode_transformNode( This->node, domNode, p );
374 }
375
376 static HRESULT WINAPI domelem_selectNodes(
377     IXMLDOMElement *iface,
378     BSTR p, IXMLDOMNodeList** outList)
379 {
380     domelem *This = impl_from_IXMLDOMElement( iface );
381     return IXMLDOMNode_selectNodes( This->node, p, outList );
382 }
383
384 static HRESULT WINAPI domelem_selectSingleNode(
385     IXMLDOMElement *iface,
386     BSTR p, IXMLDOMNode** outNode)
387 {
388     domelem *This = impl_from_IXMLDOMElement( iface );
389     return IXMLDOMNode_selectSingleNode( This->node, p, outNode );
390 }
391
392 static HRESULT WINAPI domelem_get_parsed(
393     IXMLDOMElement *iface,
394     VARIANT_BOOL* pbool)
395 {
396     domelem *This = impl_from_IXMLDOMElement( iface );
397     return IXMLDOMNode_get_parsed( This->node, pbool );
398 }
399
400 static HRESULT WINAPI domelem_get_namespaceURI(
401     IXMLDOMElement *iface,
402     BSTR* p)
403 {
404     domelem *This = impl_from_IXMLDOMElement( iface );
405     return IXMLDOMNode_get_namespaceURI( This->node, p );
406 }
407
408 static HRESULT WINAPI domelem_get_prefix(
409     IXMLDOMElement *iface,
410     BSTR* p)
411 {
412     domelem *This = impl_from_IXMLDOMElement( iface );
413     return IXMLDOMNode_get_prefix( This->node, p );
414 }
415
416 static HRESULT WINAPI domelem_get_baseName(
417     IXMLDOMElement *iface,
418     BSTR* p)
419 {
420     domelem *This = impl_from_IXMLDOMElement( iface );
421     return IXMLDOMNode_get_baseName( This->node, p );
422 }
423
424 static HRESULT WINAPI domelem_transformNodeToObject(
425     IXMLDOMElement *iface,
426     IXMLDOMNode* domNode, VARIANT var1)
427 {
428     domelem *This = impl_from_IXMLDOMElement( iface );
429     return IXMLDOMNode_transformNodeToObject( This->node, domNode, var1 );
430 }
431
432 static HRESULT WINAPI domelem_get_tagName(
433     IXMLDOMElement *iface,
434     BSTR* p)
435 {
436     domelem *This = impl_from_IXMLDOMElement( iface );
437     xmlNodePtr element;
438
439     TRACE("%p\n", This );
440
441     if ( !This->node )
442         return E_FAIL;
443
444     element = get_element( This );
445     if ( !element )
446         return E_FAIL;
447
448     *p = bstr_from_xmlChar( element->name );
449
450     return S_OK;
451 }
452
453 static HRESULT WINAPI domelem_getAttribute(
454     IXMLDOMElement *iface,
455     BSTR p, VARIANT* var)
456 {
457     FIXME("\n");
458     return E_NOTIMPL;
459 }
460
461 static HRESULT WINAPI domelem_setAttribute(
462     IXMLDOMElement *iface,
463     BSTR p, VARIANT var)
464 {
465     FIXME("\n");
466     return E_NOTIMPL;
467 }
468
469 static HRESULT WINAPI domelem_removeAttribute(
470     IXMLDOMElement *iface,
471     BSTR p)
472 {
473     FIXME("\n");
474     return E_NOTIMPL;
475 }
476
477 static HRESULT WINAPI domelem_getAttributeNode(
478     IXMLDOMElement *iface,
479     BSTR p, IXMLDOMAttribute** attributeNode )
480 {
481     FIXME("\n");
482     return E_NOTIMPL;
483 }
484
485 static HRESULT WINAPI domelem_setAttributeNode(
486     IXMLDOMElement *iface,
487     IXMLDOMAttribute* domAttribute,
488     IXMLDOMAttribute** attributeNode)
489 {
490     FIXME("\n");
491     return E_NOTIMPL;
492 }
493
494 static HRESULT WINAPI domelem_removeAttributeNode(
495     IXMLDOMElement *iface,
496     IXMLDOMAttribute* domAttribute,
497     IXMLDOMAttribute** attributeNode)
498 {
499     FIXME("\n");
500     return E_NOTIMPL;
501 }
502
503 static HRESULT WINAPI domelem_getElementsByTagName(
504     IXMLDOMElement *iface,
505     BSTR p, IXMLDOMNodeList** resultList)
506 {
507     FIXME("\n");
508     return E_NOTIMPL;
509 }
510
511 static HRESULT WINAPI domelem_normalize(
512     IXMLDOMElement *iface )
513 {
514     FIXME("\n");
515     return E_NOTIMPL;
516 }
517
518 static const struct IXMLDOMElementVtbl domelem_vtbl =
519 {
520     domelem_QueryInterface,
521     domelem_AddRef,
522     domelem_Release,
523     domelem_GetTypeInfoCount,
524     domelem_GetTypeInfo,
525     domelem_GetIDsOfNames,
526     domelem_Invoke,
527     domelem_get_nodeName,
528     domelem_get_nodeValue,
529     domelem_put_nodeValue,
530     domelem_get_nodeType,
531     domelem_get_parentNode,
532     domelem_get_childNodes,
533     domelem_get_firstChild,
534     domelem_get_lastChild,
535     domelem_get_previousSibling,
536     domelem_get_nextSibling,
537     domelem_get_attributes,
538     domelem_insertBefore,
539     domelem_replaceChild,
540     domelem_removeChild,
541     domelem_appendChild,
542     domelem_hasChildNodes,
543     domelem_get_ownerDocument,
544     domelem_cloneNode,
545     domelem_get_nodeTypeString,
546     domelem_get_text,
547     domelem_put_text,
548     domelem_get_specified,
549     domelem_get_definition,
550     domelem_get_nodeTypedValue,
551     domelem_put_nodeTypedValue,
552     domelem_get_dataType,
553     domelem_put_dataType,
554     domelem_get_xml,
555     domelem_transformNode,
556     domelem_selectNodes,
557     domelem_selectSingleNode,
558     domelem_get_parsed,
559     domelem_get_namespaceURI,
560     domelem_get_prefix,
561     domelem_get_baseName,
562     domelem_transformNodeToObject,
563     domelem_get_tagName,
564     domelem_getAttribute,
565     domelem_setAttribute,
566     domelem_removeAttribute,
567     domelem_getAttributeNode,
568     domelem_setAttributeNode,
569     domelem_removeAttributeNode,
570     domelem_getElementsByTagName,
571     domelem_normalize,
572 };
573
574 IXMLDOMElement* create_element( xmlNodePtr element )
575 {
576     domelem *This;
577
578     This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
579     if ( !This )
580         return NULL;
581
582     This->lpVtbl = &domelem_vtbl;
583     This->node = create_node( element );
584     This->ref = 1;
585
586     if ( !This->node )
587     {
588         HeapFree( GetProcessHeap(), 0, This );
589         return NULL;
590     }
591
592     return (IXMLDOMElement*) &This->lpVtbl;
593 }
594
595 #endif