[PATCH 2/5] Stub IVBMXNamespaceManager and added some tests
Nikolay Sivov
nsivov at codeweavers.com
Sun Aug 21 12:44:28 CDT 2011
---
dlls/msxml3/dispex.c | 1 +
dlls/msxml3/msxml_private.h | 1 +
dlls/msxml3/mxnamespace.c | 278 ++++++++++++++++++++++++++++++++++++-------
dlls/msxml3/tests/domdoc.c | 78 ++++++++++++
4 files changed, 317 insertions(+), 41 deletions(-)
diff --git a/dlls/msxml3/dispex.c b/dlls/msxml3/dispex.c
index fbbc35b..fa9fbb8 100644
--- a/dlls/msxml3/dispex.c
+++ b/dlls/msxml3/dispex.c
@@ -114,6 +114,7 @@ static REFIID tid_ids[] = {
&IID_IMXAttributes,
&IID_IMXReaderControl,
&IID_IMXWriter,
+ &IID_IVBMXNamespaceManager
};
HRESULT get_typeinfo(enum tid_t tid, ITypeInfo **typeinfo)
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 795c700..7072e0f 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -74,6 +74,7 @@ typedef enum tid_t {
IMXAttributes_tid,
IMXReaderControl_tid,
IMXWriter_tid,
+ IVBMXNamespaceManager_tid,
LAST_tid
} tid_t;
diff --git a/dlls/msxml3/mxnamespace.c b/dlls/msxml3/mxnamespace.c
index 2119e4f..8370469 100644
--- a/dlls/msxml3/mxnamespace.c
+++ b/dlls/msxml3/mxnamespace.c
@@ -44,7 +44,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
typedef struct
{
- IMXNamespaceManager IMXNamespaceManager_iface;
+ IMXNamespaceManager IMXNamespaceManager_iface;
+ IVBMXNamespaceManager IVBMXNamespaceManager_iface;
LONG ref;
} namespacemanager;
@@ -53,92 +54,66 @@ static inline namespacemanager *impl_from_IMXNamespaceManager( IMXNamespaceManag
return CONTAINING_RECORD(iface, namespacemanager, IMXNamespaceManager_iface);
}
+static inline namespacemanager *impl_from_IVBMXNamespaceManager( IVBMXNamespaceManager *iface )
+{
+ return CONTAINING_RECORD(iface, namespacemanager, IVBMXNamespaceManager_iface);
+}
+
static HRESULT WINAPI namespacemanager_QueryInterface(IMXNamespaceManager *iface, REFIID riid, void **ppvObject)
{
namespacemanager *This = impl_from_IMXNamespaceManager( iface );
- TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
-
- if ( IsEqualGUID( riid, &IID_IMXNamespaceManager) ||
- IsEqualGUID( riid, &IID_IUnknown) )
- {
- *ppvObject = iface;
- }
- else
- {
- TRACE("Unsupported interface %s\n", debugstr_guid(riid));
- *ppvObject = NULL;
- return E_NOINTERFACE;
- }
-
- IMXNamespaceManager_AddRef( iface );
-
- return S_OK;
+ return IVBMXNamespaceManager_QueryInterface(&This->IVBMXNamespaceManager_iface, riid, ppvObject);
}
static ULONG WINAPI namespacemanager_AddRef(IMXNamespaceManager *iface)
{
namespacemanager *This = impl_from_IMXNamespaceManager( iface );
- ULONG ref = InterlockedIncrement( &This->ref );
- TRACE("(%p)->(%u)\n", This, ref );
- return ref;
+ return IVBMXNamespaceManager_AddRef(&This->IVBMXNamespaceManager_iface);
}
static ULONG WINAPI namespacemanager_Release(IMXNamespaceManager *iface)
{
namespacemanager *This = impl_from_IMXNamespaceManager( iface );
- ULONG ref = InterlockedDecrement( &This->ref );
-
- TRACE("(%p)->(%u)\n", This, ref );
-
- if ( ref == 0 )
- heap_free( This );
-
- return ref;
+ return IVBMXNamespaceManager_Release(&This->IVBMXNamespaceManager_iface);
}
static HRESULT WINAPI namespacemanager_putAllowOverride(IMXNamespaceManager *iface,
VARIANT_BOOL override)
{
namespacemanager *This = impl_from_IMXNamespaceManager( iface );
- FIXME("(%p)->(%d): stub\n", This, override );
- return E_NOTIMPL;
+ return IVBMXNamespaceManager_put_allowOverride(&This->IVBMXNamespaceManager_iface, override);
}
static HRESULT WINAPI namespacemanager_getAllowOverride(IMXNamespaceManager *iface,
VARIANT_BOOL *override)
{
namespacemanager *This = impl_from_IMXNamespaceManager( iface );
- FIXME("(%p)->(%p): stub\n", This, override );
- return E_NOTIMPL;
+ return IVBMXNamespaceManager_get_allowOverride(&This->IVBMXNamespaceManager_iface, override);
}
static HRESULT WINAPI namespacemanager_reset(IMXNamespaceManager *iface)
{
namespacemanager *This = impl_from_IMXNamespaceManager( iface );
- FIXME("(%p): stub\n", This );
- return E_NOTIMPL;
+ return IVBMXNamespaceManager_reset(&This->IVBMXNamespaceManager_iface);
}
static HRESULT WINAPI namespacemanager_pushContext(IMXNamespaceManager *iface)
{
namespacemanager *This = impl_from_IMXNamespaceManager( iface );
- FIXME("(%p): stub\n", This );
- return E_NOTIMPL;
+ return IVBMXNamespaceManager_pushContext(&This->IVBMXNamespaceManager_iface);
}
static HRESULT WINAPI namespacemanager_pushNodeContext(IMXNamespaceManager *iface,
IXMLDOMNode *node, VARIANT_BOOL deep)
{
namespacemanager *This = impl_from_IMXNamespaceManager( iface );
- FIXME("(%p)->(%p %d): stub\n", This, node, deep );
- return E_NOTIMPL;
+ return IVBMXNamespaceManager_pushNodeContext(&This->IVBMXNamespaceManager_iface, node, deep);
}
static HRESULT WINAPI namespacemanager_popContext(IMXNamespaceManager *iface)
{
namespacemanager *This = impl_from_IMXNamespaceManager( iface );
- FIXME("(%p): stub\n", This );
- return E_NOTIMPL;
+ return IVBMXNamespaceManager_popContext(&This->IVBMXNamespaceManager_iface);
}
static HRESULT WINAPI namespacemanager_declarePrefix(IMXNamespaceManager *iface,
@@ -190,6 +165,226 @@ static const struct IMXNamespaceManagerVtbl MXNamespaceManagerVtbl =
namespacemanager_getURI
};
+static HRESULT WINAPI vbnamespacemanager_QueryInterface(IVBMXNamespaceManager *iface, REFIID riid, void **ppvObject)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
+
+ if ( IsEqualGUID( riid, &IID_IMXNamespaceManager) ||
+ IsEqualGUID( riid, &IID_IUnknown) )
+ {
+ *ppvObject = &This->IMXNamespaceManager_iface;
+ }
+ else if ( IsEqualGUID( riid, &IID_IVBMXNamespaceManager) ||
+ IsEqualGUID( riid, &IID_IDispatch) )
+ {
+ *ppvObject = &This->IVBMXNamespaceManager_iface;
+ }
+ else
+ {
+ TRACE("Unsupported interface %s\n", debugstr_guid(riid));
+ *ppvObject = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IVBMXNamespaceManager_AddRef( iface );
+
+ return S_OK;
+}
+
+static ULONG WINAPI vbnamespacemanager_AddRef(IVBMXNamespaceManager *iface)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ ULONG ref = InterlockedIncrement( &This->ref );
+ TRACE("(%p)->(%u)\n", This, ref );
+ return ref;
+}
+
+static ULONG WINAPI vbnamespacemanager_Release(IVBMXNamespaceManager *iface)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ ULONG ref = InterlockedDecrement( &This->ref );
+
+ TRACE("(%p)->(%u)\n", This, ref );
+
+ if ( ref == 0 )
+ heap_free( This );
+
+ return ref;
+}
+
+static HRESULT WINAPI vbnamespacemanager_GetTypeInfoCount(IVBMXNamespaceManager *iface, UINT *pctinfo)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+
+ TRACE("(%p)->(%p)\n", This, pctinfo);
+ *pctinfo = 1;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI vbnamespacemanager_GetTypeInfo(IVBMXNamespaceManager *iface, UINT iTInfo,
+ LCID lcid, ITypeInfo **ppTInfo)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+
+ TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
+
+ return get_typeinfo(IVBMXNamespaceManager_tid, ppTInfo);
+}
+
+static HRESULT WINAPI vbnamespacemanager_GetIDsOfNames(IVBMXNamespaceManager *iface, REFIID riid,
+ LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ ITypeInfo *typeinfo;
+ HRESULT hr;
+
+ TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
+ lcid, rgDispId);
+
+ if(!rgszNames || cNames == 0 || !rgDispId)
+ return E_INVALIDARG;
+
+ hr = get_typeinfo(IVBMXNamespaceManager_tid, &typeinfo);
+ if(SUCCEEDED(hr))
+ {
+ hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
+ ITypeInfo_Release(typeinfo);
+ }
+
+ return hr;
+}
+
+static HRESULT WINAPI vbnamespacemanager_Invoke(IVBMXNamespaceManager *iface, DISPID dispIdMember, REFIID riid,
+ LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
+ EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ ITypeInfo *typeinfo;
+ HRESULT hr;
+
+ TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
+ lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+
+ hr = get_typeinfo(IVBMXNamespaceManager_tid, &typeinfo);
+ if(SUCCEEDED(hr))
+ {
+ hr = ITypeInfo_Invoke(typeinfo, &This->IVBMXNamespaceManager_iface, dispIdMember, wFlags,
+ pDispParams, pVarResult, pExcepInfo, puArgErr);
+ ITypeInfo_Release(typeinfo);
+ }
+
+ return hr;
+}
+
+static HRESULT WINAPI vbnamespacemanager_put_allowOverride(IVBMXNamespaceManager *iface,
+ VARIANT_BOOL override)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ FIXME("(%p)->(%d): stub\n", This, override);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI vbnamespacemanager_get_allowOverride(IVBMXNamespaceManager *iface,
+ VARIANT_BOOL *override)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ FIXME("(%p)->(%p): stub\n", This, override);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI vbnamespacemanager_reset(IVBMXNamespaceManager *iface)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ FIXME("(%p): stub\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI vbnamespacemanager_pushContext(IVBMXNamespaceManager *iface)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ FIXME("(%p): stub\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI vbnamespacemanager_pushNodeContext(IVBMXNamespaceManager *iface,
+ IXMLDOMNode *node, VARIANT_BOOL deep)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ FIXME("(%p)->(%p %d): stub\n", This, node, deep);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI vbnamespacemanager_popContext(IVBMXNamespaceManager *iface)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ FIXME("(%p): stub\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI vbnamespacemanager_declarePrefix(IVBMXNamespaceManager *iface,
+ BSTR prefix, BSTR namespaceURI)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ FIXME("(%p)->(%s %s): stub\n", This, debugstr_w(prefix), debugstr_w(namespaceURI));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI vbnamespacemanager_getDeclaredPrefixes(IVBMXNamespaceManager *iface,
+ IMXNamespacePrefixes** prefixes)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ FIXME("(%p)->(%p): stub\n", This, prefixes);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI vbnamespacemanager_getPrefixes(IVBMXNamespaceManager *iface,
+ BSTR namespaceURI, IMXNamespacePrefixes** prefixes)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ FIXME("(%p)->(%s %p): stub\n", This, debugstr_w(namespaceURI), prefixes);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI vbnamespacemanager_getURI(IVBMXNamespaceManager *iface,
+ BSTR prefix, VARIANT* uri)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ FIXME("(%p)->(%s %p): stub\n", This, debugstr_w(prefix), uri);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI vbnamespacemanager_getURIFromNode(IVBMXNamespaceManager *iface,
+ BSTR prefix, IXMLDOMNode *node, VARIANT *uri)
+{
+ namespacemanager *This = impl_from_IVBMXNamespaceManager( iface );
+ FIXME("(%p)->(%s %p %p): stub\n", This, debugstr_w(prefix), node, uri);
+ return E_NOTIMPL;
+}
+
+static const struct IVBMXNamespaceManagerVtbl VBMXNamespaceManagerVtbl =
+{
+ vbnamespacemanager_QueryInterface,
+ vbnamespacemanager_AddRef,
+ vbnamespacemanager_Release,
+ vbnamespacemanager_GetTypeInfoCount,
+ vbnamespacemanager_GetTypeInfo,
+ vbnamespacemanager_GetIDsOfNames,
+ vbnamespacemanager_Invoke,
+ vbnamespacemanager_put_allowOverride,
+ vbnamespacemanager_get_allowOverride,
+ vbnamespacemanager_reset,
+ vbnamespacemanager_pushContext,
+ vbnamespacemanager_pushNodeContext,
+ vbnamespacemanager_popContext,
+ vbnamespacemanager_declarePrefix,
+ vbnamespacemanager_getDeclaredPrefixes,
+ vbnamespacemanager_getPrefixes,
+ vbnamespacemanager_getURI,
+ vbnamespacemanager_getURIFromNode
+};
+
HRESULT MXNamespaceManager_create(IUnknown *outer, void **obj)
{
namespacemanager *ns;
@@ -201,6 +396,7 @@ HRESULT MXNamespaceManager_create(IUnknown *outer, void **obj)
return E_OUTOFMEMORY;
ns->IMXNamespaceManager_iface.lpVtbl = &MXNamespaceManagerVtbl;
+ ns->IVBMXNamespaceManager_iface.lpVtbl = &VBMXNamespaceManagerVtbl;
ns->ref = 1;
*obj = &ns->IMXNamespaceManager_iface;
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 754c083..9d71483 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -10115,6 +10115,82 @@ static void test_load(void)
free_bstrs();
}
+static void test_nsnamespacemanager(void)
+{
+ IMXNamespaceManager *nsmgr;
+ IVBMXNamespaceManager *mgr2;
+ IDispatch *disp;
+ HRESULT hr;
+ WCHAR buffW[250];
+ INT len;
+
+ hr = CoCreateInstance(&CLSID_MXNamespaceManager40, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IMXNamespaceManager, (void**)&nsmgr);
+ if (hr != S_OK)
+ {
+ win_skip("MXNamespaceManager is not available\n");
+ return;
+ }
+
+ /* IMXNamespaceManager inherits from IUnknown */
+ hr = IMXNamespaceManager_QueryInterface(nsmgr, &IID_IDispatch, (void**)&disp);
+ EXPECT_HR(hr, S_OK);
+ IDispatch_Release(disp);
+
+ hr = IMXNamespaceManager_QueryInterface(nsmgr, &IID_IVBMXNamespaceManager, (void**)&mgr2);
+ EXPECT_HR(hr, S_OK);
+ IVBMXNamespaceManager_Release(mgr2);
+
+todo_wine {
+ hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, NULL);
+ EXPECT_HR(hr, S_OK);
+
+ /* prefix already added */
+ hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, _bstr_("ns0 uri"));
+ EXPECT_HR(hr, S_FALSE);
+
+ hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns0"), NULL);
+ EXPECT_HR(hr, E_INVALIDARG);
+
+ /* "xml" and "xmlns" are not allowed here */
+ hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("xml"), _bstr_("uri1"));
+ EXPECT_HR(hr, E_INVALIDARG);
+
+ hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("xmlns"), _bstr_("uri1"));
+ EXPECT_HR(hr, E_INVALIDARG);
+
+ hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, -1, NULL, NULL);
+ EXPECT_HR(hr, E_FAIL);
+
+ hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, NULL, NULL);
+ EXPECT_HR(hr, E_POINTER);
+
+ len = -1;
+ hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, NULL, &len);
+ EXPECT_HR(hr, S_OK);
+ ok(len == 3, "got %d\n", len);
+}
+
+ len = -1;
+ buffW[0] = 0x1;
+ hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, buffW, &len);
+ todo_wine EXPECT_HR(hr, E_XML_BUFFERTOOSMALL);
+ ok(len == -1, "got %d\n", len);
+ ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
+
+ len = 10;
+ buffW[0] = 0x1;
+ hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 0, buffW, &len);
+todo_wine {
+ EXPECT_HR(hr, S_OK);
+ ok(len == 3, "got %d\n", len);
+ ok(!lstrcmpW(buffW, _bstr_("xml")), "got prefix %s\n", wine_dbgstr_w(buffW));
+}
+ IMXNamespaceManager_Release(nsmgr);
+
+ free_bstrs();
+}
+
START_TEST(domdoc)
{
IXMLDOMDocument *doc;
@@ -10189,5 +10265,7 @@ START_TEST(domdoc)
test_xsltemplate();
+ test_nsnamespacemanager();
+
CoUninitialize();
}
--
1.5.6.5
--------------020809000601000000030108--
More information about the wine-patches
mailing list