[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