[PATCH v2 4/4] mfplat: Implement IMFByteStream::{Read,Write,GetCurrentPosition} for bytestream from file.
Jactry Zeng
jzeng at codeweavers.com
Wed Jan 30 08:46:16 CST 2019
Superseded patch 157467.
ChangeLog:
v2:
- Remove a redundant test.
Signed-off-by: Jactry Zeng <jzeng at codeweavers.com>
---
dlls/mfplat/main.c | 40 +++++++++++++++++++++++++++++++-----
dlls/mfplat/tests/mfplat.c | 42 +++++++++++++++++++-------------------
2 files changed, 56 insertions(+), 26 deletions(-)
diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index 80c1b3e3ba..a606592638 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -858,6 +858,7 @@ typedef struct _mfbytestream
HANDLE handle;
LARGE_INTEGER length;
QWORD position;
+ DWORD mode;
} file;
} u;
} mfbytestream;
@@ -964,7 +965,9 @@ static HRESULT WINAPI mfbytestream_GetCurrentPosition(IMFByteStream *iface, QWOR
FIXME("%p, %p\n", This, position);
- return E_NOTIMPL;
+ *position = This->u.file.position;
+
+ return S_OK;
}
static HRESULT WINAPI mfbytestream_SetCurrentPosition(IMFByteStream *iface, QWORD position)
@@ -991,10 +994,21 @@ 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);
+ DWORD read = 0;
- 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;
+ if(This->u.file.mode == MF_ACCESSMODE_WRITE)
+ return E_ACCESSDENIED;
+
+ if(!ReadFile(This->u.file.handle, data, count, &read, NULL))
+ return S_FALSE;
+
+ This->u.file.position += read;
+ if(byte_read)
+ *byte_read = read;
+
+ return S_OK;
}
static HRESULT WINAPI mfbytestream_BeginRead(IMFByteStream *iface, BYTE *data, ULONG count,
@@ -1019,10 +1033,25 @@ 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);
+ DWORD written_len = 0;
- FIXME("%p, %p, %u, %p\n", This, data, count, written);
+ TRACE("%p, %p, %u, %p\n", This, data, count, written);
- return E_NOTIMPL;
+ if(This->u.file.mode == MF_ACCESSMODE_READ)
+ return E_ACCESSDENIED;
+
+ if(!WriteFile(This->u.file.handle, data, count, &written_len, NULL))
+ return E_FAIL;
+
+ if(!GetFileSizeEx(This->u.file.handle, &This->u.file.length))
+ return E_FAIL;
+
+ This->u.file.position = SetFilePointer(This->u.file.handle, 0, NULL, FILE_CURRENT);
+
+ if(written)
+ *written = written_len;
+
+ return S_OK;
}
static HRESULT WINAPI mfbytestream_BeginWrite(IMFByteStream *iface, const BYTE *data, ULONG count,
@@ -1429,6 +1458,7 @@ HRESULT WINAPI MFCreateFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE open
return E_FAIL;
}
object->u.file.position = 0;
+ object->u.file.mode = accessmode;
*bytestream = &object->IMFByteStream_iface;
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 00bea72bc5..a066bc109c 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -624,7 +624,7 @@ static void test_MFCreateFile(void)
MF_FILEFLAGS_ALLOW_WRITE_SHARING, filename, &bytestream);
ok(hr == S_OK, "MFCreateFile failed: 0x%08x.\n", hr);
CHECK_BS_LEN(bytestream, file_size);
- todo_wine CHECK_BS_POS(bytestream, 0);
+ CHECK_BS_POS(bytestream, 0);
IMFByteStream_Release(bytestream);
/* test MF_OPENMODE_RESET_IF_EXIST */
@@ -632,7 +632,7 @@ static void test_MFCreateFile(void)
MF_FILEFLAGS_ALLOW_WRITE_SHARING, filename, &bytestream);
ok(hr == S_OK, "MFCreateFile failed: 0x%08x.\n", hr);
CHECK_BS_LEN(bytestream, 0);
- todo_wine CHECK_BS_POS(bytestream, 0);
+ CHECK_BS_POS(bytestream, 0);
IMFByteStream_Release(bytestream);
handle = CreateFileW(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
file_size = GetFileSize(handle, NULL);
@@ -770,17 +770,17 @@ static void test_bytestream_from_file(void)
hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST,
MF_FILEFLAGS_NONE, asffile, &bytestream);
ok(hr == S_OK, "MFCreateFile failed: 0x%08x.\n", hr);
- todo_wine CHECK_BS_POS(bytestream, 0);
+ CHECK_BS_POS(bytestream, 0);
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");
- todo_wine CHECK_BS_POS(bytestream, sizeof(asf_header));
+ 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");
+ 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_Flush(bytestream);
todo_wine ok(hr == E_ACCESSDENIED, "IMFByteStream_Flush should fail: 0x%08x.\n", hr);
hr = IMFByteStream_SetLength(bytestream, 200);
@@ -791,17 +791,17 @@ 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);
- todo_wine CHECK_BS_POS(bytestream, 0);
+ ok(hr == E_ACCESSDENIED, "IMFByteStream_Read should fail: 0x%08x.\n", hr);
+ 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));
+ CHECK_BS_POS(bytestream, sizeof(asf_header));
hr = IMFByteStream_Flush(bytestream);
todo_wine ok(hr == S_OK, "IMFByteStream_Flush failed: 0x%08x.\n", hr);
- todo_wine CHECK_BS_POS(bytestream, sizeof(asf_header));
+ CHECK_BS_POS(bytestream, sizeof(asf_header));
CHECK_BS_LEN(bytestream, sizeof(asf_header));
hr = IMFByteStream_SetLength(bytestream, sizeof(asf_header) + 2);
@@ -811,7 +811,7 @@ static void test_bytestream_from_file(void)
ok(hr == S_OK, "IMFByteStream_GetLength failed: 0x%08x.\n", hr);
ok(length == sizeof(asf_header) || length == (sizeof(asf_header) + 2) /* xp */,
"got wrong length: %s.\n", wine_dbgstr_longlong(length));
- todo_wine CHECK_BS_POS(bytestream, sizeof(asf_header));
+ CHECK_BS_POS(bytestream, sizeof(asf_header));
IMFByteStream_Release(bytestream);
file = CreateFileW(asffile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
ReadFile(file, buffer, sizeof(buffer), &read, NULL);
@@ -823,20 +823,20 @@ static void test_bytestream_from_file(void)
hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_APPEND_IF_EXIST,
MF_FILEFLAGS_NONE, asffile, &bytestream);
ok(hr == S_OK, "MFCreateFile failed: 0x%08x.\n", hr);
- todo_wine CHECK_BS_POS(bytestream, 0);
+ CHECK_BS_POS(bytestream, 0);
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));
+ CHECK_BS_POS(bytestream, sizeof(test_data));
IMFByteStream_Release(bytestream);
hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_RESET_IF_EXIST,
MF_FILEFLAGS_NONE, asffile, &bytestream);
ok(hr == S_OK, "MFCreateFile failed: 0x%08x.\n", hr);
- todo_wine CHECK_BS_POS(bytestream, 0);
+ CHECK_BS_POS(bytestream, 0);
CHECK_BS_LEN(bytestream, 0);
hr = IMFByteStream_SetLength(bytestream, 2000);
ok(hr == S_OK, "IMFByteStream_SetLength failed: 0x%08x.\n", hr);
@@ -844,7 +844,7 @@ static void test_bytestream_from_file(void)
hr = IMFByteStream_GetLength(bytestream, &length);
ok(hr == S_OK, "IMFByteStream_GetLength failed: 0x%08x.\n", hr);
ok(length == 0 || length == 2000 /* xp */, "got wrong length: %s.\n", wine_dbgstr_longlong(length));
- todo_wine CHECK_BS_POS(bytestream, 0);
+ CHECK_BS_POS(bytestream, 0);
IMFByteStream_Release(bytestream);
DeleteFileW(asffile);
--
2.20.1
More information about the wine-devel
mailing list