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