msxml3/mxnamespace: Stub IVBMXNamespaceManager and added some tests.

This commit is contained in:
Nikolay Sivov 2011-08-21 21:44:28 +04:00 committed by Alexandre Julliard
parent 9253967295
commit 7f47d97e12
4 changed files with 317 additions and 41 deletions

View File

@ -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)

View File

@ -74,6 +74,7 @@ typedef enum tid_t {
IMXAttributes_tid,
IMXReaderControl_tid,
IMXWriter_tid,
IVBMXNamespaceManager_tid,
LAST_tid
} tid_t;

View File

@ -45,6 +45,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
typedef struct
{
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;

View File

@ -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();
}