Commit ffbddae5 authored by Hans Leidekker's avatar Hans Leidekker Committed by Alexandre Julliard

webservices: Store headers in WsReadEnvelopeStart.

parent a55d3842
...@@ -315,21 +315,25 @@ HRESULT WINAPI WsGetHeapProperty( WS_HEAP *handle, WS_HEAP_PROPERTY_ID id, void ...@@ -315,21 +315,25 @@ HRESULT WINAPI WsGetHeapProperty( WS_HEAP *handle, WS_HEAP_PROPERTY_ID id, void
} }
#define XML_BUFFER_INITIAL_ALLOCATED_SIZE 256 #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; struct xmlbuf *ret;
if (!size) size = XML_BUFFER_INITIAL_ALLOCATED_SIZE;
if (!(ret = ws_alloc( heap, sizeof(*ret) ))) return NULL; 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) ); ws_free( heap, ret, sizeof(*ret) );
return NULL; return NULL;
} }
ret->heap = heap; ret->heap = heap;
ret->size = XML_BUFFER_INITIAL_ALLOCATED_SIZE; ret->size = size;
ret->bytes.length = 0; ret->bytes.length = 0;
ret->encoding = encoding; ret->encoding = encoding;
ret->charset = charset; ret->charset = charset;
ret->dict_static = dict_static;
ret->dict = dict;
return ret; return ret;
} }
...@@ -348,10 +352,13 @@ HRESULT WINAPI WsCreateXmlBuffer( WS_HEAP *heap, const WS_XML_BUFFER_PROPERTY *p ...@@ -348,10 +352,13 @@ HRESULT WINAPI WsCreateXmlBuffer( WS_HEAP *heap, const WS_XML_BUFFER_PROPERTY *p
{ {
struct xmlbuf *xmlbuf; 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 (!heap || !handle) return E_INVALIDARG;
if (count) FIXME( "properties not implemented\n" ); 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; return WS_E_QUOTA_EXCEEDED;
} }
......
...@@ -794,7 +794,6 @@ static HRESULT read_envelope_start( WS_XML_READER *reader ) ...@@ -794,7 +794,6 @@ static HRESULT read_envelope_start( WS_XML_READER *reader )
{ {
for (;;) for (;;)
{ {
/* FIXME: store headers */
if ((hr = WsReadNode( reader, NULL )) != S_OK) return hr; if ((hr = WsReadNode( reader, NULL )) != S_OK) return hr;
if (match_current_element( reader, &body )) break; if (match_current_element( reader, &body )) break;
} }
...@@ -836,7 +835,8 @@ HRESULT WINAPI WsReadEnvelopeStart( WS_MESSAGE *handle, WS_XML_READER *reader, W ...@@ -836,7 +835,8 @@ HRESULT WINAPI WsReadEnvelopeStart( WS_MESSAGE *handle, WS_XML_READER *reader, W
return WS_E_INVALID_OPERATION; 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->reader_body = reader;
msg->state = WS_MESSAGE_STATE_READING; msg->state = WS_MESSAGE_STATE_READING;
......
...@@ -6931,6 +6931,8 @@ HRESULT WINAPI WsSetInputToBuffer( WS_XML_READER *handle, WS_XML_BUFFER *buffer, ...@@ -6931,6 +6931,8 @@ HRESULT WINAPI WsSetInputToBuffer( WS_XML_READER *handle, WS_XML_BUFFER *buffer,
reader->input_enc = xmlbuf->encoding; reader->input_enc = xmlbuf->encoding;
reader->input_charset = xmlbuf->charset; 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 ); set_input_buffer( reader, xmlbuf, xmlbuf->bytes.bytes, xmlbuf->bytes.length );
if (!(node = alloc_node( WS_XML_NODE_TYPE_BOF ))) hr = E_OUTOFMEMORY; if (!(node = alloc_node( WS_XML_NODE_TYPE_BOF ))) hr = E_OUTOFMEMORY;
...@@ -7268,6 +7270,33 @@ done: ...@@ -7268,6 +7270,33 @@ done:
return hr; 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 ) HRESULT get_param_desc( const WS_STRUCT_DESCRIPTION *desc, USHORT index, const WS_FIELD_DESCRIPTION **ret )
{ {
if (index >= desc->fieldCount) return E_INVALIDARG; if (index >= desc->fieldCount) return E_INVALIDARG;
......
...@@ -25,6 +25,8 @@ struct xmlbuf ...@@ -25,6 +25,8 @@ struct xmlbuf
SIZE_T size; SIZE_T size;
WS_XML_WRITER_ENCODING_TYPE encoding; WS_XML_WRITER_ENCODING_TYPE encoding;
WS_CHARSET charset; WS_CHARSET charset;
const WS_XML_DICTIONARY *dict_static;
WS_XML_DICTIONARY *dict;
}; };
void *ws_alloc( WS_HEAP *, SIZE_T ) DECLSPEC_HIDDEN; void *ws_alloc( WS_HEAP *, SIZE_T ) DECLSPEC_HIDDEN;
...@@ -32,7 +34,8 @@ void *ws_alloc_zero( 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( WS_HEAP *, void *, SIZE_T, SIZE_T ) DECLSPEC_HIDDEN;
void *ws_realloc_zero( 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; 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; void free_xmlbuf( struct xmlbuf * ) DECLSPEC_HIDDEN;
struct dictionary struct dictionary
...@@ -62,6 +65,7 @@ void restore_fpword( unsigned short ) DECLSPEC_HIDDEN; ...@@ -62,6 +65,7 @@ void restore_fpword( unsigned short ) DECLSPEC_HIDDEN;
ULONG get_type_size( WS_TYPE, const void * ) 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, 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; 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_UTF8_TEXT *alloc_utf8_text( const BYTE *, ULONG ) DECLSPEC_HIDDEN;
WS_XML_UTF16_TEXT *alloc_utf16_text( const BYTE *, ULONG ) DECLSPEC_HIDDEN; WS_XML_UTF16_TEXT *alloc_utf16_text( const BYTE *, ULONG ) DECLSPEC_HIDDEN;
......
...@@ -85,7 +85,7 @@ struct writer ...@@ -85,7 +85,7 @@ struct writer
WS_XML_WRITER_OUTPUT_TYPE output_type; WS_XML_WRITER_OUTPUT_TYPE output_type;
struct xmlbuf *output_buf; struct xmlbuf *output_buf;
WS_HEAP *output_heap; WS_HEAP *output_heap;
WS_XML_DICTIONARY *dict; const WS_XML_DICTIONARY *dict;
WS_DYNAMIC_STRING_CALLBACK dict_cb; WS_DYNAMIC_STRING_CALLBACK dict_cb;
void *dict_cb_state; void *dict_cb_state;
ULONG prop_count; ULONG prop_count;
...@@ -408,7 +408,8 @@ HRESULT WINAPI WsSetOutput( WS_XML_WRITER *handle, const WS_XML_WRITER_ENCODING ...@@ -408,7 +408,8 @@ HRESULT WINAPI WsSetOutput( WS_XML_WRITER *handle, const WS_XML_WRITER_ENCODING
case WS_XML_WRITER_OUTPUT_TYPE_BUFFER: case WS_XML_WRITER_OUTPUT_TYPE_BUFFER:
{ {
struct xmlbuf *xmlbuf; 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; hr = WS_E_QUOTA_EXCEEDED;
goto done; goto done;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment