From 1746d162e748508624217bf661cb167affdcd6fd Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Wed, 21 Jun 2017 09:37:37 +0200 Subject: [PATCH] webservices: Add support for writing WS_UNIQUE_ID values. Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard --- 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 03a978860b8..9cb6c7d9b4c 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, "", __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, "urn:uuid:00000000-0000-0000-0000-000000000000", __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, "test", __LINE__ ); + WsFreeWriter( writer ); } diff --git a/dlls/webservices/writer.c b/dlls/webservices/writer.c index 2f2cd5d955e..9272b590a3e 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.11.4.GIT