Module: wine Branch: master Commit: 65e04e006e8902ac90eecb8267c57ad7b2dc93fe URL: http://source.winehq.org/git/wine.git/?a=commit;h=65e04e006e8902ac90eecb8267...
Author: Hans Leidekker hans@codeweavers.com Date: Wed Oct 14 13:01:05 2015 +0200
webservices: Implement WsCreateWriter and WsFreeWriter.
Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/webservices/Makefile.in | 3 +- dlls/webservices/reader.c | 21 +---- dlls/webservices/webservices.spec | 4 +- dlls/webservices/webservices_private.h | 37 +++++++++ dlls/webservices/writer.c | 143 +++++++++++++++++++++++++++++++++ 5 files changed, 185 insertions(+), 23 deletions(-)
diff --git a/dlls/webservices/Makefile.in b/dlls/webservices/Makefile.in index e11a2e7..c3fea85 100644 --- a/dlls/webservices/Makefile.in +++ b/dlls/webservices/Makefile.in @@ -3,4 +3,5 @@ IMPORTLIB = webservices
C_SRCS = \ main.c \ - reader.c + reader.c \ + writer.c diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c index f85b5e7..ac61890 100644 --- a/dlls/webservices/reader.c +++ b/dlls/webservices/reader.c @@ -25,6 +25,7 @@
#include "wine/debug.h" #include "wine/list.h" +#include "webservices_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(webservices);
@@ -34,26 +35,6 @@ static const char *debugstr_xmlstr( const WS_XML_STRING *str ) return debugstr_an( (const char *)str->bytes, str->length ); }
-static inline void *heap_alloc( SIZE_T size ) -{ - return HeapAlloc( GetProcessHeap(), 0, size ); -} - -static inline void *heap_alloc_zero( SIZE_T size ) -{ - return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size ); -} - -static inline void *heap_realloc( void *mem, SIZE_T size ) -{ - return HeapReAlloc( GetProcessHeap(), 0, mem, size ); -} - -static inline BOOL heap_free( void *mem ) -{ - return HeapFree( GetProcessHeap(), 0, mem ); -} - static const struct { ULONG size; diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec index 85014bf..a8e82ec 100644 --- a/dlls/webservices/webservices.spec +++ b/dlls/webservices/webservices.spec @@ -34,7 +34,7 @@ @ stub WsCreateServiceHost @ stub WsCreateServiceProxy @ stub WsCreateServiceProxyFromTemplate -@ stub WsCreateWriter +@ stdcall WsCreateWriter(ptr long ptr ptr) @ stub WsCreateXmlBuffer @ stub WsCreateXmlSecurityToken @ stub WsDateTimeToFileTime @@ -58,7 +58,7 @@ @ stub WsFreeSecurityToken @ stub WsFreeServiceHost @ stub WsFreeServiceProxy -@ stub WsFreeWriter +@ stdcall WsFreeWriter(ptr) @ stub WsGetChannelProperty @ stub WsGetCustomHeader @ stub WsGetDictionary diff --git a/dlls/webservices/webservices_private.h b/dlls/webservices/webservices_private.h new file mode 100644 index 0000000..20d3f0b --- /dev/null +++ b/dlls/webservices/webservices_private.h @@ -0,0 +1,37 @@ +/* + * Copyright 2015 Hans Leidekker for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +static inline void *heap_alloc( SIZE_T size ) +{ + return HeapAlloc( GetProcessHeap(), 0, size ); +} + +static inline void *heap_alloc_zero( SIZE_T size ) +{ + return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size ); +} + +static inline void *heap_realloc( void *mem, SIZE_T size ) +{ + return HeapReAlloc( GetProcessHeap(), 0, mem, size ); +} + +static inline BOOL heap_free( void *mem ) +{ + return HeapFree( GetProcessHeap(), 0, mem ); +} diff --git a/dlls/webservices/writer.c b/dlls/webservices/writer.c new file mode 100644 index 0000000..e9147fc --- /dev/null +++ b/dlls/webservices/writer.c @@ -0,0 +1,143 @@ +/* + * Copyright 2015 Hans Leidekker for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "webservices.h" + +#include "wine/debug.h" +#include "webservices_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(webservices); + +static const struct +{ + ULONG size; + BOOL readonly; +} +writer_props[] = +{ + { sizeof(ULONG), FALSE }, /* WS_XML_WRITER_PROPERTY_MAX_DEPTH */ + { sizeof(BOOL), FALSE }, /* WS_XML_WRITER_PROPERTY_ALLOW_FRAGMENT */ + { sizeof(ULONG), FALSE }, /* WS_XML_READER_PROPERTY_MAX_ATTRIBUTES */ + { sizeof(BOOL), FALSE }, /* WS_XML_WRITER_PROPERTY_WRITE_DECLARATION */ + { sizeof(ULONG), FALSE }, /* WS_XML_WRITER_PROPERTY_INDENT */ + { sizeof(ULONG), FALSE }, /* WS_XML_WRITER_PROPERTY_BUFFER_TRIM_SIZE */ + { sizeof(WS_CHARSET), FALSE }, /* WS_XML_WRITER_PROPERTY_CHARSET */ + { sizeof(WS_BUFFERS), FALSE }, /* WS_XML_WRITER_PROPERTY_BUFFERS */ + { sizeof(ULONG), FALSE }, /* WS_XML_WRITER_PROPERTY_BUFFER_MAX_SIZE */ + { sizeof(WS_BYTES), FALSE }, /* WS_XML_WRITER_PROPERTY_BYTES */ + { sizeof(BOOL), TRUE }, /* WS_XML_WRITER_PROPERTY_IN_ATTRIBUTE */ + { sizeof(ULONG), FALSE }, /* WS_XML_WRITER_PROPERTY_MAX_MIME_PARTS_BUFFER_SIZE */ + { sizeof(WS_BYTES), FALSE }, /* WS_XML_WRITER_PROPERTY_INITIAL_BUFFER */ + { sizeof(BOOL), FALSE }, /* WS_XML_WRITER_PROPERTY_ALLOW_INVALID_CHARACTER_REFERENCES */ + { sizeof(ULONG), FALSE }, /* WS_XML_WRITER_PROPERTY_MAX_NAMESPACES */ + { sizeof(ULONG), TRUE }, /* WS_XML_WRITER_PROPERTY_BYTES_WRITTEN */ + { sizeof(ULONG), TRUE }, /* WS_XML_WRITER_PROPERTY_BYTES_TO_CLOSE */ + { sizeof(BOOL), FALSE }, /* WS_XML_WRITER_PROPERTY_COMPRESS_EMPTY_ELEMENTS */ + { sizeof(BOOL), FALSE } /* WS_XML_WRITER_PROPERTY_EMIT_UNCOMPRESSED_EMPTY_ELEMENTS */ +}; + +struct writer +{ + ULONG prop_count; + WS_XML_WRITER_PROPERTY prop[sizeof(writer_props)/sizeof(writer_props[0])]; +}; + +static struct writer *alloc_writer(void) +{ + static const ULONG count = sizeof(writer_props)/sizeof(writer_props[0]); + struct writer *ret; + ULONG i, size = sizeof(*ret) + count * sizeof(WS_XML_WRITER_PROPERTY); + char *ptr; + + for (i = 0; i < count; i++) size += writer_props[i].size; + if (!(ret = heap_alloc_zero( size ))) return NULL; + + ptr = (char *)&ret->prop[count]; + for (i = 0; i < count; i++) + { + ret->prop[i].value = ptr; + ret->prop[i].valueSize = writer_props[i].size; + ptr += ret->prop[i].valueSize; + } + ret->prop_count = count; + return ret; +} + +static HRESULT set_writer_prop( struct writer *writer, WS_XML_WRITER_PROPERTY_ID id, const void *value, + ULONG size ) +{ + if (id >= writer->prop_count || size != writer_props[id].size || writer_props[id].readonly) + return E_INVALIDARG; + + memcpy( writer->prop[id].value, value, size ); + return S_OK; +} + +/************************************************************************** + * WsCreateWriter [webservices.@] + */ +HRESULT WINAPI WsCreateWriter( const WS_XML_WRITER_PROPERTY *properties, ULONG count, + WS_XML_WRITER **handle, WS_ERROR *error ) +{ + struct writer *writer; + ULONG i, max_depth = 32, max_attrs = 128, trim_size = 4096, max_size = 65536, max_ns = 32; + WS_CHARSET charset = WS_CHARSET_UTF8; + HRESULT hr; + + TRACE( "%p %u %p %p\n", properties, count, handle, error ); + if (error) FIXME( "ignoring error parameter\n" ); + + if (!handle) return E_INVALIDARG; + if (!(writer = alloc_writer())) return E_OUTOFMEMORY; + + set_writer_prop( writer, WS_XML_WRITER_PROPERTY_MAX_DEPTH, &max_depth, sizeof(max_depth) ); + set_writer_prop( writer, WS_XML_WRITER_PROPERTY_MAX_ATTRIBUTES, &max_attrs, sizeof(max_attrs) ); + set_writer_prop( writer, WS_XML_WRITER_PROPERTY_BUFFER_TRIM_SIZE, &trim_size, sizeof(trim_size) ); + set_writer_prop( writer, WS_XML_WRITER_PROPERTY_CHARSET, &charset, sizeof(charset) ); + set_writer_prop( writer, WS_XML_WRITER_PROPERTY_BUFFER_MAX_SIZE, &max_size, sizeof(max_size) ); + set_writer_prop( writer, WS_XML_WRITER_PROPERTY_MAX_MIME_PARTS_BUFFER_SIZE, &max_size, sizeof(max_size) ); + set_writer_prop( writer, WS_XML_WRITER_PROPERTY_MAX_NAMESPACES, &max_ns, sizeof(max_ns) ); + + for (i = 0; i < count; i++) + { + hr = set_writer_prop( writer, properties[i].id, properties[i].value, properties[i].valueSize ); + if (hr != S_OK) + { + heap_free( writer ); + return hr; + } + } + + *handle = (WS_XML_WRITER *)writer; + return S_OK; +} + +/************************************************************************** + * WsFreeWriter [webservices.@] + */ +void WINAPI WsFreeWriter( WS_XML_WRITER *handle ) +{ + struct writer *writer = (struct writer *)handle; + + TRACE( "%p\n", handle ); + heap_free( writer ); +}