diff --git a/dlls/msado15/stream.c b/dlls/msado15/stream.c index d5a129f869a..eb384fbf94c 100644 --- a/dlls/msado15/stream.c +++ b/dlls/msado15/stream.c @@ -125,8 +125,13 @@ static HRESULT WINAPI stream_get_EOS( _Stream *iface, VARIANT_BOOL *eos ) static HRESULT WINAPI stream_get_Position( _Stream *iface, LONG *pos ) { - FIXME( "%p, %p\n", iface, pos ); - return E_NOTIMPL; + struct stream *stream = impl_from_Stream( iface ); + TRACE( "%p, %p\n", stream, pos ); + + if (stream->state == adStateClosed) return MAKE_ADO_HRESULT( adErrObjectClosed ); + + *pos = stream->pos; + return S_OK; } static HRESULT resize_buffer( struct stream *stream, LONG size ) @@ -145,8 +150,17 @@ static HRESULT resize_buffer( struct stream *stream, LONG size ) static HRESULT WINAPI stream_put_Position( _Stream *iface, LONG pos ) { - FIXME( "%p, %d\n", iface, pos ); - return E_NOTIMPL; + struct stream *stream = impl_from_Stream( iface ); + HRESULT hr; + + TRACE( "%p, %d\n", stream, pos ); + + if (stream->state == adStateClosed) return MAKE_ADO_HRESULT( adErrObjectClosed ); + if (pos < 0) return MAKE_ADO_HRESULT( adErrInvalidArgument ); + + if ((hr = resize_buffer( stream, stream->pos )) != S_OK) return hr; + stream->pos = pos; + return S_OK; } static HRESULT WINAPI stream_get_Type( _Stream *iface, StreamTypeEnum *type ) diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index 257d1c26fae..c7563228ded 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -50,7 +50,7 @@ static void test_Stream(void) { _Stream *stream; StreamTypeEnum type; - LONG refs; + LONG refs, pos; ObjectStateEnum state; VARIANT missing, val; HRESULT hr; @@ -58,6 +58,12 @@ static void test_Stream(void) hr = CoCreateInstance( &CLSID_Stream, NULL, CLSCTX_INPROC_SERVER, &IID__Stream, (void **)&stream ); ok( hr == S_OK, "got %08x\n", hr ); + hr = _Stream_get_Position( stream, &pos ); + ok( hr == MAKE_ADO_HRESULT( adErrObjectClosed ), "got %08x\n", hr ); + + hr = _Stream_put_Position( stream, 0 ); + ok( hr == MAKE_ADO_HRESULT( adErrObjectClosed ), "got %08x\n", hr ); + /* check default type */ type = 0; hr = _Stream_get_Type( stream, &type ); @@ -97,9 +103,19 @@ static void test_Stream(void) ok( hr == S_OK, "got %08x\n", hr ); ok( state == adStateOpen, "got %u\n", state ); + pos = -1; + hr = _Stream_get_Position( stream, &pos ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( !pos, "got %d\n", pos ); + hr = _Stream_Read( stream, 2, &val ); ok( hr == MAKE_ADO_HRESULT( adErrIllegalOperation ), "got %08x\n", hr ); + pos = -1; + hr = _Stream_get_Position( stream, &pos ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( !pos, "got %d\n", pos ); + hr = _Stream_Close( stream ); ok( hr == S_OK, "got %08x\n", hr ); @@ -139,6 +155,25 @@ static void test_Stream(void) ok( hr == S_OK, "got %08x\n", hr ); VariantClear( &val ); + pos = -1; + hr = _Stream_get_Position( stream, &pos ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( pos == 4, "got %d\n", pos ); + + hr = _Stream_put_Position( stream, 0 ); + ok( hr == S_OK, "got %08x\n", hr ); + + VariantInit( &val ); + hr = _Stream_Read( stream, adReadAll, &val ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( V_VT( &val ) == (VT_ARRAY | VT_UI1), "got %04x\n", V_VT( &val ) ); + VariantClear( &val ); + + pos = -1; + hr = _Stream_get_Position( stream, &pos ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( pos == 4, "got %d\n", pos ); + refs = _Stream_Release( stream ); ok( !refs, "got %d\n", refs ); }