Owen Rudge : wsdapi: Implement generation of SOAP header.

Alexandre Julliard julliard at winehq.org
Tue Mar 20 17:51:35 CDT 2018


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

Author: Owen Rudge <orudge at codeweavers.com>
Date:   Mon Mar 19 21:46:34 2018 +0000

wsdapi: Implement generation of 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 | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 83 insertions(+), 1 deletion(-)

diff --git a/dlls/wsdapi/soap.c b/dlls/wsdapi/soap.c
index 834005e..abea33c 100644
--- a/dlls/wsdapi/soap.c
+++ b/dlls/wsdapi/soap.c
@@ -63,6 +63,13 @@ static const WCHAR envelopeNsUri[] = {
 static const WCHAR addressingPrefix[] = { 'w','s','a', 0 };
 static const WCHAR discoveryPrefix[] = { 'w','s','d', 0 };
 static const WCHAR envelopePrefix[] = { 's','o','a','p', 0 };
+static const WCHAR headerString[] = { 'H','e','a','d','e','r', 0 };
+static const WCHAR actionString[] = { 'A','c','t','i','o','n', 0 };
+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 emptyString[] = { 0 };
 
 static char *wide_to_utf8(LPCWSTR wide_string, int *length)
 {
@@ -183,6 +190,33 @@ cleanup:
     return retVal;
 }
 
+static WSDXML_ELEMENT *add_child_element(IWSDXMLContext *xml_context, WSDXML_ELEMENT *parent, LPCWSTR ns_uri,
+    LPCWSTR name, LPCWSTR text)
+{
+    WSDXML_ELEMENT *element_obj;
+    WSDXML_NAME *name_obj;
+
+    if (FAILED(IWSDXMLContext_AddNameToNamespace(xml_context, ns_uri, name, &name_obj)))
+        return NULL;
+
+    if (FAILED(WSDXMLBuildAnyForSingleElement(name_obj, text, &element_obj)))
+    {
+        WSDFreeLinkedMemory(name_obj);
+        return NULL;
+    }
+
+    WSDFreeLinkedMemory(name_obj);
+
+    /* Add the element as a child - this will link the element's memory allocation to the parent's */
+    if (FAILED(WSDXMLAddChild(parent, element_obj)))
+    {
+        WSDFreeLinkedMemory(element_obj);
+        return NULL;
+    }
+
+    return element_obj;
+}
+
 static BOOL create_guid(LPWSTR buffer)
 {
     const WCHAR formatString[] = { 'u','r','n',':','u','u','i','d',':','%','s', 0 };
@@ -220,7 +254,55 @@ static void populate_soap_header(WSD_SOAP_HEADER *header, LPCWSTR to, LPCWSTR ac
 
 static WSDXML_ELEMENT *create_soap_header_xml_elements(IWSDXMLContext *xml_context, WSD_SOAP_HEADER *header)
 {
-    /* TODO: Implement header generation */
+    WSDXML_ELEMENT *header_element = NULL, *app_sequence_element = NULL;
+    WSDXML_NAME *header_name = NULL;
+
+    /* <s:Header> */
+    if (FAILED(IWSDXMLContext_AddNameToNamespace(xml_context, envelopeNsUri, headerString, &header_name))) goto cleanup;
+    if (FAILED(WSDXMLBuildAnyForSingleElement(header_name, NULL, &header_element))) goto cleanup;
+    WSDFreeLinkedMemory(header_name);
+
+    /* <a:Action> */
+    if (add_child_element(xml_context, header_element, addressingNsUri, actionString, header->Action) == NULL)
+        goto cleanup;
+
+    /* <a:MessageId> */
+    if (add_child_element(xml_context, header_element, addressingNsUri, messageIdString, header->MessageID) == NULL)
+        goto cleanup;
+
+    /* <a:To> */
+    if (add_child_element(xml_context, header_element, addressingNsUri, toString, header->To) == NULL)
+        goto cleanup;
+
+    /* <a:RelatesTo> */
+    if (header->RelatesTo.MessageID != NULL)
+    {
+        if (add_child_element(xml_context, header_element, addressingNsUri, relatesToString,
+            header->RelatesTo.MessageID) == NULL) goto cleanup;
+    }
+
+    /* <d:AppSequence> */
+    app_sequence_element = add_child_element(xml_context, header_element, discoveryNsUri, appSequenceString, emptyString);
+    if (app_sequence_element == NULL) goto cleanup;
+
+    /* TODO: InstanceId attribute */
+
+    /* TODO: MessageNumber attribute */
+
+    /* TODO: SequenceID attribute */
+
+    /* </d:AppSequence> */
+
+    /* TODO: Write any headers */
+
+    /* </s:Header> */
+
+    return header_element;
+
+cleanup:
+    if (header_name != NULL) WSDFreeLinkedMemory(header_name);
+    WSDXMLCleanupElement(header_element);
+
     return NULL;
 }
 




More information about the wine-cvs mailing list