Hans Leidekker : webservices: Add support for byte records in the writer.
Alexandre Julliard
julliard at winehq.org
Wed Jul 12 15:37:25 CDT 2017
Module: wine
Branch: master
Commit: 11028500a75906dc510da2cdaeb1055f68ce453e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=11028500a75906dc510da2cdaeb1055f68ce453e
Author: Hans Leidekker <hans at codeweavers.com>
Date: Wed Jul 12 15:34:31 2017 +0200
webservices: Add support for byte records in the writer.
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/webservices/writer.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 74 insertions(+)
diff --git a/dlls/webservices/writer.c b/dlls/webservices/writer.c
index 5f16623..40e549f 100644
--- a/dlls/webservices/writer.c
+++ b/dlls/webservices/writer.c
@@ -661,6 +661,13 @@ static enum record_type get_attr_text_record_type( const WS_XML_TEXT *text )
if (text_utf8->value.length <= MAX_UINT16) return RECORD_CHARS16_TEXT;
return RECORD_CHARS32_TEXT;
}
+ case WS_XML_TEXT_TYPE_BASE64:
+ {
+ const WS_XML_BASE64_TEXT *text_base64 = (const WS_XML_BASE64_TEXT *)text;
+ if (text_base64->length <= MAX_UINT8) return RECORD_BYTES8_TEXT;
+ if (text_base64->length <= MAX_UINT16) return RECORD_BYTES16_TEXT;
+ return RECORD_BYTES32_TEXT;
+ }
default:
FIXME( "unhandled text type %u\n", text->textType );
return 0;
@@ -700,6 +707,23 @@ static HRESULT write_attribute_value_bin( struct writer *writer, const WS_XML_TE
write_bytes( writer, text_utf8->value.bytes, len );
return S_OK;
}
+ case RECORD_BYTES8_TEXT:
+ {
+ WS_XML_BASE64_TEXT *text_base64 = (WS_XML_BASE64_TEXT *)text;
+ if ((hr = write_grow_buffer( writer, 1 + text_base64->length )) != S_OK) return hr;
+ write_char( writer, text_base64->length );
+ write_bytes( writer, text_base64->bytes, text_base64->length );
+ return S_OK;
+ }
+ case RECORD_BYTES16_TEXT:
+ {
+ WS_XML_BASE64_TEXT *text_base64 = (WS_XML_BASE64_TEXT *)text;
+ UINT16 len = text_base64->length;
+ if ((hr = write_grow_buffer( writer, sizeof(len) + len )) != S_OK) return hr;
+ write_bytes( writer, (const BYTE *)&len, sizeof(len) );
+ write_bytes( writer, text_base64->bytes, len );
+ return S_OK;
+ }
default:
ERR( "unhandled record type %02x\n", type );
return E_NOTIMPL;
@@ -2300,6 +2324,14 @@ static enum record_type get_text_record_type( const WS_XML_TEXT *text )
if (text_utf8->value.length <= MAX_UINT16) return RECORD_CHARS16_TEXT_WITH_ENDELEMENT;
return RECORD_CHARS32_TEXT_WITH_ENDELEMENT;
}
+ case WS_XML_TEXT_TYPE_BASE64:
+ {
+ const WS_XML_BASE64_TEXT *text_base64 = (const WS_XML_BASE64_TEXT *)text;
+ ULONG rem = text_base64->length % 3, len = text_base64->length - rem;
+ if (len <= MAX_UINT8) return RECORD_BYTES8_TEXT;
+ if (len <= MAX_UINT16) return RECORD_BYTES16_TEXT;
+ return RECORD_BYTES32_TEXT;
+ }
default:
FIXME( "unhandled text type %u\n", text->textType );
return 0;
@@ -2341,6 +2373,48 @@ static HRESULT write_text_bin( struct writer *writer, const WS_XML_TEXT *text, U
write_bytes( writer, text_utf8->value.bytes, len );
return S_OK;
}
+ case RECORD_BYTES8_TEXT:
+ {
+ const WS_XML_BASE64_TEXT *text_base64 = (const WS_XML_BASE64_TEXT *)text;
+ UINT8 rem = text_base64->length % 3, len = text_base64->length - rem;
+
+ if (len)
+ {
+ if ((hr = write_grow_buffer( writer, 1 + sizeof(len) + len )) != S_OK) return hr;
+ write_char( writer, rem ? RECORD_BYTES8_TEXT : RECORD_BYTES8_TEXT_WITH_ENDELEMENT );
+ write_char( writer, len );
+ write_bytes( writer, text_base64->bytes, len );
+ }
+ if (rem)
+ {
+ if ((hr = write_grow_buffer( writer, 3 )) != S_OK) return hr;
+ write_char( writer, RECORD_BYTES8_TEXT_WITH_ENDELEMENT );
+ write_char( writer, rem );
+ write_bytes( writer, (const BYTE *)text_base64->bytes + len, rem );
+ }
+ return S_OK;
+ }
+ case RECORD_BYTES16_TEXT:
+ {
+ const WS_XML_BASE64_TEXT *text_base64 = (const WS_XML_BASE64_TEXT *)text;
+ UINT16 rem = text_base64->length % 3, len = text_base64->length - rem;
+
+ if (len)
+ {
+ if ((hr = write_grow_buffer( writer, 1 + sizeof(len) + len )) != S_OK) return hr;
+ write_char( writer, rem ? RECORD_BYTES16_TEXT : RECORD_BYTES16_TEXT_WITH_ENDELEMENT );
+ write_bytes( writer, (const BYTE *)&len, sizeof(len) );
+ write_bytes( writer, text_base64->bytes, len );
+ }
+ if (rem)
+ {
+ if ((hr = write_grow_buffer( writer, 3 )) != S_OK) return hr;
+ write_char( writer, RECORD_BYTES8_TEXT_WITH_ENDELEMENT );
+ write_char( writer, rem );
+ write_bytes( writer, (const BYTE *)text_base64->bytes + len, rem );
+ }
+ return S_OK;
+ }
default:
FIXME( "unhandled record type %02x\n", type );
return E_NOTIMPL;
More information about the wine-cvs
mailing list