[PATCH 2/2] webservices: Implement WS_TYPE_ATTRIBUTE_FIELD_MAPPING for the writer.
Hans Leidekker
hans at codeweavers.com
Fri Mar 20 10:03:53 CDT 2020
Signed-off-by: Hans Leidekker <hans at 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 );
--
2.20.1
More information about the wine-devel
mailing list