Hans Leidekker : webservices: Store headers in WsReadEnvelopeStart.
Alexandre Julliard
julliard at winehq.org
Wed Sep 6 14:45:36 CDT 2017
Module: wine
Branch: master
Commit: ffbddae5420e6ae33f76f23a7d2af8a1ab5b0b54
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ffbddae5420e6ae33f76f23a7d2af8a1ab5b0b54
Author: Hans Leidekker <hans at codeweavers.com>
Date: Wed Sep 6 15:56:05 2017 +0200
webservices: Store headers in WsReadEnvelopeStart.
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/webservices/heap.c | 15 +++++++++++----
dlls/webservices/msg.c | 4 ++--
dlls/webservices/reader.c | 29 +++++++++++++++++++++++++++++
dlls/webservices/webservices_private.h | 6 +++++-
dlls/webservices/writer.c | 5 +++--
5 files changed, 50 insertions(+), 9 deletions(-)
diff --git a/dlls/webservices/heap.c b/dlls/webservices/heap.c
index a135cff..1104cf0 100644
--- a/dlls/webservices/heap.c
+++ b/dlls/webservices/heap.c
@@ -315,21 +315,25 @@ HRESULT WINAPI WsGetHeapProperty( WS_HEAP *handle, WS_HEAP_PROPERTY_ID id, void
}
#define XML_BUFFER_INITIAL_ALLOCATED_SIZE 256
-struct xmlbuf *alloc_xmlbuf( WS_HEAP *heap, WS_XML_WRITER_ENCODING_TYPE encoding, WS_CHARSET charset )
+struct xmlbuf *alloc_xmlbuf( WS_HEAP *heap, SIZE_T size, WS_XML_WRITER_ENCODING_TYPE encoding, WS_CHARSET charset,
+ const WS_XML_DICTIONARY *dict_static, WS_XML_DICTIONARY *dict )
{
struct xmlbuf *ret;
+ if (!size) size = XML_BUFFER_INITIAL_ALLOCATED_SIZE;
if (!(ret = ws_alloc( heap, sizeof(*ret) ))) return NULL;
- if (!(ret->bytes.bytes = ws_alloc( heap, XML_BUFFER_INITIAL_ALLOCATED_SIZE )))
+ if (!(ret->bytes.bytes = ws_alloc( heap, size )))
{
ws_free( heap, ret, sizeof(*ret) );
return NULL;
}
ret->heap = heap;
- ret->size = XML_BUFFER_INITIAL_ALLOCATED_SIZE;
+ ret->size = size;
ret->bytes.length = 0;
ret->encoding = encoding;
ret->charset = charset;
+ ret->dict_static = dict_static;
+ ret->dict = dict;
return ret;
}
@@ -348,10 +352,13 @@ HRESULT WINAPI WsCreateXmlBuffer( WS_HEAP *heap, const WS_XML_BUFFER_PROPERTY *p
{
struct xmlbuf *xmlbuf;
+ TRACE( "%p %p %u %p %p\n", heap, properties, count, handle, error );
+ if (error) FIXME( "ignoring error parameter\n" );
+
if (!heap || !handle) return E_INVALIDARG;
if (count) FIXME( "properties not implemented\n" );
- if (!(xmlbuf = alloc_xmlbuf( heap, WS_XML_WRITER_ENCODING_TYPE_TEXT, WS_CHARSET_UTF8 )))
+ if (!(xmlbuf = alloc_xmlbuf( heap, 0, WS_XML_WRITER_ENCODING_TYPE_TEXT, WS_CHARSET_UTF8, NULL, NULL )))
{
return WS_E_QUOTA_EXCEEDED;
}
diff --git a/dlls/webservices/msg.c b/dlls/webservices/msg.c
index d6f0144..8d416eb 100644
--- a/dlls/webservices/msg.c
+++ b/dlls/webservices/msg.c
@@ -794,7 +794,6 @@ static HRESULT read_envelope_start( WS_XML_READER *reader )
{
for (;;)
{
- /* FIXME: store headers */
if ((hr = WsReadNode( reader, NULL )) != S_OK) return hr;
if (match_current_element( reader, &body )) break;
}
@@ -836,7 +835,8 @@ HRESULT WINAPI WsReadEnvelopeStart( WS_MESSAGE *handle, WS_XML_READER *reader, W
return WS_E_INVALID_OPERATION;
}
- if ((hr = read_envelope_start( reader )) == S_OK)
+ if ((hr = read_envelope_start( reader )) == S_OK &&
+ (hr = create_header_buffer( reader, msg->heap, &msg->buf )) == S_OK)
{
msg->reader_body = reader;
msg->state = WS_MESSAGE_STATE_READING;
diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c
index 0028334..50431bf 100644
--- a/dlls/webservices/reader.c
+++ b/dlls/webservices/reader.c
@@ -6931,6 +6931,8 @@ HRESULT WINAPI WsSetInputToBuffer( WS_XML_READER *handle, WS_XML_BUFFER *buffer,
reader->input_enc = xmlbuf->encoding;
reader->input_charset = xmlbuf->charset;
+ reader->dict_static = xmlbuf->dict_static;
+ reader->dict = xmlbuf->dict;
set_input_buffer( reader, xmlbuf, xmlbuf->bytes.bytes, xmlbuf->bytes.length );
if (!(node = alloc_node( WS_XML_NODE_TYPE_BOF ))) hr = E_OUTOFMEMORY;
@@ -7268,6 +7270,33 @@ done:
return hr;
}
+HRESULT create_header_buffer( WS_XML_READER *handle, WS_HEAP *heap, WS_XML_BUFFER **ret )
+{
+ struct reader *reader = (struct reader *)handle;
+ HRESULT hr = WS_E_QUOTA_EXCEEDED;
+ struct xmlbuf *xmlbuf;
+
+ EnterCriticalSection( &reader->cs );
+
+ if (reader->magic != READER_MAGIC)
+ {
+ LeaveCriticalSection( &reader->cs );
+ return E_INVALIDARG;
+ }
+
+ if ((xmlbuf = alloc_xmlbuf( heap, reader->read_pos, reader->input_enc, reader->input_charset,
+ reader->dict_static, reader->dict )))
+ {
+ memcpy( xmlbuf->bytes.bytes, reader->read_bufptr, reader->read_pos );
+ xmlbuf->bytes.length = reader->read_pos;
+ *ret = (WS_XML_BUFFER *)xmlbuf;
+ hr = S_OK;
+ }
+
+ LeaveCriticalSection( &reader->cs );
+ return hr;
+}
+
HRESULT get_param_desc( const WS_STRUCT_DESCRIPTION *desc, USHORT index, const WS_FIELD_DESCRIPTION **ret )
{
if (index >= desc->fieldCount) return E_INVALIDARG;
diff --git a/dlls/webservices/webservices_private.h b/dlls/webservices/webservices_private.h
index 5ce88b2..9572a02 100644
--- a/dlls/webservices/webservices_private.h
+++ b/dlls/webservices/webservices_private.h
@@ -25,6 +25,8 @@ struct xmlbuf
SIZE_T size;
WS_XML_WRITER_ENCODING_TYPE encoding;
WS_CHARSET charset;
+ const WS_XML_DICTIONARY *dict_static;
+ WS_XML_DICTIONARY *dict;
};
void *ws_alloc( WS_HEAP *, SIZE_T ) DECLSPEC_HIDDEN;
@@ -32,7 +34,8 @@ void *ws_alloc_zero( WS_HEAP *, SIZE_T ) DECLSPEC_HIDDEN;
void *ws_realloc( WS_HEAP *, void *, SIZE_T, SIZE_T ) DECLSPEC_HIDDEN;
void *ws_realloc_zero( WS_HEAP *, void *, SIZE_T, SIZE_T ) DECLSPEC_HIDDEN;
void ws_free( WS_HEAP *, void *, SIZE_T ) DECLSPEC_HIDDEN;
-struct xmlbuf *alloc_xmlbuf( WS_HEAP *, WS_XML_WRITER_ENCODING_TYPE, WS_CHARSET ) DECLSPEC_HIDDEN;
+struct xmlbuf *alloc_xmlbuf( WS_HEAP *, SIZE_T, WS_XML_WRITER_ENCODING_TYPE, WS_CHARSET,
+ const WS_XML_DICTIONARY *, WS_XML_DICTIONARY * ) DECLSPEC_HIDDEN;
void free_xmlbuf( struct xmlbuf * ) DECLSPEC_HIDDEN;
struct dictionary
@@ -62,6 +65,7 @@ void restore_fpword( unsigned short ) DECLSPEC_HIDDEN;
ULONG get_type_size( WS_TYPE, const void * ) DECLSPEC_HIDDEN;
HRESULT read_header( WS_XML_READER *, const WS_XML_STRING *, const WS_XML_STRING *, WS_TYPE,
const void *, WS_READ_OPTION, WS_HEAP *, void *, ULONG ) DECLSPEC_HIDDEN;
+HRESULT create_header_buffer( WS_XML_READER *, WS_HEAP *, WS_XML_BUFFER ** ) DECLSPEC_HIDDEN;
WS_XML_UTF8_TEXT *alloc_utf8_text( const BYTE *, ULONG ) DECLSPEC_HIDDEN;
WS_XML_UTF16_TEXT *alloc_utf16_text( const BYTE *, ULONG ) DECLSPEC_HIDDEN;
diff --git a/dlls/webservices/writer.c b/dlls/webservices/writer.c
index 2071a95..7216fc1 100644
--- a/dlls/webservices/writer.c
+++ b/dlls/webservices/writer.c
@@ -85,7 +85,7 @@ struct writer
WS_XML_WRITER_OUTPUT_TYPE output_type;
struct xmlbuf *output_buf;
WS_HEAP *output_heap;
- WS_XML_DICTIONARY *dict;
+ const WS_XML_DICTIONARY *dict;
WS_DYNAMIC_STRING_CALLBACK dict_cb;
void *dict_cb_state;
ULONG prop_count;
@@ -408,7 +408,8 @@ HRESULT WINAPI WsSetOutput( WS_XML_WRITER *handle, const WS_XML_WRITER_ENCODING
case WS_XML_WRITER_OUTPUT_TYPE_BUFFER:
{
struct xmlbuf *xmlbuf;
- if (!(xmlbuf = alloc_xmlbuf( writer->output_heap, writer->output_enc, writer->output_charset )))
+ if (!(xmlbuf = alloc_xmlbuf( writer->output_heap, 0, writer->output_enc, writer->output_charset,
+ writer->dict, NULL )))
{
hr = WS_E_QUOTA_EXCEEDED;
goto done;
More information about the wine-cvs
mailing list