webservices: Also use the dictionary for writing UTF-8 text values.
Signed-off-by: Hans Leidekker <hans@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
7b0a05c151
commit
18a77c327e
|
@ -653,7 +653,7 @@ static HRESULT write_dict_string( struct writer *writer, ULONG id )
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum record_type get_attr_text_record_type( const WS_XML_TEXT *text )
|
static enum record_type get_attr_text_record_type( const WS_XML_TEXT *text, BOOL use_dict )
|
||||||
{
|
{
|
||||||
if (!text) return RECORD_CHARS8_TEXT;
|
if (!text) return RECORD_CHARS8_TEXT;
|
||||||
switch (text->textType)
|
switch (text->textType)
|
||||||
|
@ -661,6 +661,7 @@ static enum record_type get_attr_text_record_type( const WS_XML_TEXT *text )
|
||||||
case WS_XML_TEXT_TYPE_UTF8:
|
case WS_XML_TEXT_TYPE_UTF8:
|
||||||
{
|
{
|
||||||
const WS_XML_UTF8_TEXT *text_utf8 = (const WS_XML_UTF8_TEXT *)text;
|
const WS_XML_UTF8_TEXT *text_utf8 = (const WS_XML_UTF8_TEXT *)text;
|
||||||
|
if (use_dict) return RECORD_DICTIONARY_TEXT;
|
||||||
if (text_utf8->value.length <= MAX_UINT8) return RECORD_CHARS8_TEXT;
|
if (text_utf8->value.length <= MAX_UINT8) return RECORD_CHARS8_TEXT;
|
||||||
if (text_utf8->value.length <= MAX_UINT16) return RECORD_CHARS16_TEXT;
|
if (text_utf8->value.length <= MAX_UINT16) return RECORD_CHARS16_TEXT;
|
||||||
return RECORD_CHARS32_TEXT;
|
return RECORD_CHARS32_TEXT;
|
||||||
|
@ -765,10 +766,36 @@ static INT64 get_text_value_int( const WS_XML_TEXT *text )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL get_string_id( struct writer *writer, const WS_XML_STRING *str, ULONG *id )
|
||||||
|
{
|
||||||
|
if (writer->dict && str->dictionary == writer->dict)
|
||||||
|
{
|
||||||
|
*id = str->id << 1;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
if (writer->dict_cb)
|
||||||
|
{
|
||||||
|
BOOL found = FALSE;
|
||||||
|
writer->dict_cb( writer->dict_cb_state, str, &found, id, NULL );
|
||||||
|
if (found) *id = (*id << 1) | 1;
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT write_attribute_value_bin( struct writer *writer, const WS_XML_TEXT *text )
|
static HRESULT write_attribute_value_bin( struct writer *writer, const WS_XML_TEXT *text )
|
||||||
{
|
{
|
||||||
enum record_type type = get_attr_text_record_type( text );
|
enum record_type type;
|
||||||
|
BOOL use_dict = FALSE;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
ULONG id;
|
||||||
|
|
||||||
|
if (text && text->textType == WS_XML_TEXT_TYPE_UTF8)
|
||||||
|
{
|
||||||
|
const WS_XML_UTF8_TEXT *utf8 = (const WS_XML_UTF8_TEXT *)text;
|
||||||
|
use_dict = get_string_id( writer, &utf8->value, &id );
|
||||||
|
}
|
||||||
|
type = get_attr_text_record_type( text, use_dict );
|
||||||
|
|
||||||
if ((hr = write_grow_buffer( writer, 1 )) != S_OK) return hr;
|
if ((hr = write_grow_buffer( writer, 1 )) != S_OK) return hr;
|
||||||
write_char( writer, type );
|
write_char( writer, type );
|
||||||
|
@ -896,23 +923,6 @@ static HRESULT write_attribute_value_bin( struct writer *writer, const WS_XML_TE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL lookup_string_id( struct writer *writer, const WS_XML_STRING *str, ULONG *id )
|
|
||||||
{
|
|
||||||
if (writer->dict && str->dictionary == writer->dict)
|
|
||||||
{
|
|
||||||
*id = str->id << 1;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
if (writer->dict_cb)
|
|
||||||
{
|
|
||||||
BOOL found = FALSE;
|
|
||||||
writer->dict_cb( writer->dict_cb_state, str, &found, id, NULL );
|
|
||||||
if (found) *id = (*id << 1) | 1;
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static enum record_type get_attr_record_type( const WS_XML_ATTRIBUTE *attr, BOOL use_dict )
|
static enum record_type get_attr_record_type( const WS_XML_ATTRIBUTE *attr, BOOL use_dict )
|
||||||
{
|
{
|
||||||
if (!attr->prefix || !attr->prefix->length)
|
if (!attr->prefix || !attr->prefix->length)
|
||||||
|
@ -932,7 +942,7 @@ static enum record_type get_attr_record_type( const WS_XML_ATTRIBUTE *attr, BOOL
|
||||||
static HRESULT write_attribute_bin( struct writer *writer, const WS_XML_ATTRIBUTE *attr )
|
static HRESULT write_attribute_bin( struct writer *writer, const WS_XML_ATTRIBUTE *attr )
|
||||||
{
|
{
|
||||||
ULONG id;
|
ULONG id;
|
||||||
enum record_type type = get_attr_record_type( attr, lookup_string_id(writer, attr->localName, &id) );
|
enum record_type type = get_attr_record_type( attr, get_string_id(writer, attr->localName, &id) );
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
if ((hr = write_grow_buffer( writer, 1 )) != S_OK) return hr;
|
if ((hr = write_grow_buffer( writer, 1 )) != S_OK) return hr;
|
||||||
|
@ -1080,7 +1090,7 @@ static enum record_type get_xmlns_record_type( const WS_XML_ATTRIBUTE *attr, BOO
|
||||||
static HRESULT write_namespace_attribute_bin( struct writer *writer, const WS_XML_ATTRIBUTE *attr )
|
static HRESULT write_namespace_attribute_bin( struct writer *writer, const WS_XML_ATTRIBUTE *attr )
|
||||||
{
|
{
|
||||||
ULONG id;
|
ULONG id;
|
||||||
enum record_type type = get_xmlns_record_type( attr, lookup_string_id(writer, attr->ns, &id) );
|
enum record_type type = get_xmlns_record_type( attr, get_string_id(writer, attr->ns, &id) );
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
if ((hr = write_grow_buffer( writer, 1 )) != S_OK) return hr;
|
if ((hr = write_grow_buffer( writer, 1 )) != S_OK) return hr;
|
||||||
|
@ -1299,7 +1309,7 @@ static HRESULT write_startelement_bin( struct writer *writer )
|
||||||
{
|
{
|
||||||
const WS_XML_ELEMENT_NODE *elem = &writer->current->hdr;
|
const WS_XML_ELEMENT_NODE *elem = &writer->current->hdr;
|
||||||
ULONG id;
|
ULONG id;
|
||||||
enum record_type type = get_elem_record_type( elem, lookup_string_id(writer, elem->localName, &id) );
|
enum record_type type = get_elem_record_type( elem, get_string_id(writer, elem->localName, &id) );
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
if ((hr = write_grow_buffer( writer, 1 )) != S_OK) return hr;
|
if ((hr = write_grow_buffer( writer, 1 )) != S_OK) return hr;
|
||||||
|
@ -2454,13 +2464,14 @@ static HRESULT write_text_text( struct writer *writer, const WS_XML_TEXT *text,
|
||||||
return WS_E_INVALID_FORMAT;
|
return WS_E_INVALID_FORMAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum record_type get_text_record_type( const WS_XML_TEXT *text )
|
static enum record_type get_text_record_type( const WS_XML_TEXT *text, BOOL use_dict )
|
||||||
{
|
{
|
||||||
switch (text->textType)
|
switch (text->textType)
|
||||||
{
|
{
|
||||||
case WS_XML_TEXT_TYPE_UTF8:
|
case WS_XML_TEXT_TYPE_UTF8:
|
||||||
{
|
{
|
||||||
const WS_XML_UTF8_TEXT *text_utf8 = (const WS_XML_UTF8_TEXT *)text;
|
const WS_XML_UTF8_TEXT *text_utf8 = (const WS_XML_UTF8_TEXT *)text;
|
||||||
|
if (use_dict) return RECORD_DICTIONARY_TEXT_WITH_ENDELEMENT;
|
||||||
if (text_utf8->value.length <= MAX_UINT8) return RECORD_CHARS8_TEXT_WITH_ENDELEMENT;
|
if (text_utf8->value.length <= MAX_UINT8) return RECORD_CHARS8_TEXT_WITH_ENDELEMENT;
|
||||||
if (text_utf8->value.length <= MAX_UINT16) return RECORD_CHARS16_TEXT_WITH_ENDELEMENT;
|
if (text_utf8->value.length <= MAX_UINT16) return RECORD_CHARS16_TEXT_WITH_ENDELEMENT;
|
||||||
return RECORD_CHARS32_TEXT_WITH_ENDELEMENT;
|
return RECORD_CHARS32_TEXT_WITH_ENDELEMENT;
|
||||||
|
@ -2537,8 +2548,10 @@ static enum record_type get_text_record_type( const WS_XML_TEXT *text )
|
||||||
|
|
||||||
static HRESULT write_text_bin( struct writer *writer, const WS_XML_TEXT *text, ULONG offset )
|
static HRESULT write_text_bin( struct writer *writer, const WS_XML_TEXT *text, ULONG offset )
|
||||||
{
|
{
|
||||||
enum record_type type = get_text_record_type( text );
|
enum record_type type;
|
||||||
|
BOOL use_dict = FALSE;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
ULONG id;
|
||||||
|
|
||||||
if (offset)
|
if (offset)
|
||||||
{
|
{
|
||||||
|
@ -2546,7 +2559,13 @@ static HRESULT write_text_bin( struct writer *writer, const WS_XML_TEXT *text, U
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (type)
|
if (text->textType == WS_XML_TEXT_TYPE_UTF8)
|
||||||
|
{
|
||||||
|
const WS_XML_UTF8_TEXT *utf8 = (const WS_XML_UTF8_TEXT *)text;
|
||||||
|
use_dict = get_string_id( writer, &utf8->value, &id );
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ((type = get_text_record_type( text, use_dict )))
|
||||||
{
|
{
|
||||||
case RECORD_CHARS8_TEXT_WITH_ENDELEMENT:
|
case RECORD_CHARS8_TEXT_WITH_ENDELEMENT:
|
||||||
{
|
{
|
||||||
|
@ -2699,6 +2718,12 @@ static HRESULT write_text_bin( struct writer *writer, const WS_XML_TEXT *text, U
|
||||||
write_bytes( writer, (const BYTE *)&val, sizeof(val) );
|
write_bytes( writer, (const BYTE *)&val, sizeof(val) );
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
case RECORD_DICTIONARY_TEXT_WITH_ENDELEMENT:
|
||||||
|
{
|
||||||
|
if ((hr = write_grow_buffer( writer, 1 )) != S_OK) return hr;
|
||||||
|
write_char( writer, type );
|
||||||
|
return write_dict_string( writer, id );
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
FIXME( "unhandled record type %02x\n", type );
|
FIXME( "unhandled record type %02x\n", type );
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
|
|
Loading…
Reference in New Issue