Module: wine Branch: master Commit: 098a99fc4100a1f0d421f92cf9b902196320b74b URL: https://source.winehq.org/git/wine.git/?a=commit;h=098a99fc4100a1f0d421f92cf...
Author: Owen Rudge orudge@codeweavers.com Date: Wed Jun 13 19:11:26 2018 +0100
wsdapi: Return "any" headers in read_message.
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 | 40 ++++++++++++++++++++++++++++++++++++++++ dlls/wsdapi/tests/discovery.c | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/dlls/wsdapi/soap.c b/dlls/wsdapi/soap.c index c701bb0..34b9490 100644 --- a/dlls/wsdapi/soap.c +++ b/dlls/wsdapi/soap.c @@ -1317,6 +1317,35 @@ static WSDXML_ELEMENT *find_element(WSDXML_ELEMENT *parent, LPCWSTR name, LPCWST return NULL; }
+static void remove_element(WSDXML_ELEMENT *element) +{ + WSDXML_NODE *cur; + + if (element == NULL) + return; + + if (element->Node.Parent->FirstChild == (WSDXML_NODE *) element) + element->Node.Parent->FirstChild = element->Node.Next; + else + { + cur = element->Node.Parent->FirstChild; + + while (cur != NULL) + { + if (cur->Next == (WSDXML_NODE *) element) + { + cur->Next = element->Node.Next; + break; + } + + cur = cur->Next; + } + } + + WSDDetachLinkedMemory(element); + WSDFreeLinkedMemory(element); +} + HRESULT read_message(const char *xml, int xml_length, WSD_SOAP_MESSAGE **out_msg, int *msg_type) { WSDXML_ELEMENT *envelope = NULL, *header_element, *body_element; @@ -1438,6 +1467,17 @@ HRESULT read_message(const char *xml, int xml_length, WSD_SOAP_MESSAGE **out_msg soap_msg->Header.MessageID = duplicate_string(soap_msg, value); if (soap_msg->Header.MessageID == NULL) goto outofmemory;
+ /* Now detach and free known headers to leave the "any" elements */ + remove_element(find_element(header_element, actionString, addressingNsUri)); + remove_element(find_element(header_element, toString, addressingNsUri)); + remove_element(find_element(header_element, messageIdString, addressingNsUri)); + remove_element(find_element(header_element, appSequenceString, discoveryNsUri)); + + soap_msg->Header.AnyHeaders = (WSDXML_ELEMENT *) header_element->FirstChild; + + if (soap_msg->Header.AnyHeaders != NULL) + soap_msg->Header.AnyHeaders->Node.Parent = NULL; + /* Find the body element */ body_element = find_element(envelope, bodyString, envelopeNsUri);
diff --git a/dlls/wsdapi/tests/discovery.c b/dlls/wsdapi/tests/discovery.c index 0599123..b7496ea 100644 --- a/dlls/wsdapi/tests/discovery.c +++ b/dlls/wsdapi/tests/discovery.c @@ -491,7 +491,7 @@ static void verify_wsdxml_any_text(const char *debug_prefix, WSDXML_ELEMENT *any { WSDXML_TEXT *child;
- todo_wine ok(any != NULL, "%s: any == NULL\n", debug_prefix); + ok(any != NULL, "%s: any == NULL\n", debug_prefix); if (any == NULL) return;
child = (WSDXML_TEXT *) any->FirstChild;