Module: wine Branch: master Commit: 45371b53f36e10c1e535407a707113f049f8a551 URL: https://source.winehq.org/git/wine.git/?a=commit;h=45371b53f36e10c1e535407a7...
Author: Owen Rudge orudge@codeweavers.com Date: Mon Mar 19 21:46:34 2018 +0000
wsdapi: Implement generation of SOAP header.
Signed-off-by: Owen Rudge orudge@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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; }