[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