diff --git a/dlls/webservices/heap.c b/dlls/webservices/heap.c index a135cffed65..1104cf045b5 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 d6f01448cb4..8d416eb06ae 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 0028334d517..50431bfacfe 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 5ce88b223e6..9572a02ed16 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 2071a955d9e..7216fc17f2c 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;