[PATCH] Implement IXMLDOMImplementation Interface
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Fri Jan 18 03:33:03 CST 2008
---
dlls/msxml3/Makefile.in | 1 +
dlls/msxml3/domdoc.c | 8 ++-
dlls/msxml3/domimpl.c | 188 +++++++++++++++++++++++++++++++++++++++++++
dlls/msxml3/msxml_private.h | 1 +
dlls/msxml3/tests/domdoc.c | 56 +++++++++++++
5 files changed, 252 insertions(+), 2 deletions(-)
create mode 100644 dlls/msxml3/domimpl.c
diff --git a/dlls/msxml3/Makefile.in b/dlls/msxml3/Makefile.in
index 20a7b40..1075e96 100644
--- a/dlls/msxml3/Makefile.in
+++ b/dlls/msxml3/Makefile.in
@@ -13,6 +13,7 @@ C_SRCS = \
cdata.c \
comment.c \
domdoc.c \
+ domimpl.c \
element.c \
factory.c \
main.c \
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index b294eed..4f05484 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -804,8 +804,12 @@ static HRESULT WINAPI domdoc_get_implementation(
IXMLDOMDocument2 *iface,
IXMLDOMImplementation** impl )
{
- FIXME("\n");
- return E_NOTIMPL;
+ if(!impl)
+ return E_INVALIDARG;
+
+ *impl = (IXMLDOMImplementation*)create_doc_Implementation();
+
+ return S_OK;
}
static HRESULT WINAPI domdoc_get_documentElement(
diff --git a/dlls/msxml3/domimpl.c b/dlls/msxml3/domimpl.c
new file mode 100644
index 0000000..3682e5d
--- /dev/null
+++ b/dlls/msxml3/domimpl.c
@@ -0,0 +1,188 @@
+/*
+ * DOM Document Implementation implementation
+ *
+ * Copyright 2007 Alistair Leslie-Hughes
+ *
+ * This 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.
+ *
+ * This 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define COBJMACROS
+
+#include "config.h"
+
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "ole2.h"
+#include "msxml2.h"
+
+#include "msxml_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(msxml);
+
+#ifdef HAVE_LIBXML2
+
+typedef struct _domimpl
+{
+ const struct IXMLDOMImplementationVtbl *lpVtbl;
+ LONG ref;
+} domimpl;
+
+static inline domimpl *impl_from_IXMLDOMImplementation( IXMLDOMImplementation *iface )
+{
+ return (domimpl *)((char*)iface - FIELD_OFFSET(domimpl, lpVtbl));
+}
+
+static HRESULT WINAPI dimimpl_QueryInterface(
+ IXMLDOMImplementation *iface,
+ REFIID riid,
+ void** ppvObject )
+{
+ domimpl *This = impl_from_IXMLDOMImplementation( iface );
+ TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
+
+ if ( IsEqualGUID( riid, &IID_IXMLDOMImplementation ) ||
+ IsEqualGUID( riid, &IID_IDispatch ) ||
+ IsEqualGUID( riid, &IID_IUnknown ) )
+ {
+ *ppvObject = iface;
+ }
+ else
+ {
+ FIXME("Unsupported inteferace %s\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
+
+ IXMLDOMImplementation_AddRef( iface );
+
+ return S_OK;
+}
+
+static ULONG WINAPI dimimpl_AddRef(
+ IXMLDOMImplementation *iface )
+{
+ domimpl *This = impl_from_IXMLDOMImplementation( iface );
+ return InterlockedIncrement( &This->ref );
+}
+
+static ULONG WINAPI dimimpl_Release(
+ IXMLDOMImplementation *iface )
+{
+ domimpl *This = impl_from_IXMLDOMImplementation( iface );
+ ULONG ref;
+
+ ref = InterlockedDecrement( &This->ref );
+ if ( ref == 0 )
+ {
+ HeapFree( GetProcessHeap(), 0, This );
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI dimimpl_GetTypeInfoCount(
+ IXMLDOMImplementation *iface,
+ UINT* pctinfo )
+{
+ FIXME("\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI dimimpl_GetTypeInfo(
+ IXMLDOMImplementation *iface,
+ UINT iTInfo, LCID lcid,
+ ITypeInfo** ppTInfo )
+{
+ FIXME("\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI dimimpl_GetIDsOfNames(
+ IXMLDOMImplementation *iface,
+ REFIID riid, LPOLESTR* rgszNames,
+ UINT cNames, LCID lcid, DISPID* rgDispId )
+{
+ FIXME("\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI dimimpl_Invoke(
+ IXMLDOMImplementation *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 dimimpl_hasFeature(IXMLDOMImplementation* This, BSTR feature, BSTR version, VARIANT_BOOL *hasFeature)
+{
+ static WCHAR bVersion[] = {'1','.','0',0};
+ static WCHAR bXML[] = {'X','M','L',0};
+ static WCHAR bDOM[] = {'D','O','M',0};
+ static WCHAR bMSDOM[] = {'M','S','-','D','O','M',0};
+ BOOL bValidFeature = FALSE;
+ BOOL bValidVersion = FALSE;
+
+ TRACE("feature(%s) version (%s)\n", debugstr_w(feature), debugstr_w(version));
+
+ if(!feature || !hasFeature)
+ return E_INVALIDARG;
+
+ *hasFeature = VARIANT_FALSE;
+
+ if(!version || lstrcmpiW(version, bVersion) == 0)
+ bValidVersion = TRUE;
+
+ if(lstrcmpiW(feature, bXML) == 0 || lstrcmpiW(feature, bDOM) == 0 || lstrcmpiW(feature, bMSDOM) == 0)
+ bValidFeature = TRUE;
+
+ if(bValidVersion && bValidFeature)
+ *hasFeature = VARIANT_TRUE;
+
+ return S_OK;
+}
+
+static const struct IXMLDOMImplementationVtbl dimimpl_vtbl =
+{
+ dimimpl_QueryInterface,
+ dimimpl_AddRef,
+ dimimpl_Release,
+ dimimpl_GetTypeInfoCount,
+ dimimpl_GetTypeInfo,
+ dimimpl_GetIDsOfNames,
+ dimimpl_Invoke,
+ dimimpl_hasFeature
+};
+
+IUnknown* create_doc_Implementation()
+{
+ domimpl *This;
+
+ This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
+ if ( !This )
+ return NULL;
+
+ This->lpVtbl = &dimimpl_vtbl;
+ This->ref = 1;
+
+ return (IUnknown*) &This->lpVtbl;
+}
+
+#endif
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 70b7a60..620fba8 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -44,6 +44,7 @@ extern IUnknown *create_comment( xmlNodePtr comment );
extern IUnknown *create_cdata( xmlNodePtr text );
extern IXMLDOMNodeList *create_children_nodelist( xmlNodePtr );
extern IXMLDOMNamedNodeMap *create_nodemap( IXMLDOMNode *node );
+extern IUnknown *create_doc_Implementation();
extern HRESULT queryresult_create( xmlNodePtr, LPWSTR, IXMLDOMNodeList ** );
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index ca913cb..ade7151 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -1872,6 +1872,7 @@ static void test_xmlTypes(void)
IXMLDOMAttribute *pAttrubute;
IXMLDOMNamedNodeMap *pAttribs;
IXMLDOMCDATASection *pCDataSec;
+ IXMLDOMImplementation *pIXMLDOMImplementation = NULL;
BSTR str;
IXMLDOMNode *pNextChild = (IXMLDOMNode *)0x1; /* Used for testing Siblings */
VARIANT v;
@@ -1917,6 +1918,61 @@ static void test_xmlTypes(void)
ok( !lstrcmpW( str, _bstr_("document") ), "incorrect nodeTypeString string\n");
SysFreeString(str);
+ /* test implementation */
+ hr = IXMLDOMDocument_get_implementation(doc, NULL);
+ ok(hr == E_INVALIDARG, "ret %08x\n", hr );
+
+ hr = IXMLDOMDocument_get_implementation(doc, &pIXMLDOMImplementation);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ VARIANT_BOOL hasFeature = VARIANT_TRUE;
+ BSTR sEmpty = SysAllocStringLen(NULL, 0);
+
+ hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, NULL, sEmpty, &hasFeature);
+ ok(hr == E_INVALIDARG, "ret %08x\n", hr );
+
+ hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, sEmpty, sEmpty, NULL);
+ ok(hr == E_INVALIDARG, "ret %08x\n", hr );
+
+ hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), sEmpty, &hasFeature);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ ok(hasFeature == VARIANT_FALSE, "hasFeature returned false\n");
+
+ hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, sEmpty, sEmpty, &hasFeature);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ ok(hasFeature == VARIANT_FALSE, "hasFeature returned true\n");
+
+ hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), NULL, &hasFeature);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ ok(hasFeature == VARIANT_TRUE, "hasFeature returned false\n");
+
+ hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), sEmpty, &hasFeature);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ ok(hasFeature == VARIANT_FALSE, "hasFeature returned false\n");
+
+ hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), _bstr_("1.0"), &hasFeature);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ ok(hasFeature == VARIANT_TRUE, "hasFeature returned true\n");
+
+ hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("XML"), _bstr_("1.0"), &hasFeature);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ ok(hasFeature == VARIANT_TRUE, "hasFeature returned true\n");
+
+ hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("MS-DOM"), _bstr_("1.0"), &hasFeature);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ ok(hasFeature == VARIANT_TRUE, "hasFeature returned true\n");
+
+ hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("SSS"), NULL, &hasFeature);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ ok(hasFeature == VARIANT_FALSE, "hasFeature returned false\n");
+
+ SysFreeString(sEmpty);
+ IXMLDOMImplementation_Release(pIXMLDOMImplementation);
+ }
+
+
+
hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &pRoot);
ok(hr == S_OK, "ret %08x\n", hr );
if(hr == S_OK)
--
1.5.3.7
--------------090800010308050806060707--
More information about the wine-patches
mailing list