[7/7] webservices: Implement WsResetMessage.

Hans Leidekker hans at codeweavers.com
Wed Mar 29 04:14:49 CDT 2017


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/webservices/msg.c            | 63 ++++++++++++++++++++++++++++++++++++---
 dlls/webservices/tests/msg.c      | 38 +++++++++++++++++++++++
 dlls/webservices/webservices.spec |  2 +-
 include/webservices.h             |  1 +
 4 files changed, 99 insertions(+), 5 deletions(-)

diff --git a/dlls/webservices/msg.c b/dlls/webservices/msg.c
index ae021cc7f2..9e94d7c763 100644
--- a/dlls/webservices/msg.c
+++ b/dlls/webservices/msg.c
@@ -123,15 +123,44 @@ static void free_header( struct header *header )
     heap_free( header );
 }
 
-static void free_msg( struct msg *msg )
+static void reset_msg( struct msg *msg )
 {
     ULONG i;
 
-    WsFreeWriter( msg->writer );
-    WsFreeHeap( msg->heap );
+    msg->state         = WS_MESSAGE_STATE_EMPTY;
+    msg->init          = 0;
+    UuidCreate( &msg->id );
+    msg->is_addressed  = FALSE;
     heap_free( msg->addr.chars );
+    msg->addr.chars    = NULL;
+    msg->addr.length   = 0;
+
     heap_free( msg->action.chars );
-    for (i = 0; i < msg->header_count; i++) free_header( msg->header[i] );
+    msg->action.chars  = NULL;
+    msg->action.length = 0;
+
+    WsResetHeap( msg->heap, NULL );
+    msg->buf           = NULL; /* allocated on msg->heap */
+    msg->writer_body   = NULL; /* owned by caller */
+    msg->reader_body   = NULL; /* owned by caller */
+
+    for (i = 0; i < msg->header_count; i++)
+    {
+        free_header( msg->header[i] );
+        msg->header[i] = NULL;
+    }
+    msg->header_count  = 0;
+
+    memset( &msg->ctx_send, 0, sizeof(msg->ctx_send) );
+    memset( &msg->ctx_receive, 0, sizeof(msg->ctx_receive) );
+}
+
+static void free_msg( struct msg *msg )
+{
+    reset_msg( msg );
+
+    WsFreeWriter( msg->writer );
+    WsFreeHeap( msg->heap );
     heap_free( msg->header );
 
     msg->cs.DebugInfo->Spare[0] = 0;
@@ -246,6 +275,32 @@ void WINAPI WsFreeMessage( WS_MESSAGE *handle )
 }
 
 /**************************************************************************
+ *          WsResetMessage		[webservices.@]
+ */
+HRESULT WINAPI WsResetMessage( WS_MESSAGE *handle, WS_ERROR *error )
+{
+    struct msg *msg = (struct msg *)handle;
+
+    TRACE( "%p %p\n", handle, error );
+    if (error) FIXME( "ignoring error parameter\n" );
+
+    if (!msg) return E_INVALIDARG;
+
+    EnterCriticalSection( &msg->cs );
+
+    if (msg->magic != MSG_MAGIC)
+    {
+        LeaveCriticalSection( &msg->cs );
+        return E_INVALIDARG;
+    }
+
+    reset_msg( msg );
+
+    LeaveCriticalSection( &msg->cs );
+    return S_OK;
+}
+
+/**************************************************************************
  *          WsGetMessageProperty		[webservices.@]
  */
 HRESULT WINAPI WsGetMessageProperty( WS_MESSAGE *handle, WS_MESSAGE_PROPERTY_ID id, void *buf,
diff --git a/dlls/webservices/tests/msg.c b/dlls/webservices/tests/msg.c
index b13a97e768..f6a6ba150c 100644
--- a/dlls/webservices/tests/msg.c
+++ b/dlls/webservices/tests/msg.c
@@ -1105,6 +1105,43 @@ static void test_WsReadBody(void)
     WsFreeHeap( heap );
 }
 
+static void test_WsResetMessage(void)
+{
+    WS_MESSAGE *msg;
+    WS_MESSAGE_STATE state;
+    WS_ENVELOPE_VERSION env_version;
+    WS_ADDRESSING_VERSION addr_version;
+    HRESULT hr;
+
+    hr = WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1, WS_ADDRESSING_VERSION_0_9, NULL, 0, &msg, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsInitializeMessage( msg,  WS_REQUEST_MESSAGE, NULL, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsResetMessage( 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_1, "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_0_9, "got %u\n", addr_version );
+
+    WsFreeMessage( msg );
+}
+
 START_TEST(msg)
 {
     test_WsCreateMessage();
@@ -1123,4 +1160,5 @@ START_TEST(msg)
     test_WsReadEnvelopeStart();
     test_WsReadEnvelopeEnd();
     test_WsReadBody();
+    test_WsResetMessage();
 }
diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec
index 074f612ffc..fd4a831c94 100644
--- a/dlls/webservices/webservices.spec
+++ b/dlls/webservices/webservices.spec
@@ -137,7 +137,7 @@
 @ stdcall WsResetError(ptr)
 @ stdcall WsResetHeap(ptr ptr)
 @ stub WsResetListener
-@ stub WsResetMessage
+@ stdcall WsResetMessage(ptr ptr)
 @ stub WsResetMetadata
 @ stub WsResetServiceHost
 @ stub WsResetServiceProxy
diff --git a/include/webservices.h b/include/webservices.h
index 3274082e7a..532275b357 100644
--- a/include/webservices.h
+++ b/include/webservices.h
@@ -1488,6 +1488,7 @@ HRESULT WINAPI WsRemoveHeader(WS_MESSAGE*, WS_HEADER_TYPE, WS_ERROR*);
 HRESULT WINAPI WsRemoveMappedHeader(WS_MESSAGE*, const WS_XML_STRING*, WS_ERROR*);
 HRESULT WINAPI WsRemoveNode(const WS_XML_NODE_POSITION*, WS_ERROR*);
 HRESULT WINAPI WsResetChannel(WS_CHANNEL*, WS_ERROR*);
+HRESULT WINAPI WsResetMessage(WS_MESSAGE*, WS_ERROR*);
 HRESULT WINAPI WsResetError(WS_ERROR*);
 HRESULT WINAPI WsResetHeap(WS_HEAP*, WS_ERROR*);
 HRESULT WINAPI WsResetMessage(WS_MESSAGE*, WS_ERROR*);
-- 
2.11.0




More information about the wine-patches mailing list