[PATCH v6 3/3] mfplat: Implement IMFByteStream::{Read,Write}.

Jactry Zeng jzeng at codeweavers.com
Tue Feb 12 02:25:07 CST 2019


Signed-off-by: Jactry Zeng <jzeng at codeweavers.com>
---
 dlls/mfplat/main.c         | 30 ++++++++++++++++++++++++++----
 dlls/mfplat/tests/mfplat.c | 30 +++++++++++++++---------------
 2 files changed, 41 insertions(+), 19 deletions(-)

diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index 43218d667a..1187efc07a 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -975,10 +975,23 @@ static HRESULT WINAPI mfbytestream_IsEndOfStream(IMFByteStream *iface, BOOL *end
 static HRESULT WINAPI mfbytestream_Read(IMFByteStream *iface, BYTE *data, ULONG count, ULONG *byte_read)
 {
     mfbytestream *This = impl_from_IMFByteStream(iface);
+    STATSTG statstg;
+    QWORD length;
+    HRESULT hr;
 
-    FIXME("%p, %p, %u, %p\n", This, data, count, byte_read);
+    TRACE("(%p)->(%p, %u, %p)\n", This, data, count, byte_read);
 
-    return E_NOTIMPL;
+    memset(&statstg, 0, sizeof(statstg));
+    hr = IStream_Stat(This->stream, &statstg, STATFLAG_NONAME);
+    if(FAILED(hr))
+        return hr;
+    if((statstg.grfMode & 0xf) == STGM_WRITE)
+        return E_ACCESSDENIED;
+
+    IMFByteStream_GetLength(iface, &length);
+    if(count > length)
+        count = length;
+    return IStream_Read(This->stream, data, count, byte_read);
 }
 
 static HRESULT WINAPI mfbytestream_BeginRead(IMFByteStream *iface, BYTE *data, ULONG count,
@@ -1003,10 +1016,19 @@ static HRESULT WINAPI mfbytestream_EndRead(IMFByteStream *iface, IMFAsyncResult
 static HRESULT WINAPI mfbytestream_Write(IMFByteStream *iface, const BYTE *data, ULONG count, ULONG *written)
 {
     mfbytestream *This = impl_from_IMFByteStream(iface);
+    ULARGE_INTEGER stream_size;
+    HRESULT hr;
 
-    FIXME("%p, %p, %u, %p\n", This, data, count, written);
+    TRACE("(%p)->(%p, %u, %p)\n", This, data, count, written);
 
-    return E_NOTIMPL;
+    hr = IStream_Write(This->stream, data, count, written);
+    if(hr == STG_E_ACCESSDENIED)
+        return E_ACCESSDENIED;
+    hr = IStream_Size(This->stream, &stream_size);
+    if(FAILED(hr))
+        return hr;
+    This->length = stream_size.QuadPart;
+    return hr;
 }
 
 static HRESULT WINAPI mfbytestream_BeginWrite(IMFByteStream *iface, const BYTE *data, ULONG count,
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 2c7c12c5f3..48524805f2 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -797,13 +797,13 @@ static void test_bytestream_from_file(void)
     CHECK_BS_LEN(bytestream, sizeof(asf_header));
     read = 0;
     hr = IMFByteStream_Read(bytestream, buffer, sizeof(buffer), &read);
-    todo_wine ok(hr == S_OK, "IMFByteStream_Read failed: 0x%08x.\n", hr);
-    todo_wine ok(read == sizeof(asf_header), "got wrong read length: %d.\n", read);
-    todo_wine ok(!memcmp(buffer, asf_header, sizeof(asf_header)), "got wrong content.\n");
+    ok(hr == S_OK, "IMFByteStream_Read failed: 0x%08x.\n", hr);
+    ok(read == sizeof(asf_header), "got wrong read length: %d.\n", read);
+    ok(!memcmp(buffer, asf_header, sizeof(asf_header)), "got wrong content.\n");
     todo_wine CHECK_BS_POS(bytestream, sizeof(asf_header));
     memset(buffer, 0, sizeof(buffer));
     hr = IMFByteStream_Write(bytestream, asf_header, sizeof(asf_header), &written);
-    todo_wine ok(hr == E_ACCESSDENIED, "IMFByteStream_Write should fail: 0x%08x.\n", hr);
+    ok(hr == E_ACCESSDENIED, "IMFByteStream_Write should fail: 0x%08x.\n", hr);
     hr = IMFByteStream_SetLength(bytestream, 200);
     ok(hr == E_FAIL, "IMFByteStream_SetLength should fail: 0x%08x.\n", hr);
     todo_wine CHECK_BS_POS(bytestream, sizeof(asf_header));
@@ -814,12 +814,12 @@ static void test_bytestream_from_file(void)
                       MF_FILEFLAGS_NONE, asffile, &bytestream);
     ok(hr == S_OK, "MFCreateFile failed: 0x%08x.\n", hr);
     hr = IMFByteStream_Read(bytestream, buffer, sizeof(buffer), &read);
-    todo_wine ok(hr == E_ACCESSDENIED, "IMFByteStream_Read should fail: 0x%08x.\n", hr);
+    ok(hr == E_ACCESSDENIED, "IMFByteStream_Read should fail: 0x%08x.\n", hr);
     todo_wine CHECK_BS_POS(bytestream, 0);
     written = 0xdeadbeef;
     hr = IMFByteStream_Write(bytestream, asf_header, sizeof(asf_header), &written);
-    todo_wine ok(hr == S_OK, "IMFByteStream_Write failed: 0x%08x.\n", hr);
-    todo_wine ok(written == sizeof(asf_header), "got wrong written length: %d.\n", written);
+    ok(hr == S_OK, "IMFByteStream_Write failed: 0x%08x.\n", hr);
+    ok(written == sizeof(asf_header), "got wrong written length: %d.\n", written);
     CHECK_BS_LEN(bytestream, sizeof(asf_header));
     todo_wine CHECK_BS_POS(bytestream, sizeof(asf_header));
 
@@ -846,8 +846,8 @@ static void test_bytestream_from_file(void)
     CHECK_BS_LEN(bytestream, sizeof(asf_header) + 2);
     written = 0xdeadbeef;
     hr = IMFByteStream_Write(bytestream, test_data, sizeof(test_data), &written);
-    todo_wine ok(hr == S_OK, "IMFByteStream_Write failed: 0x%08x.\n", hr);
-    todo_wine ok(written == sizeof(test_data), "got wrong written length: %d.\n", written);
+    ok(hr == S_OK, "IMFByteStream_Write failed: 0x%08x.\n", hr);
+    ok(written == sizeof(test_data), "got wrong written length: %d.\n", written);
     CHECK_BS_LEN(bytestream, sizeof(asf_header) + 2);
     todo_wine CHECK_BS_POS(bytestream, sizeof(test_data));
     IMFByteStream_Release(bytestream);
@@ -866,8 +866,8 @@ static void test_bytestream_from_file(void)
     todo_wine CHECK_BS_POS(bytestream, 0);
     read = 0xdeadbeef;
     hr = IMFByteStream_Read(bytestream, buffer, sizeof(buffer), &read);
-    todo_wine ok(hr == S_OK, "IMFByteStream_Read failed: 0x%08x.\n", hr);
-    todo_wine ok(read == 0 || broken(read == 1000) /* xp */, "got wrong read length: %d.\n", read);
+    ok(hr == S_OK, "IMFByteStream_Read failed: 0x%08x.\n", hr);
+    ok(read == 0 || broken(read == 1000) /* xp */, "got wrong read length: %d.\n", read);
     memset(buffer, 0, sizeof(buffer));
     IMFByteStream_Release(bytestream);
 
@@ -909,8 +909,8 @@ static void test_bytestream_from_stream(void)
     CHECK_BS_LEN(bytestream, sizeof(asf_header));
     hr = IMFByteStream_Read(bytestream, buffer, sizeof(buffer), &read);
     todo_wine ok(hr == S_FALSE, "IMFByteStream_Read returned: 0x%08x.\n", hr);
-    todo_wine ok(read == sizeof(asf_header), "got wrong read length: %d.\n", read);
-    todo_wine ok(!memcmp(buffer, asf_header, sizeof(asf_header)), "got wrong content.\n");
+    ok(read == sizeof(asf_header), "got wrong read length: %d.\n", read);
+    ok(!memcmp(buffer, asf_header, sizeof(asf_header)), "got wrong content.\n");
     todo_wine CHECK_BS_POS(bytestream, sizeof(asf_header));
     memset(buffer, 0, sizeof(buffer));
     todo_wine CHECK_BS_POS(bytestream, sizeof(asf_header));
@@ -933,8 +933,8 @@ static void test_bytestream_from_stream(void)
     todo_wine CHECK_BS_POS(bytestream, 0);
     written = 0xdeadbeef;
     hr = IMFByteStream_Write(bytestream, asf_header, sizeof(asf_header), &written);
-    todo_wine ok(hr == S_OK, "IMFByteStream_Write failed: 0x%08x.\n", hr);
-    todo_wine ok(written == sizeof(asf_header), "got wrong written length: %d.\n", written);
+    ok(hr == S_OK, "IMFByteStream_Write failed: 0x%08x.\n", hr);
+    ok(written == sizeof(asf_header), "got wrong written length: %d.\n", written);
     CHECK_BS_LEN(bytestream, sizeof(asf_header));
     todo_wine CHECK_BS_POS(bytestream, sizeof(asf_header));
 
-- 
2.20.1




More information about the wine-devel mailing list