Owen Rudge : wsdapi: Add InstanceId and MessageNumber to SOAP header.

Alexandre Julliard julliard at winehq.org
Wed Mar 28 16:42:44 CDT 2018


Module: wine
Branch: master
Commit: 5df08c9de48b7c2158c0095da3fbd1731b5d140d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5df08c9de48b7c2158c0095da3fbd1731b5d140d

Author: Owen Rudge <orudge at codeweavers.com>
Date:   Tue Mar 27 21:30:29 2018 +0100

wsdapi: Add InstanceId and MessageNumber to SOAP header.

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

---

 dlls/wsdapi/soap.c            | 127 +++++++++++++++++++++++++++++++++++++++++-
 dlls/wsdapi/tests/discovery.c |   2 +-
 2 files changed, 126 insertions(+), 3 deletions(-)

diff --git a/dlls/wsdapi/soap.c b/dlls/wsdapi/soap.c
index 2bfb160..06d0129 100644
--- a/dlls/wsdapi/soap.c
+++ b/dlls/wsdapi/soap.c
@@ -69,6 +69,8 @@ static const WCHAR messageIdString[] = { 'M','e','s','s','a','g','e','I','D', 0
 static const WCHAR toString[] = { 'T','o', 0 };
 static const WCHAR relatesToString[] = { 'R','e','l','a','t','e','s','T','o', 0 };
 static const WCHAR appSequenceString[] = { 'A','p','p','S','e','q','u','e','n','c','e', 0 };
+static const WCHAR instanceIdString[] = { 'I','n','s','t','a','n','c','e','I','d', 0 };
+static const WCHAR messageNumberString[] = { 'M','e','s','s','a','g','e','N','u','m','b','e','r', 0 };
 static const WCHAR emptyString[] = { 0 };
 
 struct discovered_namespace
@@ -318,6 +320,123 @@ static void populate_soap_header(WSD_SOAP_HEADER *header, LPCWSTR to, LPCWSTR ac
     /* TODO: Implement RelatesTo, ReplyTo, From, FaultTo */
 }
 
+#define MAX_ULONGLONG_STRING_SIZE    25
+
+static LPWSTR ulonglong_to_string(void *parent, ULONGLONG value)
+{
+    WCHAR formatString[] = { '%','I','6','4','u', 0 };
+    LPWSTR ret;
+
+    ret = WSDAllocateLinkedMemory(parent, MAX_ULONGLONG_STRING_SIZE * sizeof(WCHAR));
+
+    if (ret == NULL)
+        return NULL;
+
+    wsprintfW(ret, formatString, value);
+    return ret;
+}
+
+static WSDXML_ATTRIBUTE *add_attribute(IWSDXMLContext *xml_context, WSDXML_ELEMENT *parent, LPCWSTR ns_uri, LPCWSTR name)
+{
+    WSDXML_ATTRIBUTE *attribute, *cur_attrib;
+    WSDXML_NAME *name_obj = NULL;
+
+    if (ns_uri == NULL)
+    {
+        name_obj = WSDAllocateLinkedMemory(NULL, sizeof(WSDXML_NAME));
+        name_obj->LocalName = duplicate_string(name_obj, name);
+        name_obj->Space = NULL;
+    }
+    else
+    {
+        if (FAILED(IWSDXMLContext_AddNameToNamespace(xml_context, ns_uri, name, &name_obj)))
+            return NULL;
+    }
+
+    attribute = WSDAllocateLinkedMemory(parent, sizeof(WSDXML_ATTRIBUTE));
+
+    if (attribute == NULL)
+    {
+        WSDFreeLinkedMemory(name_obj);
+        return NULL;
+    }
+
+    attribute->Element = parent;
+    attribute->Name = name_obj;
+    attribute->Next = NULL;
+    attribute->Value = NULL;
+
+    if (name_obj != NULL)
+        WSDAttachLinkedMemory(attribute, name_obj);
+
+    if (parent->FirstAttribute == NULL)
+    {
+        /* Make this the first attribute of the parent */
+        parent->FirstAttribute = attribute;
+    }
+    else
+    {
+        /* Find the last attribute and add this as the next one */
+        cur_attrib = parent->FirstAttribute;
+
+        while (cur_attrib->Next != NULL)
+        {
+            cur_attrib = cur_attrib->Next;
+        }
+
+        cur_attrib->Next = attribute;
+    }
+
+    return attribute;
+}
+
+static void remove_attribute(WSDXML_ELEMENT *parent, WSDXML_ATTRIBUTE *attribute)
+{
+    WSDXML_ATTRIBUTE *cur_attrib;
+
+    /* Find the last attribute and add this as the next one */
+    cur_attrib = parent->FirstAttribute;
+
+    if (cur_attrib == attribute)
+        parent->FirstAttribute = cur_attrib->Next;
+    else
+    {
+        while (cur_attrib != NULL)
+        {
+            /* Is our attribute the next attribute? */
+            if (cur_attrib->Next == attribute)
+            {
+                /* Remove it from the list */
+                cur_attrib->Next = attribute->Next;
+                break;
+            }
+
+            cur_attrib = cur_attrib->Next;
+        }
+    }
+
+    WSDFreeLinkedMemory(attribute);
+}
+
+static BOOL add_ulonglong_attribute(IWSDXMLContext *xml_context, WSDXML_ELEMENT *parent, LPCWSTR ns_uri, LPCWSTR name,
+    ULONGLONG value)
+{
+    WSDXML_ATTRIBUTE *attribute = add_attribute(xml_context, parent, ns_uri, name);
+
+    if (attribute == NULL)
+        return FALSE;
+
+    attribute->Value = ulonglong_to_string(attribute, value);
+
+    if (attribute->Value == NULL)
+    {
+        remove_attribute(parent, attribute);
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
 static BOOL add_discovered_namespace(struct list *namespaces, WSDXML_NAMESPACE *discovered_ns)
 {
     struct discovered_namespace *ns;
@@ -376,9 +495,13 @@ static WSDXML_ELEMENT *create_soap_header_xml_elements(IWSDXMLContext *xml_conte
     app_sequence_element = add_child_element(xml_context, header_element, discoveryNsUri, appSequenceString, emptyString);
     if (app_sequence_element == NULL) goto cleanup;
 
-    /* TODO: InstanceId attribute */
+    /* InstanceId attribute */
+    if (!add_ulonglong_attribute(xml_context, app_sequence_element, NULL, instanceIdString, min(UINT_MAX,
+        header->AppSequence->InstanceId))) goto cleanup;
 
-    /* TODO: MessageNumber attribute */
+    /* MessageNumber attribute */
+    if (!add_ulonglong_attribute(xml_context, app_sequence_element, NULL, messageNumberString, min(UINT_MAX,
+        header->AppSequence->MessageNumber))) goto cleanup;
 
     /* TODO: SequenceID attribute */
 
diff --git a/dlls/wsdapi/tests/discovery.c b/dlls/wsdapi/tests/discovery.c
index 30f90a5..1fa96b7 100644
--- a/dlls/wsdapi/tests/discovery.c
+++ b/dlls/wsdapi/tests/discovery.c
@@ -614,7 +614,7 @@ static void Publish_tests(void)
 
     ok(hello_message_seen == TRUE, "Hello message not received\n");
     todo_wine ok(endpoint_reference_seen == TRUE, "EndpointReference not received\n");
-    todo_wine ok(app_sequence_seen == TRUE, "AppSequence not received\n");
+    ok(app_sequence_seen == TRUE, "AppSequence not received\n");
     todo_wine ok(metadata_version_seen == TRUE, "MetadataVersion not received\n");
     todo_wine ok(messageOK == TRUE, "Hello message metadata not received\n");
 




More information about the wine-cvs mailing list