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