[4/6] webservices: Add support for text field mappings in WsReadType.

Hans Leidekker hans at codeweavers.com
Wed Mar 30 07:12:17 CDT 2016


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 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();
 }
-- 
2.8.0.rc3




More information about the wine-patches mailing list