[v2 2/5] webservices: Add support for item ranges.

Hans Leidekker hans at codeweavers.com
Wed Apr 6 08:55:51 CDT 2016


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/webservices/reader.c       | 27 ++++++---------------------
 dlls/webservices/tests/reader.c | 16 ++++++++++++++++
 2 files changed, 22 insertions(+), 21 deletions(-)

diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c
index 7559da0..d79c310 100644
--- a/dlls/webservices/reader.c
+++ b/dlls/webservices/reader.c
@@ -2581,9 +2581,6 @@ static HRESULT read_type_repeating_element( struct reader *reader, const WS_FIEL
 
     if (size != sizeof(void *)) return E_INVALIDARG;
 
-    if (desc->itemRange)
-        FIXME( "ignoring range (%u-%u)\n", desc->itemRange->minItemCount, desc->itemRange->maxItemCount );
-
     /* wrapper element */
     if (desc->localName && ((hr = read_node( reader )) != S_OK)) return hr;
 
@@ -2616,29 +2613,17 @@ static HRESULT read_type_repeating_element( struct reader *reader, const WS_FIEL
 
     if (desc->localName && ((hr = read_node( reader )) != S_OK)) return hr;
 
-    if (!nb_items)
+    if (desc->itemRange && (nb_items < desc->itemRange->minItemCount || nb_items > desc->itemRange->maxItemCount))
     {
+        TRACE( "number of items %u out of range (%u-%u)\n", nb_items, desc->itemRange->minItemCount,
+               desc->itemRange->maxItemCount );
         ws_free( heap, buf );
-        buf = NULL;
-    }
-
-    switch (option)
-    {
-    case WS_READ_REQUIRED_POINTER:
-        if (!nb_items) return WS_E_INVALID_FORMAT;
-        /* fall through */
-
-    case WS_READ_OPTIONAL_POINTER:
-        if (size != sizeof(void *)) return E_INVALIDARG;
-        *ret = buf;
-        break;
-
-    default:
-        FIXME( "read option %u not supported\n", option );
-        return E_NOTIMPL;
+        return WS_E_INVALID_FORMAT;
     }
 
     *count = nb_items;
+    *ret = buf;
+
     return S_OK;
 }
 
diff --git a/dlls/webservices/tests/reader.c b/dlls/webservices/tests/reader.c
index 755a070..b7ef0ca 100644
--- a/dlls/webservices/tests/reader.c
+++ b/dlls/webservices/tests/reader.c
@@ -77,6 +77,9 @@ static const char data12[] =
     "<service><id>2</id></service>"
     "</services>";
 
+static const char data13[] =
+    "<services></services>";
+
 static void test_WsCreateError(void)
 {
     HRESULT hr;
@@ -2659,6 +2662,7 @@ static void test_repeating_element(void)
     WS_HEAP *heap;
     WS_STRUCT_DESCRIPTION s, s2;
     WS_FIELD_DESCRIPTION f, f2, *fields[1], *fields2[1];
+    WS_ITEM_RANGE range;
     struct service
     {
         UINT32 id;
@@ -2717,6 +2721,18 @@ static void test_repeating_element(void)
     ok( test->service[0].id == 1, "got %u\n", test->service[0].id );
     ok( test->service[1].id == 2, "got %u\n", test->service[1].id );
 
+    prepare_struct_type_test( reader, data13 );
+    range.minItemCount = 0;
+    range.maxItemCount = 1;
+    f.itemRange = ⦥
+    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->service != NULL, "service not set\n" );
+    ok( !test->service_count, "got %u\n", test->service_count );
+
     WsFreeReader( reader );
     WsFreeHeap( heap );
 }
-- 
2.8.0.rc3




More information about the wine-patches mailing list