Module: wine Branch: master Commit: 805143d40b2f0654345d6f9d74e4cec806a037a6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=805143d40b2f0654345d6f9d74...
Author: Hans Leidekker hans@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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(); }