[PATCH 5/7] quartz: Use file APIs directly in get_media_type().
Zebediah Figura
zfigura at codeweavers.com
Mon Aug 5 18:56:05 CDT 2019
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/quartz/filesource.c | 28 +++++++++++-----
dlls/quartz/filtergraph.c | 65 +++---------------------------------
dlls/quartz/quartz_private.h | 2 +-
3 files changed, 24 insertions(+), 71 deletions(-)
diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c
index c87f181679f..47116a4d53a 100644
--- a/dlls/quartz/filesource.c
+++ b/dlls/quartz/filesource.c
@@ -129,10 +129,10 @@ static unsigned char byte_from_hex_char(WCHAR wHex)
}
}
-static BOOL process_pattern_string(const WCHAR *pattern, IAsyncReader *reader)
+static BOOL process_pattern_string(const WCHAR *pattern, HANDLE file)
{
+ ULONG size, offset, i, ret_size;
BYTE *mask, *expect, *actual;
- ULONG size, offset, i;
BOOL ret = TRUE;
/* format: "offset, size, mask, value" */
@@ -181,7 +181,8 @@ static BOOL process_pattern_string(const WCHAR *pattern, IAsyncReader *reader)
}
actual = heap_alloc(size);
- if (FAILED(IAsyncReader_SyncRead(reader, offset, size, actual)))
+ SetFilePointer(file, offset, NULL, FILE_BEGIN);
+ if (!ReadFile(file, actual, size, &ret_size, NULL) || ret_size != size)
{
heap_free(actual);
heap_free(expect);
@@ -204,13 +205,12 @@ static BOOL process_pattern_string(const WCHAR *pattern, IAsyncReader *reader)
/* If there is a following tuple, then we must match that as well. */
if (ret && (pattern = wcschr(pattern, ',')))
- return process_pattern_string(pattern + 1, reader);
+ return process_pattern_string(pattern + 1, file);
return TRUE;
}
-BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype,
- GUID *subtype, GUID *source_clsid)
+BOOL get_media_type(const WCHAR *filename, GUID *majortype, GUID *subtype, GUID *source_clsid)
{
WCHAR extensions_path[278] = {'M','e','d','i','a',' ','T','y','p','e','\\','E','x','t','e','n','s','i','o','n','s','\\',0};
static const WCHAR wszExtensions[] = {'E','x','t','e','n','s','i','o','n','s',0};
@@ -218,6 +218,7 @@ BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype
DWORD majortype_idx, size;
const WCHAR *ext;
HKEY parent_key;
+ HANDLE file;
if ((ext = wcsrchr(filename, '.')))
{
@@ -244,11 +245,18 @@ BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype
}
}
- if (!reader)
+ if ((file = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
+ OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
+ {
+ WARN("Failed to open file %s, error %u.\n", debugstr_w(filename), GetLastError());
return FALSE;
+ }
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, wszMediaType, 0, KEY_READ, &parent_key))
+ {
+ CloseHandle(file);
return FALSE;
+ }
for (majortype_idx = 0; ; ++majortype_idx)
{
@@ -298,7 +306,7 @@ BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype
if (!wcscmp(value_name, source_filter_name))
continue;
- if (!process_pattern_string(pattern, reader))
+ if (!process_pattern_string(pattern, file))
continue;
if (majortype)
@@ -314,6 +322,7 @@ BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype
RegCloseKey(subtype_key);
RegCloseKey(majortype_key);
RegCloseKey(parent_key);
+ CloseHandle(file);
return TRUE;
}
@@ -325,6 +334,7 @@ BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype
}
RegCloseKey(parent_key);
+ CloseHandle(file);
return FALSE;
}
@@ -503,7 +513,7 @@ static HRESULT WINAPI FileSource_Load(IFileSourceFilter * iface, LPCOLESTR pszFi
if (!pmt)
{
CopyMediaType(This->pmt, &default_mt);
- if (get_media_type(&This->IAsyncReader_iface, pszFileName, &This->pmt->majortype, &This->pmt->subtype, NULL))
+ if (get_media_type(pszFileName, &This->pmt->majortype, &This->pmt->subtype, NULL))
{
TRACE("Found major type %s, subtype %s.\n",
debugstr_guid(&This->pmt->majortype), debugstr_guid(&This->pmt->subtype));
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index 681ebad5010..7fd3d833ec8 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -1683,69 +1683,12 @@ static HRESULT CreateFilterInstanceAndLoadFile(GUID* clsid, LPCOLESTR pszFileNam
}
/* Some filters implement their own asynchronous reader (Theoretically they all should, try to load it first */
-static HRESULT GetFileSourceFilter(LPCOLESTR pszFileName, IBaseFilter **filter)
+static HRESULT GetFileSourceFilter(const WCHAR *filename, IBaseFilter **filter)
{
- HRESULT hr;
GUID clsid;
- IAsyncReader * pReader = NULL;
- IFileSourceFilter* pSource = NULL;
- IPin * pOutputPin = NULL;
- static const WCHAR wszOutputPinName[] = { 'O','u','t','p','u','t',0 };
- BOOL ret;
-
- /* Try to find a match without reading the file first */
- if (get_media_type(NULL, pszFileName, NULL, NULL, &clsid))
- return CreateFilterInstanceAndLoadFile(&clsid, pszFileName, filter);
-
- /* Now create a AyncReader instance, to check for signature bytes in the file */
- hr = CoCreateInstance(&CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (LPVOID*)filter);
- if (FAILED(hr))
- return hr;
-
- hr = IBaseFilter_QueryInterface(*filter, &IID_IFileSourceFilter, (LPVOID *)&pSource);
- if (FAILED(hr))
- {
- IBaseFilter_Release(*filter);
- return hr;
- }
-
- hr = IFileSourceFilter_Load(pSource, pszFileName, NULL);
- IFileSourceFilter_Release(pSource);
- if (FAILED(hr))
- {
- IBaseFilter_Release(*filter);
- return hr;
- }
-
- hr = IBaseFilter_FindPin(*filter, wszOutputPinName, &pOutputPin);
- if (FAILED(hr))
- {
- IBaseFilter_Release(*filter);
- return hr;
- }
-
- hr = IPin_QueryInterface(pOutputPin, &IID_IAsyncReader, (LPVOID *)&pReader);
- IPin_Release(pOutputPin);
- if (FAILED(hr))
- {
- IBaseFilter_Release(*filter);
- return hr;
- }
-
- /* Try again find a match */
- ret = get_media_type(pReader, pszFileName, NULL, NULL, &clsid);
- IAsyncReader_Release(pReader);
-
- if (ret)
- {
- TRACE("Found source filter %s.\n", debugstr_guid(&clsid));
- /* Release the AsyncReader filter and create the matching one */
- IBaseFilter_Release(*filter);
- return CreateFilterInstanceAndLoadFile(&clsid, pszFileName, filter);
- }
-
- /* Return the AsyncReader filter */
- return S_OK;
+ if (!get_media_type(filename, NULL, NULL, &clsid))
+ clsid = CLSID_AsyncReader;
+ return CreateFilterInstanceAndLoadFile(&clsid, filename, filter);
}
static HRESULT WINAPI FilterGraph2_AddSourceFilter(IFilterGraph2 *iface, LPCWSTR lpcwstrFileName,
diff --git a/dlls/quartz/quartz_private.h b/dlls/quartz/quartz_private.h
index 92af2312e67..874b29f2b12 100644
--- a/dlls/quartz/quartz_private.h
+++ b/dlls/quartz/quartz_private.h
@@ -77,6 +77,6 @@ extern void video_unregister_windowclass(void) DECLSPEC_HIDDEN;
BOOL CompareMediaTypes(const AM_MEDIA_TYPE * pmt1, const AM_MEDIA_TYPE * pmt2, BOOL bWildcards);
void dump_AM_MEDIA_TYPE(const AM_MEDIA_TYPE * pmt) DECLSPEC_HIDDEN;
-BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype, GUID *subtype, GUID *source_clsid) DECLSPEC_HIDDEN;
+BOOL get_media_type(const WCHAR *filename, GUID *majortype, GUID *subtype, GUID *source_clsid) DECLSPEC_HIDDEN;
#endif /* __QUARTZ_PRIVATE_INCLUDED__ */
--
2.20.1
More information about the wine-devel
mailing list