From 3b5c2221ccdec11857dff1df58480d4454c40752 Mon Sep 17 00:00:00 2001 From: Mike McCormack Date: Wed, 3 Aug 2005 10:58:47 +0000 Subject: [PATCH] Implemented the IXMLDOMElement interface. --- dlls/msxml3/Makefile.in | 1 + dlls/msxml3/domdoc.c | 9 +- dlls/msxml3/element.c | 568 ++++++++++++++++++++++++++++++++++++ dlls/msxml3/msxml_private.h | 8 + 4 files changed, 582 insertions(+), 4 deletions(-) create mode 100644 dlls/msxml3/element.c diff --git a/dlls/msxml3/Makefile.in b/dlls/msxml3/Makefile.in index 995eca811c3..5fbe50cc6d1 100644 --- a/dlls/msxml3/Makefile.in +++ b/dlls/msxml3/Makefile.in @@ -10,6 +10,7 @@ EXTRAINCL = @XML2INCL@ C_SRCS = \ domdoc.c \ + element.c \ factory.c \ main.c diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 69d9dea2fea..0f2812de6e8 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -39,8 +39,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml); #ifdef HAVE_LIBXML2 -#include - typedef struct _domdoc { const struct IXMLDOMDocumentVtbl *lpVtbl; @@ -501,8 +499,11 @@ static HRESULT WINAPI domdoc_get_documentElement( IXMLDOMDocument *iface, IXMLDOMElement** DOMElement ) { - FIXME("\n"); - return E_NOTIMPL; + domdoc *This = impl_from_IXMLDOMDocument( iface ); + + FIXME("%p\n", This); + + return DOMElement_create(DOMElement, This->xmldoc); } diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c new file mode 100644 index 00000000000..5f210802d8b --- /dev/null +++ b/dlls/msxml3/element.c @@ -0,0 +1,568 @@ +/* + * DOM Document implementation + * + * Copyright 2005 Mike McCormack + * + * iface library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * iface library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define COBJMACROS + +#include "config.h" + +#include +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" +#include "ocidl.h" +#include "msxml.h" +#include "xmldom.h" +#include "msxml.h" + +#include "msxml_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msxml); + +typedef struct _domelem +{ + const struct IXMLDOMElementVtbl *lpVtbl; + LONG ref; + xmlDocPtr xmldoc; +} domelem; + +static inline domelem *impl_from_IXMLDOMElement( IXMLDOMElement *iface ) +{ + return (domelem *)((char*)iface - FIELD_OFFSET(domelem, lpVtbl)); +} + +static HRESULT WINAPI domelem_QueryInterface( + IXMLDOMElement *iface, + REFIID riid, + void** ppvObject ) +{ + TRACE("%p %p %p\n", iface, debugstr_guid(riid), ppvObject); + + if ( IsEqualGUID( riid, &IID_IXMLDOMElement ) || + IsEqualGUID( riid, &IID_IUnknown ) || + IsEqualGUID( riid, &IID_IDispatch ) || + IsEqualGUID( riid, &IID_IXMLDOMNode ) ) + { + *ppvObject = iface; + } + else + return E_NOINTERFACE; + + IXMLDOMElement_AddRef( iface ); + + return S_OK; +} + +static ULONG WINAPI domelem_AddRef( + IXMLDOMElement *iface ) +{ + domelem *This = impl_from_IXMLDOMElement( iface ); + return InterlockedIncrement( &This->ref ); +} + +static ULONG WINAPI domelem_Release( + IXMLDOMElement *iface ) +{ + domelem *This = impl_from_IXMLDOMElement( iface ); + ULONG ref; + + ref = InterlockedDecrement( &This->ref ); + if ( ref == 0 ) + { + HeapFree( GetProcessHeap(), 0, This ); + } + + return ref; +} + +static HRESULT WINAPI domelem_GetTypeInfoCount( + IXMLDOMElement *iface, + UINT* pctinfo ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_GetTypeInfo( + IXMLDOMElement *iface, + UINT iTInfo, LCID lcid, + ITypeInfo** ppTInfo ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_GetIDsOfNames( + IXMLDOMElement *iface, + REFIID riid, LPOLESTR* rgszNames, + UINT cNames, LCID lcid, DISPID* rgDispId ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_Invoke( + IXMLDOMElement *iface, + DISPID dispIdMember, REFIID riid, LCID lcid, + WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, + EXCEPINFO* pExcepInfo, UINT* puArgErr ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_nodeName( + IXMLDOMElement *iface, + BSTR* p ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_nodeValue( + IXMLDOMElement *iface, + VARIANT* var1 ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_put_nodeValue( + IXMLDOMElement *iface, + VARIANT var1 ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_nodeType( + IXMLDOMElement *iface, + DOMNodeType* domNodeType ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_parentNode( + IXMLDOMElement *iface, + IXMLDOMNode** parent ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_childNodes( + IXMLDOMElement *iface, + IXMLDOMNodeList** outList) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_firstChild( + IXMLDOMElement *iface, + IXMLDOMNode** domNode) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_lastChild( + IXMLDOMElement *iface, + IXMLDOMNode** domNode) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_previousSibling( + IXMLDOMElement *iface, + IXMLDOMNode** domNode) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_nextSibling( + IXMLDOMElement *iface, + IXMLDOMNode** domNode) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_attributes( + IXMLDOMElement *iface, + IXMLDOMNamedNodeMap** attributeMap) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_insertBefore( + IXMLDOMElement *iface, + IXMLDOMNode* newNode, VARIANT var1, + IXMLDOMNode** outOldNode) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_replaceChild( + IXMLDOMElement *iface, + IXMLDOMNode* newNode, + IXMLDOMNode* oldNode, + IXMLDOMNode** outOldNode) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_removeChild( + IXMLDOMElement *iface, + IXMLDOMNode* domNode, IXMLDOMNode** oldNode) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_appendChild( + IXMLDOMElement *iface, + IXMLDOMNode* newNode, IXMLDOMNode** outNewNode) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_hasChildNodes( + IXMLDOMElement *iface, + VARIANT_BOOL* pbool) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_ownerDocument( + IXMLDOMElement *iface, + IXMLDOMDocument** domDocument) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_cloneNode( + IXMLDOMElement *iface, + VARIANT_BOOL pbool, IXMLDOMNode** outNode) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_nodeTypeString( + IXMLDOMElement *iface, + BSTR* p) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_text( + IXMLDOMElement *iface, + BSTR* p) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_put_text( + IXMLDOMElement *iface, + BSTR p) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_specified( + IXMLDOMElement *iface, + VARIANT_BOOL* pbool) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_definition( + IXMLDOMElement *iface, + IXMLDOMNode** domNode) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_nodeTypedValue( + IXMLDOMElement *iface, + VARIANT* var1) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_put_nodeTypedValue( + IXMLDOMElement *iface, + VARIANT var1) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_dataType( + IXMLDOMElement *iface, + VARIANT* var1) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_put_dataType( + IXMLDOMElement *iface, + BSTR p) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_xml( + IXMLDOMElement *iface, + BSTR* p) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_transformNode( + IXMLDOMElement *iface, + IXMLDOMNode* domNode, BSTR* p) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_selectNodes( + IXMLDOMElement *iface, + BSTR p, IXMLDOMNodeList** outList) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_selectSingleNode( + IXMLDOMElement *iface, + BSTR p, IXMLDOMNode** outNode) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_parsed( + IXMLDOMElement *iface, + VARIANT_BOOL* pbool) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_namespaceURI( + IXMLDOMElement *iface, + BSTR* p) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_prefix( + IXMLDOMElement *iface, + BSTR* p) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_baseName( + IXMLDOMElement *iface, + BSTR* p) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_transformNodeToObject( + IXMLDOMElement *iface, + IXMLDOMNode* domNode, VARIANT var1) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_get_tagName( + IXMLDOMElement *iface, + BSTR* p) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_getAttribute( + IXMLDOMElement *iface, + BSTR p, VARIANT* var) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_setAttribute( + IXMLDOMElement *iface, + BSTR p, VARIANT var) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_removeAttribute( + IXMLDOMElement *iface, + BSTR p) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_getAttributeNode( + IXMLDOMElement *iface, + BSTR p, IXMLDOMAttribute** attributeNode ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_setAttributeNode( + IXMLDOMElement *iface, + IXMLDOMAttribute* domAttribute, + IXMLDOMAttribute** attributeNode) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_removeAttributeNode( + IXMLDOMElement *iface, + IXMLDOMAttribute* domAttribute, + IXMLDOMAttribute** attributeNode) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_getElementsByTagName( + IXMLDOMElement *iface, + BSTR p, IXMLDOMNodeList** resultList) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI domelem_normalize( + IXMLDOMElement *iface ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +const struct IXMLDOMElementVtbl domelem_vtbl = +{ + domelem_QueryInterface, + domelem_AddRef, + domelem_Release, + domelem_GetTypeInfoCount, + domelem_GetTypeInfo, + domelem_GetIDsOfNames, + domelem_Invoke, + domelem_get_nodeName, + domelem_get_nodeValue, + domelem_put_nodeValue, + domelem_get_nodeType, + domelem_get_parentNode, + domelem_get_childNodes, + domelem_get_firstChild, + domelem_get_lastChild, + domelem_get_previousSibling, + domelem_get_nextSibling, + domelem_get_attributes, + domelem_insertBefore, + domelem_replaceChild, + domelem_removeChild, + domelem_appendChild, + domelem_hasChildNodes, + domelem_get_ownerDocument, + domelem_cloneNode, + domelem_get_nodeTypeString, + domelem_get_text, + domelem_put_text, + domelem_get_specified, + domelem_get_definition, + domelem_get_nodeTypedValue, + domelem_put_nodeTypedValue, + domelem_get_dataType, + domelem_put_dataType, + domelem_get_xml, + domelem_transformNode, + domelem_selectNodes, + domelem_selectSingleNode, + domelem_get_parsed, + domelem_get_namespaceURI, + domelem_get_prefix, + domelem_get_baseName, + domelem_transformNodeToObject, + domelem_get_tagName, + domelem_getAttribute, + domelem_setAttribute, + domelem_removeAttribute, + domelem_getAttributeNode, + domelem_setAttributeNode, + domelem_removeAttributeNode, + domelem_getElementsByTagName, + domelem_normalize, +}; + +HRESULT DOMElement_create( IXMLDOMElement** DOMElement, xmlDocPtr xmldoc ) +{ + domelem *elem; + + elem = HeapAlloc( GetProcessHeap(), 0, sizeof *elem ); + if( !elem ) + return E_OUTOFMEMORY; + + elem->lpVtbl = &domelem_vtbl; + elem->xmldoc = xmldoc; + elem->ref = 1; + + *DOMElement = (IXMLDOMElement*) &elem->lpVtbl; + + return S_OK; +} diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 9da8670e87e..cf5f70170d8 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -21,6 +21,14 @@ #ifndef __MSXML_PRIVATE__ #define __MSXML_PRIVATE__ +#ifdef HAVE_LIBXML_PARSER_H + +#include + +extern HRESULT DOMElement_create( IXMLDOMElement** DOMElement, xmlDocPtr xmldoc ); + +#endif + extern HRESULT DOMDocument_create( IUnknown *pUnkOuter, LPVOID *ppObj ); #endif /* __MSXML_PRIVATE__ */