[1/6] webservices: Add support for writing WS_UNIQUE_ID values.

Hans Leidekker hans at codeweavers.com
Wed Jun 21 02:37:37 CDT 2017


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/webservices/tests/writer.c | 20 ++++++++++++++++++++
 dlls/webservices/writer.c       | 38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 58 insertions(+)

diff --git a/dlls/webservices/tests/writer.c b/dlls/webservices/tests/writer.c
index 03a9788..9cb6c7d 100644
--- a/dlls/webservices/tests/writer.c
+++ b/dlls/webservices/tests/writer.c
@@ -679,6 +679,7 @@ static void test_basic_type(void)
     WCHAR *str;
     WS_STRING string;
     WS_BYTES bytes;
+    WS_UNIQUE_ID id;
     ULONG i;
     static const struct
     {
@@ -830,6 +831,25 @@ static void test_basic_type(void)
     check_output( writer, "<t a:nil=\"true\" xmlns:a=\"http://www.w3.org/2001/XMLSchema-instance\"/>",
                   __LINE__ );
 
+    prepare_basic_type_test( writer );
+    memset( &id, 0, sizeof(id) );
+    hr = WsWriteType( writer, WS_ELEMENT_TYPE_MAPPING, WS_UNIQUE_ID_TYPE, NULL, WS_WRITE_REQUIRED_VALUE,
+                      &id, sizeof(id), NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    hr = WsWriteEndElement( writer, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    check_output( writer, "<t>urn:uuid:00000000-0000-0000-0000-000000000000</t>", __LINE__ );
+
+    prepare_basic_type_test( writer );
+    id.uri.length = 4;
+    id.uri.chars  = testW;
+    hr = WsWriteType( writer, WS_ELEMENT_TYPE_MAPPING, WS_UNIQUE_ID_TYPE, NULL, WS_WRITE_REQUIRED_VALUE,
+                      &id, sizeof(id), NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    hr = WsWriteEndElement( writer, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    check_output( writer, "<t>test</t>", __LINE__ );
+
     WsFreeWriter( writer );
 }
 
diff --git a/dlls/webservices/writer.c b/dlls/webservices/writer.c
index 2f2cd5d..9272b59 100644
--- a/dlls/webservices/writer.c
+++ b/dlls/webservices/writer.c
@@ -2615,6 +2615,40 @@ static HRESULT write_type_guid( struct writer *writer, WS_TYPE_MAPPING mapping,
     return write_type_text( writer, mapping, &utf8.text );
 }
 
+static HRESULT write_type_unique_id( struct writer *writer, WS_TYPE_MAPPING mapping,
+                                     const WS_UNIQUE_ID_DESCRIPTION *desc, WS_WRITE_OPTION option,
+                                     const void *value, ULONG size )
+{
+    WS_XML_UTF8_TEXT utf8;
+    WS_XML_UTF16_TEXT utf16;
+    unsigned char buf[46]; /* "urn:uuid:00000000-0000-0000-0000-000000000000" */
+    const WS_UNIQUE_ID *ptr;
+    HRESULT hr;
+
+    if (desc)
+    {
+        FIXME( "description not supported\n" );
+        return E_NOTIMPL;
+    }
+
+    if (!option || option == WS_WRITE_NILLABLE_VALUE) return E_INVALIDARG;
+    if ((hr = get_value_ptr( option, value, size, sizeof(*ptr), (const void **)&ptr )) != S_OK) return hr;
+    if (option == WS_WRITE_NILLABLE_POINTER && !ptr) return write_add_nil_attribute( writer );
+
+    if (ptr->uri.length)
+    {
+        utf16.text.textType = WS_XML_TEXT_TYPE_UTF16;
+        utf16.bytes         = (BYTE *)ptr->uri.chars;
+        utf16.byteCount     = ptr->uri.length * sizeof(WCHAR);
+        return write_type_text( writer, mapping, &utf16.text );
+    }
+
+    utf8.text.textType = WS_XML_TEXT_TYPE_UTF8;
+    utf8.value.bytes   = buf;
+    utf8.value.length  = format_urn( &ptr->guid, buf );
+    return write_type_text( writer, mapping, &utf8.text );
+}
+
 static HRESULT write_type_string( struct writer *writer, WS_TYPE_MAPPING mapping,
                                   const WS_STRING_DESCRIPTION *desc, WS_WRITE_OPTION option,
                                   const void *value, ULONG size )
@@ -2740,6 +2774,7 @@ static WS_WRITE_OPTION get_field_write_option( WS_TYPE type, ULONG options )
     case WS_DOUBLE_TYPE:
     case WS_DATETIME_TYPE:
     case WS_GUID_TYPE:
+    case WS_UNIQUE_ID_TYPE:
     case WS_STRING_TYPE:
     case WS_BYTES_TYPE:
     case WS_XML_STRING_TYPE:
@@ -2956,6 +2991,9 @@ static HRESULT write_type( struct writer *writer, WS_TYPE_MAPPING mapping, WS_TY
     case WS_GUID_TYPE:
         return write_type_guid( writer, mapping, desc, option, value, size );
 
+    case WS_UNIQUE_ID_TYPE:
+        return write_type_unique_id( writer, mapping, desc, option, value, size );
+
     case WS_STRING_TYPE:
         return write_type_string( writer, mapping, desc, option, value, size );
 
-- 
2.1.4




More information about the wine-patches mailing list