Hans Leidekker : webservices: Implement WsGetReaderNode.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Sep 16 09:54:06 CDT 2015


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Wed Sep 16 11:18:27 2015 +0200

webservices: Implement WsGetReaderNode.

---

 dlls/webservices/reader.c         | 95 +++++++++++++++++++++++++++++++++++++++
 dlls/webservices/webservices.spec |  2 +-
 2 files changed, 96 insertions(+), 1 deletion(-)

diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c
index 7a811c7..1599aac 100644
--- a/dlls/webservices/reader.c
+++ b/dlls/webservices/reader.c
@@ -24,6 +24,7 @@
 #include "webservices.h"
 
 #include "wine/debug.h"
+#include "wine/list.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(webservices);
 
@@ -250,6 +251,65 @@ void WINAPI WsFreeHeap( WS_HEAP *handle )
     heap_free( heap );
 }
 
+struct node
+{
+    WS_XML_ELEMENT_NODE hdr;
+    struct list entry;
+};
+
+static struct node *alloc_node( WS_XML_NODE_TYPE type )
+{
+    struct node *ret;
+
+    if (!(ret = heap_alloc_zero( sizeof(*ret) ))) return NULL;
+    ret->hdr.node.nodeType = type;
+    list_init( &ret->entry );
+    return ret;
+}
+
+static void free_node( struct node *node )
+{
+    if (!node) return;
+    switch (node->hdr.node.nodeType)
+    {
+    case WS_XML_NODE_TYPE_ELEMENT:
+    {
+        WS_XML_ELEMENT_NODE *elem = (WS_XML_ELEMENT_NODE *)node;
+        heap_free( elem->prefix );
+        heap_free( elem->localName );
+        heap_free( elem->ns );
+        break;
+    }
+    case WS_XML_NODE_TYPE_TEXT:
+    {
+        WS_XML_TEXT_NODE *text = (WS_XML_TEXT_NODE *)node;
+        heap_free( text->text );
+        break;
+    }
+    case WS_XML_NODE_TYPE_END_ELEMENT:
+    case WS_XML_NODE_TYPE_EOF:
+    case WS_XML_NODE_TYPE_BOF:
+        break;
+
+    default:
+        ERR( "unhandled type %u\n", node->hdr.node.nodeType );
+        break;
+    }
+    heap_free( node );
+}
+
+static void destroy_nodes( struct list *list )
+{
+    struct list *ptr;
+
+    while ((ptr = list_head( list )))
+    {
+        struct node *node = LIST_ENTRY( ptr, struct node, entry );
+        list_remove( &node->entry );
+        free_node( node );
+    }
+}
+
 static const struct
 {
     ULONG size;
@@ -276,6 +336,8 @@ reader_props[] =
 
 struct reader
 {
+    struct list             nodes;
+    struct node            *current;
     const char             *input_data;
     ULONG                   input_size;
     ULONG                   prop_count;
@@ -328,6 +390,7 @@ HRESULT WINAPI WsCreateReader( const WS_XML_READER_PROPERTY *properties, ULONG c
                                WS_XML_READER **handle, WS_ERROR *error )
 {
     struct reader *reader;
+    struct node *node;
     ULONG i, max_depth = 32, max_attrs = 128, max_ns = 32;
     WS_CHARSET charset = WS_CHARSET_UTF8;
     BOOL read_decl = TRUE;
@@ -355,6 +418,15 @@ HRESULT WINAPI WsCreateReader( const WS_XML_READER_PROPERTY *properties, ULONG c
         }
     }
 
+    if (!(node = alloc_node( WS_XML_NODE_TYPE_EOF )))
+    {
+        heap_free( reader );
+        return E_OUTOFMEMORY;
+    }
+    list_init( &reader->nodes );
+    list_add_tail( &reader->nodes, &node->entry );
+    reader->current = node;
+
     *handle = (WS_XML_READER *)reader;
     return S_OK;
 }
@@ -369,6 +441,7 @@ void WINAPI WsFreeReader( WS_XML_READER *handle )
     TRACE( "%p\n", handle );
 
     if (!reader) return;
+    destroy_nodes( &reader->nodes );
     heap_free( reader );
 }
 
@@ -399,6 +472,23 @@ HRESULT WINAPI WsGetHeapProperty( WS_HEAP *handle, WS_HEAP_PROPERTY_ID id, void
 }
 
 /**************************************************************************
+ *          WsGetReaderNode		[webservices.@]
+ */
+HRESULT WINAPI WsGetReaderNode( WS_XML_READER *handle, const WS_XML_NODE **node,
+                                WS_ERROR *error )
+{
+    struct reader *reader = (struct reader *)handle;
+
+    TRACE( "%p %p %p\n", handle, node, error );
+    if (error) FIXME( "ignoring error parameter\n" );
+
+    if (!reader || !node) return E_INVALIDARG;
+
+    *node = &reader->current->hdr.node;
+    return S_OK;
+}
+
+/**************************************************************************
  *          WsGetReaderProperty		[webservices.@]
  */
 HRESULT WINAPI WsGetReaderProperty( WS_XML_READER *handle, WS_XML_READER_PROPERTY_ID id,
@@ -435,6 +525,7 @@ HRESULT WINAPI WsSetInput( WS_XML_READER *handle, const WS_XML_READER_ENCODING *
                            ULONG count, WS_ERROR *error )
 {
     struct reader *reader = (struct reader *)handle;
+    struct node *node;
     HRESULT hr;
     ULONG i;
 
@@ -479,5 +570,9 @@ HRESULT WINAPI WsSetInput( WS_XML_READER *handle, const WS_XML_READER_ENCODING *
         if (hr != S_OK) return hr;
     }
 
+    if (!(node = alloc_node( WS_XML_NODE_TYPE_BOF ))) return E_OUTOFMEMORY;
+    list_add_head( &reader->nodes, &node->entry );
+    reader->current = node;
+
     return S_OK;
 }
diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec
index 6a81612..cf74019 100644
--- a/dlls/webservices/webservices.spec
+++ b/dlls/webservices/webservices.spec
@@ -80,7 +80,7 @@
 @ stub WsGetPolicyAlternativeCount
 @ stub WsGetPolicyProperty
 @ stub WsGetPrefixFromNamespace
-@ stub WsGetReaderNode
+@ stdcall WsGetReaderNode(ptr ptr ptr)
 @ stub WsGetReaderPosition
 @ stdcall WsGetReaderProperty(ptr long ptr long ptr)
 @ stub WsGetSecurityContextProperty




More information about the wine-cvs mailing list