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