Hans Leidekker : webservices: Store the action header as WS_XML_STRING.

Alexandre Julliard julliard at winehq.org
Wed Sep 6 14:45:36 CDT 2017


Module: wine
Branch: master
Commit: 7727e001783c2042c1ed7fb60300e87ce2b3d84c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7727e001783c2042c1ed7fb60300e87ce2b3d84c

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Wed Sep  6 15:56:08 2017 +0200

webservices: Store the action header as WS_XML_STRING.

Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/webservices/msg.c | 44 ++++++++++++++++++++------------------------
 1 file changed, 20 insertions(+), 24 deletions(-)

diff --git a/dlls/webservices/msg.c b/dlls/webservices/msg.c
index 8d416eb..37ce3a3 100644
--- a/dlls/webservices/msg.c
+++ b/dlls/webservices/msg.c
@@ -68,7 +68,7 @@ struct msg
     WS_ADDRESSING_VERSION               version_addr;
     BOOL                                is_addressed;
     WS_STRING                           addr;
-    WS_STRING                           action;
+    WS_XML_STRING                      *action;
     WS_HEAP                            *heap;
     WS_XML_BUFFER                      *buf;
     WS_XML_WRITER                      *writer;
@@ -131,9 +131,8 @@ static void reset_msg( struct msg *msg )
     msg->addr.chars    = NULL;
     msg->addr.length   = 0;
 
-    heap_free( msg->action.chars );
-    msg->action.chars  = NULL;
-    msg->action.length = 0;
+    free_xml_string( msg->action );
+    msg->action = NULL;
 
     WsResetHeap( msg->heap, NULL );
     msg->buf           = NULL; /* allocated on msg->heap */
@@ -546,13 +545,12 @@ static HRESULT write_headers( struct msg *msg, WS_XML_WRITER *writer, const WS_X
     if ((hr = WsWriteXmlnsAttribute( writer, prefix_addr, ns_addr, FALSE, NULL )) != S_OK) return hr;
     if ((hr = WsWriteStartElement( writer, prefix_env, &header, ns_env, NULL )) != S_OK) return hr;
 
-    if (msg->action.length)
+    if (msg->action)
     {
-        WS_XML_UTF16_TEXT utf16 = {{WS_XML_TEXT_TYPE_UTF16}, (BYTE *)msg->action.chars,
-                                   msg->action.length * sizeof(WCHAR)};
+        WS_XML_UTF8_TEXT utf8 = {{WS_XML_TEXT_TYPE_UTF8}, {msg->action->length, msg->action->bytes}};
         if ((hr = WsWriteStartElement( writer, prefix_addr, action, ns_addr, NULL )) != S_OK) return hr;
         if ((hr = write_must_understand( writer, prefix_env, ns_env )) != S_OK) return hr;
-        if ((hr = WsWriteText( writer, &utf16.text, NULL )) != S_OK) return hr;
+        if ((hr = WsWriteText( writer, &utf8.text, NULL )) != S_OK) return hr;
         if ((hr = WsWriteEndElement( writer, NULL )) != S_OK) return hr; /* </a:Action> */
     }
     if (msg->addr.length)
@@ -600,7 +598,7 @@ static HRESULT write_headers_transport( struct msg *msg, WS_XML_WRITER *writer,
     HRESULT hr = S_OK;
     ULONG i;
 
-    if ((msg->header_count || !msg->action.length) &&
+    if ((msg->header_count || !msg->action) &&
         (hr = WsWriteStartElement( writer, prefix, &header, ns, NULL )) != S_OK) return hr;
 
     for (i = 0; i < msg->header_count; i++)
@@ -609,7 +607,7 @@ static HRESULT write_headers_transport( struct msg *msg, WS_XML_WRITER *writer,
         if ((hr = WsWriteXmlBuffer( writer, msg->header[i]->u.buf, NULL )) != S_OK) return hr;
     }
 
-    if (msg->header_count || !msg->action.length) hr = WsWriteEndElement( writer, NULL ); /* </s:Header> */
+    if (msg->header_count || !msg->action) hr = WsWriteEndElement( writer, NULL ); /* </s:Header> */
     return hr;
 }
 
@@ -1681,12 +1679,13 @@ HRESULT message_insert_http_headers( WS_MESSAGE *handle, HINTERNET req )
     {
         static const WCHAR soapactionW[] = {'S','O','A','P','A','c','t','i','o','n',':',' ',0};
 
-        if (!(len = msg->action.length)) break;
+        if (!(len = MultiByteToWideChar( CP_UTF8, 0, (char *)msg->action->bytes, msg->action->length, NULL, 0 )))
+            break;
 
         hr = E_OUTOFMEMORY;
         if (!(buf = heap_alloc( (len + 3) * sizeof(WCHAR) ))) goto done;
         buf[0] = '"';
-        memcpy( buf + 1, msg->action.chars, len * sizeof(WCHAR) );
+        MultiByteToWideChar( CP_UTF8, 0, (char *)msg->action->bytes, msg->action->length, buf + 1, len );
         buf[len + 1] = '"';
         buf[len + 2] = 0;
 
@@ -1702,12 +1701,13 @@ HRESULT message_insert_http_headers( WS_MESSAGE *handle, HINTERNET req )
         static const WCHAR actionW[] = {'a','c','t','i','o','n','=','"'};
         ULONG len_action = sizeof(actionW)/sizeof(actionW[0]);
 
-        if (!(len = msg->action.length)) break;
+        if (!(len = MultiByteToWideChar( CP_UTF8, 0, (char *)msg->action->bytes, msg->action->length, NULL, 0 )))
+            break;
 
         hr = E_OUTOFMEMORY;
         if (!(buf = heap_alloc( (len + len_action + 2) * sizeof(WCHAR) ))) goto done;
         memcpy( buf, actionW, len_action * sizeof(WCHAR) );
-        memcpy( buf + len_action, msg->action.chars, len * sizeof(WCHAR) );
+        MultiByteToWideChar( CP_UTF8, 0, (char *)msg->action->bytes, msg->action->length, buf + len_action, len );
         len += len_action;
         buf[len++] = '"';
         buf[len] = 0;
@@ -1827,21 +1827,17 @@ HRESULT message_set_action( WS_MESSAGE *handle, const WS_XML_STRING *action )
 
     if (!action || !action->length)
     {
-        heap_free( msg->action.chars );
-        msg->action.chars  = NULL;
-        msg->action.length = 0;
+        free_xml_string( msg->action );
+        msg->action = NULL;
     }
     else
     {
-        WCHAR *chars;
-        int len = MultiByteToWideChar( CP_UTF8, 0, (char *)action->bytes, action->length, NULL, 0 );
-        if (!(chars = heap_alloc( len * sizeof(WCHAR) ))) hr = E_OUTOFMEMORY;
+        WS_XML_STRING *str;
+        if (!(str = dup_xml_string( action ))) hr = E_OUTOFMEMORY;
         else
         {
-            MultiByteToWideChar( CP_UTF8, 0, (char *)action->bytes, action->length, chars, len );
-            heap_free( msg->action.chars );
-            msg->action.chars  = chars;
-            msg->action.length = len;
+            free_xml_string( msg->action );
+            msg->action = str;
         }
     }
 




More information about the wine-cvs mailing list