[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