[07/10] webservices: Build a session dictionary for strings not present in the static dictionary.
Hans Leidekker
hans at codeweavers.com
Wed Sep 6 08:56:11 CDT 2017
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/webservices/channel.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/dlls/webservices/channel.c b/dlls/webservices/channel.c
index 1300da8..29c8108 100644
--- a/dlls/webservices/channel.c
+++ b/dlls/webservices/channel.c
@@ -1055,6 +1055,22 @@ HRESULT channel_send_message( WS_CHANNEL *handle, WS_MESSAGE *msg )
return hr;
}
+static HRESULT CALLBACK dict_cb( void *state, const WS_XML_STRING *str, BOOL *found, ULONG *id, WS_ERROR *error )
+{
+ struct dictionary *dict = state;
+ HRESULT hr = S_OK;
+ int index;
+
+ if ((index = find_string( dict, str->bytes, str->length, id )) == -1 ||
+ (hr = insert_string( dict, str->bytes, str->length, index, id )) == S_OK)
+ {
+ *found = TRUE;
+ return S_OK;
+ }
+ *found = FALSE;
+ return hr;
+}
+
static HRESULT init_writer( struct channel *channel )
{
WS_XML_WRITER_BUFFER_OUTPUT buf = {{WS_XML_WRITER_OUTPUT_TYPE_BUFFER}};
@@ -1073,8 +1089,13 @@ static HRESULT init_writer( struct channel *channel )
break;
case WS_ENCODING_XML_BINARY_SESSION_1:
- bin.staticDictionary = (WS_XML_DICTIONARY *)&dict_builtin_static.dict;
- /* fall through */
+ if ((hr = writer_enable_lookup( channel->writer )) != S_OK) return hr;
+ clear_dict( &channel->dict );
+ bin.staticDictionary = (WS_XML_DICTIONARY *)&dict_builtin_static.dict;
+ bin.dynamicStringCallback = dict_cb;
+ bin.dynamicStringCallbackState = &channel->dict;
+ encoding = &bin.encoding;
+ break;
case WS_ENCODING_XML_BINARY_1:
encoding = &bin.encoding;
--
2.1.4
More information about the wine-patches
mailing list