[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