Hans Leidekker : webservices: Implement WsWriteText.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Nov 11 08:36:44 CST 2015


Module: wine
Branch: master
Commit: 83e4e135716d71001085c18284664372be82d96c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=83e4e135716d71001085c18284664372be82d96c

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Wed Nov 11 11:02:08 2015 +0100

webservices: Implement WsWriteText.

Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
+}




More information about the wine-cvs mailing list