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