webservices: Implement WS_TYPE_ATTRIBUTE_FIELD_MAPPING for the writer.
Signed-off-by: Hans Leidekker <hans@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
9616d2586c
commit
234115c8cc
|
@ -4793,6 +4793,61 @@ static void test_stream_output(void)
|
||||||
WsFreeWriter( writer );
|
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)
|
START_TEST(writer)
|
||||||
{
|
{
|
||||||
test_WsCreateWriter();
|
test_WsCreateWriter();
|
||||||
|
@ -4837,4 +4892,5 @@ START_TEST(writer)
|
||||||
test_text_types_binary();
|
test_text_types_binary();
|
||||||
test_repeating_element_choice();
|
test_repeating_element_choice();
|
||||||
test_stream_output();
|
test_stream_output();
|
||||||
|
test_description_type();
|
||||||
}
|
}
|
||||||
|
|
|
@ -3760,8 +3760,8 @@ static HRESULT write_type_field( struct writer *writer, const WS_FIELD_DESCRIPTI
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* zero-terminated strings are always pointers */
|
/* zero-terminated strings and descriptions are always pointers */
|
||||||
if (desc->type == WS_WSZ_TYPE) field_options |= WS_FIELD_POINTER;
|
if (desc->type == WS_WSZ_TYPE || desc->type == WS_DESCRIPTION_TYPE) field_options |= WS_FIELD_POINTER;
|
||||||
|
|
||||||
if (field_options & WS_FIELD_POINTER)
|
if (field_options & WS_FIELD_POINTER)
|
||||||
size = sizeof(const void *);
|
size = sizeof(const void *);
|
||||||
|
@ -3790,6 +3790,10 @@ static HRESULT write_type_field( struct writer *writer, const WS_FIELD_DESCRIPTI
|
||||||
|
|
||||||
switch (desc->mapping)
|
switch (desc->mapping)
|
||||||
{
|
{
|
||||||
|
case WS_TYPE_ATTRIBUTE_FIELD_MAPPING:
|
||||||
|
mapping = WS_ATTRIBUTE_TYPE_MAPPING;
|
||||||
|
break;
|
||||||
|
|
||||||
case WS_ATTRIBUTE_FIELD_MAPPING:
|
case WS_ATTRIBUTE_FIELD_MAPPING:
|
||||||
if (!desc->localName || !desc->ns) return E_INVALIDARG;
|
if (!desc->localName || !desc->ns) return E_INVALIDARG;
|
||||||
if ((hr = write_add_attribute( writer, NULL, desc->localName, desc->ns, FALSE )) != S_OK)
|
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 );
|
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,
|
static HRESULT write_type( struct writer *writer, WS_TYPE_MAPPING mapping, WS_TYPE type,
|
||||||
const void *desc, WS_WRITE_OPTION option, const void *value,
|
const void *desc, WS_WRITE_OPTION option, const void *value,
|
||||||
ULONG size )
|
ULONG size )
|
||||||
|
@ -3970,6 +3985,9 @@ static HRESULT write_type( struct writer *writer, WS_TYPE_MAPPING mapping, WS_TY
|
||||||
case WS_XML_QNAME_TYPE:
|
case WS_XML_QNAME_TYPE:
|
||||||
return write_type_qname( writer, mapping, desc, option, value, size );
|
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:
|
case WS_STRUCT_TYPE:
|
||||||
return write_type_struct( writer, mapping, desc, option, value, size );
|
return write_type_struct( writer, mapping, desc, option, value, size );
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue