Hans Leidekker : webservices: Implement WsCreateListener and WsFreeListener.
Alexandre Julliard
julliard at winehq.org
Wed Apr 5 16:17:07 CDT 2017
Module: wine
Branch: master
Commit: 83a2c56fc07ff50793169a59dab5abfc5adcb186
URL: http://source.winehq.org/git/wine.git/?a=commit;h=83a2c56fc07ff50793169a59dab5abfc5adcb186
Author: Hans Leidekker <hans at codeweavers.com>
Date: Wed Apr 5 11:40:25 2017 +0200
webservices: Implement WsCreateListener and WsFreeListener.
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/webservices/Makefile.in | 1 +
dlls/webservices/listener.c | 174 ++++++++++++++++++++++++++++++++++++++
dlls/webservices/webservices.spec | 4 +-
3 files changed, 177 insertions(+), 2 deletions(-)
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)
More information about the wine-cvs
mailing list