Module: wine Branch: master Commit: 9c2288fceef98cf25cdb4f11803ac780e5611fc0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9c2288fceef98cf25cdb4f1180...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sun Aug 21 21:49:21 2011 +0400
msxml3/mxnamespace: Support prefix override mode.
---
dlls/msxml3/mxnamespace.c | 65 ++++++++++++++++++++++++++++++++++--------- dlls/msxml3/tests/domdoc.c | 42 +++++++++++++++++++++++++--- 2 files changed, 88 insertions(+), 19 deletions(-)
diff --git a/dlls/msxml3/mxnamespace.c b/dlls/msxml3/mxnamespace.c index 2719bb5..17fbab8 100644 --- a/dlls/msxml3/mxnamespace.c +++ b/dlls/msxml3/mxnamespace.c @@ -71,6 +71,8 @@ typedef struct LONG ref;
struct list ctxts; + + VARIANT_BOOL override; } namespacemanager;
static inline namespacemanager *impl_from_IMXNamespaceManager( IMXNamespaceManager *iface ) @@ -83,17 +85,46 @@ static inline namespacemanager *impl_from_IVBMXNamespaceManager( IVBMXNamespaceM return CONTAINING_RECORD(iface, namespacemanager, IVBMXNamespaceManager_iface); }
-static HRESULT declare_prefix(struct nscontext *ctxt, const WCHAR *prefix, const WCHAR *uri) +static HRESULT declare_prefix(namespacemanager *This, const WCHAR *prefix, const WCHAR *uri) { + struct nscontext *ctxt = LIST_ENTRY(list_head(&This->ctxts), struct nscontext, entry); + static const WCHAR emptyW[] = {0}; + struct ns *ns; + int i; + if (ctxt->count == ctxt->max_alloc) { ctxt->max_alloc *= 2; ctxt->ns = heap_realloc(ctxt->ns, ctxt->max_alloc*sizeof(*ctxt->ns)); }
- ctxt->ns[ctxt->count].prefix = SysAllocString(prefix); - ctxt->ns[ctxt->count].uri = SysAllocString(uri); - ctxt->count++; + if (!prefix) prefix = emptyW; + + ns = NULL; + for (i = 0; i < ctxt->count; i++) + if (!strcmpW(ctxt->ns[i].prefix, prefix)) + { + ns = &ctxt->ns[i]; + break; + } + + if (ns) + { + if (This->override == VARIANT_TRUE) + { + SysFreeString(ns->uri); + ns->uri = SysAllocString(uri); + return S_FALSE; + } + else + return E_FAIL; + } + else + { + ctxt->ns[ctxt->count].prefix = SysAllocString(prefix); + ctxt->ns[ctxt->count].uri = SysAllocString(uri); + ctxt->count++; + }
return S_OK; } @@ -222,17 +253,13 @@ static HRESULT WINAPI namespacemanager_declarePrefix(IMXNamespaceManager *iface, static const WCHAR xmlnsW[] = {'x','m','l','n','s',0};
namespacemanager *This = impl_from_IMXNamespaceManager( iface ); - struct nscontext *ctxt;
TRACE("(%p)->(%s %s)\n", This, debugstr_w(prefix), debugstr_w(namespaceURI));
- if (!prefix) return E_FAIL; - - if (!strcmpW(prefix, xmlW) || !strcmpW(prefix, xmlnsW) || (prefix && !namespaceURI)) + if (prefix && (!strcmpW(prefix, xmlW) || !strcmpW(prefix, xmlnsW) || !namespaceURI)) return E_INVALIDARG;
- ctxt = LIST_ENTRY(list_head(&This->ctxts), struct nscontext, entry); - return declare_prefix(ctxt, prefix, namespaceURI); + return declare_prefix(This, prefix, namespaceURI); }
static HRESULT WINAPI namespacemanager_getDeclaredPrefix(IMXNamespaceManager *iface, @@ -451,16 +478,24 @@ static HRESULT WINAPI vbnamespacemanager_put_allowOverride(IVBMXNamespaceManager VARIANT_BOOL override) { namespacemanager *This = impl_from_IVBMXNamespaceManager( iface ); - FIXME("(%p)->(%d): stub\n", This, override); - return E_NOTIMPL; + + TRACE("(%p)->(%d)\n", This, override); + This->override = override; + + return S_OK; }
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; + + TRACE("(%p)->(%p)\n", This, override); + + if (!override) return E_POINTER; + *override = This->override; + + return S_OK; }
static HRESULT WINAPI vbnamespacemanager_reset(IVBMXNamespaceManager *iface) @@ -572,6 +607,8 @@ HRESULT MXNamespaceManager_create(IUnknown *outer, void **obj) ctxt = alloc_ns_context(); list_add_head(&ns->ctxts, &ctxt->entry);
+ ns->override = VARIANT_TRUE; + *obj = &ns->IMXNamespaceManager_iface;
TRACE("returning iface %p\n", *obj); diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 3db8e48..2c3de42 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -10142,14 +10142,13 @@ static void test_nsnamespacemanager(void) 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);
@@ -10238,6 +10237,7 @@ static void test_nsnamespacemanager_override(void) { IMXNamespaceManager *nsmgr; WCHAR buffW[250]; + VARIANT_BOOL b; HRESULT hr; INT len;
@@ -10260,11 +10260,25 @@ static void test_nsnamespacemanager_override(void) hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 1, buffW, &len); EXPECT_HR(hr, E_FAIL);
+ hr = IMXNamespaceManager_getAllowOverride(nsmgr, NULL); + EXPECT_HR(hr, E_POINTER); + + b = VARIANT_FALSE; + hr = IMXNamespaceManager_getAllowOverride(nsmgr, &b); + EXPECT_HR(hr, S_OK); + ok(b == VARIANT_TRUE, "got %d\n", b); + hr = IMXNamespaceManager_putAllowOverride(nsmgr, VARIANT_FALSE); - todo_wine EXPECT_HR(hr, S_OK); + EXPECT_HR(hr, S_OK);
hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, _bstr_("ns0 uri")); - todo_wine EXPECT_HR(hr, S_OK); + EXPECT_HR(hr, S_OK); + + len = sizeof(buffW)/sizeof(WCHAR); + buffW[0] = 0; + hr = IMXNamespaceManager_getURI(nsmgr, _bstr_(""), NULL, buffW, &len); + EXPECT_HR(hr, S_OK); + ok(!lstrcmpW(buffW, _bstr_("ns0 uri")), "got uri %s\n", wine_dbgstr_w(buffW));
hr = IMXNamespaceManager_declarePrefix(nsmgr, _bstr_("ns0"), _bstr_("ns0 uri")); EXPECT_HR(hr, S_OK); @@ -10284,7 +10298,7 @@ static void test_nsnamespacemanager_override(void) len = sizeof(buffW)/sizeof(WCHAR); buffW[0] = 0; hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 2, buffW, &len); - todo_wine EXPECT_HR(hr, S_OK); + EXPECT_HR(hr, S_OK); ok(!lstrcmpW(buffW, _bstr_("")), "got prefix %s\n", wine_dbgstr_w(buffW));
/* new prefix placed at index 1 always */ @@ -10306,6 +10320,24 @@ static void test_nsnamespacemanager_override(void) hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, _bstr_("ns0 uri")); EXPECT_HR(hr, E_FAIL);
+ hr = IMXNamespaceManager_putAllowOverride(nsmgr, VARIANT_TRUE); + EXPECT_HR(hr, S_OK); + + hr = IMXNamespaceManager_declarePrefix(nsmgr, NULL, _bstr_("ns0 uri override")); + EXPECT_HR(hr, S_FALSE); + + len = sizeof(buffW)/sizeof(WCHAR); + buffW[0] = 0; + hr = IMXNamespaceManager_getURI(nsmgr, _bstr_(""), NULL, buffW, &len); + EXPECT_HR(hr, S_OK); + ok(!lstrcmpW(buffW, _bstr_("ns0 uri override")), "got uri %s\n", wine_dbgstr_w(buffW)); + + len = sizeof(buffW)/sizeof(WCHAR); + buffW[0] = 0; + hr = IMXNamespaceManager_getDeclaredPrefix(nsmgr, 3, buffW, &len); + EXPECT_HR(hr, S_OK); + ok(!lstrcmpW(buffW, _bstr_("")), "got prefix %s\n", wine_dbgstr_w(buffW)); + IMXNamespaceManager_Release(nsmgr);
free_bstrs();