[5/7] webservices: Implement WsCreateListener and WsFreeListener.

Hans Leidekker hans at codeweavers.com
Wed Apr 5 04:40:25 CDT 2017


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/webservices/Makefile.in      |   1 +
 dlls/webservices/listener.c       | 174 ++++++++++++++++++++++++++++++++++++++
 dlls/webservices/webservices.spec |   4 +-
 3 files changed, 177 insertions(+), 2 deletions(-)
 create mode 100644 dlls/webservices/listener.c

diff --git a/dlls/webservices/Makefile.in b/dlls/webservices/Makefile.in
index fa79a68..70ca1fc 100644
--- a/dlls/webservices/Makefile.in
+++ b/dlls/webservices/Makefile.in
@@ -6,6 +6,7 @@ C_SRCS = \
 	channel.c \
 	error.c \
 	heap.c \
+	listener.c \
 	msg.c \
 	proxy.c \
 	reader.c \
diff --git a/dlls/webservices/listener.c b/dlls/webservices/listener.c
new file mode 100644
index 0000000..205f7bc
--- /dev/null
+++ b/dlls/webservices/listener.c
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2017 Hans Leidekker for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "webservices.h"
+
+#include "wine/debug.h"
+#include "wine/list.h"
+#include "wine/unicode.h"
+#include "webservices_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(webservices);
+
+static const struct prop_desc listener_props[] =
+{
+    { sizeof(ULONG), FALSE },                               /* WS_LISTENER_PROPERTY_LISTEN_BACKLOG */
+    { sizeof(WS_IP_VERSION), FALSE },                       /* WS_LISTENER_PROPERTY_IP_VERSION */
+    { sizeof(WS_LISTENER_STATE), TRUE },                    /* WS_LISTENER_PROPERTY_STATE */
+    { sizeof(WS_CALLBACK_MODEL), FALSE },                   /* WS_LISTENER_PROPERTY_ASYNC_CALLBACK_MODEL */
+    { sizeof(WS_CHANNEL_TYPE), TRUE },                      /* WS_LISTENER_PROPERTY_CHANNEL_TYPE */
+    { sizeof(WS_CHANNEL_BINDING), TRUE },                   /* WS_LISTENER_PROPERTY_CHANNEL_BINDING */
+    { sizeof(ULONG), FALSE },                               /* WS_LISTENER_PROPERTY_CONNECT_TIMEOUT */
+    { sizeof(BOOL), FALSE },                                /* WS_LISTENER_PROPERTY_IS_MULTICAST */
+    { 0, FALSE },                                           /* WS_LISTENER_PROPERTY_MULTICAST_INTERFACES */
+    { sizeof(BOOL), FALSE },                                /* WS_LISTENER_PROPERTY_MULTICAST_LOOPBACK */
+    { sizeof(ULONG), FALSE },                               /* WS_LISTENER_PROPERTY_CLOSE_TIMEOUT */
+    { sizeof(ULONG), FALSE },                               /* WS_LISTENER_PROPERTY_TO_HEADER_MATCHING_OPTIONS */
+    { sizeof(ULONG), FALSE },                               /* WS_LISTENER_PROPERTY_TRANSPORT_URL_MATCHING_OPTIONS */
+    { sizeof(WS_CUSTOM_LISTENER_CALLBACKS), FALSE },        /* WS_LISTENER_PROPERTY_CUSTOM_LISTENER_CALLBACKS */
+    { 0, FALSE },                                           /* WS_LISTENER_PROPERTY_CUSTOM_LISTENER_PARAMETERS */
+    { sizeof(void *), TRUE },                               /* WS_LISTENER_PROPERTY_CUSTOM_LISTENER_INSTANCE */
+    { sizeof(WS_DISALLOWED_USER_AGENT_SUBSTRINGS), FALSE }  /* WS_LISTENER_PROPERTY_DISALLOWED_USER_AGENT */
+};
+
+struct listener
+{
+    ULONG                   magic;
+    CRITICAL_SECTION        cs;
+    WS_CHANNEL_TYPE         type;
+    WS_CHANNEL_BINDING      binding;
+    WS_LISTENER_STATE       state;
+    ULONG                   prop_count;
+    struct prop             prop[sizeof(listener_props)/sizeof(listener_props[0])];
+};
+
+#define LISTENER_MAGIC (('L' << 24) | ('I' << 16) | ('S' << 8) | 'T')
+
+static struct listener *alloc_listener(void)
+{
+    static const ULONG count = sizeof(listener_props)/sizeof(listener_props[0]);
+    struct listener *ret;
+    ULONG size = sizeof(*ret) + prop_size( listener_props, count );
+
+    if (!(ret = heap_alloc_zero( size ))) return NULL;
+
+    ret->magic      = LISTENER_MAGIC;
+    InitializeCriticalSection( &ret->cs );
+    ret->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": listener.cs");
+
+    prop_init( listener_props, count, ret->prop, &ret[1] );
+    ret->prop_count = count;
+    return ret;
+}
+
+static void free_listener( struct listener *listener )
+{
+    listener->cs.DebugInfo->Spare[0] = 0;
+    DeleteCriticalSection( &listener->cs );
+    heap_free( listener );
+}
+
+static HRESULT create_listener( WS_CHANNEL_TYPE type, WS_CHANNEL_BINDING binding,
+                                const WS_LISTENER_PROPERTY *properties, ULONG count, struct listener **ret )
+{
+    struct listener *listener;
+    HRESULT hr;
+    ULONG i;
+
+    if (!(listener = alloc_listener())) return E_OUTOFMEMORY;
+
+    for (i = 0; i < count; i++)
+    {
+        hr = prop_set( listener->prop, listener->prop_count, properties[i].id, properties[i].value,
+                       properties[i].valueSize );
+        if (hr != S_OK)
+        {
+            free_listener( listener );
+            return hr;
+        }
+    }
+
+    listener->type    = type;
+    listener->binding = binding;
+
+    *ret = listener;
+    return S_OK;
+}
+
+/**************************************************************************
+ *          WsCreateListener		[webservices.@]
+ */
+HRESULT WINAPI WsCreateListener( WS_CHANNEL_TYPE type, WS_CHANNEL_BINDING binding,
+                                 const WS_LISTENER_PROPERTY *properties, ULONG count,
+                                 const WS_SECURITY_DESCRIPTION *desc, WS_LISTENER **handle,
+                                 WS_ERROR *error )
+{
+    struct listener *listener;
+    HRESULT hr;
+
+    TRACE( "%u %u %p %u %p %p %p\n", type, binding, properties, count, desc, handle, error );
+    if (error) FIXME( "ignoring error parameter\n" );
+    if (desc) FIXME( "ignoring security description\n" );
+
+    if (!handle) return E_INVALIDARG;
+
+    if (type != WS_CHANNEL_TYPE_DUPLEX_SESSION)
+    {
+        FIXME( "channel type %u not implemented\n", type );
+        return E_NOTIMPL;
+    }
+    if (binding != WS_TCP_CHANNEL_BINDING)
+    {
+        FIXME( "channel binding %u not implemented\n", binding );
+        return E_NOTIMPL;
+    }
+
+    if ((hr = create_listener( type, binding, properties, count, &listener )) != S_OK) return hr;
+
+    *handle = (WS_LISTENER *)listener;
+    return S_OK;
+}
+
+/**************************************************************************
+ *          WsFreeListener		[webservices.@]
+ */
+void WINAPI WsFreeListener( WS_LISTENER *handle )
+{
+    struct listener *listener = (struct listener *)handle;
+
+    TRACE( "%p\n", handle );
+
+    if (!listener) return;
+
+    EnterCriticalSection( &listener->cs );
+
+    if (listener->magic != LISTENER_MAGIC)
+    {
+        LeaveCriticalSection( &listener->cs );
+        return;
+    }
+
+    listener->magic = 0;
+
+    LeaveCriticalSection( &listener->cs );
+    free_listener( listener );
+}
diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec
index def0cca..9f1fc3e 100644
--- a/dlls/webservices/webservices.spec
+++ b/dlls/webservices/webservices.spec
@@ -25,7 +25,7 @@
 @ stdcall WsCreateError(ptr long ptr)
 @ stub WsCreateFaultFromError
 @ stdcall WsCreateHeap(long long ptr long ptr ptr)
-@ stub WsCreateListener
+@ stdcall WsCreateListener(long long ptr long ptr ptr ptr)
 @ stdcall WsCreateMessage(long long ptr long ptr ptr)
 @ stdcall WsCreateMessageForChannel(ptr ptr long ptr ptr)
 @ stub WsCreateMetadata
@@ -51,7 +51,7 @@
 @ stdcall WsFreeChannel(ptr)
 @ stdcall WsFreeError(ptr)
 @ stdcall WsFreeHeap(ptr)
-@ stub WsFreeListener
+@ stdcall WsFreeListener(ptr)
 @ stdcall WsFreeMessage(ptr)
 @ stub WsFreeMetadata
 @ stdcall WsFreeReader(ptr)
-- 
2.1.4




More information about the wine-patches mailing list