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 )
659 domdoc *This = impl_from_IXMLDOMDocument( iface );
661 TRACE("(%p)->(%s, %p)\n", This, debugstr_w(tagName), resultList);
663 name = xmlChar_from_wchar((WCHAR*)tagName);
664 *resultList = create_filtered_nodelist((xmlNodePtr)get_doc(This), name, TRUE);
665 HeapFree(GetProcessHeap(), 0, name);
667 if(!*resultList) return S_FALSE;
671 static DOMNodeType get_node_type(VARIANT Type)
673 if(V_VT(&Type) == VT_I4)
676 FIXME("Unsupported variant type %x\n", V_VT(&Type));
680 static HRESULT WINAPI domdoc_createNode(
681 IXMLDOMDocument *iface,
687 domdoc *This = impl_from_IXMLDOMDocument( iface );
688 DOMNodeType node_type;
689 xmlNodePtr xmlnode = NULL;
693 TRACE("(%p)->(type,%s,%s,%p)\n", This, debugstr_w(name), debugstr_w(namespaceURI), node);
695 node_type = get_node_type(Type);
696 TRACE("node_type %d\n", node_type);
698 xml_name = xmlChar_from_wchar((WCHAR*)name);
702 xmldoc = xmlNewDoc(NULL);
703 xmldoc->_private = 0;
704 attach_xmlnode(This->node, (xmlNodePtr) xmldoc);
710 xmlnode = xmlNewDocNode(get_doc(This), NULL, xml_name, NULL);
711 *node = create_node(xmlnode);
712 TRACE("created %p\n", xmlnode);
716 FIXME("unhandled node type %d\n", node_type);
720 HeapFree(GetProcessHeap(), 0, xml_name);
728 static HRESULT WINAPI domdoc_nodeFromID(
729 IXMLDOMDocument *iface,
737 static xmlDocPtr doparse( char *ptr, int len )
739 #ifdef HAVE_XMLREADMEMORY
741 * use xmlReadMemory if possible so we can suppress
742 * writing errors to stderr
744 return xmlReadMemory( ptr, len, NULL, NULL,
745 XML_PARSE_NOERROR | XML_PARSE_NOWARNING );
747 return xmlParseMemory( ptr, len );
751 static xmlDocPtr doread( LPWSTR filename )
753 HANDLE handle, mapping;
755 xmlDocPtr xmldoc = NULL;
758 TRACE("%s\n", debugstr_w( filename ));
760 handle = CreateFileW( filename, GENERIC_READ, FILE_SHARE_READ,
761 NULL, OPEN_EXISTING, 0, NULL );
762 if( handle == INVALID_HANDLE_VALUE )
765 len = GetFileSize( handle, NULL );
766 if( len != INVALID_FILE_SIZE || GetLastError() == NO_ERROR )
768 mapping = CreateFileMappingW( handle, NULL, PAGE_READONLY, 0, 0, NULL );
771 ptr = MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, len );
774 xmldoc = doparse( ptr, len );
775 UnmapViewOfFile( ptr );
777 CloseHandle( mapping );
780 CloseHandle( handle );
786 static HRESULT WINAPI domdoc_load(
787 IXMLDOMDocument *iface,
789 VARIANT_BOOL* isSuccessful )
791 domdoc *This = impl_from_IXMLDOMDocument( iface );
792 LPWSTR filename = NULL;
795 TRACE("type %d\n", V_VT(&xmlSource) );
797 *isSuccessful = VARIANT_FALSE;
799 assert( This->node );
801 attach_xmlnode(This->node, NULL);
803 switch( V_VT(&xmlSource) )
806 filename = V_BSTR(&xmlSource);
812 xmldoc = doread( filename );
813 if ( !xmldoc ) return S_FALSE;
815 xmldoc->_private = 0;
816 attach_xmlnode(This->node, (xmlNodePtr) xmldoc);
818 *isSuccessful = VARIANT_TRUE;
823 static HRESULT WINAPI domdoc_get_readyState(
824 IXMLDOMDocument *iface,
832 static HRESULT WINAPI domdoc_get_parseError(
833 IXMLDOMDocument *iface,
834 IXMLDOMParseError** errorObj )
836 FIXME("(%p)->(%p): creating a dummy parseError\n", iface, errorObj);
837 *errorObj = create_parseError(0, NULL, NULL, NULL, 0, 0, 0);
838 if(!*errorObj) return E_OUTOFMEMORY;
843 static HRESULT WINAPI domdoc_get_url(
844 IXMLDOMDocument *iface,
852 static HRESULT WINAPI domdoc_get_async(
853 IXMLDOMDocument *iface,
854 VARIANT_BOOL* isAsync )
856 domdoc *This = impl_from_IXMLDOMDocument( iface );
858 TRACE("%p <- %d\n", isAsync, This->async);
859 *isAsync = This->async;
864 static HRESULT WINAPI domdoc_put_async(
865 IXMLDOMDocument *iface,
866 VARIANT_BOOL isAsync )
868 domdoc *This = impl_from_IXMLDOMDocument( iface );
870 TRACE("%d\n", isAsync);
871 This->async = isAsync;
876 static HRESULT WINAPI domdoc_abort(
877 IXMLDOMDocument *iface )
884 BOOL bstr_to_utf8( BSTR bstr, char **pstr, int *plen )
886 UINT len, blen = SysStringLen( bstr );
889 len = WideCharToMultiByte( CP_UTF8, 0, bstr, blen, NULL, 0, NULL, NULL );
890 str = HeapAlloc( GetProcessHeap(), 0, len );
893 WideCharToMultiByte( CP_UTF8, 0, bstr, blen, str, len, NULL, NULL );
899 static HRESULT WINAPI domdoc_loadXML(
900 IXMLDOMDocument *iface,
902 VARIANT_BOOL* isSuccessful )
904 domdoc *This = impl_from_IXMLDOMDocument( iface );
909 TRACE("%p %s %p\n", This, debugstr_w( bstrXML ), isSuccessful );
911 assert ( This->node );
913 attach_xmlnode( This->node, NULL );
918 *isSuccessful = VARIANT_FALSE;
923 if ( !bstr_to_utf8( bstrXML, &str, &len ) )
926 xmldoc = doparse( str, len );
927 HeapFree( GetProcessHeap(), 0, str );
931 xmldoc->_private = 0;
932 attach_xmlnode( This->node, (xmlNodePtr) xmldoc );
934 *isSuccessful = VARIANT_TRUE;
939 static HRESULT WINAPI domdoc_save(
940 IXMLDOMDocument *iface,
941 VARIANT destination )
943 domdoc *This = impl_from_IXMLDOMDocument( iface );
950 TRACE("(%p)->(var(vt %x, %s))\n", This, V_VT(&destination),
951 V_VT(&destination) == VT_BSTR ? debugstr_w(V_BSTR(&destination)) : NULL);
953 if(V_VT(&destination) != VT_BSTR)
955 FIXME("Unhandled vt %x\n", V_VT(&destination));
959 handle = CreateFileW( V_BSTR(&destination), GENERIC_WRITE, 0,
960 NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
961 if( handle == INVALID_HANDLE_VALUE )
963 WARN("failed to create file\n");
967 xmlDocDumpMemory(get_doc(This), &mem, &size);
968 if(!WriteFile(handle, mem, (DWORD)size, &written, NULL) || written != (DWORD)size)
970 WARN("write error\n");
979 static HRESULT WINAPI domdoc_get_validateOnParse(
980 IXMLDOMDocument *iface,
981 VARIANT_BOOL* isValidating )
988 static HRESULT WINAPI domdoc_put_validateOnParse(
989 IXMLDOMDocument *iface,
990 VARIANT_BOOL isValidating )
997 static HRESULT WINAPI domdoc_get_resolveExternals(
998 IXMLDOMDocument *iface,
999 VARIANT_BOOL* isResolving )
1006 static HRESULT WINAPI domdoc_put_resolveExternals(
1007 IXMLDOMDocument *iface,
1008 VARIANT_BOOL isValidating )
1015 static HRESULT WINAPI domdoc_get_preserveWhiteSpace(
1016 IXMLDOMDocument *iface,
1017 VARIANT_BOOL* isPreserving )
1024 static HRESULT WINAPI domdoc_put_preserveWhiteSpace(
1025 IXMLDOMDocument *iface,
1026 VARIANT_BOOL isPreserving )
1033 static HRESULT WINAPI domdoc_put_onReadyStateChange(
1034 IXMLDOMDocument *iface,
1035 VARIANT readyStateChangeSink )
1042 static HRESULT WINAPI domdoc_put_onDataAvailable(
1043 IXMLDOMDocument *iface,
1044 VARIANT onDataAvailableSink )
1050 static HRESULT WINAPI domdoc_put_onTransformNode(
1051 IXMLDOMDocument *iface,
1052 VARIANT onTransformNodeSink )
1058 const struct IXMLDOMDocumentVtbl domdoc_vtbl =
1060 domdoc_QueryInterface,
1063 domdoc_GetTypeInfoCount,
1065 domdoc_GetIDsOfNames,
1067 domdoc_get_nodeName,
1068 domdoc_get_nodeValue,
1069 domdoc_put_nodeValue,
1070 domdoc_get_nodeType,
1071 domdoc_get_parentNode,
1072 domdoc_get_childNodes,
1073 domdoc_get_firstChild,
1074 domdoc_get_lastChild,
1075 domdoc_get_previousSibling,
1076 domdoc_get_nextSibling,
1077 domdoc_get_attributes,
1078 domdoc_insertBefore,
1079 domdoc_replaceChild,
1082 domdoc_hasChildNodes,
1083 domdoc_get_ownerDocument,
1085 domdoc_get_nodeTypeString,
1088 domdoc_get_specified,
1089 domdoc_get_definition,
1090 domdoc_get_nodeTypedValue,
1091 domdoc_put_nodeTypedValue,
1092 domdoc_get_dataType,
1093 domdoc_put_dataType,
1095 domdoc_transformNode,
1097 domdoc_selectSingleNode,
1099 domdoc_get_namespaceURI,
1101 domdoc_get_baseName,
1102 domdoc_transformNodeToObject,
1104 domdoc_get_implementation,
1105 domdoc_get_documentElement,
1106 domdoc_documentElement,
1107 domdoc_createElement,
1108 domdoc_createDocumentFragment,
1109 domdoc_createTextNode,
1110 domdoc_createComment,
1111 domdoc_createCDATASection,
1112 domdoc_createProcessingInstruction,
1113 domdoc_createAttribute,
1114 domdoc_createEntityReference,
1115 domdoc_getElementsByTagName,
1119 domdoc_get_readyState,
1120 domdoc_get_parseError,
1127 domdoc_get_validateOnParse,
1128 domdoc_put_validateOnParse,
1129 domdoc_get_resolveExternals,
1130 domdoc_put_resolveExternals,
1131 domdoc_get_preserveWhiteSpace,
1132 domdoc_put_preserveWhiteSpace,
1133 domdoc_put_onReadyStateChange,
1134 domdoc_put_onDataAvailable,
1135 domdoc_put_onTransformNode,
1138 HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj)
1143 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
1145 doc = HeapAlloc( GetProcessHeap(), 0, sizeof (*doc) );
1147 return E_OUTOFMEMORY;
1149 doc->lpVtbl = &domdoc_vtbl;
1153 doc->node_unk = create_basic_node( NULL, (IUnknown*)&doc->lpVtbl );
1156 HeapFree(GetProcessHeap(), 0, doc);
1160 hr = IUnknown_QueryInterface(doc->node_unk, &IID_IXMLDOMNode, (LPVOID*)&doc->node);
1163 IUnknown_Release(doc->node_unk);
1164 HeapFree( GetProcessHeap(), 0, doc );
1167 /* The ref on doc->node is actually looped back into this object, so release it */
1168 IXMLDOMNode_Release(doc->node);
1170 *ppObj = &doc->lpVtbl;
1172 TRACE("returning iface %p\n", *ppObj);
1178 HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj)
1180 MESSAGE("This program tried to use a DOMDocument object, but\n"
1181 "libxml2 support was not present at compile time.\n");