[05/10] webservices: Implement WsCreateMessageForChannel.

Hans Leidekker hans at codeweavers.com
Thu Jul 7 02:31:55 CDT 2016


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/webservices/msg.c            |  83 +++++++++++++++++++++++++++---
 dlls/webservices/tests/msg.c      | 103 +++++++++++++++++++++++++++++++++++---
 dlls/webservices/webservices.spec |   2 +-
 3 files changed, 172 insertions(+), 16 deletions(-)

diff --git a/dlls/webservices/msg.c b/dlls/webservices/msg.c
index 47df32e..82c8106 100644
--- a/dlls/webservices/msg.c
+++ b/dlls/webservices/msg.c
@@ -33,8 +33,8 @@ static const struct prop_desc msg_props[] =
 {
     { sizeof(WS_MESSAGE_STATE), TRUE },         /* WS_MESSAGE_PROPERTY_STATE */
     { sizeof(WS_HEAP *), TRUE },                /* WS_MESSAGE_PROPERTY_HEAP */
-    { sizeof(WS_ENVELOPE_VERSION), FALSE },     /* WS_MESSAGE_PROPERTY_ENVELOPE_VERSION */
-    { sizeof(WS_ADDRESSING_VERSION), FALSE },   /* WS_MESSAGE_PROPERTY_ADDRESSING_VERSION */
+    { sizeof(WS_ENVELOPE_VERSION), TRUE },      /* WS_MESSAGE_PROPERTY_ENVELOPE_VERSION */
+    { sizeof(WS_ADDRESSING_VERSION), TRUE },    /* WS_MESSAGE_PROPERTY_ADDRESSING_VERSION */
     { sizeof(WS_XML_BUFFER *), TRUE },          /* WS_MESSAGE_PROPERTY_HEADER_BUFFER */
     { sizeof(WS_XML_NODE_POSITION *), TRUE },   /* WS_MESSAGE_PROPERTY_HEADER_POSITION */
     { sizeof(WS_XML_READER *), TRUE },          /* WS_MESSAGE_PROPERTY_BODY_READER */
@@ -45,6 +45,9 @@ static const struct prop_desc msg_props[] =
 struct msg
 {
     WS_MESSAGE_STATE          state;
+    WS_ENVELOPE_VERSION       version_env;
+    WS_ADDRESSING_VERSION     version_addr;
+    BOOL                      is_addressed;
     ULONG                     prop_count;
     struct prop               prop[sizeof(msg_props)/sizeof(msg_props[0])];
 };
@@ -76,11 +79,6 @@ static HRESULT create_msg( WS_ENVELOPE_VERSION env_version, WS_ADDRESSING_VERSIO
 
     if (!(msg = alloc_msg())) return E_OUTOFMEMORY;
 
-    prop_set( msg->prop, msg->prop_count, WS_MESSAGE_PROPERTY_ENVELOPE_VERSION, &env_version,
-              sizeof(env_version) );
-    prop_set( msg->prop, msg->prop_count, WS_MESSAGE_PROPERTY_ADDRESSING_VERSION, &addr_version,
-              sizeof(addr_version) );
-
     for (i = 0; i < count; i++)
     {
         if (properties[i].id == WS_MESSAGE_PROPERTY_ENVELOPE_VERSION ||
@@ -98,6 +96,9 @@ static HRESULT create_msg( WS_ENVELOPE_VERSION env_version, WS_ADDRESSING_VERSIO
         }
     }
 
+    msg->version_env  = env_version;
+    msg->version_addr = addr_version;
+
     *handle = (WS_MESSAGE *)msg;
     return S_OK;
 }
@@ -117,6 +118,32 @@ HRESULT WINAPI WsCreateMessage( WS_ENVELOPE_VERSION env_version, WS_ADDRESSING_V
 }
 
 /**************************************************************************
+ *          WsCreateMessageForChannel		[webservices.@]
+ */
+HRESULT WINAPI WsCreateMessageForChannel( WS_CHANNEL *channel_handle, const WS_MESSAGE_PROPERTY *properties,
+                                          ULONG count, WS_MESSAGE **handle, WS_ERROR *error )
+{
+    WS_ENVELOPE_VERSION version_env;
+    WS_ADDRESSING_VERSION version_addr;
+    HRESULT hr;
+
+    TRACE( "%p %p %u %p %p\n", channel_handle, properties, count, handle, error );
+    if (error) FIXME( "ignoring error parameter\n" );
+
+    if (!channel_handle || !handle) return E_INVALIDARG;
+
+    if ((hr = WsGetChannelProperty( channel_handle, WS_CHANNEL_PROPERTY_ENVELOPE_VERSION, &version_env,
+                                    sizeof(version_env), NULL )) != S_OK || !version_env)
+        version_env = WS_ENVELOPE_VERSION_SOAP_1_2;
+
+    if ((hr = WsGetChannelProperty( channel_handle, WS_CHANNEL_PROPERTY_ADDRESSING_VERSION, &version_addr,
+                                    sizeof(version_addr), NULL )) != S_OK || !version_addr)
+        version_addr = WS_ADDRESSING_VERSION_1_0;
+
+    return create_msg( version_env, version_addr, properties, count, handle );
+}
+
+/**************************************************************************
  *          WsFreeMessage		[webservices.@]
  */
 void WINAPI WsFreeMessage( WS_MESSAGE *handle )
@@ -138,7 +165,33 @@ HRESULT WINAPI WsGetMessageProperty( WS_MESSAGE *handle, WS_MESSAGE_PROPERTY_ID
     TRACE( "%p %u %p %u %p\n", handle, id, buf, size, error );
     if (error) FIXME( "ignoring error parameter\n" );
 
-    return prop_get( msg->prop, msg->prop_count, id, buf, size );
+    if (!handle) return E_INVALIDARG;
+
+    switch (id)
+    {
+    case WS_MESSAGE_PROPERTY_STATE:
+        if (!buf || size != sizeof(msg->state)) return E_INVALIDARG;
+        *(WS_MESSAGE_STATE *)buf = msg->state;
+        return S_OK;
+
+    case WS_MESSAGE_PROPERTY_ENVELOPE_VERSION:
+        if (!buf || size != sizeof(msg->version_env)) return E_INVALIDARG;
+        *(WS_ENVELOPE_VERSION *)buf = msg->version_env;
+        return S_OK;
+
+    case WS_MESSAGE_PROPERTY_ADDRESSING_VERSION:
+        if (!buf || size != sizeof(msg->version_addr)) return E_INVALIDARG;
+        *(WS_ADDRESSING_VERSION *)buf = msg->version_addr;
+        return S_OK;
+
+    case WS_MESSAGE_PROPERTY_IS_ADDRESSED:
+        if (msg->state < WS_MESSAGE_STATE_INITIALIZED) return WS_E_INVALID_OPERATION;
+        *(BOOL *)buf = msg->is_addressed;
+        return S_OK;
+
+    default:
+        return prop_get( msg->prop, msg->prop_count, id, buf, size );
+    }
 }
 
 /**************************************************************************
@@ -152,5 +205,19 @@ HRESULT WINAPI WsSetMessageProperty( WS_MESSAGE *handle, WS_MESSAGE_PROPERTY_ID
     TRACE( "%p %u %p %u\n", handle, id, value, size );
     if (error) FIXME( "ignoring error parameter\n" );
 
+    if (!handle) return E_INVALIDARG;
+
+    switch (id)
+    {
+    case WS_MESSAGE_PROPERTY_STATE:
+    case WS_MESSAGE_PROPERTY_ENVELOPE_VERSION:
+    case WS_MESSAGE_PROPERTY_ADDRESSING_VERSION:
+    case WS_MESSAGE_PROPERTY_IS_ADDRESSED:
+        if (msg->state < WS_MESSAGE_STATE_INITIALIZED) return WS_E_INVALID_OPERATION;
+        return E_INVALIDARG;
+
+    default:
+        break;
+    }
     return prop_set( msg->prop, msg->prop_count, id, value, size );
 }
diff --git a/dlls/webservices/tests/msg.c b/dlls/webservices/tests/msg.c
index 852407c..957a64e 100644
--- a/dlls/webservices/tests/msg.c
+++ b/dlls/webservices/tests/msg.c
@@ -25,34 +25,40 @@ static void test_WsCreateMessage(void)
 {
     HRESULT hr;
     WS_MESSAGE *msg;
+    WS_MESSAGE_STATE state;
     WS_ENVELOPE_VERSION env_version;
     WS_ADDRESSING_VERSION addr_version;
     WS_MESSAGE_PROPERTY prop;
 
-    hr = WsCreateMessage( 0, 0, NULL, 0, NULL, NULL ) ;
+    hr = WsCreateMessage( 0, 0, NULL, 0, NULL, NULL );
     ok( hr == E_INVALIDARG, "got %08x\n", hr );
 
-    hr = WsCreateMessage( 0, 0, NULL, 0, &msg, NULL ) ;
+    hr = WsCreateMessage( 0, 0, NULL, 0, &msg, NULL );
     ok( hr == E_INVALIDARG, "got %08x\n", hr );
 
-    hr = WsCreateMessage( WS_ADDRESSING_VERSION_0_9, 0, NULL, 0, &msg, NULL ) ;
+    hr = WsCreateMessage( WS_ADDRESSING_VERSION_0_9, 0, NULL, 0, &msg, NULL );
     ok( hr == E_INVALIDARG, "got %08x\n", hr );
 
-    hr = WsCreateMessage( 0, WS_ENVELOPE_VERSION_SOAP_1_1, NULL, 0, &msg, NULL ) ;
+    hr = WsCreateMessage( 0, WS_ENVELOPE_VERSION_SOAP_1_1, NULL, 0, &msg, NULL );
     ok( hr == E_INVALIDARG, "got %08x\n", hr );
 
     env_version = WS_ENVELOPE_VERSION_SOAP_1_1;
     prop.id = WS_MESSAGE_PROPERTY_ENVELOPE_VERSION;
     prop.value = &env_version;
     prop.valueSize = sizeof(env_version);
-    hr = WsCreateMessage( WS_ADDRESSING_VERSION_0_9, WS_ENVELOPE_VERSION_SOAP_1_1, &prop,
-                          1, &msg, NULL ) ;
+    hr = WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1, WS_ADDRESSING_VERSION_0_9, &prop,
+                          1, &msg, NULL );
     ok( hr == E_INVALIDARG, "got %08x\n", hr );
 
     hr = WsCreateMessage( WS_ADDRESSING_VERSION_0_9, WS_ENVELOPE_VERSION_SOAP_1_1, NULL,
-                          0, &msg, NULL ) ;
+                          0, &msg, NULL );
     ok( hr == S_OK, "got %08x\n", hr );
 
+    state = 0xdeadbeef;
+    hr = WsGetMessageProperty( msg, WS_MESSAGE_PROPERTY_STATE, &state, sizeof(state), NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( state == WS_MESSAGE_STATE_EMPTY, "got %u\n", state );
+
     env_version = 0xdeadbeef;
     hr = WsGetMessageProperty( msg, WS_MESSAGE_PROPERTY_ENVELOPE_VERSION, &env_version,
                                sizeof(env_version), NULL );
@@ -65,10 +71,93 @@ static void test_WsCreateMessage(void)
     ok( hr == S_OK, "got %08x\n", hr );
     ok( addr_version == WS_ADDRESSING_VERSION_0_9, "got %u\n", addr_version );
 
+    state = WS_MESSAGE_STATE_EMPTY;
+    hr = WsSetMessageProperty( msg, WS_MESSAGE_PROPERTY_STATE, &state, sizeof(state), NULL );
+    ok( hr == WS_E_INVALID_OPERATION, "got %08x\n", hr );
+
+    env_version = WS_ENVELOPE_VERSION_SOAP_1_1;
+    hr = WsSetMessageProperty( msg, WS_MESSAGE_PROPERTY_ENVELOPE_VERSION, &env_version,
+                               sizeof(env_version), NULL );
+    ok( hr == WS_E_INVALID_OPERATION, "got %08x\n", hr );
+
+    addr_version = WS_ADDRESSING_VERSION_0_9;
+    hr = WsSetMessageProperty( msg, WS_MESSAGE_PROPERTY_ADDRESSING_VERSION, &addr_version,
+                               sizeof(addr_version), NULL );
+    ok( hr == WS_E_INVALID_OPERATION, "got %08x\n", hr );
+    WsFreeMessage( msg );
+}
+
+static void test_WsCreateMessageForChannel(void)
+{
+    HRESULT hr;
+    WS_CHANNEL *channel;
+    WS_MESSAGE *msg;
+    WS_MESSAGE_STATE state;
+    WS_ENVELOPE_VERSION env_version;
+    WS_ADDRESSING_VERSION addr_version;
+    WS_CHANNEL_PROPERTY prop;
+    BOOL addressed;
+
+    hr = WsCreateMessageForChannel( NULL, NULL, 0, NULL, NULL );
+    ok( hr == E_INVALIDARG, "got %08x\n", hr );
+
+    hr = WsCreateMessageForChannel( NULL, NULL, 0, &msg, NULL );
+    ok( hr == E_INVALIDARG, "got %08x\n", hr );
+
+    hr = WsCreateChannel( WS_CHANNEL_TYPE_REQUEST, WS_HTTP_CHANNEL_BINDING, NULL, 0, NULL,
+                          &channel, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsCreateMessageForChannel( channel, NULL, 0, &msg, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    state = 0xdeadbeef;
+    hr = WsGetMessageProperty( msg, WS_MESSAGE_PROPERTY_STATE, &state, sizeof(state), NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( state == WS_MESSAGE_STATE_EMPTY, "got %u\n", state );
+
+    env_version = 0xdeadbeef;
+    hr = WsGetMessageProperty( msg, WS_MESSAGE_PROPERTY_ENVELOPE_VERSION, &env_version,
+                               sizeof(env_version), NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( env_version == WS_ENVELOPE_VERSION_SOAP_1_2, "got %u\n", env_version );
+
+    addr_version = 0xdeadbeef;
+    hr = WsGetMessageProperty( msg, WS_MESSAGE_PROPERTY_ADDRESSING_VERSION, &addr_version,
+                               sizeof(addr_version), NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( addr_version == WS_ADDRESSING_VERSION_1_0, "got %u\n", addr_version );
+
+    hr = WsGetMessageProperty( msg, WS_MESSAGE_PROPERTY_IS_ADDRESSED, &addressed, sizeof(addressed),
+                               NULL );
+    ok( hr == WS_E_INVALID_OPERATION, "got %08x\n", hr );
+
+    WsFreeChannel( channel );
+    WsFreeMessage( msg );
+
+    env_version = WS_ENVELOPE_VERSION_SOAP_1_1;
+    prop.id = WS_CHANNEL_PROPERTY_ENVELOPE_VERSION;
+    prop.value = &env_version;
+    prop.valueSize = sizeof(env_version);
+    hr = WsCreateChannel( WS_CHANNEL_TYPE_REQUEST, WS_HTTP_CHANNEL_BINDING, &prop, 1, NULL,
+                          &channel, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsCreateMessageForChannel( channel, NULL, 0, &msg, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    env_version = 0xdeadbeef;
+    hr = WsGetMessageProperty( msg, WS_MESSAGE_PROPERTY_ENVELOPE_VERSION, &env_version,
+                               sizeof(env_version), NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( env_version == WS_ENVELOPE_VERSION_SOAP_1_1, "got %u\n", env_version );
+
+    WsFreeChannel( channel );
     WsFreeMessage( msg );
 }
 
 START_TEST(msg)
 {
     test_WsCreateMessage();
+    test_WsCreateMessageForChannel();
 }
diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec
index a848e4c..8c9c8ee 100644
--- a/dlls/webservices/webservices.spec
+++ b/dlls/webservices/webservices.spec
@@ -27,7 +27,7 @@
 @ stdcall WsCreateHeap(long long ptr long ptr ptr)
 @ stub WsCreateListener
 @ stdcall WsCreateMessage(long long ptr long ptr ptr)
-@ stub WsCreateMessageForChannel
+@ stdcall WsCreateMessageForChannel(ptr ptr long ptr ptr)
 @ stub WsCreateMetadata
 @ stdcall WsCreateReader(ptr long ptr ptr)
 @ stub WsCreateServiceEndpointFromTemplate
-- 
2.1.4




More information about the wine-patches mailing list