Module: wine Branch: master Commit: 5eed03cb28d14260ddbb7ffe8a319b83adbff7f1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5eed03cb28d14260ddbb7ffe8a...
Author: Hans Leidekker hans@codeweavers.com Date: Fri Jan 29 13:27:28 2016 +0100
webservices: Implement WsWriteAttribute.
Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/webservices/tests/writer.c | 66 +++++++++++++++++++++++++++++++++++++++ dlls/webservices/webservices.spec | 2 +- dlls/webservices/writer.c | 28 +++++++++++++++++ 3 files changed, 95 insertions(+), 1 deletion(-)
diff --git a/dlls/webservices/tests/writer.c b/dlls/webservices/tests/writer.c index 252ac2c..a4d1973 100644 --- a/dlls/webservices/tests/writer.c +++ b/dlls/webservices/tests/writer.c @@ -906,6 +906,71 @@ static void test_WsWriteValue(void) WsFreeWriter( writer ); }
+static void test_WsWriteAttribute(void) +{ + static const WCHAR testW[] = {'t','e','s','t',0}; + HRESULT hr; + WS_XML_WRITER *writer; + WS_STRUCT_DESCRIPTION s; + WS_FIELD_DESCRIPTION f, *fields[1]; + WS_ATTRIBUTE_DESCRIPTION desc; + WS_XML_STRING localname = {3, (BYTE *)"str"}, ns = {0, NULL}; + struct test { const WCHAR *str; } *test; + + hr = WsCreateWriter( NULL, 0, &writer, NULL ) ; + ok( hr == S_OK, "got %08x\n", hr ); + + hr = set_output( writer ); + ok( hr == S_OK, "got %08x\n", hr ); + + /* text field mapping */ + memset( &f, 0, sizeof(f) ); + f.mapping = WS_TEXT_FIELD_MAPPING; + f.type = WS_WSZ_TYPE; + fields[0] = &f; + + memset( &s, 0, sizeof(s) ); + s.size = sizeof(struct test); + s.alignment = TYPE_ALIGNMENT(struct test); + s.fields = fields; + s.fieldCount = 1; + + desc.attributeLocalName = &localname; + desc.attributeNs = &ns; + desc.type = WS_STRUCT_TYPE; + desc.typeDescription = &s; + + test = HeapAlloc( GetProcessHeap(), 0, sizeof(*test) ); + test->str = testW; + hr = WsWriteAttribute( NULL, &desc, WS_WRITE_REQUIRED_POINTER, &test, sizeof(test), NULL ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + hr = WsWriteAttribute( writer, NULL, WS_WRITE_REQUIRED_POINTER, &test, sizeof(test), NULL ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + hr = WsWriteAttribute( writer, &desc, WS_WRITE_REQUIRED_POINTER, NULL, 0, NULL ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + hr = WsWriteAttribute( writer, &desc, WS_WRITE_REQUIRED_POINTER, &test, sizeof(test), NULL ); + ok( hr == WS_E_INVALID_OPERATION, "got %08x\n", hr ); + + hr = set_output( writer ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = WsWriteStartElement( writer, NULL, &localname, &ns, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = WsWriteAttribute( writer, &desc, WS_WRITE_REQUIRED_POINTER, &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, "<str str="test"/>", __LINE__ ); + + HeapFree( GetProcessHeap(), 0, test ); + WsFreeWriter( writer ); +} + START_TEST(writer) { test_WsCreateWriter(); @@ -917,6 +982,7 @@ START_TEST(writer) test_WsWriteType(); test_WsWriteElement(); test_WsWriteValue(); + test_WsWriteAttribute(); test_basic_type(); test_simple_struct_type(); } diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec index 4bda968..6931f77 100644 --- a/dlls/webservices/webservices.spec +++ b/dlls/webservices/webservices.spec @@ -165,7 +165,7 @@ @ stub WsTrimXmlWhitespace @ stub WsVerifyXmlNCName @ stub WsWriteArray -@ stub WsWriteAttribute +@ stdcall WsWriteAttribute(ptr ptr long ptr long ptr) @ stub WsWriteBody @ stub WsWriteBytes @ stub WsWriteChars diff --git a/dlls/webservices/writer.c b/dlls/webservices/writer.c index 05094cd..dafeb24 100644 --- a/dlls/webservices/writer.c +++ b/dlls/webservices/writer.c @@ -1349,6 +1349,34 @@ static HRESULT write_type( struct writer *writer, WS_TYPE_MAPPING mapping, WS_TY }
/************************************************************************** + * WsWriteAttribute [webservices.@] + */ +HRESULT WINAPI WsWriteAttribute( WS_XML_WRITER *handle, const WS_ATTRIBUTE_DESCRIPTION *desc, + WS_WRITE_OPTION option, const void *value, ULONG size, + WS_ERROR *error ) +{ + struct writer *writer = (struct writer *)handle; + HRESULT hr; + + TRACE( "%p %p %u %p %u %p\n", handle, desc, option, value, size, error ); + if (error) FIXME( "ignoring error parameter\n" ); + + if (!writer || !desc || !desc->attributeLocalName || !desc->attributeNs || !value) + return E_INVALIDARG; + + if (writer->state != WRITER_STATE_STARTELEMENT) return WS_E_INVALID_OPERATION; + + if ((hr = write_add_attribute( writer, NULL, desc->attributeLocalName, desc->attributeNs, + FALSE )) != S_OK) return hr; + + if ((hr = write_type( writer, WS_ATTRIBUTE_TYPE_MAPPING, desc->type, desc->typeDescription, + option, value, size )) != S_OK) return hr; + + writer->state = WRITER_STATE_STARTELEMENT; + return S_OK; +} + +/************************************************************************** * WsWriteElement [webservices.@] */ HRESULT WINAPI WsWriteElement( WS_XML_WRITER *handle, const WS_ELEMENT_DESCRIPTION *desc,