[PATCH 5/6] mfplat: Implement Read() for file-based stream.

Nikolay Sivov nsivov at codeweavers.com
Mon May 6 05:52:17 CDT 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mfplat/main.c | 39 +++++++++++++++++++++++++++------------
 1 file changed, 27 insertions(+), 12 deletions(-)

diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index 8efe6802b6..0e21497d4d 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -2660,13 +2660,30 @@ static HRESULT WINAPI mfbytestream_IsEndOfStream(IMFByteStream *iface, BOOL *end
     return S_OK;
 }
 
-static HRESULT WINAPI mfbytestream_Read(IMFByteStream *iface, BYTE *data, ULONG count, ULONG *byte_read)
+static HRESULT WINAPI bytestream_file_Read(IMFByteStream *iface, BYTE *buffer, ULONG size, ULONG *read_len)
 {
-    mfbytestream *This = impl_from_IMFByteStream(iface);
+    struct bytestream *stream = impl_from_IMFByteStream(iface);
+    LARGE_INTEGER position;
+    HRESULT hr = S_OK;
+    BOOL ret;
+
+    TRACE("%p, %p, %u, %p.\n", iface, buffer, size, read_len);
 
-    FIXME("%p, %p, %u, %p\n", This, data, count, byte_read);
+    EnterCriticalSection(&stream->cs);
 
-    return E_NOTIMPL;
+    position.QuadPart = stream->position;
+    if ((ret = SetFilePointerEx(stream->hfile, position, NULL, FILE_BEGIN)))
+    {
+        if ((ret = ReadFile(stream->hfile, buffer, size, read_len, NULL)))
+            stream->position += *read_len;
+    }
+
+    if (!ret)
+        hr = HRESULT_FROM_WIN32(GetLastError());
+
+    LeaveCriticalSection(&stream->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI bytestream_BeginRead(IMFByteStream *iface, BYTE *data, ULONG size, IMFAsyncCallback *callback,
@@ -2744,7 +2761,7 @@ static HRESULT WINAPI mfbytestream_Close(IMFByteStream *iface)
     return E_NOTIMPL;
 }
 
-static const IMFByteStreamVtbl mfbytestream_vtbl =
+static const IMFByteStreamVtbl bytestream_file_vtbl =
 {
     bytestream_QueryInterface,
     bytestream_AddRef,
@@ -2755,7 +2772,7 @@ static const IMFByteStreamVtbl mfbytestream_vtbl =
     mfbytestream_GetCurrentPosition,
     mfbytestream_SetCurrentPosition,
     mfbytestream_IsEndOfStream,
-    mfbytestream_Read,
+    bytestream_file_Read,
     bytestream_BeginRead,
     bytestream_EndRead,
     mfbytestream_Write,
@@ -3209,16 +3226,14 @@ HRESULT WINAPI MFCreateFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE open
                             LPCWSTR url, IMFByteStream **bytestream)
 {
     DWORD capabilities = MFBYTESTREAM_IS_SEEKABLE | MFBYTESTREAM_DOES_NOT_USE_NETWORK;
-    struct bytestream *object;
-    DWORD fileaccessmode = 0;
+    DWORD filecreation_disposition = 0, fileaccessmode = 0, fileattributes = 0;
     DWORD filesharemode = FILE_SHARE_READ;
-    DWORD filecreation_disposition = 0;
-    DWORD fileattributes = 0;
+    struct bytestream *object;
     FILETIME writetime;
     HANDLE file;
     HRESULT hr;
 
-    FIXME("(%d, %d, %d, %s, %p): stub\n", accessmode, openmode, flags, debugstr_w(url), bytestream);
+    TRACE("%d, %d, %#x, %s, %p.\n", accessmode, openmode, flags, debugstr_w(url), bytestream);
 
     switch (accessmode)
     {
@@ -3279,7 +3294,7 @@ HRESULT WINAPI MFCreateFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE open
         heap_free(object);
         return hr;
     }
-    object->IMFByteStream_iface.lpVtbl = &mfbytestream_vtbl;
+    object->IMFByteStream_iface.lpVtbl = &bytestream_file_vtbl;
     object->attributes.IMFAttributes_iface.lpVtbl = &mfbytestream_attributes_vtbl;
     object->IMFGetService_iface.lpVtbl = &bytestream_file_getservice_vtbl;
     object->read_callback.lpVtbl = &bytestream_file_read_callback_vtbl;
-- 
2.20.1




More information about the wine-devel mailing list