2 * DOM CDATA node implementation
4 * Copyright 2007 Alistair Leslie-Hughes
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.
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.
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
27 # include <libxml/parser.h>
28 # include <libxml/xmlerror.h>
37 #include "msxml_private.h"
39 #include "wine/debug.h"
41 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
45 typedef struct _domcdata
48 IXMLDOMCDATASection IXMLDOMCDATASection_iface;
52 static inline domcdata *impl_from_IXMLDOMCDATASection( IXMLDOMCDATASection *iface )
54 return CONTAINING_RECORD(iface, domcdata, IXMLDOMCDATASection_iface);
57 static HRESULT WINAPI domcdata_QueryInterface(
58 IXMLDOMCDATASection *iface,
62 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
63 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
65 if ( IsEqualGUID( riid, &IID_IXMLDOMCDATASection ) ||
66 IsEqualGUID( riid, &IID_IXMLDOMCharacterData) ||
67 IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
68 IsEqualGUID( riid, &IID_IDispatch ) ||
69 IsEqualGUID( riid, &IID_IUnknown ) )
73 else if ( IsEqualGUID( riid, &IID_IXMLDOMText ) ||
74 IsEqualGUID( riid, &IID_IXMLDOMElement ) )
76 TRACE("Unsupported interface\n");
79 else if(node_query_interface(&This->node, riid, ppvObject))
81 return *ppvObject ? S_OK : E_NOINTERFACE;
85 FIXME("Unsupported interface %s\n", debugstr_guid(riid));
89 IXMLDOMText_AddRef((IUnknown*)*ppvObject);
93 static ULONG WINAPI domcdata_AddRef(
94 IXMLDOMCDATASection *iface )
96 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
97 return InterlockedIncrement( &This->ref );
100 static ULONG WINAPI domcdata_Release(
101 IXMLDOMCDATASection *iface )
103 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
106 ref = InterlockedDecrement( &This->ref );
109 destroy_xmlnode(&This->node);
116 static HRESULT WINAPI domcdata_GetTypeInfoCount(
117 IXMLDOMCDATASection *iface,
120 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
122 TRACE("(%p)->(%p)\n", This, pctinfo);
129 static HRESULT WINAPI domcdata_GetTypeInfo(
130 IXMLDOMCDATASection *iface,
131 UINT iTInfo, LCID lcid,
132 ITypeInfo** ppTInfo )
134 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
137 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
139 hr = get_typeinfo(IXMLDOMCDATASection_tid, ppTInfo);
144 static HRESULT WINAPI domcdata_GetIDsOfNames(
145 IXMLDOMCDATASection *iface,
146 REFIID riid, LPOLESTR* rgszNames,
147 UINT cNames, LCID lcid, DISPID* rgDispId )
149 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
153 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
156 if(!rgszNames || cNames == 0 || !rgDispId)
159 hr = get_typeinfo(IXMLDOMCDATASection_tid, &typeinfo);
162 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
163 ITypeInfo_Release(typeinfo);
169 static HRESULT WINAPI domcdata_Invoke(
170 IXMLDOMCDATASection *iface,
171 DISPID dispIdMember, REFIID riid, LCID lcid,
172 WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
173 EXCEPINFO* pExcepInfo, UINT* puArgErr )
175 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
179 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
180 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
182 hr = get_typeinfo(IXMLDOMCDATASection_tid, &typeinfo);
185 hr = ITypeInfo_Invoke(typeinfo, &This->IXMLDOMCDATASection_iface, dispIdMember, wFlags,
186 pDispParams, pVarResult, pExcepInfo, puArgErr);
187 ITypeInfo_Release(typeinfo);
193 static HRESULT WINAPI domcdata_get_nodeName(
194 IXMLDOMCDATASection *iface,
197 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
199 static const WCHAR cdata_sectionW[] =
200 {'#','c','d','a','t','a','-','s','e','c','t','i','o','n',0};
202 TRACE("(%p)->(%p)\n", This, p);
204 return return_bstr(cdata_sectionW, p);
207 static HRESULT WINAPI domcdata_get_nodeValue(
208 IXMLDOMCDATASection *iface,
211 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
213 TRACE("(%p)->(%p)\n", This, value);
215 return node_get_content(&This->node, value);
218 static HRESULT WINAPI domcdata_put_nodeValue(
219 IXMLDOMCDATASection *iface,
222 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
224 TRACE("(%p)->(%s)\n", This, debugstr_variant(&value));
226 return node_put_value(&This->node, &value);
229 static HRESULT WINAPI domcdata_get_nodeType(
230 IXMLDOMCDATASection *iface,
231 DOMNodeType* domNodeType )
233 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
235 TRACE("(%p)->(%p)\n", This, domNodeType);
237 *domNodeType = NODE_CDATA_SECTION;
241 static HRESULT WINAPI domcdata_get_parentNode(
242 IXMLDOMCDATASection *iface,
243 IXMLDOMNode** parent )
245 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
247 TRACE("(%p)->(%p)\n", This, parent);
249 return node_get_parent(&This->node, parent);
252 static HRESULT WINAPI domcdata_get_childNodes(
253 IXMLDOMCDATASection *iface,
254 IXMLDOMNodeList** outList)
256 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
258 TRACE("(%p)->(%p)\n", This, outList);
260 return node_get_child_nodes(&This->node, outList);
263 static HRESULT WINAPI domcdata_get_firstChild(
264 IXMLDOMCDATASection *iface,
265 IXMLDOMNode** domNode)
267 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
269 TRACE("(%p)->(%p)\n", This, domNode);
271 return return_null_node(domNode);
274 static HRESULT WINAPI domcdata_get_lastChild(
275 IXMLDOMCDATASection *iface,
276 IXMLDOMNode** domNode)
278 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
280 TRACE("(%p)->(%p)\n", This, domNode);
282 return return_null_node(domNode);
285 static HRESULT WINAPI domcdata_get_previousSibling(
286 IXMLDOMCDATASection *iface,
287 IXMLDOMNode** domNode)
289 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
291 TRACE("(%p)->(%p)\n", This, domNode);
293 return node_get_previous_sibling(&This->node, domNode);
296 static HRESULT WINAPI domcdata_get_nextSibling(
297 IXMLDOMCDATASection *iface,
298 IXMLDOMNode** domNode)
300 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
302 TRACE("(%p)->(%p)\n", This, domNode);
304 return node_get_next_sibling(&This->node, domNode);
307 static HRESULT WINAPI domcdata_get_attributes(
308 IXMLDOMCDATASection *iface,
309 IXMLDOMNamedNodeMap** attributeMap)
311 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
313 TRACE("(%p)->(%p)\n", This, attributeMap);
315 return return_null_ptr((void**)attributeMap);
318 static HRESULT WINAPI domcdata_insertBefore(
319 IXMLDOMCDATASection *iface,
320 IXMLDOMNode* newNode, VARIANT refChild,
321 IXMLDOMNode** outOldNode)
323 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
325 FIXME("(%p)->(%p %s %p) needs test\n", This, newNode, debugstr_variant(&refChild), outOldNode);
327 return node_insert_before(&This->node, newNode, &refChild, outOldNode);
330 static HRESULT WINAPI domcdata_replaceChild(
331 IXMLDOMCDATASection *iface,
332 IXMLDOMNode* newNode,
333 IXMLDOMNode* oldNode,
334 IXMLDOMNode** outOldNode)
336 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
338 FIXME("(%p)->(%p %p %p) needs tests\n", This, newNode, oldNode, outOldNode);
340 return node_replace_child(&This->node, newNode, oldNode, outOldNode);
343 static HRESULT WINAPI domcdata_removeChild(
344 IXMLDOMCDATASection *iface,
345 IXMLDOMNode *child, IXMLDOMNode **oldChild)
347 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
348 TRACE("(%p)->(%p %p)\n", This, child, oldChild);
349 return node_remove_child(&This->node, child, oldChild);
352 static HRESULT WINAPI domcdata_appendChild(
353 IXMLDOMCDATASection *iface,
354 IXMLDOMNode *child, IXMLDOMNode **outChild)
356 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
357 TRACE("(%p)->(%p %p)\n", This, child, outChild);
358 return node_append_child(&This->node, child, outChild);
361 static HRESULT WINAPI domcdata_hasChildNodes(
362 IXMLDOMCDATASection *iface,
365 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
366 TRACE("(%p)->(%p)\n", This, ret);
367 return node_has_childnodes(&This->node, ret);
370 static HRESULT WINAPI domcdata_get_ownerDocument(
371 IXMLDOMCDATASection *iface,
372 IXMLDOMDocument **doc)
374 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
375 TRACE("(%p)->(%p)\n", This, doc);
376 return node_get_owner_doc(&This->node, doc);
379 static HRESULT WINAPI domcdata_cloneNode(
380 IXMLDOMCDATASection *iface,
381 VARIANT_BOOL deep, IXMLDOMNode** outNode)
383 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
384 TRACE("(%p)->(%d %p)\n", This, deep, outNode);
385 return node_clone( &This->node, deep, outNode );
388 static HRESULT WINAPI domcdata_get_nodeTypeString(
389 IXMLDOMCDATASection *iface,
392 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
393 static const WCHAR cdatasectionW[] = {'c','d','a','t','a','s','e','c','t','i','o','n',0};
395 TRACE("(%p)->(%p)\n", This, p);
397 return return_bstr(cdatasectionW, p);
400 static HRESULT WINAPI domcdata_get_text(
401 IXMLDOMCDATASection *iface,
404 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
405 TRACE("(%p)->(%p)\n", This, p);
406 return node_get_text(&This->node, p);
409 static HRESULT WINAPI domcdata_put_text(
410 IXMLDOMCDATASection *iface,
413 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
414 TRACE("(%p)->(%p)\n", This, debugstr_w(p));
415 return node_put_text( &This->node, p );
418 static HRESULT WINAPI domcdata_get_specified(
419 IXMLDOMCDATASection *iface,
420 VARIANT_BOOL* isSpecified)
422 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
423 FIXME("(%p)->(%p) stub!\n", This, isSpecified);
424 *isSpecified = VARIANT_TRUE;
428 static HRESULT WINAPI domcdata_get_definition(
429 IXMLDOMCDATASection *iface,
430 IXMLDOMNode** definitionNode)
432 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
433 FIXME("(%p)->(%p)\n", This, definitionNode);
437 static HRESULT WINAPI domcdata_get_nodeTypedValue(
438 IXMLDOMCDATASection *iface,
441 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
442 FIXME("(%p)->(%p)\n", This, var1);
443 return return_null_var(var1);
446 static HRESULT WINAPI domcdata_put_nodeTypedValue(
447 IXMLDOMCDATASection *iface,
450 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
451 FIXME("(%p)->(%s)\n", This, debugstr_variant(&typedValue));
455 static HRESULT WINAPI domcdata_get_dataType(
456 IXMLDOMCDATASection *iface,
459 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
460 TRACE("(%p)->(%p)\n", This, typename);
461 return return_null_var( typename );
464 static HRESULT WINAPI domcdata_put_dataType(
465 IXMLDOMCDATASection *iface,
468 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
470 FIXME("(%p)->(%s)\n", This, debugstr_w(p));
478 static HRESULT WINAPI domcdata_get_xml(
479 IXMLDOMCDATASection *iface,
482 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
484 TRACE("(%p)->(%p)\n", This, p);
486 return node_get_xml(&This->node, FALSE, FALSE, p);
489 static HRESULT WINAPI domcdata_transformNode(
490 IXMLDOMCDATASection *iface,
491 IXMLDOMNode *node, BSTR *p)
493 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
494 TRACE("(%p)->(%p %p)\n", This, node, p);
495 return node_transform_node(&This->node, node, p);
498 static HRESULT WINAPI domcdata_selectNodes(
499 IXMLDOMCDATASection *iface,
500 BSTR p, IXMLDOMNodeList** outList)
502 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
503 TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outList);
504 return node_select_nodes(&This->node, p, outList);
507 static HRESULT WINAPI domcdata_selectSingleNode(
508 IXMLDOMCDATASection *iface,
509 BSTR p, IXMLDOMNode** outNode)
511 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
512 TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outNode);
513 return node_select_singlenode(&This->node, p, outNode);
516 static HRESULT WINAPI domcdata_get_parsed(
517 IXMLDOMCDATASection *iface,
518 VARIANT_BOOL* isParsed)
520 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
521 FIXME("(%p)->(%p) stub!\n", This, isParsed);
522 *isParsed = VARIANT_TRUE;
526 static HRESULT WINAPI domcdata_get_namespaceURI(
527 IXMLDOMCDATASection *iface,
530 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
531 TRACE("(%p)->(%p)\n", This, p);
532 return node_get_namespaceURI(&This->node, p);
535 static HRESULT WINAPI domcdata_get_prefix(
536 IXMLDOMCDATASection *iface,
539 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
540 TRACE("(%p)->(%p)\n", This, prefix);
541 return return_null_bstr( prefix );
544 static HRESULT WINAPI domcdata_get_baseName(
545 IXMLDOMCDATASection *iface,
548 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
549 FIXME("(%p)->(%p): needs test\n", This, name);
550 return return_null_bstr( name );
553 static HRESULT WINAPI domcdata_transformNodeToObject(
554 IXMLDOMCDATASection *iface,
555 IXMLDOMNode* domNode, VARIANT var1)
557 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
558 FIXME("(%p)->(%p %s)\n", This, domNode, debugstr_variant(&var1));
562 static HRESULT WINAPI domcdata_get_data(
563 IXMLDOMCDATASection *iface,
572 hr = IXMLDOMCDATASection_get_nodeValue( iface, &vRet );
581 static HRESULT WINAPI domcdata_put_data(
582 IXMLDOMCDATASection *iface,
585 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
588 TRACE("(%p)->(%s)\n", This, debugstr_w(data) );
590 V_VT(&val) = VT_BSTR;
593 return IXMLDOMCDATASection_put_nodeValue( iface, val );
596 static HRESULT WINAPI domcdata_get_length(
597 IXMLDOMCDATASection *iface,
600 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
604 TRACE("(%p)->(%p)\n", This, len);
609 hr = IXMLDOMCDATASection_get_data(iface, &data);
612 *len = SysStringLen(data);
619 static HRESULT WINAPI domcdata_substringData(
620 IXMLDOMCDATASection *iface,
621 LONG offset, LONG count, BSTR *p)
623 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
627 TRACE("(%p)->(%d %d %p)\n", This, offset, count, p);
633 if(offset < 0 || count < 0)
639 hr = IXMLDOMCDATASection_get_data(iface, &data);
642 LONG len = SysStringLen(data);
646 if(offset + count > len)
647 *p = SysAllocString(&data[offset]);
649 *p = SysAllocStringLen(&data[offset], count);
660 static HRESULT WINAPI domcdata_appendData(
661 IXMLDOMCDATASection *iface,
664 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
669 TRACE("(%p)->(%s)\n", This, debugstr_w(p));
671 /* Nothing to do if NULL or an Empty string passed in. */
672 if((p_len = SysStringLen(p)) == 0) return S_OK;
674 hr = IXMLDOMCDATASection_get_data(iface, &data);
677 LONG len = SysStringLen(data);
678 BSTR str = SysAllocStringLen(NULL, p_len + len);
680 memcpy(str, data, len*sizeof(WCHAR));
681 memcpy(&str[len], p, p_len*sizeof(WCHAR));
684 hr = IXMLDOMCDATASection_put_data(iface, str);
693 static HRESULT WINAPI domcdata_insertData(
694 IXMLDOMCDATASection *iface,
697 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
702 TRACE("(%p)->(%d %s)\n", This, offset, debugstr_w(p));
704 /* If have a NULL or empty string, don't do anything. */
705 if((p_len = SysStringLen(p)) == 0)
713 hr = IXMLDOMCDATASection_get_data(iface, &data);
716 LONG len = SysStringLen(data);
725 str = SysAllocStringLen(NULL, len + p_len);
726 /* start part, supplied string and end part */
727 memcpy(str, data, offset*sizeof(WCHAR));
728 memcpy(&str[offset], p, p_len*sizeof(WCHAR));
729 memcpy(&str[offset+p_len], &data[offset], (len-offset)*sizeof(WCHAR));
732 hr = IXMLDOMCDATASection_put_data(iface, str);
741 static HRESULT WINAPI domcdata_deleteData(
742 IXMLDOMCDATASection *iface,
743 LONG offset, LONG count)
745 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
750 TRACE("(%p)->(%d %d)\n", This, offset, count);
752 hr = IXMLDOMCDATASection_get_length(iface, &len);
753 if(hr != S_OK) return hr;
755 if((offset < 0) || (offset > len) || (count < 0))
758 if(len == 0) return S_OK;
760 /* cutting start or end */
761 if((offset == 0) || ((count + offset) >= len))
764 IXMLDOMCDATASection_substringData(iface, count, len - count, &str);
766 IXMLDOMCDATASection_substringData(iface, 0, offset, &str);
767 hr = IXMLDOMCDATASection_put_data(iface, str);
770 /* cutting from the inside */
774 IXMLDOMCDATASection_substringData(iface, 0, offset, &str);
775 IXMLDOMCDATASection_substringData(iface, offset + count, len - count, &str_end);
777 hr = IXMLDOMCDATASection_put_data(iface, str);
779 hr = IXMLDOMCDATASection_appendData(iface, str_end);
781 SysFreeString(str_end);
789 static HRESULT WINAPI domcdata_replaceData(
790 IXMLDOMCDATASection *iface,
791 LONG offset, LONG count, BSTR p)
793 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
796 TRACE("(%p)->(%d %d %s)\n", This, offset, count, debugstr_w(p));
798 hr = IXMLDOMCDATASection_deleteData(iface, offset, count);
801 hr = IXMLDOMCDATASection_insertData(iface, offset, p);
806 static HRESULT WINAPI domcdata_splitText(
807 IXMLDOMCDATASection *iface,
808 LONG offset, IXMLDOMText **txtNode)
810 domcdata *This = impl_from_IXMLDOMCDATASection( iface );
811 IXMLDOMDocument *doc;
815 TRACE("(%p)->(%d %p)\n", This, offset, txtNode);
817 if (!txtNode || offset < 0) return E_INVALIDARG;
821 IXMLDOMCDATASection_get_length(iface, &length);
823 if (offset > length) return E_INVALIDARG;
824 if (offset == length) return S_FALSE;
826 hr = IXMLDOMCDATASection_get_ownerDocument(iface, &doc);
831 hr = IXMLDOMCDATASection_substringData(iface, offset, length - offset, &data);
834 hr = IXMLDOMDocument_createTextNode(doc, data, txtNode);
839 hr = IXMLDOMCDATASection_get_parentNode(iface, &parent);
842 IXMLDOMCDATASection_deleteData(iface, 0, offset);
843 hr = IXMLDOMNode_appendChild(parent, (IXMLDOMNode*)*txtNode, NULL);
844 IXMLDOMNode_Release(parent);
849 IXMLDOMDocument_Release(doc);
855 static const struct IXMLDOMCDATASectionVtbl domcdata_vtbl =
857 domcdata_QueryInterface,
860 domcdata_GetTypeInfoCount,
861 domcdata_GetTypeInfo,
862 domcdata_GetIDsOfNames,
864 domcdata_get_nodeName,
865 domcdata_get_nodeValue,
866 domcdata_put_nodeValue,
867 domcdata_get_nodeType,
868 domcdata_get_parentNode,
869 domcdata_get_childNodes,
870 domcdata_get_firstChild,
871 domcdata_get_lastChild,
872 domcdata_get_previousSibling,
873 domcdata_get_nextSibling,
874 domcdata_get_attributes,
875 domcdata_insertBefore,
876 domcdata_replaceChild,
877 domcdata_removeChild,
878 domcdata_appendChild,
879 domcdata_hasChildNodes,
880 domcdata_get_ownerDocument,
882 domcdata_get_nodeTypeString,
885 domcdata_get_specified,
886 domcdata_get_definition,
887 domcdata_get_nodeTypedValue,
888 domcdata_put_nodeTypedValue,
889 domcdata_get_dataType,
890 domcdata_put_dataType,
892 domcdata_transformNode,
893 domcdata_selectNodes,
894 domcdata_selectSingleNode,
896 domcdata_get_namespaceURI,
898 domcdata_get_baseName,
899 domcdata_transformNodeToObject,
903 domcdata_substringData,
907 domcdata_replaceData,
911 IUnknown* create_cdata( xmlNodePtr text )
915 This = heap_alloc( sizeof *This );
919 This->IXMLDOMCDATASection_iface.lpVtbl = &domcdata_vtbl;
922 init_xmlnode(&This->node, text, (IXMLDOMNode*)&This->IXMLDOMCDATASection_iface, NULL);
924 return (IUnknown*)&This->IXMLDOMCDATASection_iface;