[2/9] webservices: Implement WsWriteEndElement.

Hans Leidekker hans at codeweavers.com
Wed Nov 11 04:02:02 CST 2015


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/webservices/webservices.spec |  2 +-
 dlls/webservices/writer.c         | 69 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 70 insertions(+), 1 deletion(-)

diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec
index f0516d1..1d811ae 100644
--- a/dlls/webservices/webservices.spec
+++ b/dlls/webservices/webservices.spec
@@ -173,7 +173,7 @@
 @ stub WsWriteElement
 @ stub WsWriteEndAttribute
 @ stub WsWriteEndCData
-@ stub WsWriteEndElement
+@ stdcall WsWriteEndElement(ptr ptr)
 @ stub WsWriteEndStartElement
 @ stub WsWriteEnvelopeEnd
 @ stub WsWriteEnvelopeStart
diff --git a/dlls/webservices/writer.c b/dlls/webservices/writer.c
index b56c718..f55f56e 100644
--- a/dlls/webservices/writer.c
+++ b/dlls/webservices/writer.c
@@ -520,6 +520,75 @@ static HRESULT write_startelement( struct writer *writer )
     return S_OK;
 }
 
+static HRESULT write_endelement( struct writer *writer )
+{
+    WS_XML_ELEMENT_NODE *elem = (WS_XML_ELEMENT_NODE *)writer->current;
+    ULONG size;
+    HRESULT hr;
+
+    /* '</prefix:localname>' */
+
+    size = elem->localName->length + 3 /* '</>' */;
+    if (elem->prefix) size += elem->prefix->length + 1 /* ':' */;
+    if ((hr = write_grow_buffer( writer, size )) != S_OK) return hr;
+
+    write_char( writer, '<' );
+    write_char( writer, '/' );
+    if (elem->prefix)
+    {
+        write_bytes( writer, elem->prefix->bytes, elem->prefix->length );
+        write_char( writer, ':' );
+    }
+    write_bytes( writer, elem->localName->bytes, elem->localName->length );
+    write_char( writer, '>' );
+    return S_OK;
+}
+
+/**************************************************************************
+ *          WsWriteEndElement		[webservices.@]
+ */
+HRESULT WINAPI WsWriteEndElement( WS_XML_WRITER *handle, WS_ERROR *error )
+{
+    struct writer *writer = (struct writer *)handle;
+    HRESULT hr;
+
+    TRACE( "%p %p\n", handle, error );
+    if (error) FIXME( "ignoring error parameter\n" );
+
+    if (!writer) return E_INVALIDARG;
+
+    if (writer->state == WRITER_STATE_STARTELEMENT)
+    {
+        /* '/>' */
+        if ((hr = write_startelement( writer )) != S_OK) return hr;
+        if ((hr = write_grow_buffer( writer, 2 )) != S_OK) return hr;
+        write_char( writer, '/' );
+        write_char( writer, '>' );
+
+        writer->current = writer->current->parent;
+        writer->state   = WRITER_STATE_STARTENDELEMENT;
+        return S_OK;
+    }
+    else
+    {
+        struct node *node = alloc_node( WS_XML_NODE_TYPE_END_ELEMENT );
+        if (!node) return E_OUTOFMEMORY;
+
+        /* '</prefix:localname>' */
+        if ((hr = write_endelement( writer )) != S_OK)
+        {
+            free_node( node );
+            return hr;
+        }
+
+        write_insert_node( writer, node );
+        writer->current = node->parent;
+        writer->state   = WRITER_STATE_ENDELEMENT;
+        return S_OK;
+    }
+    return WS_E_INVALID_OPERATION;
+}
+
 /**************************************************************************
  *          WsWriteStartElement		[webservices.@]
  */
-- 
2.6.2




More information about the wine-patches mailing list