Owen Rudge : wsdapi: Return "any" headers in read_message.
Alexandre Julliard
julliard at winehq.org
Thu Jun 14 16:53:23 CDT 2018
Module: wine
Branch: master
Commit: 098a99fc4100a1f0d421f92cf9b902196320b74b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=098a99fc4100a1f0d421f92cf9b902196320b74b
Author: Owen Rudge <orudge at codeweavers.com>
Date: Wed Jun 13 19:11:26 2018 +0100
wsdapi: Return "any" headers in read_message.
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 | 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;
More information about the wine-cvs
mailing list