[PATCH v2 03/11] mfplat: Implement IMFByteStream::SetCurrentPosition for files.

Derek Lesho dlesho at codeweavers.com
Mon Feb 10 16:32:33 CST 2020


Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
---
v2: Add tests.
---
 dlls/mfplat/main.c         | 26 ++++++++++++++++----------
 dlls/mfplat/tests/mfplat.c |  8 ++++++++
 2 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index 85d676a0d6..853b5ab370 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -3296,15 +3296,6 @@ static HRESULT WINAPI mfbytestream_GetCurrentPosition(IMFByteStream *iface, QWOR
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI mfbytestream_SetCurrentPosition(IMFByteStream *iface, QWORD position)
-{
-    mfbytestream *This = impl_from_IMFByteStream(iface);
-
-    FIXME("%p, %s\n", This, wine_dbgstr_longlong(position));
-
-    return E_NOTIMPL;
-}
-
 static HRESULT WINAPI bytestream_file_GetLength(IMFByteStream *iface, QWORD *length)
 {
     struct bytestream *stream = impl_from_IMFByteStream(iface);
@@ -3318,6 +3309,21 @@ static HRESULT WINAPI bytestream_file_GetLength(IMFByteStream *iface, QWORD *len
     return S_OK;
 }
 
+static HRESULT WINAPI bytestream_file_SetCurrentPosition(IMFByteStream *iface, QWORD position)
+{
+    struct bytestream *stream = impl_from_IMFByteStream(iface);
+
+    TRACE("%p, %s\n", iface, wine_dbgstr_longlong(position));
+
+    EnterCriticalSection(&stream->cs);
+
+    stream->position = position;
+
+    LeaveCriticalSection(&stream->cs);
+
+    return S_OK;
+}
+
 static HRESULT WINAPI bytestream_file_IsEndOfStream(IMFByteStream *iface, BOOL *ret)
 {
     struct bytestream *stream = impl_from_IMFByteStream(iface);
@@ -3449,7 +3455,7 @@ static const IMFByteStreamVtbl bytestream_file_vtbl =
     bytestream_file_GetLength,
     mfbytestream_SetLength,
     mfbytestream_GetCurrentPosition,
-    mfbytestream_SetCurrentPosition,
+    bytestream_file_SetCurrentPosition,
     bytestream_file_IsEndOfStream,
     bytestream_file_Read,
     bytestream_BeginRead,
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 81219adff4..c468286362 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -1525,6 +1525,7 @@ static void test_file_stream(void)
     WCHAR *filename;
     IUnknown *unk;
     QWORD bytestream_length;
+    BOOL eos;
     HRESULT hr;
     WCHAR *str;
 
@@ -1588,6 +1589,13 @@ static void test_file_stream(void)
     ok(hr == S_OK, "Failed to get bytestream length, hr %#x.\n", hr);
     ok(bytestream_length == 1554, "Unexpected bytestream length %s.\n", wine_dbgstr_longlong(bytestream_length));
 
+    hr = IMFByteStream_SetCurrentPosition(bytestream, bytestream_length);
+    ok (hr == S_OK, "Failed to set bytestream position, hr %#x.\n", hr);
+
+    hr = IMFByteStream_IsEndOfStream(bytestream, &eos);
+    ok (hr == S_OK, "Failed query end of stream, hr %#x.\n", hr);
+    ok (eos == TRUE, "Unexpected IsEndOfStream result, %u.\n", eos);
+
     hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST,
                       MF_FILEFLAGS_NONE, filename, &bytestream2);
     ok(hr == S_OK, "got 0x%08x\n", hr);
-- 
2.25.0




More information about the wine-devel mailing list