2 * DOM Document implementation
4 * Copyright 2005 Mike McCormack
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
34 #include "wine/debug.h"
36 #include "msxml_private.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
42 typedef struct _domdoc
44 const struct IXMLDOMDocumentVtbl *lpVtbl;
51 LONG xmldoc_add_ref(xmlDocPtr doc)
53 LONG ref = InterlockedIncrement((LONG*)&doc->_private);
58 LONG xmldoc_release(xmlDocPtr doc)
60 LONG ref = InterlockedDecrement((LONG*)&doc->_private);
64 TRACE("freeing docptr %p\n", doc);
71 static inline domdoc *impl_from_IXMLDOMDocument( IXMLDOMDocument *iface )
73 return (domdoc *)((char*)iface - FIELD_OFFSET(domdoc, lpVtbl));
76 static inline xmlDocPtr get_doc( domdoc *This )
78 return (xmlDocPtr) xmlNodePtr_from_domnode( This->node, XML_DOCUMENT_NODE );
81 static HRESULT WINAPI domdoc_QueryInterface( IXMLDOMDocument *iface, REFIID riid, void** ppvObject )
83 domdoc *This = impl_from_IXMLDOMDocument( iface );
85 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
87 if ( IsEqualGUID( riid, &IID_IXMLDOMDocument ) ||
88 IsEqualGUID( riid, &IID_IUnknown ) )
92 else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
93 IsEqualGUID( riid, &IID_IDispatch ) )
95 return IUnknown_QueryInterface(This->node_unk, riid, ppvObject);
99 FIXME("interface %s not implemented\n", debugstr_guid(riid));
100 return E_NOINTERFACE;
103 IXMLDOMDocument_AddRef( iface );
109 static ULONG WINAPI domdoc_AddRef(
110 IXMLDOMDocument *iface )
112 domdoc *This = impl_from_IXMLDOMDocument( iface );
113 TRACE("%p\n", This );
114 return InterlockedIncrement( &This->ref );
118 static ULONG WINAPI domdoc_Release(
119 IXMLDOMDocument *iface )
121 domdoc *This = impl_from_IXMLDOMDocument( iface );
124 TRACE("%p\n", This );
126 ref = InterlockedDecrement( &This->ref );
129 IUnknown_Release( This->node_unk );
130 HeapFree( GetProcessHeap(), 0, This );
136 static HRESULT WINAPI domdoc_GetTypeInfoCount( IXMLDOMDocument *iface, UINT* pctinfo )
142 static HRESULT WINAPI domdoc_GetTypeInfo(
143 IXMLDOMDocument *iface,
144 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
150 static HRESULT WINAPI domdoc_GetIDsOfNames(
151 IXMLDOMDocument *iface,
163 static HRESULT WINAPI domdoc_Invoke(
164 IXMLDOMDocument *iface,
169 DISPPARAMS* pDispParams,
171 EXCEPINFO* pExcepInfo,
179 static HRESULT WINAPI domdoc_get_nodeName(
180 IXMLDOMDocument *iface,
183 domdoc *This = impl_from_IXMLDOMDocument( iface );
184 return IXMLDOMNode_get_nodeName( This->node, name );
188 static HRESULT WINAPI domdoc_get_nodeValue(
189 IXMLDOMDocument *iface,
192 domdoc *This = impl_from_IXMLDOMDocument( iface );
193 return IXMLDOMNode_get_nodeValue( This->node, value );
197 static HRESULT WINAPI domdoc_put_nodeValue(
198 IXMLDOMDocument *iface,
201 domdoc *This = impl_from_IXMLDOMDocument( iface );
202 return IXMLDOMNode_put_nodeValue( This->node, value );
206 static HRESULT WINAPI domdoc_get_nodeType(
207 IXMLDOMDocument *iface,
210 domdoc *This = impl_from_IXMLDOMDocument( iface );
211 return IXMLDOMNode_get_nodeType( This->node, type );
215 static HRESULT WINAPI domdoc_get_parentNode(
216 IXMLDOMDocument *iface,
217 IXMLDOMNode** parent )
219 domdoc *This = impl_from_IXMLDOMDocument( iface );
220 return IXMLDOMNode_get_parentNode( This->node, parent );
224 static HRESULT WINAPI domdoc_get_childNodes(
225 IXMLDOMDocument *iface,
226 IXMLDOMNodeList** childList )
228 domdoc *This = impl_from_IXMLDOMDocument( iface );
229 return IXMLDOMNode_get_childNodes( This->node, childList );
233 static HRESULT WINAPI domdoc_get_firstChild(
234 IXMLDOMDocument *iface,
235 IXMLDOMNode** firstChild )
237 domdoc *This = impl_from_IXMLDOMDocument( iface );
238 return IXMLDOMNode_get_firstChild( This->node, firstChild );
242 static HRESULT WINAPI domdoc_get_lastChild(
243 IXMLDOMDocument *iface,
244 IXMLDOMNode** lastChild )
246 domdoc *This = impl_from_IXMLDOMDocument( iface );
247 return IXMLDOMNode_get_lastChild( This->node, lastChild );
251 static HRESULT WINAPI domdoc_get_previousSibling(
252 IXMLDOMDocument *iface,
253 IXMLDOMNode** previousSibling )
255 domdoc *This = impl_from_IXMLDOMDocument( iface );
256 return IXMLDOMNode_get_previousSibling( This->node, previousSibling );
260 static HRESULT WINAPI domdoc_get_nextSibling(
261 IXMLDOMDocument *iface,
262 IXMLDOMNode** nextSibling )
264 domdoc *This = impl_from_IXMLDOMDocument( iface );
265 return IXMLDOMNode_get_nextSibling( This->node, nextSibling );
269 static HRESULT WINAPI domdoc_get_attributes(
270 IXMLDOMDocument *iface,
271 IXMLDOMNamedNodeMap** attributeMap )
273 domdoc *This = impl_from_IXMLDOMDocument( iface );
274 return IXMLDOMNode_get_attributes( This->node, attributeMap );
278 static HRESULT WINAPI domdoc_insertBefore(
279 IXMLDOMDocument *iface,
280 IXMLDOMNode* newChild,
282 IXMLDOMNode** outNewChild )
284 domdoc *This = impl_from_IXMLDOMDocument( iface );
285 return IXMLDOMNode_insertBefore( This->node, newChild, refChild, outNewChild );
289 static HRESULT WINAPI domdoc_replaceChild(
290 IXMLDOMDocument *iface,
291 IXMLDOMNode* newChild,
292 IXMLDOMNode* oldChild,
293 IXMLDOMNode** outOldChild)
295 domdoc *This = impl_from_IXMLDOMDocument( iface );
296 return IXMLDOMNode_replaceChild( This->node, newChild, oldChild, outOldChild );
300 static HRESULT WINAPI domdoc_removeChild(
301 IXMLDOMDocument *iface,
302 IXMLDOMNode* childNode,
303 IXMLDOMNode** oldChild)
305 domdoc *This = impl_from_IXMLDOMDocument( iface );
306 return IXMLDOMNode_removeChild( This->node, childNode, oldChild );
310 static HRESULT WINAPI domdoc_appendChild(
311 IXMLDOMDocument *iface,
312 IXMLDOMNode* newChild,
313 IXMLDOMNode** outNewChild)
315 domdoc *This = impl_from_IXMLDOMDocument( iface );
316 return IXMLDOMNode_appendChild( This->node, newChild, outNewChild );
320 static HRESULT WINAPI domdoc_hasChildNodes(
321 IXMLDOMDocument *iface,
322 VARIANT_BOOL* hasChild)
324 domdoc *This = impl_from_IXMLDOMDocument( iface );
325 return IXMLDOMNode_hasChildNodes( This->node, hasChild );
329 static HRESULT WINAPI domdoc_get_ownerDocument(
330 IXMLDOMDocument *iface,
331 IXMLDOMDocument** DOMDocument)
333 domdoc *This = impl_from_IXMLDOMDocument( iface );
334 return IXMLDOMNode_get_ownerDocument( This->node, DOMDocument );
338 static HRESULT WINAPI domdoc_cloneNode(
339 IXMLDOMDocument *iface,
341 IXMLDOMNode** cloneRoot)
343 domdoc *This = impl_from_IXMLDOMDocument( iface );
344 return IXMLDOMNode_cloneNode( This->node, deep, cloneRoot );
348 static HRESULT WINAPI domdoc_get_nodeTypeString(
349 IXMLDOMDocument *iface,
352 domdoc *This = impl_from_IXMLDOMDocument( iface );
353 return IXMLDOMNode_get_nodeTypeString( This->node, nodeType );
357 static HRESULT WINAPI domdoc_get_text(
358 IXMLDOMDocument *iface,
361 domdoc *This = impl_from_IXMLDOMDocument( iface );
362 return IXMLDOMNode_get_text( This->node, text );
366 static HRESULT WINAPI domdoc_put_text(
367 IXMLDOMDocument *iface,
370 domdoc *This = impl_from_IXMLDOMDocument( iface );
371 return IXMLDOMNode_put_text( This->node, text );
375 static HRESULT WINAPI domdoc_get_specified(
376 IXMLDOMDocument *iface,
377 VARIANT_BOOL* isSpecified )
379 domdoc *This = impl_from_IXMLDOMDocument( iface );
380 return IXMLDOMNode_get_specified( This->node, isSpecified );
384 static HRESULT WINAPI domdoc_get_definition(
385 IXMLDOMDocument *iface,
386 IXMLDOMNode** definitionNode )
388 domdoc *This = impl_from_IXMLDOMDocument( iface );
389 return IXMLDOMNode_get_definition( This->node, definitionNode );
393 static HRESULT WINAPI domdoc_get_nodeTypedValue(
394 IXMLDOMDocument *iface,
395 VARIANT* typedValue )
397 domdoc *This = impl_from_IXMLDOMDocument( iface );
398 return IXMLDOMNode_get_nodeTypedValue( This->node, typedValue );
401 static HRESULT WINAPI domdoc_put_nodeTypedValue(
402 IXMLDOMDocument *iface,
405 domdoc *This = impl_from_IXMLDOMDocument( iface );
406 return IXMLDOMNode_put_nodeTypedValue( This->node, typedValue );
410 static HRESULT WINAPI domdoc_get_dataType(
411 IXMLDOMDocument *iface,
412 VARIANT* dataTypeName )
414 domdoc *This = impl_from_IXMLDOMDocument( iface );
415 return IXMLDOMNode_get_dataType( This->node, dataTypeName );
419 static HRESULT WINAPI domdoc_put_dataType(
420 IXMLDOMDocument *iface,
423 domdoc *This = impl_from_IXMLDOMDocument( iface );
424 return IXMLDOMNode_put_dataType( This->node, dataTypeName );
428 static HRESULT WINAPI domdoc_get_xml(
429 IXMLDOMDocument *iface,
432 domdoc *This = impl_from_IXMLDOMDocument( iface );
433 return IXMLDOMNode_get_xml( This->node, xmlString );
437 static HRESULT WINAPI domdoc_transformNode(
438 IXMLDOMDocument *iface,
439 IXMLDOMNode* styleSheet,
442 domdoc *This = impl_from_IXMLDOMDocument( iface );
443 return IXMLDOMNode_transformNode( This->node, styleSheet, xmlString );
447 static HRESULT WINAPI domdoc_selectNodes(
448 IXMLDOMDocument *iface,
450 IXMLDOMNodeList** resultList )
452 domdoc *This = impl_from_IXMLDOMDocument( iface );
453 return IXMLDOMNode_selectNodes( This->node, queryString, resultList );
457 static HRESULT WINAPI domdoc_selectSingleNode(
458 IXMLDOMDocument *iface,
460 IXMLDOMNode** resultNode )
462 domdoc *This = impl_from_IXMLDOMDocument( iface );
463 return IXMLDOMNode_selectSingleNode( This->node, queryString, resultNode );
467 static HRESULT WINAPI domdoc_get_parsed(
468 IXMLDOMDocument *iface,
469 VARIANT_BOOL* isParsed )
471 domdoc *This = impl_from_IXMLDOMDocument( iface );
472 return IXMLDOMNode_get_parsed( This->node, isParsed );
476 static HRESULT WINAPI domdoc_get_namespaceURI(
477 IXMLDOMDocument *iface,
480 domdoc *This = impl_from_IXMLDOMDocument( iface );
481 return IXMLDOMNode_get_namespaceURI( This->node, namespaceURI );
485 static HRESULT WINAPI domdoc_get_prefix(
486 IXMLDOMDocument *iface,
489 domdoc *This = impl_from_IXMLDOMDocument( iface );
490 return IXMLDOMNode_get_prefix( This->node, prefixString );
494 static HRESULT WINAPI domdoc_get_baseName(
495 IXMLDOMDocument *iface,
498 domdoc *This = impl_from_IXMLDOMDocument( iface );
499 return IXMLDOMNode_get_baseName( This->node, nameString );
503 static HRESULT WINAPI domdoc_transformNodeToObject(
504 IXMLDOMDocument *iface,
505 IXMLDOMNode* stylesheet,
506 VARIANT outputObject)
508 domdoc *This = impl_from_IXMLDOMDocument( iface );
509 return IXMLDOMNode_transformNodeToObject( This->node, stylesheet, outputObject );
513 static HRESULT WINAPI domdoc_get_doctype(
514 IXMLDOMDocument *iface,
515 IXMLDOMDocumentType** documentType )
522 static HRESULT WINAPI domdoc_get_implementation(
523 IXMLDOMDocument *iface,
524 IXMLDOMImplementation** impl )
530 static HRESULT WINAPI domdoc_get_documentElement(
531 IXMLDOMDocument *iface,
532 IXMLDOMElement** DOMElement )
534 domdoc *This = impl_from_IXMLDOMDocument( iface );
535 xmlDocPtr xmldoc = NULL;
536 xmlNodePtr root = NULL;
537 IXMLDOMNode *element_node;
547 xmldoc = get_doc( This );
551 root = xmlDocGetRootElement( xmldoc );
555 element_node = create_node( root );
556 if(!element_node) return S_FALSE;
558 hr = IXMLDOMNode_QueryInterface(element_node, &IID_IXMLDOMElement, (LPVOID*)DOMElement);
559 IXMLDOMNode_Release(element_node);
565 static HRESULT WINAPI domdoc_documentElement(
566 IXMLDOMDocument *iface,
567 IXMLDOMElement* DOMElement )
574 static HRESULT WINAPI domdoc_createElement(
575 IXMLDOMDocument *iface,
577 IXMLDOMElement** element )
584 static HRESULT WINAPI domdoc_createDocumentFragment(
585 IXMLDOMDocument *iface,
586 IXMLDOMDocumentFragment** docFrag )
593 static HRESULT WINAPI domdoc_createTextNode(
594 IXMLDOMDocument *iface,
603 static HRESULT WINAPI domdoc_createComment(
604 IXMLDOMDocument *iface,
606 IXMLDOMComment** comment )
613 static HRESULT WINAPI domdoc_createCDATASection(
614 IXMLDOMDocument *iface,
616 IXMLDOMCDATASection** cdata )
623 static HRESULT WINAPI domdoc_createProcessingInstruction(
624 IXMLDOMDocument *iface,
627 IXMLDOMProcessingInstruction** pi )
634 static HRESULT WINAPI domdoc_createAttribute(
635 IXMLDOMDocument *iface,
637 IXMLDOMAttribute** attribute )
644 static HRESULT WINAPI domdoc_createEntityReference(
645 IXMLDOMDocument *iface,
647 IXMLDOMEntityReference** entityRef )
654 static HRESULT WINAPI domdoc_getElementsByTagName(
655 IXMLDOMDocument *iface,
657 IXMLDOMNodeList** resultList )
663 static DOMNodeType get_node_type(VARIANT Type)
665 if(V_VT(&Type) == VT_I4)
668 FIXME("Unsupported variant type %x\n", V_VT(&Type));
672 static HRESULT WINAPI domdoc_createNode(
673 IXMLDOMDocument *iface,
679 domdoc *This = impl_from_IXMLDOMDocument( iface );
680 DOMNodeType node_type;
681 xmlNodePtr xmlnode = NULL;
685 TRACE("(%p)->(type,%s,%s,%p)\n", This, debugstr_w(name), debugstr_w(namespaceURI), node);
687 node_type = get_node_type(Type);
688 TRACE("node_type %d\n", node_type);
690 xml_name = xmlChar_from_wchar((WCHAR*)name);
694 xmldoc = xmlNewDoc(NULL);
695 xmldoc->_private = 0;
696 attach_xmlnode(This->node, (xmlNodePtr) xmldoc);
702 xmlnode = xmlNewDocNode(get_doc(This), NULL, xml_name, NULL);
703 *node = create_node(xmlnode);
704 TRACE("created %p\n", xmlnode);
708 FIXME("unhandled node type %d\n", node_type);
712 HeapFree(GetProcessHeap(), 0, xml_name);
720 static HRESULT WINAPI domdoc_nodeFromID(
721 IXMLDOMDocument *iface,
729 static xmlDocPtr doparse( char *ptr, int len )
731 #ifdef HAVE_XMLREADMEMORY
733 * use xmlReadMemory if possible so we can suppress
734 * writing errors to stderr
736 return xmlReadMemory( ptr, len, NULL, NULL,
737 XML_PARSE_NOERROR | XML_PARSE_NOWARNING );
739 return xmlParseMemory( ptr, len );
743 static xmlDocPtr doread( LPWSTR filename )
745 HANDLE handle, mapping;
747 xmlDocPtr xmldoc = NULL;
750 TRACE("%s\n", debugstr_w( filename ));
752 handle = CreateFileW( filename, GENERIC_READ, FILE_SHARE_READ,
753 NULL, OPEN_EXISTING, 0, NULL );
754 if( handle == INVALID_HANDLE_VALUE )
757 len = GetFileSize( handle, NULL );
758 if( len != INVALID_FILE_SIZE || GetLastError() == NO_ERROR )
760 mapping = CreateFileMappingW( handle, NULL, PAGE_READONLY, 0, 0, NULL );
763 ptr = MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, len );
766 xmldoc = doparse( ptr, len );
767 UnmapViewOfFile( ptr );
769 CloseHandle( mapping );
772 CloseHandle( handle );
778 static HRESULT WINAPI domdoc_load(
779 IXMLDOMDocument *iface,
781 VARIANT_BOOL* isSuccessful )
783 domdoc *This = impl_from_IXMLDOMDocument( iface );
784 LPWSTR filename = NULL;
787 TRACE("type %d\n", V_VT(&xmlSource) );
789 *isSuccessful = VARIANT_FALSE;
791 assert( This->node );
793 attach_xmlnode(This->node, NULL);
795 switch( V_VT(&xmlSource) )
798 filename = V_BSTR(&xmlSource);
804 xmldoc = doread( filename );
805 if ( !xmldoc ) return S_FALSE;
807 xmldoc->_private = 0;
808 attach_xmlnode(This->node, (xmlNodePtr) xmldoc);
810 *isSuccessful = VARIANT_TRUE;
815 static HRESULT WINAPI domdoc_get_readyState(
816 IXMLDOMDocument *iface,
824 static HRESULT WINAPI domdoc_get_parseError(
825 IXMLDOMDocument *iface,
826 IXMLDOMParseError** errorObj )
828 FIXME("(%p)->(%p): creating a dummy parseError\n", iface, errorObj);
829 *errorObj = create_parseError(0, NULL, NULL, NULL, 0, 0, 0);
830 if(!*errorObj) return E_OUTOFMEMORY;
835 static HRESULT WINAPI domdoc_get_url(
836 IXMLDOMDocument *iface,
844 static HRESULT WINAPI domdoc_get_async(
845 IXMLDOMDocument *iface,
846 VARIANT_BOOL* isAsync )
848 domdoc *This = impl_from_IXMLDOMDocument( iface );
850 TRACE("%p <- %d\n", isAsync, This->async);
851 *isAsync = This->async;
856 static HRESULT WINAPI domdoc_put_async(
857 IXMLDOMDocument *iface,
858 VARIANT_BOOL isAsync )
860 domdoc *This = impl_from_IXMLDOMDocument( iface );
862 TRACE("%d\n", isAsync);
863 This->async = isAsync;
868 static HRESULT WINAPI domdoc_abort(
869 IXMLDOMDocument *iface )
876 BOOL bstr_to_utf8( BSTR bstr, char **pstr, int *plen )
878 UINT len, blen = SysStringLen( bstr );
881 len = WideCharToMultiByte( CP_UTF8, 0, bstr, blen, NULL, 0, NULL, NULL );
882 str = HeapAlloc( GetProcessHeap(), 0, len );
885 WideCharToMultiByte( CP_UTF8, 0, bstr, blen, str, len, NULL, NULL );
891 static HRESULT WINAPI domdoc_loadXML(
892 IXMLDOMDocument *iface,
894 VARIANT_BOOL* isSuccessful )
896 domdoc *This = impl_from_IXMLDOMDocument( iface );
901 TRACE("%p %s %p\n", This, debugstr_w( bstrXML ), isSuccessful );
903 assert ( This->node );
905 attach_xmlnode( This->node, NULL );
910 *isSuccessful = VARIANT_FALSE;
915 if ( !bstr_to_utf8( bstrXML, &str, &len ) )
918 xmldoc = doparse( str, len );
919 HeapFree( GetProcessHeap(), 0, str );
923 xmldoc->_private = 0;
924 attach_xmlnode( This->node, (xmlNodePtr) xmldoc );
926 *isSuccessful = VARIANT_TRUE;
931 static HRESULT WINAPI domdoc_save(
932 IXMLDOMDocument *iface,
933 VARIANT destination )
935 domdoc *This = impl_from_IXMLDOMDocument( iface );
942 TRACE("(%p)->(var(vt %x, %s))\n", This, V_VT(&destination),
943 V_VT(&destination) == VT_BSTR ? debugstr_w(V_BSTR(&destination)) : NULL);
945 if(V_VT(&destination) != VT_BSTR)
947 FIXME("Unhandled vt %x\n", V_VT(&destination));
951 handle = CreateFileW( V_BSTR(&destination), GENERIC_WRITE, 0,
952 NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
953 if( handle == INVALID_HANDLE_VALUE )
955 WARN("failed to create file\n");
959 xmlDocDumpMemory(get_doc(This), &mem, &size);
960 if(!WriteFile(handle, mem, (DWORD)size, &written, NULL) || written != (DWORD)size)
962 WARN("write error\n");
971 static HRESULT WINAPI domdoc_get_validateOnParse(
972 IXMLDOMDocument *iface,
973 VARIANT_BOOL* isValidating )
980 static HRESULT WINAPI domdoc_put_validateOnParse(
981 IXMLDOMDocument *iface,
982 VARIANT_BOOL isValidating )
989 static HRESULT WINAPI domdoc_get_resolveExternals(
990 IXMLDOMDocument *iface,
991 VARIANT_BOOL* isResolving )
998 static HRESULT WINAPI domdoc_put_resolveExternals(
999 IXMLDOMDocument *iface,
1000 VARIANT_BOOL isValidating )
1007 static HRESULT WINAPI domdoc_get_preserveWhiteSpace(
1008 IXMLDOMDocument *iface,
1009 VARIANT_BOOL* isPreserving )
1016 static HRESULT WINAPI domdoc_put_preserveWhiteSpace(
1017 IXMLDOMDocument *iface,
1018 VARIANT_BOOL isPreserving )
1025 static HRESULT WINAPI domdoc_put_onReadyStateChange(
1026 IXMLDOMDocument *iface,
1027 VARIANT readyStateChangeSink )
1034 static HRESULT WINAPI domdoc_put_onDataAvailable(
1035 IXMLDOMDocument *iface,
1036 VARIANT onDataAvailableSink )
1042 static HRESULT WINAPI domdoc_put_onTransformNode(
1043 IXMLDOMDocument *iface,
1044 VARIANT onTransformNodeSink )
1050 const struct IXMLDOMDocumentVtbl domdoc_vtbl =
1052 domdoc_QueryInterface,
1055 domdoc_GetTypeInfoCount,
1057 domdoc_GetIDsOfNames,
1059 domdoc_get_nodeName,
1060 domdoc_get_nodeValue,
1061 domdoc_put_nodeValue,
1062 domdoc_get_nodeType,
1063 domdoc_get_parentNode,
1064 domdoc_get_childNodes,
1065 domdoc_get_firstChild,
1066 domdoc_get_lastChild,
1067 domdoc_get_previousSibling,
1068 domdoc_get_nextSibling,
1069 domdoc_get_attributes,
1070 domdoc_insertBefore,
1071 domdoc_replaceChild,
1074 domdoc_hasChildNodes,
1075 domdoc_get_ownerDocument,
1077 domdoc_get_nodeTypeString,
1080 domdoc_get_specified,
1081 domdoc_get_definition,
1082 domdoc_get_nodeTypedValue,
1083 domdoc_put_nodeTypedValue,
1084 domdoc_get_dataType,
1085 domdoc_put_dataType,
1087 domdoc_transformNode,
1089 domdoc_selectSingleNode,
1091 domdoc_get_namespaceURI,
1093 domdoc_get_baseName,
1094 domdoc_transformNodeToObject,
1096 domdoc_get_implementation,
1097 domdoc_get_documentElement,
1098 domdoc_documentElement,
1099 domdoc_createElement,
1100 domdoc_createDocumentFragment,
1101 domdoc_createTextNode,
1102 domdoc_createComment,
1103 domdoc_createCDATASection,
1104 domdoc_createProcessingInstruction,
1105 domdoc_createAttribute,
1106 domdoc_createEntityReference,
1107 domdoc_getElementsByTagName,
1111 domdoc_get_readyState,
1112 domdoc_get_parseError,
1119 domdoc_get_validateOnParse,
1120 domdoc_put_validateOnParse,
1121 domdoc_get_resolveExternals,
1122 domdoc_put_resolveExternals,
1123 domdoc_get_preserveWhiteSpace,
1124 domdoc_put_preserveWhiteSpace,
1125 domdoc_put_onReadyStateChange,
1126 domdoc_put_onDataAvailable,
1127 domdoc_put_onTransformNode,
1130 HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj)
1135 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
1137 doc = HeapAlloc( GetProcessHeap(), 0, sizeof (*doc) );
1139 return E_OUTOFMEMORY;
1141 doc->lpVtbl = &domdoc_vtbl;
1145 doc->node_unk = create_basic_node( NULL, (IUnknown*)&doc->lpVtbl );
1148 HeapFree(GetProcessHeap(), 0, doc);
1152 hr = IUnknown_QueryInterface(doc->node_unk, &IID_IXMLDOMNode, (LPVOID*)&doc->node);
1155 IUnknown_Release(doc->node_unk);
1156 HeapFree( GetProcessHeap(), 0, doc );
1159 /* The ref on doc->node is actually looped back into this object, so release it */
1160 IXMLDOMNode_Release(doc->node);
1162 *ppObj = &doc->lpVtbl;
1164 TRACE("returning iface %p\n", *ppObj);
1170 HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj)
1172 MESSAGE("This program tried to use a DOMDocument object, but\n"
1173 "libxml2 support was not present at compile time.\n");