[5/9] webservices: Add support for reading enum values.
Hans Leidekker
hans at codeweavers.com
Wed Apr 13 06:49:42 CDT 2016
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/webservices/reader.c | 68 +++++++++++++++++++++++++++++++++++++++++
dlls/webservices/tests/reader.c | 18 +++++++++++
2 files changed, 86 insertions(+)
diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c
index f09781e..c2c9d0b 100644
--- a/dlls/webservices/reader.c
+++ b/dlls/webservices/reader.c
@@ -2542,6 +2542,67 @@ static HRESULT read_type_wsz( struct reader *reader, WS_TYPE_MAPPING mapping,
return S_OK;
}
+static HRESULT get_enum_value( const WS_XML_UTF8_TEXT *text, const WS_ENUM_DESCRIPTION *desc, int *ret )
+{
+ ULONG i;
+ for (i = 0; i < desc->valueCount; i++)
+ {
+ if (WsXmlStringEquals( &text->value, desc->values[i].name, NULL ) == S_OK)
+ {
+ *ret = desc->values[i].value;
+ return S_OK;
+ }
+ }
+ return WS_E_INVALID_FORMAT;
+}
+
+static HRESULT read_type_enum( struct reader *reader, WS_TYPE_MAPPING mapping,
+ const WS_XML_STRING *localname, const WS_XML_STRING *ns,
+ const WS_ENUM_DESCRIPTION *desc, WS_READ_OPTION option,
+ WS_HEAP *heap, void *ret, ULONG size )
+{
+ WS_XML_UTF8_TEXT *utf8;
+ HRESULT hr;
+ int val = 0;
+ BOOL found;
+
+ if (!desc) return E_INVALIDARG;
+
+ if ((hr = read_get_text( reader, mapping, localname, ns, &utf8, &found )) != S_OK) return hr;
+ if (found && (hr = get_enum_value( utf8, desc, &val )) != S_OK) return hr;
+
+ switch (option)
+ {
+ case WS_READ_REQUIRED_VALUE:
+ if (!found) return WS_E_INVALID_FORMAT;
+ if (size != sizeof(int)) return E_INVALIDARG;
+ *(int *)ret = val;
+ break;
+
+ case WS_READ_REQUIRED_POINTER:
+ if (!found) return WS_E_INVALID_FORMAT;
+ /* fall through */
+
+ case WS_READ_OPTIONAL_POINTER:
+ {
+ int *heap_val = NULL;
+ if (size != sizeof(heap_val)) return E_INVALIDARG;
+ if (found)
+ {
+ if (!(heap_val = ws_alloc( heap, sizeof(*heap_val) ))) return WS_E_QUOTA_EXCEEDED;
+ *heap_val = val;
+ }
+ *(int **)ret = heap_val;
+ break;
+ }
+ default:
+ FIXME( "read option %u not supported\n", option );
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
+}
+
static BOOL is_empty_text_node( const struct node *node )
{
const WS_XML_TEXT_NODE *text = (const WS_XML_TEXT_NODE *)node;
@@ -2608,6 +2669,7 @@ static ULONG get_type_size( WS_TYPE type, const WS_STRUCT_DESCRIPTION *desc )
case WS_BOOL_TYPE:
case WS_INT32_TYPE:
case WS_UINT32_TYPE:
+ case WS_ENUM_TYPE:
return sizeof(INT32);
case WS_INT64_TYPE:
@@ -2716,6 +2778,7 @@ static WS_READ_OPTION map_field_options( WS_TYPE type, ULONG options )
case WS_UINT16_TYPE:
case WS_UINT32_TYPE:
case WS_UINT64_TYPE:
+ case WS_ENUM_TYPE:
return WS_READ_REQUIRED_VALUE;
case WS_WSZ_TYPE:
@@ -2944,6 +3007,11 @@ static HRESULT read_type( struct reader *reader, WS_TYPE_MAPPING mapping, WS_TYP
return hr;
break;
+ case WS_ENUM_TYPE:
+ if ((hr = read_type_enum( reader, mapping, localname, ns, desc, option, heap, value, size )) != S_OK)
+ return hr;
+ break;
+
default:
FIXME( "type %u not supported\n", type );
return E_NOTIMPL;
diff --git a/dlls/webservices/tests/reader.c b/dlls/webservices/tests/reader.c
index 02b1c27..9b5face 100644
--- a/dlls/webservices/tests/reader.c
+++ b/dlls/webservices/tests/reader.c
@@ -1324,6 +1324,12 @@ static void test_WsReadType(void)
HRESULT hr;
WS_XML_READER *reader;
WS_HEAP *heap;
+ enum { ONE = 1, TWO = 2 };
+ WS_XML_STRING one = { 3, (BYTE *)"ONE" };
+ WS_XML_STRING two = { 3, (BYTE *)"TWO" };
+ WS_ENUM_VALUE enum_values[] = { { ONE, &one }, { TWO, &two } };
+ WS_ENUM_DESCRIPTION enum_desc;
+ int val_enum;
WCHAR *val_str;
BOOL val_bool;
INT8 val_int8;
@@ -1561,6 +1567,18 @@ static void test_WsReadType(void)
todo_wine ok( hr == WS_E_INVALID_FORMAT, "got %08x\n", hr );
ok( !val_uint64, "wrong value\n" );
+ enum_desc.values = enum_values;
+ enum_desc.valueCount = sizeof(enum_values)/sizeof(enum_values[0]);
+ enum_desc.maxByteCount = 3;
+ enum_desc.nameIndices = NULL;
+
+ val_enum = 0;
+ prepare_type_test( reader, "<t>ONE</t>", sizeof("<t>ONE</t>") - 1 );
+ hr = WsReadType( reader, WS_ELEMENT_CONTENT_TYPE_MAPPING, WS_ENUM_TYPE, &enum_desc,
+ WS_READ_REQUIRED_VALUE, heap, &val_enum, sizeof(val_enum), NULL );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( val_enum == 1, "got %d\n", val_enum );
+
WsFreeReader( reader );
WsFreeHeap( heap );
}
--
2.8.0.rc3
More information about the wine-patches
mailing list