dinput: Implement IDirectInput::RunControlPanel.
[wine] / dlls / msxml3 / docfrag.c
1 /*
2  *    DOM Document Fragment implementation
3  *
4  * Copyright 2007 Alistair Leslie-Hughes
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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #define COBJMACROS
22
23 #include "config.h"
24
25 #include <stdarg.h>
26 #ifdef HAVE_LIBXML2
27 # include <libxml/parser.h>
28 # include <libxml/xmlerror.h>
29 #endif
30
31 #include "windef.h"
32 #include "winbase.h"
33 #include "winuser.h"
34 #include "ole2.h"
35 #include "msxml6.h"
36
37 #include "msxml_private.h"
38
39 #include "wine/debug.h"
40
41 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
42
43 #ifdef HAVE_LIBXML2
44
45 typedef struct _domfrag
46 {
47     xmlnode node;
48     IXMLDOMDocumentFragment IXMLDOMDocumentFragment_iface;
49     LONG ref;
50 } domfrag;
51
52 static inline domfrag *impl_from_IXMLDOMDocumentFragment( IXMLDOMDocumentFragment *iface )
53 {
54     return CONTAINING_RECORD(iface, domfrag, IXMLDOMDocumentFragment_iface);
55 }
56
57 static HRESULT WINAPI domfrag_QueryInterface(
58     IXMLDOMDocumentFragment *iface,
59     REFIID riid,
60     void** ppvObject )
61 {
62     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
63     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
64
65     if ( IsEqualGUID( riid, &IID_IXMLDOMDocumentFragment ) ||
66          IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
67          IsEqualGUID( riid, &IID_IDispatch ) ||
68          IsEqualGUID( riid, &IID_IUnknown ) )
69     {
70         *ppvObject = iface;
71     }
72     else if(node_query_interface(&This->node, riid, ppvObject))
73     {
74         return *ppvObject ? S_OK : E_NOINTERFACE;
75     }
76     else
77     {
78         TRACE("Unsupported interface %s\n", debugstr_guid(riid));
79         *ppvObject = NULL;
80         return E_NOINTERFACE;
81     }
82
83     IXMLDOMText_AddRef((IUnknown*)*ppvObject);
84     return S_OK;
85 }
86
87 static ULONG WINAPI domfrag_AddRef(
88     IXMLDOMDocumentFragment *iface )
89 {
90     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
91     ULONG ref = InterlockedIncrement( &This->ref );
92     TRACE("(%p)->(%d)\n", This, ref);
93     return ref;
94 }
95
96 static ULONG WINAPI domfrag_Release(
97     IXMLDOMDocumentFragment *iface )
98 {
99     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
100     ULONG ref = InterlockedDecrement( &This->ref );
101
102     TRACE("(%p)->(%d)\n", This, ref);
103     if ( ref == 0 )
104     {
105         destroy_xmlnode(&This->node);
106         heap_free( This );
107     }
108
109     return ref;
110 }
111
112 static HRESULT WINAPI domfrag_GetTypeInfoCount(
113     IXMLDOMDocumentFragment *iface,
114     UINT* pctinfo )
115 {
116     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
117
118     TRACE("(%p)->(%p)\n", This, pctinfo);
119
120     *pctinfo = 1;
121
122     return S_OK;
123 }
124
125 static HRESULT WINAPI domfrag_GetTypeInfo(
126     IXMLDOMDocumentFragment *iface,
127     UINT iTInfo, LCID lcid,
128     ITypeInfo** ppTInfo )
129 {
130     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
131     HRESULT hr;
132
133     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
134
135     hr = get_typeinfo(IXMLDOMDocumentFragment_tid, ppTInfo);
136
137     return hr;
138 }
139
140 static HRESULT WINAPI domfrag_GetIDsOfNames(
141     IXMLDOMDocumentFragment *iface,
142     REFIID riid, LPOLESTR* rgszNames,
143     UINT cNames, LCID lcid, DISPID* rgDispId )
144 {
145     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
146     ITypeInfo *typeinfo;
147     HRESULT hr;
148
149     TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
150           lcid, rgDispId);
151
152     if(!rgszNames || cNames == 0 || !rgDispId)
153         return E_INVALIDARG;
154
155     hr = get_typeinfo(IXMLDOMDocumentFragment_tid, &typeinfo);
156     if(SUCCEEDED(hr))
157     {
158         hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
159         ITypeInfo_Release(typeinfo);
160     }
161
162     return hr;
163 }
164
165 static HRESULT WINAPI domfrag_Invoke(
166     IXMLDOMDocumentFragment *iface,
167     DISPID dispIdMember, REFIID riid, LCID lcid,
168     WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
169     EXCEPINFO* pExcepInfo, UINT* puArgErr )
170 {
171     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
172     ITypeInfo *typeinfo;
173     HRESULT hr;
174
175     TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
176           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
177
178     hr = get_typeinfo(IXMLDOMDocumentFragment_tid, &typeinfo);
179     if(SUCCEEDED(hr))
180     {
181         hr = ITypeInfo_Invoke(typeinfo, &This->IXMLDOMDocumentFragment_iface, dispIdMember,
182                 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
183         ITypeInfo_Release(typeinfo);
184     }
185
186     return hr;
187 }
188
189 static HRESULT WINAPI domfrag_get_nodeName(
190     IXMLDOMDocumentFragment *iface,
191     BSTR* p )
192 {
193     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
194
195     static const WCHAR document_fragmentW[] =
196         {'#','d','o','c','u','m','e','n','t','-','f','r','a','g','m','e','n','t',0};
197
198     TRACE("(%p)->(%p)\n", This, p);
199
200     return return_bstr(document_fragmentW, p);
201 }
202
203 static HRESULT WINAPI domfrag_get_nodeValue(
204     IXMLDOMDocumentFragment *iface,
205     VARIANT* value)
206 {
207     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
208
209     FIXME("(%p)->(%p)\n", This, value);
210
211     if(!value)
212         return E_INVALIDARG;
213
214     V_VT(value) = VT_NULL;
215     return S_FALSE;
216 }
217
218 static HRESULT WINAPI domfrag_put_nodeValue(
219     IXMLDOMDocumentFragment *iface,
220     VARIANT value)
221 {
222     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
223     TRACE("(%p)->(%s)\n", This, debugstr_variant(&value));
224     return E_FAIL;
225 }
226
227 static HRESULT WINAPI domfrag_get_nodeType(
228     IXMLDOMDocumentFragment *iface,
229     DOMNodeType* domNodeType )
230 {
231     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
232
233     TRACE("(%p)->(%p)\n", This, domNodeType);
234
235     *domNodeType = NODE_DOCUMENT_FRAGMENT;
236     return S_OK;
237 }
238
239 static HRESULT WINAPI domfrag_get_parentNode(
240     IXMLDOMDocumentFragment *iface,
241     IXMLDOMNode** parent )
242 {
243     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
244
245     TRACE("(%p)->(%p)\n", This, parent);
246
247     return node_get_parent(&This->node, parent);
248 }
249
250 static HRESULT WINAPI domfrag_get_childNodes(
251     IXMLDOMDocumentFragment *iface,
252     IXMLDOMNodeList** outList)
253 {
254     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
255
256     TRACE("(%p)->(%p)\n", This, outList);
257
258     return node_get_child_nodes(&This->node, outList);
259 }
260
261 static HRESULT WINAPI domfrag_get_firstChild(
262     IXMLDOMDocumentFragment *iface,
263     IXMLDOMNode** domNode)
264 {
265     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
266
267     TRACE("(%p)->(%p)\n", This, domNode);
268
269     return node_get_first_child(&This->node, domNode);
270 }
271
272 static HRESULT WINAPI domfrag_get_lastChild(
273     IXMLDOMDocumentFragment *iface,
274     IXMLDOMNode** domNode)
275 {
276     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
277
278     TRACE("(%p)->(%p)\n", This, domNode);
279
280     return node_get_last_child(&This->node, domNode);
281 }
282
283 static HRESULT WINAPI domfrag_get_previousSibling(
284     IXMLDOMDocumentFragment *iface,
285     IXMLDOMNode** domNode)
286 {
287     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
288
289     TRACE("(%p)->(%p)\n", This, domNode);
290
291     return return_null_node(domNode);
292 }
293
294 static HRESULT WINAPI domfrag_get_nextSibling(
295     IXMLDOMDocumentFragment *iface,
296     IXMLDOMNode** domNode)
297 {
298     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
299
300     TRACE("(%p)->(%p)\n", This, domNode);
301
302     return return_null_node(domNode);
303 }
304
305 static HRESULT WINAPI domfrag_get_attributes(
306     IXMLDOMDocumentFragment *iface,
307     IXMLDOMNamedNodeMap** attributeMap)
308 {
309     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
310
311     TRACE("(%p)->(%p)\n", This, attributeMap);
312
313     return return_null_ptr((void**)attributeMap);
314 }
315
316 static HRESULT WINAPI domfrag_insertBefore(
317     IXMLDOMDocumentFragment *iface,
318     IXMLDOMNode* newNode, VARIANT refChild,
319     IXMLDOMNode** outOldNode)
320 {
321     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
322
323     TRACE("(%p)->(%p %s %p)\n", This, newNode, debugstr_variant(&refChild), outOldNode);
324
325     /* TODO: test */
326     return node_insert_before(&This->node, newNode, &refChild, outOldNode);
327 }
328
329 static HRESULT WINAPI domfrag_replaceChild(
330     IXMLDOMDocumentFragment *iface,
331     IXMLDOMNode* newNode,
332     IXMLDOMNode* oldNode,
333     IXMLDOMNode** outOldNode)
334 {
335     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
336
337     TRACE("(%p)->(%p %p %p)\n", This, newNode, oldNode, outOldNode);
338
339     /* TODO: test */
340     return node_replace_child(&This->node, newNode, oldNode, outOldNode);
341 }
342
343 static HRESULT WINAPI domfrag_removeChild(
344     IXMLDOMDocumentFragment *iface,
345     IXMLDOMNode *child, IXMLDOMNode **oldChild)
346 {
347     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
348     TRACE("(%p)->(%p %p)\n", This, child, oldChild);
349     return node_remove_child(&This->node, child, oldChild);
350 }
351
352 static HRESULT WINAPI domfrag_appendChild(
353     IXMLDOMDocumentFragment *iface,
354     IXMLDOMNode *child, IXMLDOMNode **outChild)
355 {
356     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
357     TRACE("(%p)->(%p %p)\n", This, child, outChild);
358     return node_append_child(&This->node, child, outChild);
359 }
360
361 static HRESULT WINAPI domfrag_hasChildNodes(
362     IXMLDOMDocumentFragment *iface,
363     VARIANT_BOOL *ret)
364 {
365     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
366     TRACE("(%p)->(%p)\n", This, ret);
367     return node_has_childnodes(&This->node, ret);
368 }
369
370 static HRESULT WINAPI domfrag_get_ownerDocument(
371     IXMLDOMDocumentFragment *iface,
372     IXMLDOMDocument **doc)
373 {
374     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
375     TRACE("(%p)->(%p)\n", This, doc);
376     return node_get_owner_doc(&This->node, doc);
377 }
378
379 static HRESULT WINAPI domfrag_cloneNode(
380     IXMLDOMDocumentFragment *iface,
381     VARIANT_BOOL deep, IXMLDOMNode** outNode)
382 {
383     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
384     TRACE("(%p)->(%d %p)\n", This, deep, outNode);
385     return node_clone( &This->node, deep, outNode );
386 }
387
388 static HRESULT WINAPI domfrag_get_nodeTypeString(
389     IXMLDOMDocumentFragment *iface,
390     BSTR* p)
391 {
392     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
393     static const WCHAR documentfragmentW[] = {'d','o','c','u','m','e','n','t','f','r','a','g','m','e','n','t',0};
394
395     TRACE("(%p)->(%p)\n", This, p);
396
397     return return_bstr(documentfragmentW, p);
398 }
399
400 static HRESULT WINAPI domfrag_get_text(
401     IXMLDOMDocumentFragment *iface,
402     BSTR* p)
403 {
404     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
405     TRACE("(%p)->(%p)\n", This, p);
406     return node_get_text(&This->node, p);
407 }
408
409 static HRESULT WINAPI domfrag_put_text(
410     IXMLDOMDocumentFragment *iface,
411     BSTR p)
412 {
413     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
414     TRACE("(%p)->(%s)\n", This, debugstr_w(p));
415     return node_put_text( &This->node, p );
416 }
417
418 static HRESULT WINAPI domfrag_get_specified(
419     IXMLDOMDocumentFragment *iface,
420     VARIANT_BOOL* isSpecified)
421 {
422     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
423     FIXME("(%p)->(%p) stub!\n", This, isSpecified);
424     *isSpecified = VARIANT_TRUE;
425     return S_OK;
426 }
427
428 static HRESULT WINAPI domfrag_get_definition(
429     IXMLDOMDocumentFragment *iface,
430     IXMLDOMNode** definitionNode)
431 {
432     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
433     FIXME("(%p)->(%p)\n", This, definitionNode);
434     return E_NOTIMPL;
435 }
436
437 static HRESULT WINAPI domfrag_get_nodeTypedValue(
438     IXMLDOMDocumentFragment *iface,
439     VARIANT *v)
440 {
441     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
442     TRACE("(%p)->(%p)\n", This, v);
443     return return_null_var(v);
444 }
445
446 static HRESULT WINAPI domfrag_put_nodeTypedValue(
447     IXMLDOMDocumentFragment *iface,
448     VARIANT typedValue)
449 {
450     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
451     FIXME("(%p)->(%s)\n", This, debugstr_variant(&typedValue));
452     return E_NOTIMPL;
453 }
454
455 static HRESULT WINAPI domfrag_get_dataType(
456     IXMLDOMDocumentFragment *iface,
457     VARIANT* typename)
458 {
459     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
460     TRACE("(%p)->(%p)\n", This, typename);
461     return return_null_var( typename );
462 }
463
464 static HRESULT WINAPI domfrag_put_dataType(
465     IXMLDOMDocumentFragment *iface,
466     BSTR p)
467 {
468     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
469
470     FIXME("(%p)->(%s)\n", This, debugstr_w(p));
471
472     if(!p)
473         return E_INVALIDARG;
474
475     return E_FAIL;
476 }
477
478 static HRESULT WINAPI domfrag_get_xml(
479     IXMLDOMDocumentFragment *iface,
480     BSTR* p)
481 {
482     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
483
484     TRACE("(%p)->(%p)\n", This, p);
485
486     return node_get_xml(&This->node, FALSE, FALSE, p);
487 }
488
489 static HRESULT WINAPI domfrag_transformNode(
490     IXMLDOMDocumentFragment *iface,
491     IXMLDOMNode *node, BSTR *p)
492 {
493     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
494     TRACE("(%p)->(%p %p)\n", This, node, p);
495     return node_transform_node(&This->node, node, p);
496 }
497
498 static HRESULT WINAPI domfrag_selectNodes(
499     IXMLDOMDocumentFragment *iface,
500     BSTR p, IXMLDOMNodeList** outList)
501 {
502     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
503     TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outList);
504     return node_select_nodes(&This->node, p, outList);
505 }
506
507 static HRESULT WINAPI domfrag_selectSingleNode(
508     IXMLDOMDocumentFragment *iface,
509     BSTR p, IXMLDOMNode** outNode)
510 {
511     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
512     TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outNode);
513     return node_select_singlenode(&This->node, p, outNode);
514 }
515
516 static HRESULT WINAPI domfrag_get_parsed(
517     IXMLDOMDocumentFragment *iface,
518     VARIANT_BOOL* isParsed)
519 {
520     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
521     FIXME("(%p)->(%p) stub!\n", This, isParsed);
522     *isParsed = VARIANT_TRUE;
523     return S_OK;
524 }
525
526 static HRESULT WINAPI domfrag_get_namespaceURI(
527     IXMLDOMDocumentFragment *iface,
528     BSTR* p)
529 {
530     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
531     TRACE("(%p)->(%p)\n", This, p);
532     return node_get_namespaceURI(&This->node, p);
533 }
534
535 static HRESULT WINAPI domfrag_get_prefix(
536     IXMLDOMDocumentFragment *iface,
537     BSTR* prefix)
538 {
539     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
540     TRACE("(%p)->(%p)\n", This, prefix);
541     return return_null_bstr( prefix );
542 }
543
544 static HRESULT WINAPI domfrag_get_baseName(
545     IXMLDOMDocumentFragment *iface,
546     BSTR* name)
547 {
548     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
549     FIXME("(%p)->(%p): needs test\n", This, name);
550     return return_null_bstr( name );
551 }
552
553 static HRESULT WINAPI domfrag_transformNodeToObject(
554     IXMLDOMDocumentFragment *iface,
555     IXMLDOMNode* domNode, VARIANT var1)
556 {
557     domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
558     FIXME("(%p)->(%p %s)\n", This, domNode, debugstr_variant(&var1));
559     return E_NOTIMPL;
560 }
561
562 static const struct IXMLDOMDocumentFragmentVtbl domfrag_vtbl =
563 {
564     domfrag_QueryInterface,
565     domfrag_AddRef,
566     domfrag_Release,
567     domfrag_GetTypeInfoCount,
568     domfrag_GetTypeInfo,
569     domfrag_GetIDsOfNames,
570     domfrag_Invoke,
571     domfrag_get_nodeName,
572     domfrag_get_nodeValue,
573     domfrag_put_nodeValue,
574     domfrag_get_nodeType,
575     domfrag_get_parentNode,
576     domfrag_get_childNodes,
577     domfrag_get_firstChild,
578     domfrag_get_lastChild,
579     domfrag_get_previousSibling,
580     domfrag_get_nextSibling,
581     domfrag_get_attributes,
582     domfrag_insertBefore,
583     domfrag_replaceChild,
584     domfrag_removeChild,
585     domfrag_appendChild,
586     domfrag_hasChildNodes,
587     domfrag_get_ownerDocument,
588     domfrag_cloneNode,
589     domfrag_get_nodeTypeString,
590     domfrag_get_text,
591     domfrag_put_text,
592     domfrag_get_specified,
593     domfrag_get_definition,
594     domfrag_get_nodeTypedValue,
595     domfrag_put_nodeTypedValue,
596     domfrag_get_dataType,
597     domfrag_put_dataType,
598     domfrag_get_xml,
599     domfrag_transformNode,
600     domfrag_selectNodes,
601     domfrag_selectSingleNode,
602     domfrag_get_parsed,
603     domfrag_get_namespaceURI,
604     domfrag_get_prefix,
605     domfrag_get_baseName,
606     domfrag_transformNodeToObject
607 };
608
609 IUnknown* create_doc_fragment( xmlNodePtr fragment )
610 {
611     domfrag *This;
612
613     This = heap_alloc( sizeof *This );
614     if ( !This )
615         return NULL;
616
617     This->IXMLDOMDocumentFragment_iface.lpVtbl = &domfrag_vtbl;
618     This->ref = 1;
619
620     init_xmlnode(&This->node, fragment, (IXMLDOMNode*)&This->IXMLDOMDocumentFragment_iface, NULL);
621
622     return (IUnknown*)&This->IXMLDOMDocumentFragment_iface;
623 }
624
625 #endif