[PATCH 4/5] msado15: Implement _Stream_get_Charset and _Stream_put_Charset.

Hans Leidekker hans at codeweavers.com
Tue Dec 10 04:11:22 CST 2019


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 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 );
 
-- 
2.20.1




More information about the wine-devel mailing list