msxml3: Remove transformNode() forward.
[wine] / dlls / msxml3 / pi.c
1 /*
2  *    DOM processing instruction node implementation
3  *
4  * Copyright 2006 Huw Davies
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 _dom_pi
46 {
47     xmlnode node;
48     IXMLDOMProcessingInstruction IXMLDOMProcessingInstruction_iface;
49     LONG ref;
50 } dom_pi;
51
52 static inline dom_pi *impl_from_IXMLDOMProcessingInstruction( IXMLDOMProcessingInstruction *iface )
53 {
54     return CONTAINING_RECORD(iface, dom_pi, IXMLDOMProcessingInstruction_iface);
55 }
56
57 static HRESULT WINAPI dom_pi_QueryInterface(
58     IXMLDOMProcessingInstruction *iface,
59     REFIID riid,
60     void** ppvObject )
61 {
62     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
63     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
64
65     if ( IsEqualGUID( riid, &IID_IXMLDOMProcessingInstruction ) ||
66          IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
67          IsEqualGUID( riid, &IID_IDispatch ) ||
68          IsEqualGUID( riid, &IID_IUnknown ) )
69     {
70         *ppvObject = iface;
71     }
72     else if(node_query_interface(&This->node, riid, ppvObject))
73     {
74         return *ppvObject ? S_OK : E_NOINTERFACE;
75     }
76     else
77     {
78         FIXME("Unsupported interface %s\n", debugstr_guid(riid));
79         return E_NOINTERFACE;
80     }
81
82     IUnknown_AddRef((IUnknown*)*ppvObject);
83     return S_OK;
84 }
85
86 static ULONG WINAPI dom_pi_AddRef(
87     IXMLDOMProcessingInstruction *iface )
88 {
89     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
90     return InterlockedIncrement( &This->ref );
91 }
92
93 static ULONG WINAPI dom_pi_Release(
94     IXMLDOMProcessingInstruction *iface )
95 {
96     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
97     ULONG ref;
98
99     ref = InterlockedDecrement( &This->ref );
100     if ( ref == 0 )
101     {
102         destroy_xmlnode(&This->node);
103         heap_free( This );
104     }
105
106     return ref;
107 }
108
109 static HRESULT WINAPI dom_pi_GetTypeInfoCount(
110     IXMLDOMProcessingInstruction *iface,
111     UINT* pctinfo )
112 {
113     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
114
115     TRACE("(%p)->(%p)\n", This, pctinfo);
116
117     *pctinfo = 1;
118
119     return S_OK;
120 }
121
122 static HRESULT WINAPI dom_pi_GetTypeInfo(
123     IXMLDOMProcessingInstruction *iface,
124     UINT iTInfo, LCID lcid,
125     ITypeInfo** ppTInfo )
126 {
127     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
128     HRESULT hr;
129
130     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
131
132     hr = get_typeinfo(IXMLDOMProcessingInstruction_tid, ppTInfo);
133
134     return hr;
135 }
136
137 static HRESULT WINAPI dom_pi_GetIDsOfNames(
138     IXMLDOMProcessingInstruction *iface,
139     REFIID riid, LPOLESTR* rgszNames,
140     UINT cNames, LCID lcid, DISPID* rgDispId )
141 {
142     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
143     ITypeInfo *typeinfo;
144     HRESULT hr;
145
146     TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
147           lcid, rgDispId);
148
149     if(!rgszNames || cNames == 0 || !rgDispId)
150         return E_INVALIDARG;
151
152     hr = get_typeinfo(IXMLDOMProcessingInstruction_tid, &typeinfo);
153     if(SUCCEEDED(hr))
154     {
155         hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
156         ITypeInfo_Release(typeinfo);
157     }
158
159     return hr;
160 }
161
162 static HRESULT WINAPI dom_pi_Invoke(
163     IXMLDOMProcessingInstruction *iface,
164     DISPID dispIdMember, REFIID riid, LCID lcid,
165     WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
166     EXCEPINFO* pExcepInfo, UINT* puArgErr )
167 {
168     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
169     ITypeInfo *typeinfo;
170     HRESULT hr;
171
172     TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
173           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
174
175     hr = get_typeinfo(IXMLDOMProcessingInstruction_tid, &typeinfo);
176     if(SUCCEEDED(hr))
177     {
178        hr = ITypeInfo_Invoke(typeinfo, &This->IXMLDOMProcessingInstruction_iface, dispIdMember,
179                 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
180         ITypeInfo_Release(typeinfo);
181     }
182
183     return hr;
184 }
185
186 static HRESULT WINAPI dom_pi_get_nodeName(
187     IXMLDOMProcessingInstruction *iface,
188     BSTR* p )
189 {
190     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
191
192     TRACE("(%p)->(%p)\n", This, p);
193
194     return node_get_nodeName(&This->node, p);
195 }
196
197 static HRESULT WINAPI dom_pi_get_nodeValue(
198     IXMLDOMProcessingInstruction *iface,
199     VARIANT* value)
200 {
201     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
202
203     TRACE("(%p)->(%p)\n", This, value);
204
205     return node_get_content(&This->node, value);
206 }
207
208 static HRESULT WINAPI dom_pi_put_nodeValue(
209     IXMLDOMProcessingInstruction *iface,
210     VARIANT value)
211 {
212     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
213     BSTR sTarget;
214     HRESULT hr;
215
216     TRACE("(%p)->(%s)\n", This, debugstr_variant(&value));
217
218     /* Cannot set data to a PI node whose target is 'xml' */
219     hr = dom_pi_get_nodeName(iface, &sTarget);
220     if(hr == S_OK)
221     {
222         static const WCHAR xmlW[] = {'x','m','l',0};
223         if(lstrcmpW( sTarget, xmlW) == 0)
224         {
225             SysFreeString(sTarget);
226             return E_FAIL;
227         }
228
229         SysFreeString(sTarget);
230     }
231
232     return node_put_value(&This->node, &value);
233 }
234
235 static HRESULT WINAPI dom_pi_get_nodeType(
236     IXMLDOMProcessingInstruction *iface,
237     DOMNodeType* domNodeType )
238 {
239     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
240
241     TRACE("(%p)->(%p)\n", This, domNodeType);
242
243     *domNodeType = NODE_PROCESSING_INSTRUCTION;
244     return S_OK;
245 }
246
247 static HRESULT WINAPI dom_pi_get_parentNode(
248     IXMLDOMProcessingInstruction *iface,
249     IXMLDOMNode** parent )
250 {
251     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
252
253     TRACE("(%p)->(%p)\n", This, parent);
254
255     return node_get_parent(&This->node, parent);
256 }
257
258 static HRESULT WINAPI dom_pi_get_childNodes(
259     IXMLDOMProcessingInstruction *iface,
260     IXMLDOMNodeList** outList)
261 {
262     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
263
264     TRACE("(%p)->(%p)\n", This, outList);
265
266     return node_get_child_nodes(&This->node, outList);
267 }
268
269 static HRESULT WINAPI dom_pi_get_firstChild(
270     IXMLDOMProcessingInstruction *iface,
271     IXMLDOMNode** domNode)
272 {
273     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
274
275     TRACE("(%p)->(%p)\n", This, domNode);
276
277     return return_null_node(domNode);
278 }
279
280 static HRESULT WINAPI dom_pi_get_lastChild(
281     IXMLDOMProcessingInstruction *iface,
282     IXMLDOMNode** domNode)
283 {
284     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
285
286     TRACE("(%p)->(%p)\n", This, domNode);
287
288     return return_null_node(domNode);
289 }
290
291 static HRESULT WINAPI dom_pi_get_previousSibling(
292     IXMLDOMProcessingInstruction *iface,
293     IXMLDOMNode** domNode)
294 {
295     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
296
297     TRACE("(%p)->(%p)\n", This, domNode);
298
299     return node_get_previous_sibling(&This->node, domNode);
300 }
301
302 static HRESULT WINAPI dom_pi_get_nextSibling(
303     IXMLDOMProcessingInstruction *iface,
304     IXMLDOMNode** domNode)
305 {
306     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
307
308     TRACE("(%p)->(%p)\n", This, domNode);
309
310     return node_get_next_sibling(&This->node, domNode);
311 }
312
313 static HRESULT WINAPI dom_pi_get_attributes(
314     IXMLDOMProcessingInstruction *iface,
315     IXMLDOMNamedNodeMap** attributeMap)
316 {
317     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
318
319     TRACE("(%p)->(%p)\n", This, attributeMap);
320
321     *attributeMap = create_nodemap((IXMLDOMNode*)&This->IXMLDOMProcessingInstruction_iface);
322     return S_OK;
323 }
324
325 static HRESULT WINAPI dom_pi_insertBefore(
326     IXMLDOMProcessingInstruction *iface,
327     IXMLDOMNode* newNode, VARIANT refChild,
328     IXMLDOMNode** outOldNode)
329 {
330     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
331
332     FIXME("(%p)->(%p %s %p) needs test\n", This, newNode, debugstr_variant(&refChild), outOldNode);
333
334     return node_insert_before(&This->node, newNode, &refChild, outOldNode);
335 }
336
337 static HRESULT WINAPI dom_pi_replaceChild(
338     IXMLDOMProcessingInstruction *iface,
339     IXMLDOMNode* newNode,
340     IXMLDOMNode* oldNode,
341     IXMLDOMNode** outOldNode)
342 {
343     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
344
345     FIXME("(%p)->(%p %p %p) needs test\n", This, newNode, oldNode, outOldNode);
346
347     return node_replace_child(&This->node, newNode, oldNode, outOldNode);
348 }
349
350 static HRESULT WINAPI dom_pi_removeChild(
351     IXMLDOMProcessingInstruction *iface,
352     IXMLDOMNode *child, IXMLDOMNode **oldChild)
353 {
354     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
355     TRACE("(%p)->(%p %p)\n", This, child, oldChild);
356     return node_remove_child(&This->node, child, oldChild);
357 }
358
359 static HRESULT WINAPI dom_pi_appendChild(
360     IXMLDOMProcessingInstruction *iface,
361     IXMLDOMNode *child, IXMLDOMNode **outChild)
362 {
363     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
364     TRACE("(%p)->(%p %p)\n", This, child, outChild);
365     return node_append_child(&This->node, child, outChild);
366 }
367
368 static HRESULT WINAPI dom_pi_hasChildNodes(
369     IXMLDOMProcessingInstruction *iface,
370     VARIANT_BOOL *ret)
371 {
372     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
373     TRACE("(%p)->(%p)\n", This, ret);
374     return node_has_childnodes(&This->node, ret);
375 }
376
377 static HRESULT WINAPI dom_pi_get_ownerDocument(
378     IXMLDOMProcessingInstruction *iface,
379     IXMLDOMDocument **doc)
380 {
381     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
382     TRACE("(%p)->(%p)\n", This, doc);
383     return node_get_owner_doc(&This->node, doc);
384 }
385
386 static HRESULT WINAPI dom_pi_cloneNode(
387     IXMLDOMProcessingInstruction *iface,
388     VARIANT_BOOL deep, IXMLDOMNode** outNode)
389 {
390     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
391     TRACE("(%p)->(%d %p)\n", This, deep, outNode);
392     return node_clone( &This->node, deep, outNode );
393 }
394
395 static HRESULT WINAPI dom_pi_get_nodeTypeString(
396     IXMLDOMProcessingInstruction *iface,
397     BSTR* p)
398 {
399     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
400     static const WCHAR processinginstructionW[] =
401         {'p','r','o','c','e','s','s','i','n','g','i','n','s','t','r','u','c','t','i','o','n',0};
402
403     TRACE("(%p)->(%p)\n", This, p);
404
405     return return_bstr(processinginstructionW, p);
406 }
407
408 static HRESULT WINAPI dom_pi_get_text(
409     IXMLDOMProcessingInstruction *iface,
410     BSTR* p)
411 {
412     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
413     TRACE("(%p)->(%p)\n", This, p);
414     return node_get_text(&This->node, p);
415 }
416
417 static HRESULT WINAPI dom_pi_put_text(
418     IXMLDOMProcessingInstruction *iface,
419     BSTR p)
420 {
421     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
422     TRACE("(%p)->(%s)\n", This, debugstr_w(p));
423     return node_put_text( &This->node, p );
424 }
425
426 static HRESULT WINAPI dom_pi_get_specified(
427     IXMLDOMProcessingInstruction *iface,
428     VARIANT_BOOL* isSpecified)
429 {
430     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
431     FIXME("(%p)->(%p) stub!\n", This, isSpecified);
432     *isSpecified = VARIANT_TRUE;
433     return S_OK;
434 }
435
436 static HRESULT WINAPI dom_pi_get_definition(
437     IXMLDOMProcessingInstruction *iface,
438     IXMLDOMNode** definitionNode)
439 {
440     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
441     FIXME("(%p)->(%p)\n", This, definitionNode);
442     return E_NOTIMPL;
443 }
444
445 static HRESULT WINAPI dom_pi_get_nodeTypedValue(
446     IXMLDOMProcessingInstruction *iface,
447     VARIANT* var1)
448 {
449     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
450     FIXME("(%p)->(%p)\n", This, var1);
451     return return_null_var(var1);
452 }
453
454 static HRESULT WINAPI dom_pi_put_nodeTypedValue(
455     IXMLDOMProcessingInstruction *iface,
456     VARIANT typedValue)
457 {
458     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
459     FIXME("(%p)->(%s)\n", This, debugstr_variant(&typedValue));
460     return E_NOTIMPL;
461 }
462
463 static HRESULT WINAPI dom_pi_get_dataType(
464     IXMLDOMProcessingInstruction *iface,
465     VARIANT* typename)
466 {
467     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
468     TRACE("(%p)->(%p)\n", This, typename);
469     return return_null_var( typename );
470 }
471
472 static HRESULT WINAPI dom_pi_put_dataType(
473     IXMLDOMProcessingInstruction *iface,
474     BSTR p)
475 {
476     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
477
478     FIXME("(%p)->(%s)\n", This, debugstr_w(p));
479
480     if(!p)
481         return E_INVALIDARG;
482
483     return E_FAIL;
484 }
485
486 static HRESULT WINAPI dom_pi_get_xml(
487     IXMLDOMProcessingInstruction *iface,
488     BSTR* p)
489 {
490     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
491
492     TRACE("(%p)->(%p)\n", This, p);
493
494     return node_get_xml(&This->node, FALSE, FALSE, p);
495 }
496
497 static HRESULT WINAPI dom_pi_transformNode(
498     IXMLDOMProcessingInstruction *iface,
499     IXMLDOMNode *node, BSTR *p)
500 {
501     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
502     TRACE("(%p)->(%p %p)\n", This, node, p);
503     return node_transform_node(&This->node, node, p);
504 }
505
506 static HRESULT WINAPI dom_pi_selectNodes(
507     IXMLDOMProcessingInstruction *iface,
508     BSTR p, IXMLDOMNodeList** outList)
509 {
510     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
511     TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outList);
512     return node_select_nodes(&This->node, p, outList);
513 }
514
515 static HRESULT WINAPI dom_pi_selectSingleNode(
516     IXMLDOMProcessingInstruction *iface,
517     BSTR p, IXMLDOMNode** outNode)
518 {
519     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
520     TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outNode);
521     return node_select_singlenode(&This->node, p, outNode);
522 }
523
524 static HRESULT WINAPI dom_pi_get_parsed(
525     IXMLDOMProcessingInstruction *iface,
526     VARIANT_BOOL* isParsed)
527 {
528     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
529     FIXME("(%p)->(%p) stub!\n", This, isParsed);
530     *isParsed = VARIANT_TRUE;
531     return S_OK;
532 }
533
534 static HRESULT WINAPI dom_pi_get_namespaceURI(
535     IXMLDOMProcessingInstruction *iface,
536     BSTR* p)
537 {
538     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
539     TRACE("(%p)->(%p)\n", This, p);
540     return node_get_namespaceURI(&This->node, p);
541 }
542
543 static HRESULT WINAPI dom_pi_get_prefix(
544     IXMLDOMProcessingInstruction *iface,
545     BSTR* prefix)
546 {
547     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
548     TRACE("(%p)->(%p)\n", This, prefix);
549     return return_null_bstr( prefix );
550 }
551
552 static HRESULT WINAPI dom_pi_get_baseName(
553     IXMLDOMProcessingInstruction *iface,
554     BSTR* name)
555 {
556     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
557     TRACE("(%p)->(%p)\n", This, name);
558     return node_get_base_name( &This->node, name );
559 }
560
561 static HRESULT WINAPI dom_pi_transformNodeToObject(
562     IXMLDOMProcessingInstruction *iface,
563     IXMLDOMNode* domNode, VARIANT var1)
564 {
565     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
566     FIXME("(%p)->(%p %s)\n", This, domNode, debugstr_variant(&var1));
567     return E_NOTIMPL;
568 }
569
570 static HRESULT WINAPI dom_pi_get_target(
571     IXMLDOMProcessingInstruction *iface,
572     BSTR *p)
573 {
574     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
575
576     TRACE("(%p)->(%p)\n", This, p);
577
578     /* target returns the same value as nodeName property */
579     return node_get_nodeName(&This->node, p);
580 }
581
582 static HRESULT WINAPI dom_pi_get_data(
583     IXMLDOMProcessingInstruction *iface,
584     BSTR *p)
585 {
586     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
587     HRESULT hr;
588     VARIANT ret;
589
590     TRACE("(%p)->(%p)\n", This, p);
591
592     if(!p)
593         return E_INVALIDARG;
594
595     hr = IXMLDOMProcessingInstruction_get_nodeValue( iface, &ret );
596     if(hr == S_OK)
597     {
598         *p = V_BSTR(&ret);
599     }
600
601     return hr;
602 }
603
604 static HRESULT WINAPI dom_pi_put_data(
605     IXMLDOMProcessingInstruction *iface,
606     BSTR data)
607 {
608     dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
609     HRESULT hr;
610     VARIANT val;
611     BSTR sTarget;
612
613     TRACE("(%p)->(%s)\n", This, debugstr_w(data) );
614
615     /* Cannot set data to a PI node whose target is 'xml' */
616     hr = dom_pi_get_nodeName(iface, &sTarget);
617     if(hr == S_OK)
618     {
619         static const WCHAR xmlW[] = {'x','m','l',0};
620         if(lstrcmpW( sTarget, xmlW) == 0)
621         {
622             SysFreeString(sTarget);
623             return E_FAIL;
624         }
625
626         SysFreeString(sTarget);
627     }
628
629     V_VT(&val) = VT_BSTR;
630     V_BSTR(&val) = data;
631
632     return IXMLDOMProcessingInstruction_put_nodeValue( iface, val );
633 }
634
635 static const struct IXMLDOMProcessingInstructionVtbl dom_pi_vtbl =
636 {
637     dom_pi_QueryInterface,
638     dom_pi_AddRef,
639     dom_pi_Release,
640     dom_pi_GetTypeInfoCount,
641     dom_pi_GetTypeInfo,
642     dom_pi_GetIDsOfNames,
643     dom_pi_Invoke,
644     dom_pi_get_nodeName,
645     dom_pi_get_nodeValue,
646     dom_pi_put_nodeValue,
647     dom_pi_get_nodeType,
648     dom_pi_get_parentNode,
649     dom_pi_get_childNodes,
650     dom_pi_get_firstChild,
651     dom_pi_get_lastChild,
652     dom_pi_get_previousSibling,
653     dom_pi_get_nextSibling,
654     dom_pi_get_attributes,
655     dom_pi_insertBefore,
656     dom_pi_replaceChild,
657     dom_pi_removeChild,
658     dom_pi_appendChild,
659     dom_pi_hasChildNodes,
660     dom_pi_get_ownerDocument,
661     dom_pi_cloneNode,
662     dom_pi_get_nodeTypeString,
663     dom_pi_get_text,
664     dom_pi_put_text,
665     dom_pi_get_specified,
666     dom_pi_get_definition,
667     dom_pi_get_nodeTypedValue,
668     dom_pi_put_nodeTypedValue,
669     dom_pi_get_dataType,
670     dom_pi_put_dataType,
671     dom_pi_get_xml,
672     dom_pi_transformNode,
673     dom_pi_selectNodes,
674     dom_pi_selectSingleNode,
675     dom_pi_get_parsed,
676     dom_pi_get_namespaceURI,
677     dom_pi_get_prefix,
678     dom_pi_get_baseName,
679     dom_pi_transformNodeToObject,
680
681     dom_pi_get_target,
682     dom_pi_get_data,
683     dom_pi_put_data
684 };
685
686 IUnknown* create_pi( xmlNodePtr pi )
687 {
688     dom_pi *This;
689
690     This = heap_alloc( sizeof *This );
691     if ( !This )
692         return NULL;
693
694     This->IXMLDOMProcessingInstruction_iface.lpVtbl = &dom_pi_vtbl;
695     This->ref = 1;
696
697     init_xmlnode(&This->node, pi, (IXMLDOMNode*)&This->IXMLDOMProcessingInstruction_iface, NULL);
698
699     return (IUnknown*)&This->IXMLDOMProcessingInstruction_iface;
700 }
701
702 #endif