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