Module: wine Branch: master Commit: 3e6b9394bc9650928a24bd2ec8890574b46b7280 URL: https://source.winehq.org/git/wine.git/?a=commit;h=3e6b9394bc9650928a24bd2ec...
Author: Hans Leidekker hans@codeweavers.com Date: Tue Dec 10 11:11:22 2019 +0100
msado15: Implement _Stream_get_Charset and _Stream_put_Charset.
Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/msado15/msado15_private.h | 8 ++++++++ dlls/msado15/stream.c | 24 ++++++++++++++++++++---- dlls/msado15/tests/msado15.c | 11 +++++++++++ 3 files changed, 39 insertions(+), 4 deletions(-)
diff --git a/dlls/msado15/msado15_private.h b/dlls/msado15/msado15_private.h index 1078cbf64e..7239e48b53 100644 --- a/dlls/msado15/msado15_private.h +++ b/dlls/msado15/msado15_private.h @@ -31,4 +31,12 @@ static inline void *heap_realloc_zero( void *mem, SIZE_T len ) return HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, mem, len ); }
+static inline WCHAR *strdupW( const WCHAR *src ) +{ + WCHAR *dst; + if (!src) return NULL; + if ((dst = heap_alloc( (lstrlenW( src ) + 1) * sizeof(*dst) ))) lstrcpyW( dst, src ); + return dst; +} + #endif /* _WINE_MSADO15_PRIVATE_H_ */ diff --git a/dlls/msado15/stream.c b/dlls/msado15/stream.c index 9aa35d5831..e2e404a620 100644 --- a/dlls/msado15/stream.c +++ b/dlls/msado15/stream.c @@ -38,6 +38,7 @@ struct stream ConnectModeEnum mode; StreamTypeEnum type; LineSeparatorEnum sep; + WCHAR *charset; LONG size; LONG allocated; LONG pos; @@ -62,6 +63,7 @@ static ULONG WINAPI stream_Release( _Stream *iface ) if (!refs) { TRACE( "destroying %p\n", stream ); + heap_free( stream->charset ); heap_free( stream->buf ); heap_free( stream ); } @@ -240,14 +242,28 @@ static HRESULT WINAPI stream_put_Mode( _Stream *iface, ConnectModeEnum mode )
static HRESULT WINAPI stream_get_Charset( _Stream *iface, BSTR *charset ) { - FIXME( "%p, %p\n", iface, charset ); - return E_NOTIMPL; + struct stream *stream = impl_from_Stream( iface ); + const WCHAR *src = stream->charset ? stream->charset : L"Unicode"; + BSTR dst; + + TRACE( "%p, %p\n", stream, charset ); + + if (!(dst = SysAllocString( src ))) return E_OUTOFMEMORY; + *charset = dst; + return S_OK; }
static HRESULT WINAPI stream_put_Charset( _Stream *iface, BSTR charset ) { - FIXME( "%p, %s\n", iface, debugstr_w(charset) ); - return E_NOTIMPL; + struct stream *stream = impl_from_Stream( iface ); + WCHAR *str; + + TRACE( "%p, %s\n", stream, debugstr_w(charset) ); + + if (!(str = strdupW( charset ))) return E_OUTOFMEMORY; + heap_free( stream->charset ); + stream->charset = str; + return S_OK; }
static HRESULT create_byte_array( BYTE *data, LONG len, VARIANT *ret ) diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index 6aab518da9..2c75904837 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -55,6 +55,7 @@ static void test_Stream(void) LONG refs, size, pos; ObjectStateEnum state; ConnectModeEnum mode; + BSTR charset, str; VARIANT missing, val; HRESULT hr;
@@ -112,6 +113,16 @@ static void test_Stream(void) hr = _Stream_put_Mode( stream, adModeReadWrite ); ok( hr == S_OK, "got %08x\n", hr );
+ hr = _Stream_get_Charset( stream, &charset ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( !lstrcmpW( charset, L"Unicode" ), "got %s\n", wine_dbgstr_w(charset) ); + SysFreeString( charset ); + + str = SysAllocString( L"Unicode" ); + hr = _Stream_put_Charset( stream, str ); + ok( hr == S_OK, "got %08x\n", hr ); + SysFreeString( str ); + hr = _Stream_Read( stream, 2, &val ); ok( hr == MAKE_ADO_HRESULT( adErrObjectClosed ), "got %08x\n", hr );