Signed-off-by: Hans Leidekker hans@codeweavers.com --- dlls/msado15/stream.c | 58 +++++++++++++++++++++++++++++++++--- dlls/msado15/tests/msado15.c | 51 +++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 4 deletions(-)
diff --git a/dlls/msado15/stream.c b/dlls/msado15/stream.c index e2e404a620..52f35afe3c 100644 --- a/dlls/msado15/stream.c +++ b/dlls/msado15/stream.c @@ -400,14 +400,64 @@ static HRESULT WINAPI stream_LoadFromFile( _Stream *iface, BSTR filename )
static HRESULT WINAPI stream_ReadText( _Stream *iface, LONG len, BSTR *ret ) { - FIXME( "%p, %d, %p\n", iface, len, ret ); - return E_NOTIMPL; + struct stream *stream = impl_from_Stream( iface ); + BSTR str; + + TRACE( "%p, %d, %p\n", stream, len, ret ); + if (len == adReadLine) + { + FIXME( "adReadLine not supported\n" ); + return E_NOTIMPL; + } + if (stream->charset && wcscmp( stream->charset, L"Unicode" )) + { + FIXME( "charset %s not supported\n", debugstr_w(stream->charset) ); + return E_NOTIMPL; + } + + if (stream->type != adTypeText) return MAKE_ADO_HRESULT( adErrIllegalOperation ); + if (len < adReadLine) return MAKE_ADO_HRESULT( adErrInvalidArgument ); + + if (len == adReadAll) len = (stream->size - stream->pos) / sizeof(WCHAR); + else len = min( len, stream->size - stream->pos / sizeof(WCHAR) ); + + if (!(str = SysAllocStringLen( NULL, len ))) return E_OUTOFMEMORY; + memcpy( str, stream->buf + stream->pos, len * sizeof(WCHAR) ); + str[len] = 0; + + stream->pos += len * sizeof(WCHAR); + + *ret = str; + return S_OK; }
static HRESULT WINAPI stream_WriteText( _Stream *iface, BSTR data, StreamWriteEnum options ) { - FIXME( "%p, %s, %u\n", iface, debugstr_w(data), options ); - return E_NOTIMPL; + struct stream *stream = impl_from_Stream( iface ); + HRESULT hr; + LONG size; + + TRACE( "%p, %s, %u\n", stream, debugstr_w(data), options ); + if (options != adWriteChar) + { + FIXME( "options %u not supported\n", options ); + return E_NOTIMPL; + } + if (stream->charset && wcscmp( stream->charset, L"Unicode" )) + { + FIXME( "charset %s not supported\n", debugstr_w(stream->charset) ); + return E_NOTIMPL; + } + + if (stream->type != adTypeText) return MAKE_ADO_HRESULT( adErrIllegalOperation ); + + size = (lstrlenW( data ) + 1) * sizeof(WCHAR); + if ((hr = resize_buffer( stream, stream->size + size )) != S_OK) return hr; + + memcpy( stream->buf + stream->pos, data, size ); + stream->pos += size; + + return S_OK; }
static HRESULT WINAPI stream_Cancel( _Stream *iface ) diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index 2c75904837..079da0a103 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -162,11 +162,54 @@ static void test_Stream(void) hr = _Stream_Read( stream, 2, &val ); ok( hr == MAKE_ADO_HRESULT( adErrIllegalOperation ), "got %08x\n", hr );
+ hr = _Stream_ReadText( stream, 2, &str ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( !str[0], "got %s\n", wine_dbgstr_w(str) ); + SysFreeString( str ); + pos = -1; hr = _Stream_get_Position( stream, &pos ); ok( hr == S_OK, "got %08x\n", hr ); ok( !pos, "got %d\n", pos );
+ str = SysAllocString( L"test" ); + hr = _Stream_WriteText( stream, str, adWriteChar ); + ok( hr == S_OK, "got %08x\n", hr ); + SysFreeString( str ); + + hr = _Stream_ReadText( stream, adReadAll, &str ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( !str[0], "got %s\n", wine_dbgstr_w(str) ); + SysFreeString( str ); + + hr = _Stream_put_Position( stream, 0 ); + ok( hr == S_OK, "got %08x\n", hr ); + hr = _Stream_ReadText( stream, adReadAll, &str ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( !lstrcmpW( str, L"test" ), "got %s\n", wine_dbgstr_w(str) ); + SysFreeString( str ); + + pos = -1; + hr = _Stream_get_Position( stream, &pos ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( pos == 10, "got %d\n", pos ); + + eos = VARIANT_FALSE; + hr = _Stream_get_EOS( stream, &eos ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( eos == VARIANT_TRUE, "got %04x\n", eos ); + + hr = _Stream_put_Position( stream, 6 ); + ok( hr == S_OK, "got %08x\n", hr ); + + size = -1; + hr = _Stream_get_Size( stream, &size ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( size == 10, "got %d\n", size ); + + hr = _Stream_put_Position( stream, 2 ); + ok( hr == S_OK, "got %08x\n", hr ); + hr = _Stream_Close( stream ); ok( hr == S_OK, "got %08x\n", hr );
@@ -191,6 +234,14 @@ static void test_Stream(void) hr = _Stream_Open( stream, missing, adModeUnknown, adOpenStreamUnspecified, NULL, NULL ); ok( hr == S_OK, "got %08x\n", hr );
+ hr = _Stream_ReadText( stream, adReadAll, &str ); + ok( hr == MAKE_ADO_HRESULT( adErrIllegalOperation ), "got %08x\n", hr ); + + str = SysAllocString( L"test" ); + hr = _Stream_WriteText( stream, str, adWriteChar ); + ok( hr == MAKE_ADO_HRESULT( adErrIllegalOperation ), "got %08x\n", hr ); + SysFreeString( str ); + VariantInit( &val ); hr = _Stream_Read( stream, 1, &val ); ok( hr == S_OK, "got %08x\n", hr );