winhttp: Reverse the order of arguments passed to Invoke.
[wine] / dlls / msxml3 / entityref.c
1 /*
2  *    DOM Entity Reference 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 _entityref
46 {
47     xmlnode node;
48     IXMLDOMEntityReference IXMLDOMEntityReference_iface;
49     LONG ref;
50 } entityref;
51
52 static const tid_t domentityref_se_tids[] = {
53     IXMLDOMNode_tid,
54     IXMLDOMEntityReference_tid,
55     0
56 };
57
58 static inline entityref *impl_from_IXMLDOMEntityReference( IXMLDOMEntityReference *iface )
59 {
60     return CONTAINING_RECORD(iface, entityref, IXMLDOMEntityReference_iface);
61 }
62
63 static HRESULT WINAPI entityref_QueryInterface(
64     IXMLDOMEntityReference *iface,
65     REFIID riid,
66     void** ppvObject )
67 {
68     entityref *This = impl_from_IXMLDOMEntityReference( iface );
69     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
70
71     if ( IsEqualGUID( riid, &IID_IXMLDOMEntityReference ) ||
72          IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
73          IsEqualGUID( riid, &IID_IDispatch ) ||
74          IsEqualGUID( riid, &IID_IUnknown ) )
75     {
76         *ppvObject = iface;
77     }
78     else if(node_query_interface(&This->node, riid, ppvObject))
79     {
80         return *ppvObject ? S_OK : E_NOINTERFACE;
81     }
82     else if (IsEqualGUID( riid, &IID_ISupportErrorInfo ))
83     {
84         return node_create_supporterrorinfo(domentityref_se_tids, ppvObject);
85     }
86     else
87     {
88         TRACE("Unsupported interface %s\n", debugstr_guid(riid));
89         *ppvObject = NULL;
90         return E_NOINTERFACE;
91     }
92
93     IUnknown_AddRef((IUnknown*)*ppvObject);
94     return S_OK;
95 }
96
97 static ULONG WINAPI entityref_AddRef(
98     IXMLDOMEntityReference *iface )
99 {
100     entityref *This = impl_from_IXMLDOMEntityReference( iface );
101     ULONG ref = InterlockedIncrement( &This->ref );
102     TRACE("(%p)->(%d)\n", This, ref);
103     return ref;
104 }
105
106 static ULONG WINAPI entityref_Release(
107     IXMLDOMEntityReference *iface )
108 {
109     entityref *This = impl_from_IXMLDOMEntityReference( iface );
110     ULONG ref = InterlockedDecrement( &This->ref );
111
112     TRACE("(%p)->(%d)\n", This, ref);
113     if ( ref == 0 )
114     {
115         destroy_xmlnode(&This->node);
116         heap_free( This );
117     }
118
119     return ref;
120 }
121
122 static HRESULT WINAPI entityref_GetTypeInfoCount(
123     IXMLDOMEntityReference *iface,
124     UINT* pctinfo )
125 {
126     entityref *This = impl_from_IXMLDOMEntityReference( iface );
127     return IDispatchEx_GetTypeInfoCount(&This->node.dispex.IDispatchEx_iface, pctinfo);
128 }
129
130 static HRESULT WINAPI entityref_GetTypeInfo(
131     IXMLDOMEntityReference *iface,
132     UINT iTInfo, LCID lcid,
133     ITypeInfo** ppTInfo )
134 {
135     entityref *This = impl_from_IXMLDOMEntityReference( iface );
136     return IDispatchEx_GetTypeInfo(&This->node.dispex.IDispatchEx_iface,
137         iTInfo, lcid, ppTInfo);
138 }
139
140 static HRESULT WINAPI entityref_GetIDsOfNames(
141     IXMLDOMEntityReference *iface,
142     REFIID riid, LPOLESTR* rgszNames,
143     UINT cNames, LCID lcid, DISPID* rgDispId )
144 {
145     entityref *This = impl_from_IXMLDOMEntityReference( iface );
146     return IDispatchEx_GetIDsOfNames(&This->node.dispex.IDispatchEx_iface,
147         riid, rgszNames, cNames, lcid, rgDispId);
148 }
149
150 static HRESULT WINAPI entityref_Invoke(
151     IXMLDOMEntityReference *iface,
152     DISPID dispIdMember, REFIID riid, LCID lcid,
153     WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
154     EXCEPINFO* pExcepInfo, UINT* puArgErr )
155 {
156     entityref *This = impl_from_IXMLDOMEntityReference( iface );
157     return IDispatchEx_Invoke(&This->node.dispex.IDispatchEx_iface,
158         dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
159 }
160
161 static HRESULT WINAPI entityref_get_nodeName(
162     IXMLDOMEntityReference *iface,
163     BSTR* p )
164 {
165     entityref *This = impl_from_IXMLDOMEntityReference( iface );
166
167     FIXME("(%p)->(%p)\n", This, p);
168
169     return node_get_nodeName(&This->node, p);
170 }
171
172 static HRESULT WINAPI entityref_get_nodeValue(
173     IXMLDOMEntityReference *iface,
174     VARIANT* value)
175 {
176     entityref *This = impl_from_IXMLDOMEntityReference( iface );
177
178     FIXME("(%p)->(%p)\n", This, value);
179
180     if(!value)
181         return E_INVALIDARG;
182
183     V_VT(value) = VT_NULL;
184     return S_FALSE;
185 }
186
187 static HRESULT WINAPI entityref_put_nodeValue(
188     IXMLDOMEntityReference *iface,
189     VARIANT value)
190 {
191     entityref *This = impl_from_IXMLDOMEntityReference( iface );
192     TRACE("(%p)->(%s)\n", This, debugstr_variant(&value));
193     return E_FAIL;
194 }
195
196 static HRESULT WINAPI entityref_get_nodeType(
197     IXMLDOMEntityReference *iface,
198     DOMNodeType* domNodeType )
199 {
200     entityref *This = impl_from_IXMLDOMEntityReference( iface );
201
202     TRACE("(%p)->(%p)\n", This, domNodeType);
203
204     *domNodeType = NODE_ENTITY_REFERENCE;
205     return S_OK;
206 }
207
208 static HRESULT WINAPI entityref_get_parentNode(
209     IXMLDOMEntityReference *iface,
210     IXMLDOMNode** parent )
211 {
212     entityref *This = impl_from_IXMLDOMEntityReference( iface );
213
214     TRACE("(%p)->(%p)\n", This, parent);
215
216     return node_get_parent(&This->node, parent);
217 }
218
219 static HRESULT WINAPI entityref_get_childNodes(
220     IXMLDOMEntityReference *iface,
221     IXMLDOMNodeList** outList)
222 {
223     entityref *This = impl_from_IXMLDOMEntityReference( iface );
224
225     TRACE("(%p)->(%p)\n", This, outList);
226
227     return node_get_child_nodes(&This->node, outList);
228 }
229
230 static HRESULT WINAPI entityref_get_firstChild(
231     IXMLDOMEntityReference *iface,
232     IXMLDOMNode** domNode)
233 {
234     entityref *This = impl_from_IXMLDOMEntityReference( iface );
235
236     TRACE("(%p)->(%p)\n", This, domNode);
237
238     return node_get_first_child(&This->node, domNode);
239 }
240
241 static HRESULT WINAPI entityref_get_lastChild(
242     IXMLDOMEntityReference *iface,
243     IXMLDOMNode** domNode)
244 {
245     entityref *This = impl_from_IXMLDOMEntityReference( iface );
246
247     TRACE("(%p)->(%p)\n", This, domNode);
248
249     return node_get_last_child(&This->node, domNode);
250 }
251
252 static HRESULT WINAPI entityref_get_previousSibling(
253     IXMLDOMEntityReference *iface,
254     IXMLDOMNode** domNode)
255 {
256     entityref *This = impl_from_IXMLDOMEntityReference( iface );
257
258     TRACE("(%p)->(%p)\n", This, domNode);
259
260     return node_get_previous_sibling(&This->node, domNode);
261 }
262
263 static HRESULT WINAPI entityref_get_nextSibling(
264     IXMLDOMEntityReference *iface,
265     IXMLDOMNode** domNode)
266 {
267     entityref *This = impl_from_IXMLDOMEntityReference( iface );
268
269     TRACE("(%p)->(%p)\n", This, domNode);
270
271     return node_get_next_sibling(&This->node, domNode);
272 }
273
274 static HRESULT WINAPI entityref_get_attributes(
275     IXMLDOMEntityReference *iface,
276     IXMLDOMNamedNodeMap** attributeMap)
277 {
278     entityref *This = impl_from_IXMLDOMEntityReference( iface );
279
280     TRACE("(%p)->(%p)\n", This, attributeMap);
281
282     return return_null_ptr((void**)attributeMap);
283 }
284
285 static HRESULT WINAPI entityref_insertBefore(
286     IXMLDOMEntityReference *iface,
287     IXMLDOMNode* newNode, VARIANT refChild,
288     IXMLDOMNode** outOldNode)
289 {
290     entityref *This = impl_from_IXMLDOMEntityReference( iface );
291
292     FIXME("(%p)->(%p %s %p) needs test\n", This, newNode, debugstr_variant(&refChild), outOldNode);
293
294     return node_insert_before(&This->node, newNode, &refChild, outOldNode);
295 }
296
297 static HRESULT WINAPI entityref_replaceChild(
298     IXMLDOMEntityReference *iface,
299     IXMLDOMNode* newNode,
300     IXMLDOMNode* oldNode,
301     IXMLDOMNode** outOldNode)
302 {
303     entityref *This = impl_from_IXMLDOMEntityReference( iface );
304
305     FIXME("(%p)->(%p %p %p) needs test\n", This, newNode, oldNode, outOldNode);
306
307     return node_replace_child(&This->node, newNode, oldNode, outOldNode);
308 }
309
310 static HRESULT WINAPI entityref_removeChild(
311     IXMLDOMEntityReference *iface,
312     IXMLDOMNode *child, IXMLDOMNode **oldChild)
313 {
314     entityref *This = impl_from_IXMLDOMEntityReference( iface );
315     TRACE("(%p)->(%p %p)\n", This, child, oldChild);
316     return node_remove_child(&This->node, child, oldChild);
317 }
318
319 static HRESULT WINAPI entityref_appendChild(
320     IXMLDOMEntityReference *iface,
321     IXMLDOMNode *child, IXMLDOMNode **outChild)
322 {
323     entityref *This = impl_from_IXMLDOMEntityReference( iface );
324     TRACE("(%p)->(%p %p)\n", This, child, outChild);
325     return node_append_child(&This->node, child, outChild);
326 }
327
328 static HRESULT WINAPI entityref_hasChildNodes(
329     IXMLDOMEntityReference *iface,
330     VARIANT_BOOL *ret)
331 {
332     entityref *This = impl_from_IXMLDOMEntityReference( iface );
333     TRACE("(%p)->(%p)\n", This, ret);
334     return node_has_childnodes(&This->node, ret);
335 }
336
337 static HRESULT WINAPI entityref_get_ownerDocument(
338     IXMLDOMEntityReference *iface,
339     IXMLDOMDocument **doc)
340 {
341     entityref *This = impl_from_IXMLDOMEntityReference( iface );
342     TRACE("(%p)->(%p)\n", This, doc);
343     return node_get_owner_doc(&This->node, doc);
344 }
345
346 static HRESULT WINAPI entityref_cloneNode(
347     IXMLDOMEntityReference *iface,
348     VARIANT_BOOL deep, IXMLDOMNode** outNode)
349 {
350     entityref *This = impl_from_IXMLDOMEntityReference( iface );
351     TRACE("(%p)->(%d %p)\n", This, deep, outNode);
352     return node_clone( &This->node, deep, outNode );
353 }
354
355 static HRESULT WINAPI entityref_get_nodeTypeString(
356     IXMLDOMEntityReference *iface,
357     BSTR* p)
358 {
359     entityref *This = impl_from_IXMLDOMEntityReference( iface );
360     static const WCHAR entityreferenceW[] = {'e','n','t','i','t','y','r','e','f','e','r','e','n','c','e',0};
361
362     TRACE("(%p)->(%p)\n", This, p);
363
364     return return_bstr(entityreferenceW, p);
365 }
366
367 static HRESULT WINAPI entityref_get_text(
368     IXMLDOMEntityReference *iface,
369     BSTR* p)
370 {
371     entityref *This = impl_from_IXMLDOMEntityReference( iface );
372     TRACE("(%p)->(%p)\n", This, p);
373     return node_get_text(&This->node, p);
374 }
375
376 static HRESULT WINAPI entityref_put_text(
377     IXMLDOMEntityReference *iface,
378     BSTR p)
379 {
380     entityref *This = impl_from_IXMLDOMEntityReference( iface );
381     TRACE("(%p)->(%s)\n", This, debugstr_w(p));
382     return node_put_text( &This->node, p );
383 }
384
385 static HRESULT WINAPI entityref_get_specified(
386     IXMLDOMEntityReference *iface,
387     VARIANT_BOOL* isSpecified)
388 {
389     entityref *This = impl_from_IXMLDOMEntityReference( iface );
390     FIXME("(%p)->(%p) stub!\n", This, isSpecified);
391     *isSpecified = VARIANT_TRUE;
392     return S_OK;
393 }
394
395 static HRESULT WINAPI entityref_get_definition(
396     IXMLDOMEntityReference *iface,
397     IXMLDOMNode** definitionNode)
398 {
399     entityref *This = impl_from_IXMLDOMEntityReference( iface );
400     FIXME("(%p)->(%p)\n", This, definitionNode);
401     return E_NOTIMPL;
402 }
403
404 static HRESULT WINAPI entityref_get_nodeTypedValue(
405     IXMLDOMEntityReference *iface,
406     VARIANT* var1)
407 {
408     entityref *This = impl_from_IXMLDOMEntityReference( iface );
409     FIXME("(%p)->(%p)\n", This, var1);
410     return return_null_var(var1);
411 }
412
413 static HRESULT WINAPI entityref_put_nodeTypedValue(
414     IXMLDOMEntityReference *iface,
415     VARIANT typedValue)
416 {
417     entityref *This = impl_from_IXMLDOMEntityReference( iface );
418     FIXME("(%p)->(%s)\n", This, debugstr_variant(&typedValue));
419     return E_NOTIMPL;
420 }
421
422 static HRESULT WINAPI entityref_get_dataType(
423     IXMLDOMEntityReference *iface,
424     VARIANT* typename)
425 {
426     entityref *This = impl_from_IXMLDOMEntityReference( iface );
427     FIXME("(%p)->(%p): should return a valid value\n", This, typename);
428     return return_null_var( typename );
429 }
430
431 static HRESULT WINAPI entityref_put_dataType(
432     IXMLDOMEntityReference *iface,
433     BSTR p)
434 {
435     entityref *This = impl_from_IXMLDOMEntityReference( iface );
436
437     FIXME("(%p)->(%s)\n", This, debugstr_w(p));
438
439     if(!p)
440         return E_INVALIDARG;
441
442     return E_FAIL;
443 }
444
445 static HRESULT WINAPI entityref_get_xml(
446     IXMLDOMEntityReference *iface,
447     BSTR* p)
448 {
449     entityref *This = impl_from_IXMLDOMEntityReference( iface );
450
451     TRACE("(%p)->(%p)\n", This, p);
452
453     return node_get_xml(&This->node, FALSE, FALSE, p);
454 }
455
456 static HRESULT WINAPI entityref_transformNode(
457     IXMLDOMEntityReference *iface,
458     IXMLDOMNode *node, BSTR *p)
459 {
460     entityref *This = impl_from_IXMLDOMEntityReference( iface );
461     TRACE("(%p)->(%p %p)\n", This, node, p);
462     return node_transform_node(&This->node, node, p);
463 }
464
465 static HRESULT WINAPI entityref_selectNodes(
466     IXMLDOMEntityReference *iface,
467     BSTR p, IXMLDOMNodeList** outList)
468 {
469     entityref *This = impl_from_IXMLDOMEntityReference( iface );
470     TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outList);
471     return node_select_nodes(&This->node, p, outList);
472 }
473
474 static HRESULT WINAPI entityref_selectSingleNode(
475     IXMLDOMEntityReference *iface,
476     BSTR p, IXMLDOMNode** outNode)
477 {
478     entityref *This = impl_from_IXMLDOMEntityReference( iface );
479     TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outNode);
480     return node_select_singlenode(&This->node, p, outNode);
481 }
482
483 static HRESULT WINAPI entityref_get_parsed(
484     IXMLDOMEntityReference *iface,
485     VARIANT_BOOL* isParsed)
486 {
487     entityref *This = impl_from_IXMLDOMEntityReference( iface );
488     FIXME("(%p)->(%p) stub!\n", This, isParsed);
489     *isParsed = VARIANT_TRUE;
490     return S_OK;
491 }
492
493 static HRESULT WINAPI entityref_get_namespaceURI(
494     IXMLDOMEntityReference *iface,
495     BSTR* p)
496 {
497     entityref *This = impl_from_IXMLDOMEntityReference( iface );
498     TRACE("(%p)->(%p)\n", This, p);
499     return node_get_namespaceURI(&This->node, p);
500 }
501
502 static HRESULT WINAPI entityref_get_prefix(
503     IXMLDOMEntityReference *iface,
504     BSTR* prefix)
505 {
506     entityref *This = impl_from_IXMLDOMEntityReference( iface );
507     FIXME("(%p)->(%p): stub\n", This, prefix);
508     return return_null_bstr( prefix );
509 }
510
511 static HRESULT WINAPI entityref_get_baseName(
512     IXMLDOMEntityReference *iface,
513     BSTR* name)
514 {
515     entityref *This = impl_from_IXMLDOMEntityReference( iface );
516     FIXME("(%p)->(%p): needs test\n", This, name);
517     return return_null_bstr( name );
518 }
519
520 static HRESULT WINAPI entityref_transformNodeToObject(
521     IXMLDOMEntityReference *iface,
522     IXMLDOMNode* domNode, VARIANT var1)
523 {
524     entityref *This = impl_from_IXMLDOMEntityReference( iface );
525     FIXME("(%p)->(%p %s)\n", This, domNode, debugstr_variant(&var1));
526     return E_NOTIMPL;
527 }
528
529 static const struct IXMLDOMEntityReferenceVtbl entityref_vtbl =
530 {
531     entityref_QueryInterface,
532     entityref_AddRef,
533     entityref_Release,
534     entityref_GetTypeInfoCount,
535     entityref_GetTypeInfo,
536     entityref_GetIDsOfNames,
537     entityref_Invoke,
538     entityref_get_nodeName,
539     entityref_get_nodeValue,
540     entityref_put_nodeValue,
541     entityref_get_nodeType,
542     entityref_get_parentNode,
543     entityref_get_childNodes,
544     entityref_get_firstChild,
545     entityref_get_lastChild,
546     entityref_get_previousSibling,
547     entityref_get_nextSibling,
548     entityref_get_attributes,
549     entityref_insertBefore,
550     entityref_replaceChild,
551     entityref_removeChild,
552     entityref_appendChild,
553     entityref_hasChildNodes,
554     entityref_get_ownerDocument,
555     entityref_cloneNode,
556     entityref_get_nodeTypeString,
557     entityref_get_text,
558     entityref_put_text,
559     entityref_get_specified,
560     entityref_get_definition,
561     entityref_get_nodeTypedValue,
562     entityref_put_nodeTypedValue,
563     entityref_get_dataType,
564     entityref_put_dataType,
565     entityref_get_xml,
566     entityref_transformNode,
567     entityref_selectNodes,
568     entityref_selectSingleNode,
569     entityref_get_parsed,
570     entityref_get_namespaceURI,
571     entityref_get_prefix,
572     entityref_get_baseName,
573     entityref_transformNodeToObject,
574 };
575
576 static const tid_t domentityref_iface_tids[] = {
577     IXMLDOMEntityReference_tid,
578     0
579 };
580
581 static dispex_static_data_t domentityref_dispex = {
582     NULL,
583     IXMLDOMEntityReference_tid,
584     NULL,
585     domentityref_iface_tids
586 };
587
588 IUnknown* create_doc_entity_ref( xmlNodePtr entity )
589 {
590     entityref *This;
591
592     This = heap_alloc( sizeof *This );
593     if ( !This )
594         return NULL;
595
596     This->IXMLDOMEntityReference_iface.lpVtbl = &entityref_vtbl;
597     This->ref = 1;
598
599     init_xmlnode(&This->node, entity, (IXMLDOMNode*)&This->IXMLDOMEntityReference_iface, &domentityref_dispex);
600
601     return (IUnknown*)&This->IXMLDOMEntityReference_iface;
602 }
603
604 #endif