Signed-off-by: Jactry Zeng jzeng@codeweavers.com --- dlls/mfplat/main.c | 21 ++++++++----- dlls/mfplat/tests/mfplat.c | 60 +++++++++++++++++++++++++++++++++----- 2 files changed, 66 insertions(+), 15 deletions(-)
diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c index 9497e304cd..a4fd7329e8 100644 --- a/dlls/mfplat/main.c +++ b/dlls/mfplat/main.c @@ -850,7 +850,11 @@ typedef struct _mfbytestream mfattributes attributes; IMFByteStream IMFByteStream_iface;
- IStream *stream; + union + { + IStream *stream; + HANDLE file; + } u; } mfbytestream;
static inline mfbytestream *impl_from_IMFByteStream(IMFByteStream *iface) @@ -903,6 +907,7 @@ static ULONG WINAPI mfbytestream_Release(IMFByteStream *iface)
if (!ref) { + CloseHandle(This->u.file); HeapFree(GetProcessHeap(), 0, This); }
@@ -1081,7 +1086,7 @@ static ULONG WINAPI stream_mfbytestream_Release(IMFByteStream *iface)
if(!ref) { - IStream_Release(This->stream); + IStream_Release(This->u.stream); heap_free(This); }
@@ -1323,7 +1328,7 @@ HRESULT WINAPI MFCreateMFByteStreamOnStream(IStream *stream, IMFByteStream **byt init_attribute_object(&object->attributes, 0); object->IMFByteStream_iface.lpVtbl = &stream_mfbytestream_vtbl; object->attributes.IMFAttributes_iface.lpVtbl = &mfbytestream_attributes_vtbl; - hr = IStream_QueryInterface(stream, &IID_IStream, (void **)&object->stream); + hr = IStream_QueryInterface(stream, &IID_IStream, (void **)&object->u.stream); if(FAILED(hr)) { heap_free(object); @@ -1345,7 +1350,7 @@ HRESULT WINAPI MFCreateFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE open DWORD fileattributes = 0; HANDLE file;
- FIXME("(%d, %d, %d, %s, %p): stub\n", accessmode, openmode, flags, debugstr_w(url), bytestream); + TRACE("(%d, %d, %d, %s, %p): stub\n", accessmode, openmode, flags, debugstr_w(url), bytestream);
switch (accessmode) { @@ -1383,23 +1388,23 @@ HRESULT WINAPI MFCreateFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE open if (flags & MF_FILEFLAGS_NOBUFFERING) fileattributes |= FILE_FLAG_NO_BUFFERING;
- /* Open HANDLE to file */ file = CreateFileW(url, fileaccessmode, filesharemode, NULL, filecreation_disposition, fileattributes, 0);
if(file == INVALID_HANDLE_VALUE) return HRESULT_FROM_WIN32(GetLastError());
- /* Close the file again, since we don't do anything with it yet */ - CloseHandle(file); - object = heap_alloc( sizeof(*object) ); if(!object) + { + CloseHandle(file); return E_OUTOFMEMORY; + }
init_attribute_object(&object->attributes, 0); object->IMFByteStream_iface.lpVtbl = &mfbytestream_vtbl; object->attributes.IMFAttributes_iface.lpVtbl = &mfbytestream_attributes_vtbl; + object->u.file = file;
*bytestream = &object->IMFByteStream_iface;
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 0ccc680aca..488dbfbce6 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -63,6 +63,28 @@ static void _check_ref(IUnknown* obj, ULONG ref, int line) ok_(__FILE__,line)(rc == ref, "expected refcount %d, got %d\n", ref, rc); }
+#define CHECK_BS_POS(obj,pos) _check_bs_pos(obj, pos, __LINE__) +static void _check_bs_pos(IMFByteStream* obj, QWORD pos, int line) +{ + QWORD position = 0xdeadbeef; + HRESULT hr; + hr = IMFByteStream_GetCurrentPosition(obj, &position); + ok_(__FILE__,line)(hr == S_OK, "IMFByteStream_GetCurrentPosition failed: 0x%08x.\n", hr); + ok_(__FILE__,line)(position == pos, "got wrong position: %s.\n", + wine_dbgstr_longlong(position)); +} + +#define CHECK_BS_LEN(obj,len) _check_bs_len(obj, len, __LINE__) +static void _check_bs_len(IMFByteStream* obj, QWORD len, int line) +{ + QWORD length = 0xdeadbeef; + HRESULT hr; + hr = IMFByteStream_GetLength(obj, &length); + ok_(__FILE__,line)(hr == S_OK, "IMFByteStream_GetLength failed: 0x%08x.\n", hr); + ok_(__FILE__,line)(length == len, "got wrong length: %s.\n", + wine_dbgstr_longlong(length)); +} + static WCHAR *load_resource(const WCHAR *name) { static WCHAR pathW[MAX_PATH]; @@ -520,7 +542,8 @@ static void test_MFCreateFile(void) IMFAttributes *attributes = NULL; HRESULT hr; WCHAR *filename; - + LONG file_size; + HANDLE handle; static const WCHAR newfilename[] = {'n','e','w','.','m','p','4',0};
filename = load_resource(mp4file); @@ -545,12 +568,12 @@ static void test_MFCreateFile(void)
hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, filename, &bytestream2); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "got 0x%08x\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "got 0x%08x\n", hr); if (hr == S_OK) IMFByteStream_Release(bytestream2);
hr = MFCreateFile(MF_ACCESSMODE_READWRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, filename, &bytestream2); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "got 0x%08x\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "got 0x%08x\n", hr); if (hr == S_OK) IMFByteStream_Release(bytestream2);
IMFByteStream_Release(bytestream); @@ -569,17 +592,17 @@ static void test_MFCreateFile(void)
hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, newfilename, &bytestream2); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "got 0x%08x\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "got 0x%08x\n", hr); if (hr == S_OK) IMFByteStream_Release(bytestream2);
hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, newfilename, &bytestream2); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "got 0x%08x\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "got 0x%08x\n", hr); if (hr == S_OK) IMFByteStream_Release(bytestream2);
hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_ALLOW_WRITE_SHARING, newfilename, &bytestream2); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "got 0x%08x\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "got 0x%08x\n", hr); if (hr == S_OK) IMFByteStream_Release(bytestream2);
IMFByteStream_Release(bytestream); @@ -591,11 +614,34 @@ static void test_MFCreateFile(void) /* Opening the file again fails even though MF_FILEFLAGS_ALLOW_WRITE_SHARING is set. */ hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_ALLOW_WRITE_SHARING, newfilename, &bytestream2); - todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "got 0x%08x\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "got 0x%08x\n", hr); if (hr == S_OK) IMFByteStream_Release(bytestream2);
IMFByteStream_Release(bytestream);
+ /* test MF_OPENMODE_APPEND_IF_EXIST */ + handle = CreateFileW(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0); + file_size = GetFileSize(handle, NULL); + CloseHandle(handle); + hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_APPEND_IF_EXIST, + MF_FILEFLAGS_ALLOW_WRITE_SHARING, filename, &bytestream); + ok(hr == S_OK, "MFCreateFile failed: 0x%08x.\n", hr); + todo_wine CHECK_BS_LEN(bytestream, file_size); + todo_wine CHECK_BS_POS(bytestream, 0); + IMFByteStream_Release(bytestream); + + /* test MF_OPENMODE_RESET_IF_EXIST */ + hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_RESET_IF_EXIST, + MF_FILEFLAGS_ALLOW_WRITE_SHARING, filename, &bytestream); + ok(hr == S_OK, "MFCreateFile failed: 0x%08x.\n", hr); + todo_wine CHECK_BS_LEN(bytestream, 0); + todo_wine CHECK_BS_POS(bytestream, 0); + IMFByteStream_Release(bytestream); + handle = CreateFileW(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0); + file_size = GetFileSize(handle, NULL); + ok(file_size == 0, "got wrong file size: %d.\n", file_size); + CloseHandle(handle); + MFShutdown();
DeleteFileW(filename);