server: Invoke low-level hardware hooks directly from the server side.
[wine] / dlls / msxml3 / doctype.c
1 /*
2  *    DOM DTD node implementation
3  *
4  * Copyright 2010 Nikolay Sivov
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 "winnls.h"
35 #include "ole2.h"
36 #include "msxml6.h"
37
38 #include "msxml_private.h"
39
40 #include "wine/debug.h"
41
42 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
43
44 #ifdef HAVE_LIBXML2
45
46 typedef struct _domdoctype
47 {
48     xmlnode node;
49     IXMLDOMDocumentType IXMLDOMDocumentType_iface;
50     LONG ref;
51 } domdoctype;
52
53 static inline domdoctype *impl_from_IXMLDOMDocumentType( IXMLDOMDocumentType *iface )
54 {
55     return CONTAINING_RECORD(iface, domdoctype, IXMLDOMDocumentType_iface);
56 }
57
58 static HRESULT WINAPI domdoctype_QueryInterface(
59     IXMLDOMDocumentType *iface,
60     REFIID riid,
61     void** ppvObject )
62 {
63     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
64
65     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
66
67     if ( IsEqualGUID( riid, &IID_IXMLDOMDocumentType ) ||
68          IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
69          IsEqualGUID( riid, &IID_IDispatch ) ||
70          IsEqualGUID( riid, &IID_IUnknown ) )
71     {
72         *ppvObject = &This->IXMLDOMDocumentType_iface;
73     }
74     else if(node_query_interface(&This->node, riid, ppvObject))
75     {
76         return *ppvObject ? S_OK : E_NOINTERFACE;
77     }
78     else
79     {
80         FIXME("interface %s not implemented\n", debugstr_guid(riid));
81         *ppvObject = NULL;
82         return E_NOINTERFACE;
83     }
84
85     IUnknown_AddRef( (IUnknown*)*ppvObject );
86     return S_OK;
87 }
88
89 static ULONG WINAPI domdoctype_AddRef(
90     IXMLDOMDocumentType *iface )
91 {
92     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
93     LONG ref = InterlockedIncrement(&This->ref);
94
95     TRACE("(%p) ref=%d\n", This, ref);
96
97     return ref;
98 }
99
100 static ULONG WINAPI domdoctype_Release(
101     IXMLDOMDocumentType *iface )
102 {
103     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
104     ULONG ref = InterlockedDecrement(&This->ref);
105
106     TRACE("(%p) ref=%d\n", This, ref);
107
108     if(!ref) {
109         destroy_xmlnode(&This->node);
110         heap_free(This);
111     }
112
113     return ref;
114 }
115
116 static HRESULT WINAPI domdoctype_GetTypeInfoCount(
117     IXMLDOMDocumentType *iface,
118     UINT* pctinfo )
119 {
120     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
121
122     TRACE("(%p)->(%p)\n", This, pctinfo);
123
124     *pctinfo = 1;
125
126     return S_OK;
127 }
128
129 static HRESULT WINAPI domdoctype_GetTypeInfo(
130     IXMLDOMDocumentType *iface,
131     UINT iTInfo, LCID lcid,
132     ITypeInfo** ppTInfo )
133 {
134     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
135     HRESULT hr;
136
137     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
138
139     hr = get_typeinfo(IXMLDOMDocumentType_tid, ppTInfo);
140
141     return hr;
142 }
143
144 static HRESULT WINAPI domdoctype_GetIDsOfNames(
145     IXMLDOMDocumentType *iface,
146     REFIID riid, LPOLESTR* rgszNames,
147     UINT cNames, LCID lcid, DISPID* rgDispId )
148 {
149     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
150     ITypeInfo *typeinfo;
151     HRESULT hr;
152
153     TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
154           lcid, rgDispId);
155
156     if(!rgszNames || cNames == 0 || !rgDispId)
157         return E_INVALIDARG;
158
159     hr = get_typeinfo(IXMLDOMDocumentType_tid, &typeinfo);
160     if(SUCCEEDED(hr))
161     {
162         hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
163         ITypeInfo_Release(typeinfo);
164     }
165
166     return hr;
167 }
168
169 static HRESULT WINAPI domdoctype_Invoke(
170     IXMLDOMDocumentType *iface,
171     DISPID dispIdMember, REFIID riid, LCID lcid,
172     WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
173     EXCEPINFO* pExcepInfo, UINT* puArgErr )
174 {
175     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
176     ITypeInfo *typeinfo;
177     HRESULT hr;
178
179     TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
180           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
181
182     hr = get_typeinfo(IXMLDOMDocumentType_tid, &typeinfo);
183     if(SUCCEEDED(hr))
184     {
185         hr = ITypeInfo_Invoke(typeinfo, &This->IXMLDOMDocumentType_iface, dispIdMember, wFlags,
186                 pDispParams, pVarResult, pExcepInfo, puArgErr);
187         ITypeInfo_Release(typeinfo);
188     }
189
190     return hr;
191 }
192
193 static HRESULT WINAPI domdoctype_get_nodeName(
194     IXMLDOMDocumentType *iface,
195     BSTR* p )
196 {
197     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
198     FIXME("(%p)->(%p): stub\n", This, p);
199     return E_NOTIMPL;
200 }
201
202 static HRESULT WINAPI domdoctype_get_nodeValue(
203     IXMLDOMDocumentType *iface,
204     VARIANT* value)
205 {
206     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
207     FIXME("(%p)->(%p): stub\n", This, value);
208     return E_NOTIMPL;
209 }
210
211 static HRESULT WINAPI domdoctype_put_nodeValue(
212     IXMLDOMDocumentType *iface,
213     VARIANT value)
214 {
215     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
216     FIXME("(%p)->(%s): stub\n", This, debugstr_variant(&value));
217     return E_NOTIMPL;
218 }
219
220 static HRESULT WINAPI domdoctype_get_nodeType(
221     IXMLDOMDocumentType *iface,
222     DOMNodeType* domNodeType )
223 {
224     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
225
226     TRACE("(%p)->(%p)\n", This, domNodeType);
227
228     *domNodeType = NODE_DOCUMENT_TYPE;
229     return S_OK;
230 }
231
232 static HRESULT WINAPI domdoctype_get_parentNode(
233     IXMLDOMDocumentType *iface,
234     IXMLDOMNode** parent )
235 {
236     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
237     FIXME("(%p)->(%p): stub\n", This, parent);
238     return E_NOTIMPL;
239 }
240
241 static HRESULT WINAPI domdoctype_get_childNodes(
242     IXMLDOMDocumentType *iface,
243     IXMLDOMNodeList** outList)
244 {
245     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
246     FIXME("(%p)->(%p): stub\n", This, outList);
247     return E_NOTIMPL;
248 }
249
250 static HRESULT WINAPI domdoctype_get_firstChild(
251     IXMLDOMDocumentType *iface,
252     IXMLDOMNode** domNode)
253 {
254     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
255     FIXME("(%p)->(%p): stub\n", This, domNode);
256     return E_NOTIMPL;
257 }
258
259 static HRESULT WINAPI domdoctype_get_lastChild(
260     IXMLDOMDocumentType *iface,
261     IXMLDOMNode** domNode)
262 {
263     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
264     FIXME("(%p)->(%p): stub\n", This, domNode);
265     return E_NOTIMPL;
266 }
267
268 static HRESULT WINAPI domdoctype_get_previousSibling(
269     IXMLDOMDocumentType *iface,
270     IXMLDOMNode** domNode)
271 {
272     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
273     FIXME("(%p)->(%p): stub\n", This, domNode);
274     return E_NOTIMPL;
275 }
276
277 static HRESULT WINAPI domdoctype_get_nextSibling(
278     IXMLDOMDocumentType *iface,
279     IXMLDOMNode** domNode)
280 {
281     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
282     FIXME("(%p)->(%p): stub\n", This, domNode);
283     return E_NOTIMPL;
284 }
285
286 static HRESULT WINAPI domdoctype_get_attributes(
287     IXMLDOMDocumentType *iface,
288     IXMLDOMNamedNodeMap** attributeMap)
289 {
290     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
291     FIXME("(%p)->(%p): stub\n", This, attributeMap);
292     return E_NOTIMPL;
293 }
294
295 static HRESULT WINAPI domdoctype_insertBefore(
296     IXMLDOMDocumentType *iface,
297     IXMLDOMNode* newNode, VARIANT refChild,
298     IXMLDOMNode** outOldNode)
299 {
300     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
301
302     FIXME("(%p)->(%p %s %p): stub\n", This, newNode, debugstr_variant(&refChild), outOldNode);
303
304     return E_NOTIMPL;
305 }
306
307 static HRESULT WINAPI domdoctype_replaceChild(
308     IXMLDOMDocumentType *iface,
309     IXMLDOMNode* newNode,
310     IXMLDOMNode* oldNode,
311     IXMLDOMNode** outOldNode)
312 {
313     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
314
315     FIXME("(%p)->(%p %p %p): stub\n", This, newNode, oldNode, outOldNode);
316
317     return E_NOTIMPL;
318 }
319
320 static HRESULT WINAPI domdoctype_removeChild(
321     IXMLDOMDocumentType *iface,
322     IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
323 {
324     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
325     FIXME("(%p)->(%p %p): stub\n", This, domNode, oldNode);
326     return E_NOTIMPL;
327 }
328
329 static HRESULT WINAPI domdoctype_appendChild(
330     IXMLDOMDocumentType *iface,
331     IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
332 {
333     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
334     FIXME("(%p)->(%p %p): stub\n", This, newNode, outNewNode);
335     return E_NOTIMPL;
336 }
337
338 static HRESULT WINAPI domdoctype_hasChildNodes(
339     IXMLDOMDocumentType *iface,
340     VARIANT_BOOL* pbool)
341 {
342     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
343     FIXME("(%p)->(%p): stub\n", This, pbool);
344     return E_NOTIMPL;
345 }
346
347 static HRESULT WINAPI domdoctype_get_ownerDocument(
348     IXMLDOMDocumentType *iface,
349     IXMLDOMDocument** domDocument)
350 {
351     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
352     FIXME("(%p)->(%p): stub\n", This, domDocument);
353     return E_NOTIMPL;
354 }
355
356 static HRESULT WINAPI domdoctype_cloneNode(
357     IXMLDOMDocumentType *iface,
358     VARIANT_BOOL deep, IXMLDOMNode** outNode)
359 {
360     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
361     FIXME("(%p)->(%d %p): stub\n", This, deep, outNode);
362     return E_NOTIMPL;
363 }
364
365 static HRESULT WINAPI domdoctype_get_nodeTypeString(
366     IXMLDOMDocumentType *iface,
367     BSTR* p)
368 {
369     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
370     FIXME("(%p)->(%p): stub\n", This, p);
371     return E_NOTIMPL;
372 }
373
374 static HRESULT WINAPI domdoctype_get_text(
375     IXMLDOMDocumentType *iface,
376     BSTR* p)
377 {
378     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
379     FIXME("(%p)->(%p): stub\n", This, p);
380     return E_NOTIMPL;
381 }
382
383 static HRESULT WINAPI domdoctype_put_text(
384     IXMLDOMDocumentType *iface,
385     BSTR p)
386 {
387     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
388     FIXME("(%p)->(%s): stub\n", This, debugstr_w(p));
389     return E_NOTIMPL;
390 }
391
392 static HRESULT WINAPI domdoctype_get_specified(
393     IXMLDOMDocumentType *iface,
394     VARIANT_BOOL* isSpecified)
395 {
396     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
397     FIXME("(%p)->(%p): stub\n", This, isSpecified);
398     return E_NOTIMPL;
399 }
400
401 static HRESULT WINAPI domdoctype_get_definition(
402     IXMLDOMDocumentType *iface,
403     IXMLDOMNode** definitionNode)
404 {
405     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
406     FIXME("(%p)->(%p)\n", This, definitionNode);
407     return E_NOTIMPL;
408 }
409
410 static HRESULT WINAPI domdoctype_get_nodeTypedValue(
411     IXMLDOMDocumentType *iface,
412     VARIANT* var1)
413 {
414     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
415     FIXME("(%p)->(%p): stub\n", This, var1);
416     return E_NOTIMPL;
417 }
418
419 static HRESULT WINAPI domdoctype_put_nodeTypedValue(
420     IXMLDOMDocumentType *iface,
421     VARIANT value)
422 {
423     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
424     FIXME("(%p)->(%s): stub\n", This, debugstr_variant(&value));
425     return E_NOTIMPL;
426 }
427
428 static HRESULT WINAPI domdoctype_get_dataType(
429     IXMLDOMDocumentType *iface,
430     VARIANT* typename)
431 {
432     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
433     FIXME("(%p)->(%p): stub\n", This, typename);
434     return E_NOTIMPL;
435 }
436
437 static HRESULT WINAPI domdoctype_put_dataType(
438     IXMLDOMDocumentType *iface,
439     BSTR p)
440 {
441     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
442     FIXME("(%p)->(%s): stub\n", This, debugstr_w(p));
443     return E_NOTIMPL;
444 }
445
446 static HRESULT WINAPI domdoctype_get_xml(
447     IXMLDOMDocumentType *iface,
448     BSTR* p)
449 {
450     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
451     FIXME("(%p)->(%p): stub\n", This, p);
452     return E_NOTIMPL;
453 }
454
455 static HRESULT WINAPI domdoctype_transformNode(
456     IXMLDOMDocumentType *iface,
457     IXMLDOMNode* domNode, BSTR* p)
458 {
459     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
460     FIXME("(%p)->(%p %p): stub\n", This, domNode, p);
461     return E_NOTIMPL;
462 }
463
464 static HRESULT WINAPI domdoctype_selectNodes(
465     IXMLDOMDocumentType *iface,
466     BSTR p, IXMLDOMNodeList** outList)
467 {
468     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
469     FIXME("(%p)->(%s %p): stub\n", This, debugstr_w(p), outList);
470     return E_NOTIMPL;
471 }
472
473 static HRESULT WINAPI domdoctype_selectSingleNode(
474     IXMLDOMDocumentType *iface,
475     BSTR p, IXMLDOMNode** outNode)
476 {
477     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
478     FIXME("(%p)->(%s %p): stub\n", This, debugstr_w(p), outNode);
479     return E_NOTIMPL;
480 }
481
482 static HRESULT WINAPI domdoctype_get_parsed(
483     IXMLDOMDocumentType *iface,
484     VARIANT_BOOL* isParsed)
485 {
486     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
487     FIXME("(%p)->(%p): stub\n", This, isParsed);
488     return E_NOTIMPL;
489 }
490
491 static HRESULT WINAPI domdoctype_get_namespaceURI(
492     IXMLDOMDocumentType *iface,
493     BSTR* p)
494 {
495     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
496     FIXME("(%p)->(%p): stub\n", This, p);
497     return E_NOTIMPL;
498 }
499
500 static HRESULT WINAPI domdoctype_get_prefix(
501     IXMLDOMDocumentType *iface,
502     BSTR* prefix)
503 {
504     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
505     FIXME("(%p)->(%p): stub\n", This, prefix);
506     return E_NOTIMPL;
507 }
508
509 static HRESULT WINAPI domdoctype_get_baseName(
510     IXMLDOMDocumentType *iface,
511     BSTR* name)
512 {
513     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
514     FIXME("(%p)->(%p): stub\n", This, name);
515     return E_NOTIMPL;
516 }
517
518 static HRESULT WINAPI domdoctype_transformNodeToObject(
519     IXMLDOMDocumentType *iface,
520     IXMLDOMNode* domNode, VARIANT var1)
521 {
522     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
523     FIXME("(%p)->(%p %s): stub\n", This, domNode, debugstr_variant(&var1));
524     return E_NOTIMPL;
525 }
526
527 static HRESULT WINAPI domdoctype_get_name(
528     IXMLDOMDocumentType *iface,
529     BSTR *p)
530 {
531     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
532     FIXME("(%p)->(%p): stub\n", This, p);
533     return E_NOTIMPL;
534 }
535
536 static HRESULT WINAPI domdoctype_get_entities(
537     IXMLDOMDocumentType *iface,
538     IXMLDOMNamedNodeMap **entityMap)
539 {
540     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
541     FIXME("(%p)->(%p): stub\n", This, entityMap);
542     return E_NOTIMPL;
543 }
544
545 static HRESULT WINAPI domdoctype_get_notations(
546     IXMLDOMDocumentType *iface,
547     IXMLDOMNamedNodeMap **notationMap)
548 {
549     domdoctype *This = impl_from_IXMLDOMDocumentType( iface );
550     FIXME("(%p)->(%p): stub\n", This, notationMap);
551     return E_NOTIMPL;
552 }
553
554 static const struct IXMLDOMDocumentTypeVtbl domdoctype_vtbl =
555 {
556     domdoctype_QueryInterface,
557     domdoctype_AddRef,
558     domdoctype_Release,
559     domdoctype_GetTypeInfoCount,
560     domdoctype_GetTypeInfo,
561     domdoctype_GetIDsOfNames,
562     domdoctype_Invoke,
563     domdoctype_get_nodeName,
564     domdoctype_get_nodeValue,
565     domdoctype_put_nodeValue,
566     domdoctype_get_nodeType,
567     domdoctype_get_parentNode,
568     domdoctype_get_childNodes,
569     domdoctype_get_firstChild,
570     domdoctype_get_lastChild,
571     domdoctype_get_previousSibling,
572     domdoctype_get_nextSibling,
573     domdoctype_get_attributes,
574     domdoctype_insertBefore,
575     domdoctype_replaceChild,
576     domdoctype_removeChild,
577     domdoctype_appendChild,
578     domdoctype_hasChildNodes,
579     domdoctype_get_ownerDocument,
580     domdoctype_cloneNode,
581     domdoctype_get_nodeTypeString,
582     domdoctype_get_text,
583     domdoctype_put_text,
584     domdoctype_get_specified,
585     domdoctype_get_definition,
586     domdoctype_get_nodeTypedValue,
587     domdoctype_put_nodeTypedValue,
588     domdoctype_get_dataType,
589     domdoctype_put_dataType,
590     domdoctype_get_xml,
591     domdoctype_transformNode,
592     domdoctype_selectNodes,
593     domdoctype_selectSingleNode,
594     domdoctype_get_parsed,
595     domdoctype_get_namespaceURI,
596     domdoctype_get_prefix,
597     domdoctype_get_baseName,
598     domdoctype_transformNodeToObject,
599     domdoctype_get_name,
600     domdoctype_get_entities,
601     domdoctype_get_notations
602 };
603
604 static const tid_t domdoctype_iface_tids[] = {
605     IXMLDOMDocumentType_tid,
606     0
607 };
608
609 static dispex_static_data_t domdoctype_dispex = {
610     NULL,
611     IXMLDOMDocumentType_tid,
612     NULL,
613     domdoctype_iface_tids
614 };
615
616 IUnknown* create_doc_type( xmlNodePtr doctype )
617 {
618     domdoctype *This;
619
620     This = heap_alloc( sizeof *This );
621     if ( !This )
622         return NULL;
623
624     This->IXMLDOMDocumentType_iface.lpVtbl = &domdoctype_vtbl;
625     This->ref = 1;
626
627     init_xmlnode(&This->node, doctype, (IXMLDOMNode*)&This->IXMLDOMDocumentType_iface,
628             &domdoctype_dispex);
629
630     return (IUnknown*)&This->IXMLDOMDocumentType_iface;
631 }
632
633 #endif