From 83e4e135716d71001085c18284664372be82d96c Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Wed, 11 Nov 2015 11:02:08 +0100 Subject: [PATCH] webservices: Implement WsWriteText. Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard --- dlls/webservices/reader.c | 2 +- dlls/webservices/tests/writer.c | 46 ++++++++++++++++++++++++++ dlls/webservices/webservices.spec | 2 +- dlls/webservices/webservices_private.h | 1 + dlls/webservices/writer.c | 32 ++++++++++++++++++ 5 files changed, 81 insertions(+), 2 deletions(-) diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c index cc71f982bd2..10f3aab9f10 100644 --- a/dlls/webservices/reader.c +++ b/dlls/webservices/reader.c @@ -659,7 +659,7 @@ WS_XML_STRING *alloc_xml_string( const char *data, ULONG len ) return ret; } -static WS_XML_UTF8_TEXT *alloc_utf8_text( const char *data, ULONG len ) +WS_XML_UTF8_TEXT *alloc_utf8_text( const char *data, ULONG len ) { WS_XML_UTF8_TEXT *ret; diff --git a/dlls/webservices/tests/writer.c b/dlls/webservices/tests/writer.c index 95aac89fa79..f99705e74c0 100644 --- a/dlls/webservices/tests/writer.c +++ b/dlls/webservices/tests/writer.c @@ -404,6 +404,51 @@ static void test_WsWriteStartElement(void) WsFreeWriter( writer ); } +static void test_WsWriteStartAttribute(void) +{ + HRESULT hr; + WS_XML_WRITER *writer; + WS_XML_STRING prefix = {1, (BYTE *)"p"}, localname = {3, (BYTE *)"str"}, ns = {2, (BYTE *)"ns"}; + WS_XML_UTF8_TEXT text; + + 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 ); + + hr = WsWriteStartElement( writer, &prefix, &localname, &ns, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = WsWriteStartAttribute( NULL, &prefix, &localname, &ns, FALSE, NULL ); + ok( hr == E_INVALIDARG, "got %08x\n", hr ); + + /* WsWriteStartAttribute doesn't output anything */ + localname.length = 3; + localname.bytes = (BYTE *)"len"; + hr = WsWriteStartAttribute( writer, &prefix, &localname, &ns, FALSE, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + check_output( writer, "", __LINE__ ); + + text.text.textType = WS_XML_TEXT_TYPE_UTF8; + text.value.length = 1; + text.value.bytes = (BYTE *)"0"; + hr = WsWriteText( writer, &text.text, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + check_output( writer, "", __LINE__ ); + + /* WsWriteEndAttribute doesn't output anything */ + hr = WsWriteEndAttribute( writer, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + check_output( writer, "", __LINE__ ); + + hr = WsWriteEndElement( writer, NULL ); + ok( hr == S_OK, "got %08x\n", hr ); + check_output( writer, "", __LINE__ ); + + WsFreeWriter( writer ); +} + START_TEST(writer) { test_WsCreateWriter(); @@ -411,4 +456,5 @@ START_TEST(writer) test_WsSetOutput(); test_WsSetOutputToBuffer(); test_WsWriteStartElement(); + test_WsWriteStartAttribute(); } diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec index 81897687ccd..5a2babafcac 100644 --- a/dlls/webservices/webservices.spec +++ b/dlls/webservices/webservices.spec @@ -184,7 +184,7 @@ @ stdcall WsWriteStartAttribute(ptr ptr ptr ptr long ptr) @ stub WsWriteStartCData @ stdcall WsWriteStartElement(ptr ptr ptr ptr ptr) -@ stub WsWriteText +@ stdcall WsWriteText(ptr ptr ptr) @ stub WsWriteType @ stub WsWriteValue @ stub WsWriteXmlBuffer diff --git a/dlls/webservices/webservices_private.h b/dlls/webservices/webservices_private.h index 3bb039fe5cd..5c121a1b186 100644 --- a/dlls/webservices/webservices_private.h +++ b/dlls/webservices/webservices_private.h @@ -29,6 +29,7 @@ void *ws_realloc( WS_HEAP *, void *, SIZE_T ) DECLSPEC_HIDDEN; void ws_free( WS_HEAP *, void * ) DECLSPEC_HIDDEN; const char *debugstr_xmlstr( const WS_XML_STRING * ) DECLSPEC_HIDDEN; WS_XML_STRING *alloc_xml_string( const char *, ULONG ) DECLSPEC_HIDDEN; +WS_XML_UTF8_TEXT *alloc_utf8_text( const char *, ULONG ) DECLSPEC_HIDDEN; HRESULT append_attribute( WS_XML_ELEMENT_NODE *, WS_XML_ATTRIBUTE * ) DECLSPEC_HIDDEN; void free_attribute( WS_XML_ATTRIBUTE * ) DECLSPEC_HIDDEN; diff --git a/dlls/webservices/writer.c b/dlls/webservices/writer.c index 59a2859160f..b03b15dde18 100644 --- a/dlls/webservices/writer.c +++ b/dlls/webservices/writer.c @@ -738,3 +738,35 @@ error: free_node( node ); return hr; } + +/************************************************************************** + * WsWriteText [webservices.@] + */ +HRESULT WINAPI WsWriteText( WS_XML_WRITER *handle, const WS_XML_TEXT *text, WS_ERROR *error ) +{ + struct writer *writer = (struct writer *)handle; + WS_XML_ELEMENT_NODE *elem; + WS_XML_UTF8_TEXT *src, *dst; + + TRACE( "%p %p %p\n", handle, text, error ); + + if (!writer || !text) return E_INVALIDARG; + + if (writer->state != WRITER_STATE_STARTATTRIBUTE) + { + FIXME( "can't handle writer state %u\n", writer->state ); + return E_NOTIMPL; + } + if (text->textType != WS_XML_TEXT_TYPE_UTF8) + { + FIXME( "text type %u not supported\n", text->textType ); + return E_NOTIMPL; + } + src = (WS_XML_UTF8_TEXT *)text; + if (!(dst = alloc_utf8_text( (const char *)src->value.bytes, src->value.length ))) + return E_OUTOFMEMORY; + + elem = (WS_XML_ELEMENT_NODE *)writer->current; + elem->attributes[elem->attributeCount - 1]->value = (WS_XML_TEXT *)dst; + return S_OK; +}