[08/10] webservices: Implement WsOpenChannel and WsCloseChannel.

Hans Leidekker hans at codeweavers.com
Fri Apr 22 02:42:45 CDT 2016


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/webservices/channel.c             | 44 ++++++++++++++++++++++++++++++++++
 dlls/webservices/tests/channel.c       | 40 +++++++++++++++++++++++++++++++
 dlls/webservices/webservices.spec      |  4 ++--
 dlls/webservices/webservices_private.h |  3 +++
 4 files changed, 89 insertions(+), 2 deletions(-)

diff --git a/dlls/webservices/channel.c b/dlls/webservices/channel.c
index d02bfa1..9081d95 100644
--- a/dlls/webservices/channel.c
+++ b/dlls/webservices/channel.c
@@ -162,3 +162,47 @@ HRESULT WINAPI WsSetChannelProperty( WS_CHANNEL *handle, WS_CHANNEL_PROPERTY_ID
 
     return prop_set( channel->prop, channel->prop_count, id, value, size );
 }
+
+HRESULT open_channel( struct channel *channel, const WS_ENDPOINT_ADDRESS *endpoint )
+{
+    channel->state = WS_CHANNEL_STATE_OPEN;
+    return S_OK;
+}
+
+/**************************************************************************
+ *          WsOpenChannel		[webservices.@]
+ */
+HRESULT WINAPI WsOpenChannel( WS_CHANNEL *handle, const WS_ENDPOINT_ADDRESS *endpoint,
+                              const WS_ASYNC_CONTEXT *ctx, WS_ERROR *error )
+{
+    struct channel *channel = (struct channel *)handle;
+
+    TRACE( "%p %p %p %p\n", handle, endpoint, ctx, error );
+    if (error) FIXME( "ignoring error parameter\n" );
+    if (ctx) FIXME( "ignoring ctx parameter\n" );
+
+    if (!endpoint) return E_INVALIDARG;
+    if (channel->state != WS_CHANNEL_STATE_CREATED) return WS_E_INVALID_OPERATION;
+
+    return open_channel( channel, endpoint );
+}
+
+HRESULT close_channel( struct channel *channel )
+{
+    channel->state = WS_CHANNEL_STATE_CLOSED;
+    return S_OK;
+}
+
+/**************************************************************************
+ *          WsCloseChannel		[webservices.@]
+ */
+HRESULT WINAPI WsCloseChannel( WS_CHANNEL *handle, const WS_ASYNC_CONTEXT *ctx, WS_ERROR *error )
+{
+    struct channel *channel = (struct channel *)handle;
+
+    TRACE( "%p %p %p\n", handle, ctx, error );
+    if (error) FIXME( "ignoring error parameter\n" );
+    if (ctx) FIXME( "ignoring ctx parameter\n" );
+
+    return close_channel( channel );
+}
diff --git a/dlls/webservices/tests/channel.c b/dlls/webservices/tests/channel.c
index 82a7a69..d85a151 100644
--- a/dlls/webservices/tests/channel.c
+++ b/dlls/webservices/tests/channel.c
@@ -57,7 +57,47 @@ static void test_WsCreateChannel(void)
     WsFreeChannel( channel );
 }
 
+static void test_WsOpenChannel(void)
+{
+    WCHAR url[] = {'h','t','t','p',':','/','/','l','o','c','a','l','h','o','s','t'};
+    HRESULT hr;
+    WS_CHANNEL *channel;
+    WS_ENDPOINT_ADDRESS addr;
+
+    hr = WsCreateChannel( WS_CHANNEL_TYPE_REQUEST, WS_HTTP_CHANNEL_BINDING, NULL, 0, NULL, &channel, NULL ) ;
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsCloseChannel( channel, NULL, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    WsFreeChannel( channel );
+
+    hr = WsCreateChannel( WS_CHANNEL_TYPE_REQUEST, WS_HTTP_CHANNEL_BINDING, NULL, 0, NULL, &channel, NULL ) ;
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsOpenChannel( channel, NULL, NULL, NULL );
+    ok( hr == E_INVALIDARG, "got %08x\n", hr );
+
+    addr.url.length = sizeof(url)/sizeof(url[0]);
+    addr.url.chars  = url;
+    addr.headers    = NULL;
+    addr.extensions = NULL;
+    addr.identity   = NULL;
+    hr = WsOpenChannel( channel, &addr, NULL, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsOpenChannel( channel, &addr, NULL, NULL );
+    ok( hr == WS_E_INVALID_OPERATION, "got %08x\n", hr );
+
+    hr = WsCloseChannel( channel, NULL, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsCloseChannel( channel, NULL, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    WsFreeChannel( channel );
+}
+
 START_TEST(channel)
 {
     test_WsCreateChannel();
+    test_WsOpenChannel();
 }
diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec
index b39f715..95a8c1f 100644
--- a/dlls/webservices/webservices.spec
+++ b/dlls/webservices/webservices.spec
@@ -13,7 +13,7 @@
 @ stub WsAsyncExecute
 @ stub WsCall
 @ stub WsCheckMustUnderstandHeaders
-@ stub WsCloseChannel
+@ stdcall WsCloseChannel(ptr ptr ptr)
 @ stub WsCloseListener
 @ stub WsCloseServiceHost
 @ stub WsCloseServiceProxy
@@ -95,7 +95,7 @@
 @ stub WsMatchPolicyAlternative
 @ stdcall WsMoveReader(ptr long ptr ptr)
 @ stub WsMoveWriter
-@ stub WsOpenChannel
+@ stdcall WsOpenChannel(ptr ptr ptr ptr)
 @ stub WsOpenListener
 @ stub WsOpenServiceHost
 @ stub WsOpenServiceProxy
diff --git a/dlls/webservices/webservices_private.h b/dlls/webservices/webservices_private.h
index 1a7b729..c33038d 100644
--- a/dlls/webservices/webservices_private.h
+++ b/dlls/webservices/webservices_private.h
@@ -74,6 +74,7 @@ struct channel
 {
     WS_CHANNEL_TYPE         type;
     WS_CHANNEL_BINDING      binding;
+    WS_CHANNEL_STATE        state;
     ULONG                   prop_count;
     struct prop             prop[9];
 };
@@ -81,6 +82,8 @@ struct channel
 HRESULT create_channel( WS_CHANNEL_TYPE, WS_CHANNEL_BINDING, const WS_CHANNEL_PROPERTY *,
                         ULONG, struct channel ** ) DECLSPEC_HIDDEN;
 void free_channel( struct channel * ) DECLSPEC_HIDDEN;
+HRESULT open_channel( struct channel *, const WS_ENDPOINT_ADDRESS * ) DECLSPEC_HIDDEN;
+HRESULT close_channel( struct channel * ) DECLSPEC_HIDDEN;
 
 static inline void *heap_alloc( SIZE_T size )
 {
-- 
2.8.0.rc3




More information about the wine-patches mailing list