mfplat: Keep file handle open for file stream.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
b2d3567c1b
commit
b74b59915d
|
@ -1971,6 +1971,7 @@ typedef struct bytestream
|
||||||
IMFAsyncCallback read_callback;
|
IMFAsyncCallback read_callback;
|
||||||
IMFAsyncCallback write_callback;
|
IMFAsyncCallback write_callback;
|
||||||
IStream *stream;
|
IStream *stream;
|
||||||
|
HANDLE hfile;
|
||||||
QWORD position;
|
QWORD position;
|
||||||
DWORD capabilities;
|
DWORD capabilities;
|
||||||
struct list pending;
|
struct list pending;
|
||||||
|
@ -2235,6 +2236,8 @@ static ULONG WINAPI bytestream_Release(IMFByteStream *iface)
|
||||||
DeleteCriticalSection(&stream->cs);
|
DeleteCriticalSection(&stream->cs);
|
||||||
if (stream->stream)
|
if (stream->stream)
|
||||||
IStream_Release(stream->stream);
|
IStream_Release(stream->stream);
|
||||||
|
if (stream->hfile)
|
||||||
|
CloseHandle(stream->hfile);
|
||||||
heap_free(stream);
|
heap_free(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2820,7 +2823,7 @@ static const IMFGetServiceVtbl bytestream_file_getservice_vtbl =
|
||||||
HRESULT WINAPI MFCreateFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE openmode, MF_FILE_FLAGS flags,
|
HRESULT WINAPI MFCreateFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE openmode, MF_FILE_FLAGS flags,
|
||||||
LPCWSTR url, IMFByteStream **bytestream)
|
LPCWSTR url, IMFByteStream **bytestream)
|
||||||
{
|
{
|
||||||
mfbytestream *object;
|
struct bytestream *object;
|
||||||
DWORD fileaccessmode = 0;
|
DWORD fileaccessmode = 0;
|
||||||
DWORD filesharemode = FILE_SHARE_READ;
|
DWORD filesharemode = FILE_SHARE_READ;
|
||||||
DWORD filecreation_disposition = 0;
|
DWORD filecreation_disposition = 0;
|
||||||
|
@ -2894,6 +2897,7 @@ HRESULT WINAPI MFCreateFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE open
|
||||||
object->write_callback.lpVtbl = &bytestream_file_write_callback_vtbl;
|
object->write_callback.lpVtbl = &bytestream_file_write_callback_vtbl;
|
||||||
InitializeCriticalSection(&object->cs);
|
InitializeCriticalSection(&object->cs);
|
||||||
list_init(&object->pending);
|
list_init(&object->pending);
|
||||||
|
object->hfile = file;
|
||||||
|
|
||||||
if (GetFileTime(file, NULL, NULL, &writetime))
|
if (GetFileTime(file, NULL, NULL, &writetime))
|
||||||
{
|
{
|
||||||
|
@ -2905,8 +2909,6 @@ HRESULT WINAPI MFCreateFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE open
|
||||||
|
|
||||||
*bytestream = &object->IMFByteStream_iface;
|
*bytestream = &object->IMFByteStream_iface;
|
||||||
|
|
||||||
CloseHandle(file);
|
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1187,15 +1187,11 @@ todo_wine
|
||||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
IMFByteStream_Release(bytestream2);
|
IMFByteStream_Release(bytestream2);
|
||||||
|
|
||||||
hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST,
|
hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, filename, &bytestream2);
|
||||||
MF_FILEFLAGS_NONE, filename, &bytestream2);
|
ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#x.\n", hr);
|
||||||
todo_wine 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,
|
hr = MFCreateFile(MF_ACCESSMODE_READWRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, filename, &bytestream2);
|
||||||
MF_FILEFLAGS_NONE, filename, &bytestream2);
|
ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#x.\n", hr);
|
||||||
todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "got 0x%08x\n", hr);
|
|
||||||
if (hr == S_OK) IMFByteStream_Release(bytestream2);
|
|
||||||
|
|
||||||
IMFByteStream_Release(bytestream);
|
IMFByteStream_Release(bytestream);
|
||||||
|
|
||||||
|
@ -1211,20 +1207,15 @@ todo_wine
|
||||||
MF_FILEFLAGS_NONE, newfilename, &bytestream);
|
MF_FILEFLAGS_NONE, newfilename, &bytestream);
|
||||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST,
|
hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, newfilename, &bytestream2);
|
||||||
MF_FILEFLAGS_NONE, newfilename, &bytestream2);
|
ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#x.\n", hr);
|
||||||
todo_wine 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,
|
hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, newfilename, &bytestream2);
|
||||||
MF_FILEFLAGS_NONE, newfilename, &bytestream2);
|
ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#x.\n", hr);
|
||||||
todo_wine 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,
|
hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_ALLOW_WRITE_SHARING,
|
||||||
MF_FILEFLAGS_ALLOW_WRITE_SHARING, newfilename, &bytestream2);
|
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), "Unexpected hr %#x.\n", hr);
|
||||||
if (hr == S_OK) IMFByteStream_Release(bytestream2);
|
|
||||||
|
|
||||||
IMFByteStream_Release(bytestream);
|
IMFByteStream_Release(bytestream);
|
||||||
|
|
||||||
|
@ -1233,14 +1224,14 @@ todo_wine
|
||||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
/* Opening the file again fails even though MF_FILEFLAGS_ALLOW_WRITE_SHARING is set. */
|
/* 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,
|
hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_ALLOW_WRITE_SHARING,
|
||||||
MF_FILEFLAGS_ALLOW_WRITE_SHARING, newfilename, &bytestream2);
|
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), "Unexpected hr %#x.\n", hr);
|
||||||
if (hr == S_OK) IMFByteStream_Release(bytestream2);
|
|
||||||
|
|
||||||
IMFByteStream_Release(bytestream);
|
IMFByteStream_Release(bytestream);
|
||||||
|
|
||||||
MFShutdown();
|
hr = MFShutdown();
|
||||||
|
ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
|
||||||
|
|
||||||
DeleteFileW(filename);
|
DeleteFileW(filename);
|
||||||
DeleteFileW(newfilename);
|
DeleteFileW(newfilename);
|
||||||
|
|
Loading…
Reference in New Issue