webservices: Allow integer values to be passed by pointer in WsWriteType.
Signed-off-by: Hans Leidekker <hans@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
d921526312
commit
04c52f1467
|
@ -42,15 +42,9 @@ static inline float __port_nan(void)
|
||||||
|
|
||||||
static HRESULT set_output( WS_XML_WRITER *writer )
|
static HRESULT set_output( WS_XML_WRITER *writer )
|
||||||
{
|
{
|
||||||
WS_XML_WRITER_TEXT_ENCODING encoding;
|
WS_XML_WRITER_TEXT_ENCODING text = { {WS_XML_WRITER_ENCODING_TYPE_TEXT}, WS_CHARSET_UTF8 };
|
||||||
WS_XML_WRITER_BUFFER_OUTPUT output;
|
WS_XML_WRITER_BUFFER_OUTPUT buf = { {WS_XML_WRITER_OUTPUT_TYPE_BUFFER} };
|
||||||
|
return WsSetOutput( writer, &text.encoding, &buf.output, NULL, 0, NULL );
|
||||||
encoding.encoding.encodingType = WS_XML_WRITER_ENCODING_TYPE_TEXT;
|
|
||||||
encoding.charSet = WS_CHARSET_UTF8;
|
|
||||||
|
|
||||||
output.output.outputType = WS_XML_WRITER_OUTPUT_TYPE_BUFFER;
|
|
||||||
|
|
||||||
return WsSetOutput( writer, &encoding.encoding, &output.output, NULL, 0, NULL );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_WsCreateWriter(void)
|
static void test_WsCreateWriter(void)
|
||||||
|
@ -526,6 +520,10 @@ static void test_WsWriteType(void)
|
||||||
WS_WRITE_REQUIRED_POINTER, NULL, sizeof(val_str), NULL );
|
WS_WRITE_REQUIRED_POINTER, NULL, sizeof(val_str), NULL );
|
||||||
ok( hr == E_INVALIDARG, "got %08x\n", hr );
|
ok( hr == E_INVALIDARG, "got %08x\n", hr );
|
||||||
|
|
||||||
|
hr = WsWriteType( writer, WS_ELEMENT_TYPE_MAPPING, WS_WSZ_TYPE, NULL,
|
||||||
|
WS_WRITE_REQUIRED_VALUE, testW, sizeof(testW), NULL );
|
||||||
|
ok( hr == E_INVALIDARG, "got %08x\n", hr );
|
||||||
|
|
||||||
hr = WsWriteType( writer, WS_ELEMENT_TYPE_MAPPING, WS_WSZ_TYPE, NULL,
|
hr = WsWriteType( writer, WS_ELEMENT_TYPE_MAPPING, WS_WSZ_TYPE, NULL,
|
||||||
WS_WRITE_REQUIRED_POINTER, &val_str, sizeof(WCHAR **), NULL );
|
WS_WRITE_REQUIRED_POINTER, &val_str, sizeof(WCHAR **), NULL );
|
||||||
ok( hr == S_OK, "got %08x\n", hr );
|
ok( hr == S_OK, "got %08x\n", hr );
|
||||||
|
@ -632,6 +630,8 @@ static void test_basic_type(void)
|
||||||
/* element type mapping is the same as element content type mapping for basic types */
|
/* element type mapping is the same as element content type mapping for basic types */
|
||||||
for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
|
for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
|
||||||
{
|
{
|
||||||
|
const INT64 *ptr = &tests[i].val;
|
||||||
|
|
||||||
hr = set_output( writer );
|
hr = set_output( writer );
|
||||||
ok( hr == S_OK, "got %08x\n", hr );
|
ok( hr == S_OK, "got %08x\n", hr );
|
||||||
|
|
||||||
|
@ -639,7 +639,7 @@ static void test_basic_type(void)
|
||||||
ok( hr == S_OK, "got %08x\n", hr );
|
ok( hr == S_OK, "got %08x\n", hr );
|
||||||
|
|
||||||
hr = WsWriteType( writer, WS_ELEMENT_TYPE_MAPPING, tests[i].type, NULL,
|
hr = WsWriteType( writer, WS_ELEMENT_TYPE_MAPPING, tests[i].type, NULL,
|
||||||
WS_WRITE_REQUIRED_VALUE, &tests[i].val, tests[i].size, NULL );
|
WS_WRITE_REQUIRED_POINTER, &ptr, sizeof(ptr), NULL );
|
||||||
ok( hr == S_OK, "%u: got %08x\n", i, hr );
|
ok( hr == S_OK, "%u: got %08x\n", i, hr );
|
||||||
|
|
||||||
hr = WsWriteEndElement( writer, NULL );
|
hr = WsWriteEndElement( writer, NULL );
|
||||||
|
@ -713,6 +713,10 @@ static void test_simple_struct_type(void)
|
||||||
WS_WRITE_REQUIRED_POINTER, &test, sizeof(test), NULL );
|
WS_WRITE_REQUIRED_POINTER, &test, sizeof(test), NULL );
|
||||||
ok( hr == E_INVALIDARG, "got %08x\n", hr );
|
ok( hr == E_INVALIDARG, "got %08x\n", hr );
|
||||||
|
|
||||||
|
hr = WsWriteType( writer, WS_ELEMENT_CONTENT_TYPE_MAPPING, WS_STRUCT_TYPE, NULL,
|
||||||
|
WS_WRITE_REQUIRED_VALUE, test, sizeof(*test), NULL );
|
||||||
|
ok( hr == E_INVALIDARG, "got %08x\n", hr );
|
||||||
|
|
||||||
hr = WsWriteType( writer, WS_ELEMENT_CONTENT_TYPE_MAPPING, WS_STRUCT_TYPE, &s,
|
hr = WsWriteType( writer, WS_ELEMENT_CONTENT_TYPE_MAPPING, WS_STRUCT_TYPE, &s,
|
||||||
WS_WRITE_REQUIRED_POINTER, &test, sizeof(test), NULL );
|
WS_WRITE_REQUIRED_POINTER, &test, sizeof(test), NULL );
|
||||||
ok( hr == S_OK, "got %08x\n", hr );
|
ok( hr == S_OK, "got %08x\n", hr );
|
||||||
|
|
|
@ -1593,8 +1593,6 @@ static HRESULT write_type_struct( struct writer *writer, WS_TYPE_MAPPING mapping
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
const char *ptr;
|
const char *ptr;
|
||||||
|
|
||||||
if (!desc) return E_INVALIDARG;
|
|
||||||
|
|
||||||
if (desc->structOptions)
|
if (desc->structOptions)
|
||||||
{
|
{
|
||||||
FIXME( "struct options 0x%x not supported\n", desc->structOptions );
|
FIXME( "struct options 0x%x not supported\n", desc->structOptions );
|
||||||
|
@ -1612,80 +1610,115 @@ static HRESULT write_type_struct( struct writer *writer, WS_TYPE_MAPPING mapping
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT get_value_ptr( WS_WRITE_OPTION option, const void *value, ULONG size, const void **ptr )
|
||||||
|
{
|
||||||
|
switch (option)
|
||||||
|
{
|
||||||
|
case WS_WRITE_REQUIRED_VALUE:
|
||||||
|
if (!value || !size) return E_INVALIDARG;
|
||||||
|
*ptr = value;
|
||||||
|
return S_OK;
|
||||||
|
|
||||||
|
case WS_WRITE_REQUIRED_POINTER:
|
||||||
|
if (size != sizeof(const void *) || !(*ptr = *(const void **)value)) return E_INVALIDARG;
|
||||||
|
return S_OK;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FIXME( "option %08x not supported\n", option );
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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 )
|
||||||
{
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case WS_STRUCT_TYPE:
|
case WS_STRUCT_TYPE:
|
||||||
{
|
{
|
||||||
const void * const *ptr = value;
|
const void *ptr;
|
||||||
|
|
||||||
if (!desc || (option && option != WS_WRITE_REQUIRED_POINTER) || size != sizeof(*ptr))
|
if (!desc || option == WS_WRITE_REQUIRED_VALUE) return E_INVALIDARG;
|
||||||
return E_INVALIDARG;
|
|
||||||
|
|
||||||
return write_type_struct( writer, mapping, desc, *ptr );
|
if (!option) option = WS_WRITE_REQUIRED_POINTER;
|
||||||
|
if ((hr = get_value_ptr( option, value, size, (const void **)&ptr )) != S_OK) return hr;
|
||||||
|
return write_type_struct( writer, mapping, desc, ptr );
|
||||||
}
|
}
|
||||||
case WS_BOOL_TYPE:
|
case WS_BOOL_TYPE:
|
||||||
{
|
{
|
||||||
const BOOL *ptr = value;
|
const BOOL *ptr;
|
||||||
if ((option && option != WS_WRITE_REQUIRED_VALUE) || size != sizeof(*ptr)) return E_INVALIDARG;
|
if (!option) option = WS_WRITE_REQUIRED_VALUE;
|
||||||
|
if ((hr = get_value_ptr( option, value, size, (const void **)&ptr )) != S_OK) return hr;
|
||||||
return write_type_bool( writer, mapping, desc, ptr );
|
return write_type_bool( writer, mapping, desc, ptr );
|
||||||
}
|
}
|
||||||
case WS_INT8_TYPE:
|
case WS_INT8_TYPE:
|
||||||
{
|
{
|
||||||
const INT8 *ptr = value;
|
const INT8 *ptr = value;
|
||||||
if ((option && option != WS_WRITE_REQUIRED_VALUE) || size != sizeof(*ptr)) return E_INVALIDARG;
|
if (!option) option = WS_WRITE_REQUIRED_VALUE;
|
||||||
|
if ((hr = get_value_ptr( option, value, size, (const void **)&ptr )) != S_OK) return hr;
|
||||||
return write_type_int8( writer, mapping, desc, ptr );
|
return write_type_int8( writer, mapping, desc, ptr );
|
||||||
}
|
}
|
||||||
case WS_INT16_TYPE:
|
case WS_INT16_TYPE:
|
||||||
{
|
{
|
||||||
const INT16 *ptr = value;
|
const INT16 *ptr = value;
|
||||||
if ((option && option != WS_WRITE_REQUIRED_VALUE) || size != sizeof(*ptr)) return E_INVALIDARG;
|
if (!option) option = WS_WRITE_REQUIRED_VALUE;
|
||||||
|
if ((hr = get_value_ptr( option, value, size, (const void **)&ptr )) != S_OK) return hr;
|
||||||
return write_type_int16( writer, mapping, desc, ptr );
|
return write_type_int16( writer, mapping, desc, ptr );
|
||||||
}
|
}
|
||||||
case WS_INT32_TYPE:
|
case WS_INT32_TYPE:
|
||||||
{
|
{
|
||||||
const INT32 *ptr = value;
|
const INT32 *ptr;
|
||||||
if ((option && option != WS_WRITE_REQUIRED_VALUE) || size != sizeof(*ptr)) return E_INVALIDARG;
|
if (!option) option = WS_WRITE_REQUIRED_VALUE;
|
||||||
|
if ((hr = get_value_ptr( option, value, size, (const void **)&ptr )) != S_OK) return hr;
|
||||||
return write_type_int32( writer, mapping, desc, ptr );
|
return write_type_int32( writer, mapping, desc, ptr );
|
||||||
}
|
}
|
||||||
case WS_INT64_TYPE:
|
case WS_INT64_TYPE:
|
||||||
{
|
{
|
||||||
const INT64 *ptr = value;
|
const INT64 *ptr = value;
|
||||||
if ((option && option != WS_WRITE_REQUIRED_VALUE) || size != sizeof(*ptr)) return E_INVALIDARG;
|
if (!option) option = WS_WRITE_REQUIRED_VALUE;
|
||||||
|
if ((hr = get_value_ptr( option, value, size, (const void **)&ptr )) != S_OK) return hr;
|
||||||
return write_type_int64( writer, mapping, desc, ptr );
|
return write_type_int64( writer, mapping, desc, ptr );
|
||||||
}
|
}
|
||||||
case WS_UINT8_TYPE:
|
case WS_UINT8_TYPE:
|
||||||
{
|
{
|
||||||
const UINT8 *ptr = value;
|
const UINT8 *ptr = value;
|
||||||
if ((option && option != WS_WRITE_REQUIRED_VALUE) || size != sizeof(*ptr)) return E_INVALIDARG;
|
if (!option) option = WS_WRITE_REQUIRED_VALUE;
|
||||||
|
if ((hr = get_value_ptr( option, value, size, (const void **)&ptr )) != S_OK) return hr;
|
||||||
return write_type_uint8( writer, mapping, desc, ptr );
|
return write_type_uint8( writer, mapping, desc, ptr );
|
||||||
}
|
}
|
||||||
case WS_UINT16_TYPE:
|
case WS_UINT16_TYPE:
|
||||||
{
|
{
|
||||||
const UINT16 *ptr = value;
|
const UINT16 *ptr = value;
|
||||||
if ((option && option != WS_WRITE_REQUIRED_VALUE) || size != sizeof(*ptr)) return E_INVALIDARG;
|
if (!option) option = WS_WRITE_REQUIRED_VALUE;
|
||||||
|
if ((hr = get_value_ptr( option, value, size, (const void **)&ptr )) != S_OK) return hr;
|
||||||
return write_type_uint16( writer, mapping, desc, ptr );
|
return write_type_uint16( writer, mapping, desc, ptr );
|
||||||
}
|
}
|
||||||
case WS_UINT32_TYPE:
|
case WS_UINT32_TYPE:
|
||||||
{
|
{
|
||||||
const UINT32 *ptr = value;
|
const UINT32 *ptr = value;
|
||||||
if ((option && option != WS_WRITE_REQUIRED_VALUE) || size != sizeof(*ptr)) return E_INVALIDARG;
|
if (!option) option = WS_WRITE_REQUIRED_VALUE;
|
||||||
|
if ((hr = get_value_ptr( option, value, size, (const void **)&ptr )) != S_OK) return hr;
|
||||||
return write_type_uint32( writer, mapping, desc, ptr );
|
return write_type_uint32( writer, mapping, desc, ptr );
|
||||||
}
|
}
|
||||||
case WS_UINT64_TYPE:
|
case WS_UINT64_TYPE:
|
||||||
{
|
{
|
||||||
const UINT64 *ptr = value;
|
const UINT64 *ptr = value;
|
||||||
if ((option && option != WS_WRITE_REQUIRED_VALUE) || size != sizeof(*ptr)) return E_INVALIDARG;
|
if (!option) option = WS_WRITE_REQUIRED_VALUE;
|
||||||
|
if ((hr = get_value_ptr( option, value, size, (const void **)&ptr )) != S_OK) return hr;
|
||||||
return write_type_uint64( writer, mapping, desc, ptr );
|
return write_type_uint64( writer, mapping, desc, ptr );
|
||||||
}
|
}
|
||||||
case WS_WSZ_TYPE:
|
case WS_WSZ_TYPE:
|
||||||
{
|
{
|
||||||
const WCHAR * const *ptr = value;
|
const WCHAR *ptr;
|
||||||
if ((option && option != WS_WRITE_REQUIRED_POINTER) || size != sizeof(*ptr)) return E_INVALIDARG;
|
|
||||||
return write_type_wsz( writer, mapping, desc, *ptr );
|
if (option == WS_WRITE_REQUIRED_VALUE) return E_INVALIDARG;
|
||||||
|
|
||||||
|
if (!option) option = WS_WRITE_REQUIRED_POINTER;
|
||||||
|
if ((hr = get_value_ptr( option, value, size, (const void **)&ptr )) != S_OK) return hr;
|
||||||
|
return write_type_wsz( writer, mapping, desc, ptr );
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
FIXME( "type %u not supported\n", type );
|
FIXME( "type %u not supported\n", type );
|
||||||
|
|
Loading…
Reference in New Issue