Hans Leidekker : webservices: Add support for UTF-8 encoded text in read_message_id.

Alexandre Julliard julliard at winehq.org
Wed Oct 31 15:58:33 CDT 2018


Module: wine
Branch: master
Commit: 57db798965e974d43fec84a1dbc9cf7f78f67cd7
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=57db798965e974d43fec84a1dbc9cf7f78f67cd7

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Wed Oct 31 14:21:30 2018 +0100

webservices: Add support for UTF-8 encoded text in read_message_id.

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

---

 dlls/webservices/msg.c                 | 22 +++++++++++++++++-----
 dlls/webservices/reader.c              |  2 +-
 dlls/webservices/webservices_private.h |  1 +
 3 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/dlls/webservices/msg.c b/dlls/webservices/msg.c
index 4ccf82e..a53fd92 100644
--- a/dlls/webservices/msg.c
+++ b/dlls/webservices/msg.c
@@ -846,21 +846,33 @@ static HRESULT read_message_id( WS_XML_READER *reader, GUID *ret )
 {
     const WS_XML_NODE *node;
     const WS_XML_TEXT_NODE *text;
-    const WS_XML_UNIQUE_ID_TEXT *id;
     HRESULT hr;
 
     if ((hr = WsReadNode( reader, NULL )) != S_OK) return hr;
     if ((hr = WsGetReaderNode( reader, &node, NULL )) != S_OK) return hr;
     if (node->nodeType != WS_XML_NODE_TYPE_TEXT) return WS_E_INVALID_FORMAT;
     text = (const WS_XML_TEXT_NODE *)node;
-    if (text->text->textType != WS_XML_TEXT_TYPE_UNIQUE_ID)
+
+    switch (text->text->textType)
+    {
+    case WS_XML_TEXT_TYPE_UTF8:
+    {
+        const WS_XML_UTF8_TEXT *utf8 = (const WS_XML_UTF8_TEXT *)text->text;
+        if (utf8->value.length != 45 || memcmp( utf8->value.bytes, "urn:uuid:", 9 ))
+            return WS_E_INVALID_FORMAT;
+
+        return str_to_guid( utf8->value.bytes + 9, utf8->value.length - 9, ret );
+    }
+    case WS_XML_TEXT_TYPE_UNIQUE_ID:
     {
+        const WS_XML_UNIQUE_ID_TEXT *id = (const WS_XML_UNIQUE_ID_TEXT *)text->text;
+        *ret = id->value;
+        return S_OK;
+    }
+    default:
         FIXME( "unhandled text type %u\n", text->text->textType );
         return E_NOTIMPL;
     }
-    id = (const WS_XML_UNIQUE_ID_TEXT *)text->text;
-    *ret = id->value;
-    return S_OK;
 }
 
 static HRESULT read_envelope_start( struct msg *msg, WS_XML_READER *reader )
diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c
index a5ff59a..8cf3f24 100644
--- a/dlls/webservices/reader.c
+++ b/dlls/webservices/reader.c
@@ -3841,7 +3841,7 @@ static HRESULT str_to_float( const unsigned char *str, ULONG len, float *ret )
     return S_OK;
 }
 
-static HRESULT str_to_guid( const unsigned char *str, ULONG len, GUID *ret )
+HRESULT str_to_guid( const unsigned char *str, ULONG len, GUID *ret )
 {
     static const unsigned char hex[] =
     {
diff --git a/dlls/webservices/webservices_private.h b/dlls/webservices/webservices_private.h
index d981527..b482b5b 100644
--- a/dlls/webservices/webservices_private.h
+++ b/dlls/webservices/webservices_private.h
@@ -71,6 +71,7 @@ HRESULT read_header( WS_XML_READER *, const WS_XML_STRING *, const WS_XML_STRING
 HRESULT create_header_buffer( WS_XML_READER *, WS_HEAP *, WS_XML_BUFFER ** ) DECLSPEC_HIDDEN;
 HRESULT text_to_text( const WS_XML_TEXT *, const WS_XML_TEXT *, ULONG *, WS_XML_TEXT ** ) DECLSPEC_HIDDEN;
 HRESULT text_to_utf8text( const WS_XML_TEXT *, const WS_XML_UTF8_TEXT *, ULONG *, WS_XML_UTF8_TEXT ** ) DECLSPEC_HIDDEN;
+HRESULT str_to_guid( const unsigned char *, ULONG, GUID * ) DECLSPEC_HIDDEN;
 WS_XML_UTF8_TEXT *alloc_utf8_text( const BYTE *, ULONG ) DECLSPEC_HIDDEN;
 WS_XML_UTF16_TEXT *alloc_utf16_text( const BYTE *, ULONG ) DECLSPEC_HIDDEN;
 WS_XML_BASE64_TEXT *alloc_base64_text( const BYTE *, ULONG ) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list