2 * DOM Document implementation
4 * Copyright 2005 Mike McCormack
6 * iface 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 * iface 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
35 #include "wine/debug.h"
37 #include "msxml_private.h"
39 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
43 typedef struct _domdoc
45 const struct IXMLDOMDocumentVtbl *lpVtbl;
51 static inline domdoc *impl_from_IXMLDOMDocument( IXMLDOMDocument *iface )
53 return (domdoc *)((char*)iface - FIELD_OFFSET(domdoc, lpVtbl));
56 static HRESULT WINAPI domdoc_QueryInterface( IXMLDOMDocument *iface, REFIID riid, void** ppvObject )
58 domdoc *This = impl_from_IXMLDOMDocument( iface );
60 TRACE("%p %p %p\n", This, debugstr_guid( riid ), ppvObject );
62 if ( IsEqualGUID( riid, &IID_IXMLDOMDocument ) ||
63 IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
64 IsEqualGUID( riid, &IID_IDispatch ) ||
65 IsEqualGUID( riid, &IID_IUnknown ) )
72 IXMLDOMDocument_AddRef( iface );
78 static ULONG WINAPI domdoc_AddRef(
79 IXMLDOMDocument *iface )
81 domdoc *This = impl_from_IXMLDOMDocument( iface );
83 return InterlockedIncrement( &This->ref );
87 static ULONG WINAPI domdoc_Release(
88 IXMLDOMDocument *iface )
90 domdoc *This = impl_from_IXMLDOMDocument( iface );
95 ref = InterlockedDecrement( &This->ref );
98 IXMLDOMElement_Release( This->node );
99 HeapFree( GetProcessHeap(), 0, This );
105 static HRESULT WINAPI domdoc_GetTypeInfoCount( IXMLDOMDocument *iface, UINT* pctinfo )
111 static HRESULT WINAPI domdoc_GetTypeInfo(
112 IXMLDOMDocument *iface,
113 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
119 static HRESULT WINAPI domdoc_GetIDsOfNames(
120 IXMLDOMDocument *iface,
132 static HRESULT WINAPI domdoc_Invoke(
133 IXMLDOMDocument *iface,
138 DISPPARAMS* pDispParams,
140 EXCEPINFO* pExcepInfo,
148 static HRESULT WINAPI domdoc_get_nodeName(
149 IXMLDOMDocument *iface,
157 static HRESULT WINAPI domdoc_get_nodeValue(
158 IXMLDOMDocument *iface,
166 static HRESULT WINAPI domdoc_put_nodeValue(
167 IXMLDOMDocument *iface,
175 static HRESULT WINAPI domdoc_get_nodeType(
176 IXMLDOMDocument *iface,
184 static HRESULT WINAPI domdoc_get_parentNode(
185 IXMLDOMDocument *iface,
186 IXMLDOMNode** parent )
193 static HRESULT WINAPI domdoc_get_childNodes(
194 IXMLDOMDocument *iface,
195 IXMLDOMNodeList** childList )
202 static HRESULT WINAPI domdoc_get_firstChild(
203 IXMLDOMDocument *iface,
204 IXMLDOMNode** firstChild )
211 static HRESULT WINAPI domdoc_get_lastChild(
212 IXMLDOMDocument *iface,
213 IXMLDOMNode** lastChild )
220 static HRESULT WINAPI domdoc_get_previousSibling(
221 IXMLDOMDocument *iface,
222 IXMLDOMNode** previousSibling )
229 static HRESULT WINAPI domdoc_get_nextSibling(
230 IXMLDOMDocument *iface,
231 IXMLDOMNode** nextSibling )
238 static HRESULT WINAPI domdoc_get_attributes(
239 IXMLDOMDocument *iface,
240 IXMLDOMNamedNodeMap** attributeMap )
247 static HRESULT WINAPI domdoc_insertBefore(
248 IXMLDOMDocument *iface,
249 IXMLDOMNode* newChild,
251 IXMLDOMNode** outNewChild )
258 static HRESULT WINAPI domdoc_replaceChild(
259 IXMLDOMDocument *iface,
260 IXMLDOMNode* newChild,
261 IXMLDOMNode* oldChild,
262 IXMLDOMNode** outOldChild)
269 static HRESULT WINAPI domdoc_removeChild(
270 IXMLDOMDocument *iface,
271 IXMLDOMNode* childNode,
272 IXMLDOMNode** oldChild)
279 static HRESULT WINAPI domdoc_appendChild(
280 IXMLDOMDocument *iface,
281 IXMLDOMNode* newChild,
282 IXMLDOMNode** outNewChild)
289 static HRESULT WINAPI domdoc_hasChildNodes(
290 IXMLDOMDocument *iface,
291 VARIANT_BOOL* hasChild)
298 static HRESULT WINAPI domdoc_get_ownerDocument(
299 IXMLDOMDocument *iface,
300 IXMLDOMDocument** DOMDocument)
307 static HRESULT WINAPI domdoc_cloneNode(
308 IXMLDOMDocument *iface,
310 IXMLDOMNode** cloneRoot)
317 static HRESULT WINAPI domdoc_get_nodeTypeString(
318 IXMLDOMDocument *iface,
326 static HRESULT WINAPI domdoc_get_text(
327 IXMLDOMDocument *iface,
335 static HRESULT WINAPI domdoc_put_text(
336 IXMLDOMDocument *iface,
344 static HRESULT WINAPI domdoc_get_specified(
345 IXMLDOMDocument *iface,
346 VARIANT_BOOL* isSpecified )
353 static HRESULT WINAPI domdoc_get_definition(
354 IXMLDOMDocument *iface,
355 IXMLDOMNode** definitionNode )
362 static HRESULT WINAPI domdoc_get_nodeTypedValue(
363 IXMLDOMDocument *iface,
364 VARIANT* typedValue )
370 static HRESULT WINAPI domdoc_put_nodeTypedValue(
371 IXMLDOMDocument *iface,
379 static HRESULT WINAPI domdoc_get_dataType(
380 IXMLDOMDocument *iface,
381 VARIANT* dataTypeName )
388 static HRESULT WINAPI domdoc_put_dataType(
389 IXMLDOMDocument *iface,
397 static HRESULT WINAPI domdoc_get_xml(
398 IXMLDOMDocument *iface,
406 static HRESULT WINAPI domdoc_transformNode(
407 IXMLDOMDocument *iface,
408 IXMLDOMNode* styleSheet,
416 static HRESULT WINAPI domdoc_selectNodes(
417 IXMLDOMDocument *iface,
419 IXMLDOMNodeList** resultList )
426 static HRESULT WINAPI domdoc_selectSingleNode(
427 IXMLDOMDocument *iface,
429 IXMLDOMNode** resultNode )
436 static HRESULT WINAPI domdoc_get_parsed(
437 IXMLDOMDocument *iface,
438 VARIANT_BOOL* isParsed )
445 static HRESULT WINAPI domdoc_get_namespaceURI(
446 IXMLDOMDocument *iface,
454 static HRESULT WINAPI domdoc_get_prefix(
455 IXMLDOMDocument *iface,
463 static HRESULT WINAPI domdoc_get_baseName(
464 IXMLDOMDocument *iface,
472 static HRESULT WINAPI domdoc_transformNodeToObject(
473 IXMLDOMDocument *iface,
474 IXMLDOMNode* stylesheet,
475 VARIANT outputObject)
482 static HRESULT WINAPI domdoc_get_doctype(
483 IXMLDOMDocument *iface,
484 IXMLDOMDocument** documentType )
491 static HRESULT WINAPI domdoc_get_implementation(
492 IXMLDOMDocument *iface,
493 IXMLDOMImplementation** impl )
499 static HRESULT WINAPI domdoc_get_documentElement(
500 IXMLDOMDocument *iface,
501 IXMLDOMElement** DOMElement )
503 domdoc *This = impl_from_IXMLDOMDocument( iface );
504 xmlDocPtr xmldoc = NULL;
505 xmlNodePtr root = NULL;
514 xmldoc = xmldoc_from_xmlnode( This->node );
518 root = xmlDocGetRootElement( xmldoc );
522 *DOMElement = create_element( root );
528 static HRESULT WINAPI domdoc_documentElement(
529 IXMLDOMDocument *iface,
530 IXMLDOMElement* DOMElement )
537 static HRESULT WINAPI domdoc_createElement(
538 IXMLDOMDocument *iface,
540 IXMLDOMElement** element )
547 static HRESULT WINAPI domdoc_createDocumentFragment(
548 IXMLDOMDocument *iface,
549 IXMLDOMDocumentFragment** docFrag )
556 static HRESULT WINAPI domdoc_createTextNode(
557 IXMLDOMDocument *iface,
566 static HRESULT WINAPI domdoc_createComment(
567 IXMLDOMDocument *iface,
569 IXMLDOMComment** comment )
576 static HRESULT WINAPI domdoc_createCDATASection(
577 IXMLDOMDocument *iface,
579 IXMLDOMCDATASection** cdata )
586 static HRESULT WINAPI domdoc_createProcessingInstruction(
587 IXMLDOMDocument *iface,
590 IXMLDOMProcessingInstruction** pi )
597 static HRESULT WINAPI domdoc_createAttribute(
598 IXMLDOMDocument *iface,
600 IXMLDOMAttribute** attribute )
607 static HRESULT WINAPI domdoc_createEntityReference(
608 IXMLDOMDocument *iface,
610 IXMLDOMEntityReference** entityRef )
617 static HRESULT WINAPI domdoc_getElementsByTagName(
618 IXMLDOMDocument *iface,
620 IXMLDOMNodeList** resultList )
627 static HRESULT WINAPI domdoc_createNode(
628 IXMLDOMDocument *iface,
639 static HRESULT WINAPI domdoc_nodeFromID(
640 IXMLDOMDocument *iface,
648 static xmlDocPtr doread( LPWSTR filename )
650 HANDLE handle, mapping;
652 xmlDocPtr xmldoc = NULL;
655 TRACE("%s\n", debugstr_w( filename ));
657 handle = CreateFileW( filename, GENERIC_READ, FILE_SHARE_READ,
658 NULL, OPEN_EXISTING, 0, NULL );
659 if( handle == INVALID_HANDLE_VALUE )
662 len = GetFileSize( handle, NULL );
663 if( len != INVALID_FILE_SIZE || GetLastError() == NO_ERROR )
665 mapping = CreateFileMappingW( handle, NULL, PAGE_READONLY, 0, 0, NULL );
668 ptr = MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, len );
671 xmldoc = xmlParseMemory( ptr, len );
672 UnmapViewOfFile( ptr );
674 CloseHandle( mapping );
677 CloseHandle( handle );
683 static HRESULT WINAPI domdoc_load(
684 IXMLDOMDocument *iface,
686 VARIANT_BOOL* isSuccessful )
688 domdoc *This = impl_from_IXMLDOMDocument( iface );
689 LPWSTR filename = NULL;
692 TRACE("type %d\n", V_VT(&xmlSource) );
696 IXMLDOMNode_Release( This->node );
700 switch( V_VT(&xmlSource) )
703 filename = V_BSTR(&xmlSource);
709 xmldoc = doread( filename );
713 This->node = create_domdoc_node( xmldoc );
716 *isSuccessful = VARIANT_FALSE;
720 *isSuccessful = VARIANT_TRUE;
725 static HRESULT WINAPI domdoc_get_readyState(
726 IXMLDOMDocument *iface,
734 static HRESULT WINAPI domdoc_get_parseError(
735 IXMLDOMDocument *iface,
736 IXMLDOMParseError** errorObj )
743 static HRESULT WINAPI domdoc_get_url(
744 IXMLDOMDocument *iface,
752 static HRESULT WINAPI domdoc_get_async(
753 IXMLDOMDocument *iface,
754 VARIANT_BOOL* isAsync )
756 domdoc *This = impl_from_IXMLDOMDocument( iface );
758 TRACE("%p <- %d\n", isAsync, This->async);
759 *isAsync = This->async;
764 static HRESULT WINAPI domdoc_put_async(
765 IXMLDOMDocument *iface,
766 VARIANT_BOOL isAsync )
768 domdoc *This = impl_from_IXMLDOMDocument( iface );
770 TRACE("%d\n", isAsync);
771 This->async = isAsync;
776 static HRESULT WINAPI domdoc_abort(
777 IXMLDOMDocument *iface )
784 static HRESULT WINAPI domdoc_loadXML(
785 IXMLDOMDocument *iface,
787 VARIANT_BOOL* isSuccessful )
794 static HRESULT WINAPI domdoc_save(
795 IXMLDOMDocument *iface,
796 VARIANT destination )
802 static HRESULT WINAPI domdoc_get_validateOnParse(
803 IXMLDOMDocument *iface,
804 VARIANT_BOOL* isValidating )
811 static HRESULT WINAPI domdoc_put_validateOnParse(
812 IXMLDOMDocument *iface,
813 VARIANT_BOOL isValidating )
820 static HRESULT WINAPI domdoc_get_resolveExternals(
821 IXMLDOMDocument *iface,
822 VARIANT_BOOL* isResolving )
829 static HRESULT WINAPI domdoc_put_resolveExternals(
830 IXMLDOMDocument *iface,
831 VARIANT_BOOL isValidating )
838 static HRESULT WINAPI domdoc_get_preserveWhiteSpace(
839 IXMLDOMDocument *iface,
840 VARIANT_BOOL* isPreserving )
847 static HRESULT WINAPI domdoc_put_preserveWhiteSpace(
848 IXMLDOMDocument *iface,
849 VARIANT_BOOL isPreserving )
856 static HRESULT WINAPI domdoc_put_onReadyStateChange(
857 IXMLDOMDocument *iface,
858 VARIANT readyStateChangeSink )
865 static HRESULT WINAPI domdoc_put_onDataAvailable(
866 IXMLDOMDocument *iface,
867 VARIANT onDataAvailableSink )
873 static HRESULT WINAPI domdoc_put_onTransformNode(
874 IXMLDOMDocument *iface,
875 VARIANT onTransformNodeSink )
881 const struct IXMLDOMDocumentVtbl domdoc_vtbl =
883 domdoc_QueryInterface,
886 domdoc_GetTypeInfoCount,
888 domdoc_GetIDsOfNames,
891 domdoc_get_nodeValue,
892 domdoc_put_nodeValue,
894 domdoc_get_parentNode,
895 domdoc_get_childNodes,
896 domdoc_get_firstChild,
897 domdoc_get_lastChild,
898 domdoc_get_previousSibling,
899 domdoc_get_nextSibling,
900 domdoc_get_attributes,
905 domdoc_hasChildNodes,
906 domdoc_get_ownerDocument,
908 domdoc_get_nodeTypeString,
911 domdoc_get_specified,
912 domdoc_get_definition,
913 domdoc_get_nodeTypedValue,
914 domdoc_put_nodeTypedValue,
918 domdoc_transformNode,
920 domdoc_selectSingleNode,
922 domdoc_get_namespaceURI,
925 domdoc_transformNodeToObject,
927 domdoc_get_implementation,
928 domdoc_get_documentElement,
929 domdoc_documentElement,
930 domdoc_createElement,
931 domdoc_createDocumentFragment,
932 domdoc_createTextNode,
933 domdoc_createComment,
934 domdoc_createCDATASection,
935 domdoc_createProcessingInstruction,
936 domdoc_createAttribute,
937 domdoc_createEntityReference,
938 domdoc_getElementsByTagName,
942 domdoc_get_readyState,
943 domdoc_get_parseError,
950 domdoc_get_validateOnParse,
951 domdoc_put_validateOnParse,
952 domdoc_get_resolveExternals,
953 domdoc_put_resolveExternals,
954 domdoc_get_preserveWhiteSpace,
955 domdoc_put_preserveWhiteSpace,
956 domdoc_put_onReadyStateChange,
957 domdoc_put_onDataAvailable,
958 domdoc_put_onTransformNode,
961 HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj)
965 doc = HeapAlloc( GetProcessHeap(), 0, sizeof (*doc) );
967 return E_OUTOFMEMORY;
969 doc->lpVtbl = &domdoc_vtbl;
974 *ppObj = &doc->lpVtbl;
981 HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj)
983 MESSAGE("This program tried to use a DOMDocument object, but\n"
984 "libxml2 support was not present at compile time.\n");