From 23e9a042c070d763f521ef95a27317fba4c6a7a4 Mon Sep 17 00:00:00 2001 From: Mike McCormack Date: Fri, 19 Aug 2005 15:18:05 +0000 Subject: [PATCH] Implement the IXMLDOMNodeList interface for IXMLDOMNode::get_childNodes. --- dlls/msxml3/Makefile.in | 1 + dlls/msxml3/node.c | 6 +- dlls/msxml3/nodelist.c | 226 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 229 insertions(+), 4 deletions(-) create mode 100644 dlls/msxml3/nodelist.c diff --git a/dlls/msxml3/Makefile.in b/dlls/msxml3/Makefile.in index 14517f3e6ba..80dd36d6696 100644 --- a/dlls/msxml3/Makefile.in +++ b/dlls/msxml3/Makefile.in @@ -14,6 +14,7 @@ C_SRCS = \ factory.c \ main.c \ node.c \ + nodelist.c \ nodemap.c SUBDIRS = tests diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 479ad474a5e..dcb17b80f5b 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -292,12 +292,10 @@ static HRESULT WINAPI xmlnode_get_childNodes( if ( !childList ) return E_INVALIDARG; -#if 0 *childList = create_nodelist( This->node->children ); + if (!*childList) + return S_FALSE; return S_OK; -#else - return E_NOTIMPL; -#endif } static HRESULT WINAPI xmlnode_get_firstChild( diff --git a/dlls/msxml3/nodelist.c b/dlls/msxml3/nodelist.c new file mode 100644 index 00000000000..17ae49b9a6d --- /dev/null +++ b/dlls/msxml3/nodelist.c @@ -0,0 +1,226 @@ +/* + * Node list 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 "winnls.h" +#include "ole2.h" +#include "ocidl.h" +#include "msxml.h" +#include "xmldom.h" +#include "msxml.h" + +#include "msxml_private.h" + +#include "wine/debug.h" + +#ifdef HAVE_LIBXML2 + +WINE_DEFAULT_DEBUG_CHANNEL(msxml); + +typedef struct _xmlnodelist +{ + const struct IXMLDOMNodeListVtbl *lpVtbl; + LONG ref; + xmlNodePtr node; + xmlNodePtr current; +} xmlnodelist; + +static inline xmlnodelist *impl_from_IXMLDOMNodeList( IXMLDOMNodeList *iface ) +{ + return (xmlnodelist *)((char*)iface - FIELD_OFFSET(xmlnodelist, lpVtbl)); +} + +static HRESULT WINAPI xmlnodelist_QueryInterface( + IXMLDOMNodeList *iface, + REFIID riid, + void** ppvObject ) +{ + TRACE("%p %p %p\n", iface, debugstr_guid(riid), ppvObject); + + if ( IsEqualGUID( riid, &IID_IUnknown ) || + IsEqualGUID( riid, &IID_IDispatch ) || + IsEqualGUID( riid, &IID_IXMLDOMNodeList ) ) + { + *ppvObject = iface; + } + else + return E_NOINTERFACE; + + IXMLDOMNodeList_AddRef( iface ); + + return S_OK; +} + +static ULONG WINAPI xmlnodelist_AddRef( + IXMLDOMNodeList *iface ) +{ + xmlnodelist *This = impl_from_IXMLDOMNodeList( iface ); + return InterlockedIncrement( &This->ref ); +} + +static ULONG WINAPI xmlnodelist_Release( + IXMLDOMNodeList *iface ) +{ + xmlnodelist *This = impl_from_IXMLDOMNodeList( iface ); + ULONG ref; + + ref = InterlockedDecrement( &This->ref ); + if ( ref == 0 ) + { + HeapFree( GetProcessHeap(), 0, This ); + } + + return ref; +} + +static HRESULT WINAPI xmlnodelist_GetTypeInfoCount( + IXMLDOMNodeList *iface, + UINT* pctinfo ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI xmlnodelist_GetTypeInfo( + IXMLDOMNodeList *iface, + UINT iTInfo, + LCID lcid, + ITypeInfo** ppTInfo ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI xmlnodelist_GetIDsOfNames( + IXMLDOMNodeList *iface, + REFIID riid, + LPOLESTR* rgszNames, + UINT cNames, + LCID lcid, + DISPID* rgDispId ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI xmlnodelist_Invoke( + IXMLDOMNodeList *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 xmlnodelist_get_item( + IXMLDOMNodeList* iface, + long index, + IXMLDOMNode** listItem) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI xmlnodelist_get_length( + IXMLDOMNodeList* iface, + long* listLength) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI xmlnodelist_nextNode( + IXMLDOMNodeList* iface, + IXMLDOMNode** nextItem) +{ + xmlnodelist *This = impl_from_IXMLDOMNodeList( iface ); + + TRACE("%p %p\n", This, nextItem ); + + if (!This->current) + return S_FALSE; + + *nextItem = create_node( This->current ); + This->current = This->current->next; + return S_OK; +} + +static HRESULT WINAPI xmlnodelist_reset( + IXMLDOMNodeList* iface) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI xmlnodelist__newEnum( + IXMLDOMNodeList* iface, + IUnknown** ppUnk) +{ + FIXME("\n"); + return E_NOTIMPL; +} + + +static const struct IXMLDOMNodeListVtbl xmlnodelist_vtbl = +{ + xmlnodelist_QueryInterface, + xmlnodelist_AddRef, + xmlnodelist_Release, + xmlnodelist_GetTypeInfoCount, + xmlnodelist_GetTypeInfo, + xmlnodelist_GetIDsOfNames, + xmlnodelist_Invoke, + xmlnodelist_get_item, + xmlnodelist_get_length, + xmlnodelist_nextNode, + xmlnodelist_reset, + xmlnodelist__newEnum, +}; + +IXMLDOMNodeList* create_nodelist( xmlNodePtr node ) +{ + xmlnodelist *nodelist; + + nodelist = HeapAlloc( GetProcessHeap(), 0, sizeof *nodelist ); + if ( !nodelist ) + return NULL; + + nodelist->lpVtbl = &xmlnodelist_vtbl; + nodelist->ref = 1; + nodelist->node = node; + nodelist->current = node; + + return (IXMLDOMNodeList*) &nodelist->lpVtbl; +} + +#endif