Owen Rudge : wsdapi: Implement AddNameToNamespace.

Alexandre Julliard julliard at winehq.org
Fri Jun 2 17:03:28 CDT 2017


Module: wine
Branch: master
Commit: 9bf2f6b2afccd5342e7cc105f8a960e8eedb719e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9bf2f6b2afccd5342e7cc105f8a960e8eedb719e

Author: Owen Rudge <orudge at codeweavers.com>
Date:   Tue May 30 23:05:50 2017 +0100

wsdapi: Implement AddNameToNamespace.

Signed-off-by: Owen Rudge <orudge at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wsdapi/tests/xml.c |  20 ++++-----
 dlls/wsdapi/xml.c       | 113 +++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 121 insertions(+), 12 deletions(-)

diff --git a/dlls/wsdapi/tests/xml.c b/dlls/wsdapi/tests/xml.c
index 68742fe..c83f07b 100644
--- a/dlls/wsdapi/tests/xml.c
+++ b/dlls/wsdapi/tests/xml.c
@@ -413,24 +413,24 @@ static void XMLContext_AddNameToNamespace_tests(void)
 
     /* Test calling AddNameToNamespace with invalid arguments */
     hr = IWSDXMLContext_AddNameToNamespace(context, NULL, NULL, NULL);
-    todo_wine ok(hr == E_INVALIDARG, "AddNameToNamespace failed with %08x\n", hr);
+    ok(hr == E_INVALIDARG, "AddNameToNamespace failed with %08x\n", hr);
 
     hr = IWSDXMLContext_AddNameToNamespace(context, ns1Uri, NULL, NULL);
-    todo_wine ok(hr == E_INVALIDARG, "AddNameToNamespace failed with %08x\n", hr);
+    ok(hr == E_INVALIDARG, "AddNameToNamespace failed with %08x\n", hr);
 
     hr = IWSDXMLContext_AddNameToNamespace(context, NULL, name1Text, NULL);
-    todo_wine ok(hr == E_INVALIDARG, "AddNameToNamespace failed with %08x\n", hr);
+    ok(hr == E_INVALIDARG, "AddNameToNamespace failed with %08x\n", hr);
 
     /* Test calling AddNameToNamespace without the ppName parameter */
     hr = IWSDXMLContext_AddNameToNamespace(context, ns1Uri, name1Text, NULL);
-    todo_wine ok(hr == S_OK, "AddNameToNamespace failed with %08x\n", hr);
+    ok(hr == S_OK, "AddNameToNamespace failed with %08x\n", hr);
 
     /* Now retrieve the created name */
     hr = IWSDXMLContext_AddNameToNamespace(context, ns1Uri, name1Text, &name1);
-    todo_wine ok(hr == S_OK, "AddNameToNamespace failed with %08x\n", hr);
+    ok(hr == S_OK, "AddNameToNamespace failed with %08x\n", hr);
 
     /* Check the returned structure */
-    todo_wine ok(name1 != NULL, "name1 == NULL\n");
+    ok(name1 != NULL, "name1 == NULL\n");
 
     if (name1 != NULL)
     {
@@ -447,10 +447,10 @@ static void XMLContext_AddNameToNamespace_tests(void)
 
     /* Test calling AddNamespace with parameters that are too large */
     hr = IWSDXMLContext_AddNameToNamespace(context, largeText, name1Text, &name2);
-    todo_wine ok(hr == E_INVALIDARG, "AddNameToNamespace failed with %08x\n", hr);
+    ok(hr == E_INVALIDARG, "AddNameToNamespace failed with %08x\n", hr);
 
     hr = IWSDXMLContext_AddNameToNamespace(context, ns1Uri, largeText, &name2);
-    todo_wine ok(hr == E_INVALIDARG, "AddNameToNamespace failed with %08x\n", hr);
+    ok(hr == E_INVALIDARG, "AddNameToNamespace failed with %08x\n", hr);
 
     /* Try creating a namespace explicitly */
     hr = IWSDXMLContext_AddNamespace(context, ns2Uri, prefix2, &ns2);
@@ -458,10 +458,10 @@ static void XMLContext_AddNameToNamespace_tests(void)
 
     /* Now add a name to it */
     hr = IWSDXMLContext_AddNameToNamespace(context, ns2Uri, name2Text, &name2);
-    todo_wine ok(hr == S_OK, "AddNameToNamespace failed with %08x\n", hr);
+    ok(hr == S_OK, "AddNameToNamespace failed with %08x\n", hr);
 
     /* Check the returned structure */
-    todo_wine ok(name2 != NULL, "name2 == NULL\n");
+    ok(name2 != NULL, "name2 == NULL\n");
 
     if (name2 != NULL)
     {
diff --git a/dlls/wsdapi/xml.c b/dlls/wsdapi/xml.c
index 9fba638..a6d0b07 100644
--- a/dlls/wsdapi/xml.c
+++ b/dlls/wsdapi/xml.c
@@ -270,6 +270,64 @@ static WSDXML_NAMESPACE *find_namespace(struct list *namespaces, LPCWSTR uri)
     return NULL;
 }
 
+static WSDXML_NAME *find_name(WSDXML_NAMESPACE *ns, LPCWSTR name)
+{
+    int i;
+
+    for (i = 0; i < ns->NamesCount; i++)
+    {
+        if (lstrcmpW(ns->Names[i].LocalName, name) == 0)
+        {
+            return &ns->Names[i];
+        }
+    }
+
+    return NULL;
+}
+
+static WSDXML_NAME *add_name(WSDXML_NAMESPACE *ns, LPCWSTR name)
+{
+    WSDXML_NAME *names;
+    WSDXML_NAME *newName;
+    int i;
+
+    names = WSDAllocateLinkedMemory(ns, sizeof(WSDXML_NAME) * (ns->NamesCount + 1));
+
+    if (names == NULL)
+    {
+        return NULL;
+    }
+
+    if (ns->NamesCount > 0)
+    {
+        /* Copy the existing names array over to the new allocation */
+        memcpy(names, ns->Names, sizeof(WSDXML_NAME) * ns->NamesCount);
+
+        for (i = 0; i < ns->NamesCount; i++)
+        {
+            /* Attach the local name memory to the new names allocation */
+            WSDAttachLinkedMemory(names, names[i].LocalName);
+        }
+
+        WSDFreeLinkedMemory(ns->Names);
+    }
+
+    ns->Names = names;
+
+    newName = &names[ns->NamesCount];
+
+    newName->LocalName = duplicate_string(names, name);
+    newName->Space = ns;
+
+    if (newName->LocalName == NULL)
+    {
+        return NULL;
+    }
+
+    ns->NamesCount++;
+    return newName;
+}
+
 static BOOL is_prefix_unique(struct list *namespaces, LPCWSTR prefix)
 {
     struct xmlNamespace *ns;
@@ -461,8 +519,59 @@ static HRESULT WINAPI IWSDXMLContextImpl_AddNamespace(IWSDXMLContext *iface, LPC
 
 static HRESULT WINAPI IWSDXMLContextImpl_AddNameToNamespace(IWSDXMLContext *iface, LPCWSTR pszUri, LPCWSTR pszName, WSDXML_NAME **ppName)
 {
-    FIXME("(%p, %s, %s, %p)\n", iface, debugstr_w(pszUri), debugstr_w(pszName), ppName);
-    return E_NOTIMPL;
+    IWSDXMLContextImpl *This = impl_from_IWSDXMLContext(iface);
+    WSDXML_NAMESPACE *ns;
+    WSDXML_NAME *name;
+
+    TRACE("(%p, %s, %s, %p)\n", This, debugstr_w(pszUri), debugstr_w(pszName), ppName);
+
+    if ((pszUri == NULL) || (pszName == NULL) || (lstrlenW(pszUri) > WSD_MAX_TEXT_LENGTH) || (lstrlenW(pszName) > WSD_MAX_TEXT_LENGTH))
+    {
+        return E_INVALIDARG;
+    }
+
+    ns = find_namespace(This->namespaces, pszUri);
+
+    if (ns == NULL)
+    {
+        /* The namespace doesn't exist, add it */
+        ns = add_namespace(This->namespaces, pszUri);
+
+        if (ns == NULL)
+        {
+            return E_OUTOFMEMORY;
+        }
+
+        ns->PreferredPrefix = generate_namespace_prefix(This, ns, pszUri);
+        if (ns->PreferredPrefix == NULL)
+        {
+            return E_FAIL;
+        }
+    }
+
+    name = find_name(ns, pszName);
+
+    if (name == NULL)
+    {
+        name = add_name(ns, pszName);
+
+        if (name == NULL)
+        {
+            return E_OUTOFMEMORY;
+        }
+    }
+
+    if (ppName != NULL)
+    {
+        *ppName = duplicate_name(NULL, name);
+
+        if (*ppName == NULL)
+        {
+            return E_OUTOFMEMORY;
+        }
+    }
+
+    return S_OK;
 }
 
 static HRESULT WINAPI IWSDXMLContextImpl_SetNamespaces(IWSDXMLContext *iface, const PCWSDXML_NAMESPACE *pNamespaces, WORD wNamespacesCount, BYTE bLayerNumber)




More information about the wine-cvs mailing list