[4/5] webservices: Also write user supplied headers in WsWriteEnvelopeStart.
Hans Leidekker
hans at codeweavers.com
Wed Aug 10 06:13:56 CDT 2016
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/webservices/msg.c | 55 +++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 50 insertions(+), 5 deletions(-)
diff --git a/dlls/webservices/msg.c b/dlls/webservices/msg.c
index 2c8fb3b..ecbc31d 100644
--- a/dlls/webservices/msg.c
+++ b/dlls/webservices/msg.c
@@ -379,15 +379,55 @@ static HRESULT get_addr_namespace( WS_ADDRESSING_VERSION ver, WS_XML_STRING *str
}
}
+static const WS_XML_STRING *get_header_name( WS_HEADER_TYPE type )
+{
+ static const WS_XML_STRING action = {6, (BYTE *)"Action"}, to = {2, (BYTE *)"To"};
+ static const WS_XML_STRING msgid = {9, (BYTE *)"MessageID"}, relto = {9, (BYTE *)"RelatesTo"};
+ static const WS_XML_STRING from = {4, (BYTE *)"From"}, replyto = {7, (BYTE *)"ReplyTo"};
+ static const WS_XML_STRING faultto = {7, (BYTE *)"FaultTo"};
+
+ switch (type)
+ {
+ case WS_ACTION_HEADER: return &action;
+ case WS_TO_HEADER: return &to;
+ case WS_MESSAGE_ID_HEADER: return &msgid;
+ case WS_RELATES_TO_HEADER: return &relto;
+ case WS_FROM_HEADER: return &from;
+ case WS_REPLY_TO_HEADER: return &replyto;
+ case WS_FAULT_TO_HEADER: return &faultto;
+ default:
+ ERR( "unknown type %u\n", type );
+ return NULL;
+ }
+}
+
+static HRESULT write_header( WS_XML_WRITER *writer, const struct header *header )
+{
+ static const WS_XML_STRING prefix_s = {1, (BYTE *)"s"}, prefix_a = {1, (BYTE *)"a"};
+ static const WS_XML_STRING understand = {14, (BYTE *)"mustUnderstand"}, ns = {0, NULL};
+ const WS_XML_STRING *localname = get_header_name( header->type );
+ WS_XML_INT32_TEXT one = {{WS_XML_TEXT_TYPE_INT32}, 1};
+ HRESULT hr;
+
+ if ((hr = WsWriteStartElement( writer, &prefix_a, localname, &ns, NULL )) != S_OK) return hr;
+ if ((hr = WsWriteStartAttribute( writer, &prefix_s, &understand, &ns, FALSE, NULL )) != S_OK) return hr;
+ if ((hr = WsWriteText( writer, &one.text, NULL )) != S_OK) return hr;
+ if ((hr = WsWriteEndAttribute( writer, NULL )) != S_OK) return hr;
+ if ((hr = WsWriteText( writer, &header->text.text, NULL )) != S_OK) return hr;
+ return WsWriteEndElement( writer, NULL );
+}
+
static HRESULT write_envelope_start( struct msg *msg, WS_XML_WRITER *writer )
{
static const char anonymous[] = "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous";
- WS_XML_STRING prefix_s = {1, (BYTE *)"s"}, prefix_a = {1, (BYTE *)"a"}, body = {4, (BYTE *)"Body"};
- WS_XML_STRING envelope = {8, (BYTE *)"Envelope"}, header = {6, (BYTE *)"Header"};
- WS_XML_STRING msgid = {9, (BYTE *)"MessageID"}, replyto = {7, (BYTE *)"ReplyTo"};
- WS_XML_STRING address = {7, (BYTE *)"Address"}, ns_env, ns_addr;
+ static const WS_XML_STRING prefix_s = {1, (BYTE *)"s"}, prefix_a = {1, (BYTE *)"a"};
+ static const WS_XML_STRING envelope = {8, (BYTE *)"Envelope"}, header = {6, (BYTE *)"Header"};
+ static const WS_XML_STRING msgid = {9, (BYTE *)"MessageID"}, replyto = {7, (BYTE *)"ReplyTo"};
+ static const WS_XML_STRING address = {7, (BYTE *)"Address"}, body = {4, (BYTE *)"Body"};
+ WS_XML_STRING ns_env, ns_addr;
WS_XML_UTF8_TEXT urn, addr;
HRESULT hr;
+ ULONG i;
if ((hr = get_env_namespace( msg->version_env, &ns_env )) != S_OK) return hr;
if ((hr = get_addr_namespace( msg->version_addr, &ns_addr )) != S_OK) return hr;
@@ -400,8 +440,13 @@ static HRESULT write_envelope_start( struct msg *msg, WS_XML_WRITER *writer )
urn.text.textType = WS_XML_TEXT_TYPE_UNIQUE_ID;
memcpy( &urn.value, &msg->id, sizeof(msg->id) );
if ((hr = WsWriteText( writer, &urn.text, NULL )) != S_OK) return hr;
-
if ((hr = WsWriteEndElement( writer, NULL )) != S_OK) return hr; /* </a:MessageID> */
+
+ for (i = 0; i < msg->header_count; i++)
+ {
+ if ((hr = write_header( writer, msg->header[i] )) != S_OK) return hr;
+ }
+
if (msg->version_addr == WS_ADDRESSING_VERSION_0_9)
{
if ((hr = WsWriteStartElement( writer, &prefix_a, &replyto, &ns_addr, NULL )) != S_OK) return hr;
--
2.1.4
More information about the wine-patches
mailing list