Synchronize with trunk revision 59636 (just before Alex's CreateProcess revamp).
[reactos.git] / dll / win32 / 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 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 _domfrag
49 {
50 xmlnode node;
51 IXMLDOMDocumentFragment IXMLDOMDocumentFragment_iface;
52 LONG ref;
53 } domfrag;
54
55 static const tid_t domfrag_se_tids[] = {
56 IXMLDOMNode_tid,
57 IXMLDOMDocumentFragment_tid,
58 0
59 };
60
61 static inline domfrag *impl_from_IXMLDOMDocumentFragment( IXMLDOMDocumentFragment *iface )
62 {
63 return CONTAINING_RECORD(iface, domfrag, IXMLDOMDocumentFragment_iface);
64 }
65
66 static HRESULT WINAPI domfrag_QueryInterface(
67 IXMLDOMDocumentFragment *iface,
68 REFIID riid,
69 void** ppvObject )
70 {
71 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
72 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
73
74 if ( IsEqualGUID( riid, &IID_IXMLDOMDocumentFragment ) ||
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(domfrag_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 IXMLDOMDocumentFragment_AddRef(iface);
97 return S_OK;
98 }
99
100 static ULONG WINAPI domfrag_AddRef(
101 IXMLDOMDocumentFragment *iface )
102 {
103 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
104 ULONG ref = InterlockedIncrement( &This->ref );
105 TRACE("(%p)->(%d)\n", This, ref);
106 return ref;
107 }
108
109 static ULONG WINAPI domfrag_Release(
110 IXMLDOMDocumentFragment *iface )
111 {
112 domfrag *This = impl_from_IXMLDOMDocumentFragment( 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 domfrag_GetTypeInfoCount(
126 IXMLDOMDocumentFragment *iface,
127 UINT* pctinfo )
128 {
129 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
130 return IDispatchEx_GetTypeInfoCount(&This->node.dispex.IDispatchEx_iface, pctinfo);
131 }
132
133 static HRESULT WINAPI domfrag_GetTypeInfo(
134 IXMLDOMDocumentFragment *iface,
135 UINT iTInfo, LCID lcid,
136 ITypeInfo** ppTInfo )
137 {
138 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
139 return IDispatchEx_GetTypeInfo(&This->node.dispex.IDispatchEx_iface,
140 iTInfo, lcid, ppTInfo);
141 }
142
143 static HRESULT WINAPI domfrag_GetIDsOfNames(
144 IXMLDOMDocumentFragment *iface,
145 REFIID riid, LPOLESTR* rgszNames,
146 UINT cNames, LCID lcid, DISPID* rgDispId )
147 {
148 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
149 return IDispatchEx_GetIDsOfNames(&This->node.dispex.IDispatchEx_iface,
150 riid, rgszNames, cNames, lcid, rgDispId);
151 }
152
153 static HRESULT WINAPI domfrag_Invoke(
154 IXMLDOMDocumentFragment *iface,
155 DISPID dispIdMember, REFIID riid, LCID lcid,
156 WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
157 EXCEPINFO* pExcepInfo, UINT* puArgErr )
158 {
159 domfrag *This = impl_from_IXMLDOMDocumentFragment( 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 domfrag_get_nodeName(
165 IXMLDOMDocumentFragment *iface,
166 BSTR* p )
167 {
168 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
169
170 static const WCHAR document_fragmentW[] =
171 {'#','d','o','c','u','m','e','n','t','-','f','r','a','g','m','e','n','t',0};
172
173 TRACE("(%p)->(%p)\n", This, p);
174
175 return return_bstr(document_fragmentW, p);
176 }
177
178 static HRESULT WINAPI domfrag_get_nodeValue(
179 IXMLDOMDocumentFragment *iface,
180 VARIANT* value)
181 {
182 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
183 TRACE("(%p)->(%p)\n", This, value);
184 return return_null_var(value);
185 }
186
187 static HRESULT WINAPI domfrag_put_nodeValue(
188 IXMLDOMDocumentFragment *iface,
189 VARIANT value)
190 {
191 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
192 TRACE("(%p)->(%s)\n", This, debugstr_variant(&value));
193 return E_FAIL;
194 }
195
196 static HRESULT WINAPI domfrag_get_nodeType(
197 IXMLDOMDocumentFragment *iface,
198 DOMNodeType* domNodeType )
199 {
200 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
201
202 TRACE("(%p)->(%p)\n", This, domNodeType);
203
204 *domNodeType = NODE_DOCUMENT_FRAGMENT;
205 return S_OK;
206 }
207
208 static HRESULT WINAPI domfrag_get_parentNode(
209 IXMLDOMDocumentFragment *iface,
210 IXMLDOMNode** parent )
211 {
212 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
213
214 TRACE("(%p)->(%p)\n", This, parent);
215
216 return node_get_parent(&This->node, parent);
217 }
218
219 static HRESULT WINAPI domfrag_get_childNodes(
220 IXMLDOMDocumentFragment *iface,
221 IXMLDOMNodeList** outList)
222 {
223 domfrag *This = impl_from_IXMLDOMDocumentFragment( 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 domfrag_get_firstChild(
231 IXMLDOMDocumentFragment *iface,
232 IXMLDOMNode** domNode)
233 {
234 domfrag *This = impl_from_IXMLDOMDocumentFragment( 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 domfrag_get_lastChild(
242 IXMLDOMDocumentFragment *iface,
243 IXMLDOMNode** domNode)
244 {
245 domfrag *This = impl_from_IXMLDOMDocumentFragment( 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 domfrag_get_previousSibling(
253 IXMLDOMDocumentFragment *iface,
254 IXMLDOMNode** domNode)
255 {
256 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
257
258 TRACE("(%p)->(%p)\n", This, domNode);
259
260 return return_null_node(domNode);
261 }
262
263 static HRESULT WINAPI domfrag_get_nextSibling(
264 IXMLDOMDocumentFragment *iface,
265 IXMLDOMNode** domNode)
266 {
267 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
268
269 TRACE("(%p)->(%p)\n", This, domNode);
270
271 return return_null_node(domNode);
272 }
273
274 static HRESULT WINAPI domfrag_get_attributes(
275 IXMLDOMDocumentFragment *iface,
276 IXMLDOMNamedNodeMap** attributeMap)
277 {
278 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
279
280 TRACE("(%p)->(%p)\n", This, attributeMap);
281
282 return return_null_ptr((void**)attributeMap);
283 }
284
285 static HRESULT WINAPI domfrag_insertBefore(
286 IXMLDOMDocumentFragment *iface,
287 IXMLDOMNode* newNode, VARIANT refChild,
288 IXMLDOMNode** outOldNode)
289 {
290 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
291
292 TRACE("(%p)->(%p %s %p)\n", This, newNode, debugstr_variant(&refChild), outOldNode);
293
294 /* TODO: test */
295 return node_insert_before(&This->node, newNode, &refChild, outOldNode);
296 }
297
298 static HRESULT WINAPI domfrag_replaceChild(
299 IXMLDOMDocumentFragment *iface,
300 IXMLDOMNode* newNode,
301 IXMLDOMNode* oldNode,
302 IXMLDOMNode** outOldNode)
303 {
304 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
305
306 TRACE("(%p)->(%p %p %p)\n", This, newNode, oldNode, outOldNode);
307
308 /* TODO: test */
309 return node_replace_child(&This->node, newNode, oldNode, outOldNode);
310 }
311
312 static HRESULT WINAPI domfrag_removeChild(
313 IXMLDOMDocumentFragment *iface,
314 IXMLDOMNode *child, IXMLDOMNode **oldChild)
315 {
316 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
317 TRACE("(%p)->(%p %p)\n", This, child, oldChild);
318 return node_remove_child(&This->node, child, oldChild);
319 }
320
321 static HRESULT WINAPI domfrag_appendChild(
322 IXMLDOMDocumentFragment *iface,
323 IXMLDOMNode *child, IXMLDOMNode **outChild)
324 {
325 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
326 TRACE("(%p)->(%p %p)\n", This, child, outChild);
327 return node_append_child(&This->node, child, outChild);
328 }
329
330 static HRESULT WINAPI domfrag_hasChildNodes(
331 IXMLDOMDocumentFragment *iface,
332 VARIANT_BOOL *ret)
333 {
334 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
335 TRACE("(%p)->(%p)\n", This, ret);
336 return node_has_childnodes(&This->node, ret);
337 }
338
339 static HRESULT WINAPI domfrag_get_ownerDocument(
340 IXMLDOMDocumentFragment *iface,
341 IXMLDOMDocument **doc)
342 {
343 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
344 TRACE("(%p)->(%p)\n", This, doc);
345 return node_get_owner_doc(&This->node, doc);
346 }
347
348 static HRESULT WINAPI domfrag_cloneNode(
349 IXMLDOMDocumentFragment *iface,
350 VARIANT_BOOL deep, IXMLDOMNode** outNode)
351 {
352 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
353 TRACE("(%p)->(%d %p)\n", This, deep, outNode);
354 return node_clone( &This->node, deep, outNode );
355 }
356
357 static HRESULT WINAPI domfrag_get_nodeTypeString(
358 IXMLDOMDocumentFragment *iface,
359 BSTR* p)
360 {
361 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
362 static const WCHAR documentfragmentW[] = {'d','o','c','u','m','e','n','t','f','r','a','g','m','e','n','t',0};
363
364 TRACE("(%p)->(%p)\n", This, p);
365
366 return return_bstr(documentfragmentW, p);
367 }
368
369 static HRESULT WINAPI domfrag_get_text(
370 IXMLDOMDocumentFragment *iface,
371 BSTR* p)
372 {
373 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
374 TRACE("(%p)->(%p)\n", This, p);
375 return node_get_text(&This->node, p);
376 }
377
378 static HRESULT WINAPI domfrag_put_text(
379 IXMLDOMDocumentFragment *iface,
380 BSTR p)
381 {
382 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
383 TRACE("(%p)->(%s)\n", This, debugstr_w(p));
384 return node_put_text( &This->node, p );
385 }
386
387 static HRESULT WINAPI domfrag_get_specified(
388 IXMLDOMDocumentFragment *iface,
389 VARIANT_BOOL* isSpecified)
390 {
391 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
392 FIXME("(%p)->(%p) stub!\n", This, isSpecified);
393 *isSpecified = VARIANT_TRUE;
394 return S_OK;
395 }
396
397 static HRESULT WINAPI domfrag_get_definition(
398 IXMLDOMDocumentFragment *iface,
399 IXMLDOMNode** definitionNode)
400 {
401 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
402 FIXME("(%p)->(%p)\n", This, definitionNode);
403 return E_NOTIMPL;
404 }
405
406 static HRESULT WINAPI domfrag_get_nodeTypedValue(
407 IXMLDOMDocumentFragment *iface,
408 VARIANT *v)
409 {
410 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
411 TRACE("(%p)->(%p)\n", This, v);
412 return return_null_var(v);
413 }
414
415 static HRESULT WINAPI domfrag_put_nodeTypedValue(
416 IXMLDOMDocumentFragment *iface,
417 VARIANT typedValue)
418 {
419 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
420 FIXME("(%p)->(%s)\n", This, debugstr_variant(&typedValue));
421 return E_NOTIMPL;
422 }
423
424 static HRESULT WINAPI domfrag_get_dataType(
425 IXMLDOMDocumentFragment *iface,
426 VARIANT* typename)
427 {
428 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
429 TRACE("(%p)->(%p)\n", This, typename);
430 return return_null_var( typename );
431 }
432
433 static HRESULT WINAPI domfrag_put_dataType(
434 IXMLDOMDocumentFragment *iface,
435 BSTR p)
436 {
437 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
438
439 TRACE("(%p)->(%s)\n", This, debugstr_w(p));
440
441 if(!p)
442 return E_INVALIDARG;
443
444 return E_FAIL;
445 }
446
447 static HRESULT WINAPI domfrag_get_xml(
448 IXMLDOMDocumentFragment *iface,
449 BSTR* p)
450 {
451 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
452
453 TRACE("(%p)->(%p)\n", This, p);
454
455 return node_get_xml(&This->node, FALSE, p);
456 }
457
458 static HRESULT WINAPI domfrag_transformNode(
459 IXMLDOMDocumentFragment *iface,
460 IXMLDOMNode *node, BSTR *p)
461 {
462 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
463 TRACE("(%p)->(%p %p)\n", This, node, p);
464 return node_transform_node(&This->node, node, p);
465 }
466
467 static HRESULT WINAPI domfrag_selectNodes(
468 IXMLDOMDocumentFragment *iface,
469 BSTR p, IXMLDOMNodeList** outList)
470 {
471 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
472 TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outList);
473 return node_select_nodes(&This->node, p, outList);
474 }
475
476 static HRESULT WINAPI domfrag_selectSingleNode(
477 IXMLDOMDocumentFragment *iface,
478 BSTR p, IXMLDOMNode** outNode)
479 {
480 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
481 TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outNode);
482 return node_select_singlenode(&This->node, p, outNode);
483 }
484
485 static HRESULT WINAPI domfrag_get_parsed(
486 IXMLDOMDocumentFragment *iface,
487 VARIANT_BOOL* isParsed)
488 {
489 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
490 FIXME("(%p)->(%p) stub!\n", This, isParsed);
491 *isParsed = VARIANT_TRUE;
492 return S_OK;
493 }
494
495 static HRESULT WINAPI domfrag_get_namespaceURI(
496 IXMLDOMDocumentFragment *iface,
497 BSTR* p)
498 {
499 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
500 TRACE("(%p)->(%p)\n", This, p);
501 return node_get_namespaceURI(&This->node, p);
502 }
503
504 static HRESULT WINAPI domfrag_get_prefix(
505 IXMLDOMDocumentFragment *iface,
506 BSTR* prefix)
507 {
508 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
509 TRACE("(%p)->(%p)\n", This, prefix);
510 return return_null_bstr( prefix );
511 }
512
513 static HRESULT WINAPI domfrag_get_baseName(
514 IXMLDOMDocumentFragment *iface,
515 BSTR* name)
516 {
517 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
518 FIXME("(%p)->(%p): needs test\n", This, name);
519 return return_null_bstr( name );
520 }
521
522 static HRESULT WINAPI domfrag_transformNodeToObject(
523 IXMLDOMDocumentFragment *iface,
524 IXMLDOMNode* domNode, VARIANT var1)
525 {
526 domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
527 FIXME("(%p)->(%p %s)\n", This, domNode, debugstr_variant(&var1));
528 return E_NOTIMPL;
529 }
530
531 static const struct IXMLDOMDocumentFragmentVtbl domfrag_vtbl =
532 {
533 domfrag_QueryInterface,
534 domfrag_AddRef,
535 domfrag_Release,
536 domfrag_GetTypeInfoCount,
537 domfrag_GetTypeInfo,
538 domfrag_GetIDsOfNames,
539 domfrag_Invoke,
540 domfrag_get_nodeName,
541 domfrag_get_nodeValue,
542 domfrag_put_nodeValue,
543 domfrag_get_nodeType,
544 domfrag_get_parentNode,
545 domfrag_get_childNodes,
546 domfrag_get_firstChild,
547 domfrag_get_lastChild,
548 domfrag_get_previousSibling,
549 domfrag_get_nextSibling,
550 domfrag_get_attributes,
551 domfrag_insertBefore,
552 domfrag_replaceChild,
553 domfrag_removeChild,
554 domfrag_appendChild,
555 domfrag_hasChildNodes,
556 domfrag_get_ownerDocument,
557 domfrag_cloneNode,
558 domfrag_get_nodeTypeString,
559 domfrag_get_text,
560 domfrag_put_text,
561 domfrag_get_specified,
562 domfrag_get_definition,
563 domfrag_get_nodeTypedValue,
564 domfrag_put_nodeTypedValue,
565 domfrag_get_dataType,
566 domfrag_put_dataType,
567 domfrag_get_xml,
568 domfrag_transformNode,
569 domfrag_selectNodes,
570 domfrag_selectSingleNode,
571 domfrag_get_parsed,
572 domfrag_get_namespaceURI,
573 domfrag_get_prefix,
574 domfrag_get_baseName,
575 domfrag_transformNodeToObject
576 };
577
578 static const tid_t domfrag_iface_tids[] = {
579 IXMLDOMDocumentFragment_tid,
580 0
581 };
582
583 static dispex_static_data_t domfrag_dispex = {
584 NULL,
585 IXMLDOMDocumentFragment_tid,
586 NULL,
587 domfrag_iface_tids
588 };
589
590 IUnknown* create_doc_fragment( xmlNodePtr fragment )
591 {
592 domfrag *This;
593
594 This = heap_alloc( sizeof *This );
595 if ( !This )
596 return NULL;
597
598 This->IXMLDOMDocumentFragment_iface.lpVtbl = &domfrag_vtbl;
599 This->ref = 1;
600
601 init_xmlnode(&This->node, fragment, (IXMLDOMNode*)&This->IXMLDOMDocumentFragment_iface, &domfrag_dispex);
602
603 return (IUnknown*)&This->IXMLDOMDocumentFragment_iface;
604 }
605
606 #endif