Module: wine Branch: master Commit: 83e4e135716d71001085c18284664372be82d96c URL: http://source.winehq.org/git/wine.git/?a=commit;h=83e4e135716d71001085c18284...
Author: Hans Leidekker hans@codeweavers.com Date: Wed Nov 11 11:02:08 2015 +0100
webservices: Implement WsWriteText.
Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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 cc71f98..10f3aab 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 95aac89..f99705e 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, "<p:str p:len="0" xmlns:p="ns"/>", __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 8189768..5a2baba 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 3bb039f..5c121a1 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 59a2859..b03b15d 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; +}