[8/9] webservices: Implement WsWriteText.
Hans Leidekker
hans at codeweavers.com
Wed Nov 11 04:02:08 CST 2015
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
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;
+}
--
2.6.2
More information about the wine-patches
mailing list