Signed-off-by: Hans Leidekker hans@codeweavers.com --- dlls/webservices/tests/writer.c | 56 +++++++++++++++++++++++++++++++++ dlls/webservices/writer.c | 22 +++++++++++-- 2 files changed, 76 insertions(+), 2 deletions(-)
diff --git a/dlls/webservices/tests/writer.c b/dlls/webservices/tests/writer.c index e996e4972b..1d76918901 100644 --- a/dlls/webservices/tests/writer.c +++ b/dlls/webservices/tests/writer.c @@ -4793,6 +4793,61 @@ static void test_stream_output(void) WsFreeWriter( writer ); }
+static void test_description_type(void) +{ + static WS_XML_STRING ns = {0, NULL}, localname = {1, (BYTE *)"t"}, val = {3, (BYTE *)"val"}; + HRESULT hr; + WS_XML_WRITER *writer; + WS_FIELD_DESCRIPTION f, f2, *fields[2]; + WS_STRUCT_DESCRIPTION s; + struct test + { + const WS_STRUCT_DESCRIPTION *desc; + INT32 val; + } test; + + hr = WsCreateWriter( NULL, 0, &writer, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + memset( &f, 0, sizeof(f) ); + f.mapping = WS_TYPE_ATTRIBUTE_FIELD_MAPPING; + f.type = WS_DESCRIPTION_TYPE; + fields[0] = &f; + + memset( &f2, 0, sizeof(f2) ); + f2.mapping = WS_ATTRIBUTE_FIELD_MAPPING; + f2.localName = &val; + f2.ns = &ns; + f2.offset = FIELD_OFFSET(struct test, val); + f2.type = WS_INT32_TYPE; + fields[1] = &f2; + + memset( &s, 0, sizeof(s) ); + s.size = sizeof(struct test); + s.alignment = TYPE_ALIGNMENT(struct test); + s.fields = fields; + s.fieldCount = 2; + s.typeLocalName = &localname; + s.typeNs = &ns; + + test.desc = &s; + test.val = -1; + + hr = set_output( writer ); + hr = WsWriteStartElement( writer, NULL, &localname, &ns, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = WsWriteType( writer, WS_ELEMENT_TYPE_MAPPING, WS_STRUCT_TYPE, &s, + WS_WRITE_REQUIRED_VALUE, &test, sizeof(test), NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = WsWriteEndElement( writer, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + check_output( writer, "<t val="-1"/>", __LINE__ ); + + WsFreeWriter( writer ); +} + START_TEST(writer) { test_WsCreateWriter(); @@ -4837,4 +4892,5 @@ START_TEST(writer) test_text_types_binary(); test_repeating_element_choice(); test_stream_output(); + test_description_type(); } diff --git a/dlls/webservices/writer.c b/dlls/webservices/writer.c index 989ea0986d..28df4a3c4e 100644 --- a/dlls/webservices/writer.c +++ b/dlls/webservices/writer.c @@ -3760,8 +3760,8 @@ static HRESULT write_type_field( struct writer *writer, const WS_FIELD_DESCRIPTI return E_NOTIMPL; }
- /* zero-terminated strings are always pointers */ - if (desc->type == WS_WSZ_TYPE) field_options |= WS_FIELD_POINTER; + /* zero-terminated strings and descriptions are always pointers */ + if (desc->type == WS_WSZ_TYPE || desc->type == WS_DESCRIPTION_TYPE) field_options |= WS_FIELD_POINTER;
if (field_options & WS_FIELD_POINTER) size = sizeof(const void *); @@ -3790,6 +3790,10 @@ static HRESULT write_type_field( struct writer *writer, const WS_FIELD_DESCRIPTI
switch (desc->mapping) { + case WS_TYPE_ATTRIBUTE_FIELD_MAPPING: + mapping = WS_ATTRIBUTE_TYPE_MAPPING; + break; + case WS_ATTRIBUTE_FIELD_MAPPING: if (!desc->localName || !desc->ns) return E_INVALIDARG; if ((hr = write_add_attribute( writer, NULL, desc->localName, desc->ns, FALSE )) != S_OK) @@ -3910,6 +3914,17 @@ static HRESULT write_type_enum( struct writer *writer, WS_TYPE_MAPPING mapping, return write_type_text( writer, mapping, &utf8.text ); }
+static HRESULT write_type_description( struct writer *writer, WS_TYPE_MAPPING mapping, + WS_WRITE_OPTION option, const void *value, ULONG size ) +{ + const WS_STRUCT_DESCRIPTION *ptr; + HRESULT hr; + + if ((hr = get_value_ptr( option, value, size, sizeof(*ptr), (const void **)&ptr )) != S_OK) return hr; + if (ptr) FIXME( "ignoring type description %p\n", ptr ); + return S_OK; +} + static HRESULT write_type( struct writer *writer, WS_TYPE_MAPPING mapping, WS_TYPE type, const void *desc, WS_WRITE_OPTION option, const void *value, ULONG size ) @@ -3970,6 +3985,9 @@ static HRESULT write_type( struct writer *writer, WS_TYPE_MAPPING mapping, WS_TY case WS_XML_QNAME_TYPE: return write_type_qname( writer, mapping, desc, option, value, size );
+ case WS_DESCRIPTION_TYPE: + return write_type_description( writer, mapping, option, value, size ); + case WS_STRUCT_TYPE: return write_type_struct( writer, mapping, desc, option, value, size );