Hans Leidekker : webservices: Add support for text field mappings in WsReadType.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Mar 30 10:00:31 CDT 2016
Module: wine
Branch: master
Commit: 805143d40b2f0654345d6f9d74e4cec806a037a6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=805143d40b2f0654345d6f9d74e4cec806a037a6
Author: Hans Leidekker <hans at codeweavers.com>
Date: Wed Mar 30 14:12:17 2016 +0200
webservices: Add support for text field mappings in WsReadType.
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/webservices/reader.c | 18 +++++++++++++++++
dlls/webservices/tests/reader.c | 45 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+)
diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c
index c97fd7e..59fe8a1 100644
--- a/dlls/webservices/reader.c
+++ b/dlls/webservices/reader.c
@@ -2532,6 +2532,20 @@ static HRESULT read_type( struct reader *, WS_TYPE_MAPPING, WS_TYPE, const WS_XM
const WS_XML_STRING *, const void *, WS_READ_OPTION, WS_HEAP *,
void *, ULONG );
+static HRESULT read_type_text( struct reader *reader, const WS_FIELD_DESCRIPTION *desc,
+ WS_READ_OPTION option, WS_HEAP *heap, void *ret, ULONG size )
+{
+ HRESULT hr;
+ BOOL found;
+
+ if ((hr = read_to_startelement( reader, &found )) != S_OK) return S_OK;
+ if (!found) return WS_E_INVALID_FORMAT;
+ if ((hr = read_node( reader )) != S_OK) return hr;
+
+ return read_type( reader, WS_ELEMENT_CONTENT_TYPE_MAPPING, desc->type, NULL, NULL,
+ desc->typeDescription, option, heap, ret, size );
+}
+
static WS_READ_OPTION map_field_options( WS_TYPE type, ULONG options )
{
if (options & !(WS_FIELD_POINTER | WS_FIELD_OPTIONAL))
@@ -2584,6 +2598,10 @@ static HRESULT read_type_struct_field( struct reader *reader, const WS_FIELD_DES
desc->typeDescription, option, heap, ptr, size );
break;
+ case WS_TEXT_FIELD_MAPPING:
+ hr = read_type_text( reader, desc, option, heap, ptr, size );
+ break;
+
default:
FIXME( "unhandled field mapping %u\n", desc->mapping );
return E_NOTIMPL;
diff --git a/dlls/webservices/tests/reader.c b/dlls/webservices/tests/reader.c
index 38675db..5e8dd93 100644
--- a/dlls/webservices/tests/reader.c
+++ b/dlls/webservices/tests/reader.c
@@ -2446,6 +2446,50 @@ static void test_WsGetNamespaceFromPrefix(void)
WsFreeReader( reader );
}
+static void test_text_field_mapping(void)
+{
+ static const WCHAR testW[] = {'t','e','s','t',0};
+ HRESULT hr;
+ WS_XML_READER *reader;
+ WS_HEAP *heap;
+ WS_STRUCT_DESCRIPTION s;
+ WS_FIELD_DESCRIPTION f, *fields[1];
+ struct test
+ {
+ WCHAR *str;
+ } *test;
+
+ hr = WsCreateHeap( 1 << 16, 0, NULL, 0, &heap, NULL );
+ ok( hr == S_OK, "got %08x\n", hr );
+
+ hr = WsCreateReader( NULL, 0, &reader, NULL ) ;
+ ok( hr == S_OK, "got %08x\n", hr );
+
+ prepare_struct_type_test( reader, "<a>test</a>" );
+
+ memset( &f, 0, sizeof(f) );
+ f.mapping = WS_TEXT_FIELD_MAPPING;
+ f.type = WS_WSZ_TYPE;
+ fields[0] = &f;
+
+ memset( &s, 0, sizeof(s) );
+ s.size = sizeof(struct test);
+ s.alignment = TYPE_ALIGNMENT(struct test);
+ s.fields = fields;
+ s.fieldCount = 1;
+
+ test = NULL;
+ hr = WsReadType( reader, WS_ELEMENT_TYPE_MAPPING, WS_STRUCT_TYPE, &s,
+ WS_READ_REQUIRED_POINTER, heap, &test, sizeof(test), NULL );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( test != NULL, "test not set\n" );
+ ok( test->str != NULL, "str not set\n" );
+ ok( !lstrcmpW( test->str, testW ), "got %s\n", wine_dbgstr_w(test->str) );
+
+ WsFreeReader( reader );
+ WsFreeHeap( heap );
+}
+
START_TEST(reader)
{
test_WsCreateError();
@@ -2467,4 +2511,5 @@ START_TEST(reader)
test_cdata();
test_WsFindAttribute();
test_WsGetNamespaceFromPrefix();
+ test_text_field_mapping();
}
More information about the wine-cvs
mailing list