Nikolay Sivov : msxml3/mxnamespace: Implemented getURI().
Alexandre Julliard
julliard at winehq.org
Tue Aug 23 12:44:59 CDT 2011
Module: wine
Branch: master
Commit: a15fe5a75544724701eab0b5a403fa597aaf48b4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a15fe5a75544724701eab0b5a403fa597aaf48b4
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sun Aug 21 21:48:15 2011 +0400
msxml3/mxnamespace: Implemented getURI().
---
dlls/msxml3/mxnamespace.c | 50 ++++++++++++++++++++++++++++++++++++++++++-
dlls/msxml3/tests/domdoc.c | 45 +++++++++++++++++++++++++++++++++++++++
2 files changed, 93 insertions(+), 2 deletions(-)
diff --git a/dlls/msxml3/mxnamespace.c b/dlls/msxml3/mxnamespace.c
index 1a8133f..2719bb5 100644
--- a/dlls/msxml3/mxnamespace.c
+++ b/dlls/msxml3/mxnamespace.c
@@ -101,6 +101,8 @@ static HRESULT declare_prefix(struct nscontext *ctxt, const WCHAR *prefix, const
/* returned stored pointer, caller needs to copy it */
static HRESULT get_declared_prefix_idx(const struct nscontext *ctxt, LONG index, BSTR *prefix)
{
+ *prefix = NULL;
+
if (index >= ctxt->count || index < 0) return E_FAIL;
if (index > 0) index = ctxt->count - index;
@@ -109,6 +111,21 @@ static HRESULT get_declared_prefix_idx(const struct nscontext *ctxt, LONG index,
return S_OK;
}
+static HRESULT get_uri_from_prefix(const struct nscontext *ctxt, const WCHAR *prefix, BSTR *uri)
+{
+ int i;
+
+ for (i = 0; i < ctxt->count; i++)
+ if (!strcmpW(ctxt->ns[i].prefix, prefix))
+ {
+ *uri = ctxt->ns[i].uri;
+ return S_OK;
+ }
+
+ *uri = NULL;
+ return S_FALSE;
+}
+
static struct nscontext* alloc_ns_context(void)
{
struct nscontext *ctxt;
@@ -257,8 +274,37 @@ static HRESULT WINAPI namespacemanager_getURI(IMXNamespaceManager *iface,
const WCHAR *prefix, IXMLDOMNode *node, WCHAR *uri, int *uri_len)
{
namespacemanager *This = impl_from_IMXNamespaceManager( iface );
- FIXME("(%p)->(%s %p %p %p): stub\n", This, debugstr_w(prefix), node, uri, uri_len);
- return E_NOTIMPL;
+ struct nscontext *ctxt;
+ HRESULT hr;
+ BSTR urib;
+
+ TRACE("(%p)->(%s %p %p %p)\n", This, debugstr_w(prefix), node, uri, uri_len);
+
+ if (!prefix) return E_INVALIDARG;
+ if (!uri_len) return E_POINTER;
+
+ if (node)
+ {
+ FIXME("namespaces from DOM node not supported\n");
+ return E_NOTIMPL;
+ }
+
+ ctxt = LIST_ENTRY(list_head(&This->ctxts), struct nscontext, entry);
+ hr = get_uri_from_prefix(ctxt, prefix, &urib);
+ if (hr == S_OK)
+ {
+ if (uri)
+ {
+ if (*uri_len < (INT)SysStringLen(urib)) return E_XML_BUFFERTOOSMALL;
+ strcpyW(uri, urib);
+ }
+ }
+ else
+ if (uri) *uri = 0;
+
+ *uri_len = SysStringLen(urib);
+
+ return hr;
}
static const struct IMXNamespaceManagerVtbl MXNamespaceManagerVtbl =
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index ef8c014..3db8e48 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -10117,6 +10117,7 @@ static void test_load(void)
static void test_nsnamespacemanager(void)
{
+ static const char xmluriA[] = "http://www.w3.org/XML/1998/namespace";
IMXNamespaceManager *nsmgr;
IVBMXNamespaceManager *mgr2;
IDispatch *disp;
@@ -10184,6 +10185,50 @@ todo_wine {
ok(len == 3, "got %d\n", len);
ok(!lstrcmpW(buffW, _bstr_("xml")), "got prefix %s\n", wine_dbgstr_w(buffW));
+ /* getURI */
+ hr = IMXNamespaceManager_getURI(nsmgr, NULL, NULL, NULL, NULL);
+ EXPECT_HR(hr, E_INVALIDARG);
+
+ len = -1;
+ hr = IMXNamespaceManager_getURI(nsmgr, NULL, NULL, NULL, &len);
+ EXPECT_HR(hr, E_INVALIDARG);
+ ok(len == -1, "got %d\n", len);
+
+ hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml"), NULL, NULL, NULL);
+ EXPECT_HR(hr, E_POINTER);
+
+ len = -1;
+ hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml"), NULL, NULL, &len);
+ EXPECT_HR(hr, S_OK);
+ /* length of "xml" uri is constant */
+ ok(len == strlen(xmluriA), "got %d\n", len);
+
+ len = 100;
+ hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml"), NULL, buffW, &len);
+ EXPECT_HR(hr, S_OK);
+ ok(len == strlen(xmluriA), "got %d\n", len);
+ ok(!lstrcmpW(buffW, _bstr_(xmluriA)), "got prefix %s\n", wine_dbgstr_w(buffW));
+
+ len = strlen(xmluriA)-1;
+ buffW[0] = 0x1;
+ hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml"), NULL, buffW, &len);
+ EXPECT_HR(hr, E_XML_BUFFERTOOSMALL);
+ ok(len == strlen(xmluriA)-1, "got %d\n", len);
+ ok(buffW[0] == 0x1, "got %x\n", buffW[0]);
+
+ /* prefix xml1 not defined */
+ len = -1;
+ hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml1"), NULL, NULL, &len);
+ EXPECT_HR(hr, S_FALSE);
+ ok(len == 0, "got %d\n", len);
+
+ len = 100;
+ buffW[0] = 0x1;
+ hr = IMXNamespaceManager_getURI(nsmgr, _bstr_("xml1"), NULL, buffW, &len);
+ EXPECT_HR(hr, S_FALSE);
+ ok(buffW[0] == 0, "got %x\n", buffW[0]);
+ ok(len == 0, "got %d\n", len);
+
IMXNamespaceManager_Release(nsmgr);
free_bstrs();
More information about the wine-cvs
mailing list