[PATCH v2 3/8] quartz: Always try to detect a file by extension first.
Zebediah Figura
zfigura at codeweavers.com
Tue Aug 6 10:44:39 CDT 2019
From: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/quartz/filesource.c | 88 +++++++++++++---------------------------
1 file changed, 29 insertions(+), 59 deletions(-)
diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c
index 25c523b8374..bc4b5f27c8d 100644
--- a/dlls/quartz/filesource.c
+++ b/dlls/quartz/filesource.c
@@ -102,58 +102,6 @@ static const WCHAR subtype_name[] = {
static const WCHAR source_filter_name[] = {
'S','o','u','r','c','e',' ','F','i','l','t','e','r',0};
-static HRESULT process_extensions(HKEY hkeyExtensions, LPCOLESTR pszFileName, GUID * majorType, GUID * minorType, GUID * sourceFilter)
-{
- WCHAR *extension;
- LONG l;
- HKEY hsub;
- WCHAR keying[39];
- DWORD size;
-
- if (!pszFileName)
- return E_POINTER;
-
- /* Get the part of the name that matters */
- if (!(extension = wcsrchr(pszFileName, '.')))
- return E_FAIL;
-
- l = RegOpenKeyExW(hkeyExtensions, extension, 0, KEY_READ, &hsub);
- if (l)
- return E_FAIL;
-
- if (majorType)
- {
- size = sizeof(keying);
- l = RegQueryValueExW(hsub, mediatype_name, NULL, NULL, (LPBYTE)keying, &size);
- if (!l)
- CLSIDFromString(keying, majorType);
- }
-
- if (minorType)
- {
- size = sizeof(keying);
- if (!l)
- l = RegQueryValueExW(hsub, subtype_name, NULL, NULL, (LPBYTE)keying, &size);
- if (!l)
- CLSIDFromString(keying, minorType);
- }
-
- if (sourceFilter)
- {
- size = sizeof(keying);
- if (!l)
- l = RegQueryValueExW(hsub, source_filter_name, NULL, NULL, (LPBYTE)keying, &size);
- if (!l)
- CLSIDFromString(keying, sourceFilter);
- }
-
- RegCloseKey(hsub);
-
- if (!l)
- return S_OK;
- return E_FAIL;
-}
-
static unsigned char byte_from_hex_char(WCHAR wHex)
{
switch (towlower(wHex))
@@ -278,6 +226,9 @@ HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, GUID *
HRESULT hr = S_OK;
BOOL bFound = FALSE;
static const WCHAR wszMediaType[] = {'M','e','d','i','a',' ','T','y','p','e',0};
+ WCHAR extensions_path[278] = {'M','e','d','i','a',' ','T','y','p','e','\\','E','x','t','e','n','s','i','o','n','s','\\',0};
+ const WCHAR *ext;
+ DWORD size;
if(majorType)
*majorType = GUID_NULL;
@@ -286,6 +237,31 @@ HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, GUID *
if(sourceFilter)
*sourceFilter = GUID_NULL;
+ if ((ext = wcsrchr(pszFileName, '.')))
+ {
+ WCHAR guidstr[39];
+ HKEY key;
+
+ wcscat(extensions_path, ext);
+ if (!RegOpenKeyExW(HKEY_CLASSES_ROOT, extensions_path, 0, KEY_READ, &key))
+ {
+ size = sizeof(guidstr);
+ if (majorType && !RegQueryValueExW(key, mediatype_name, NULL, NULL, (BYTE *)guidstr, &size))
+ CLSIDFromString(guidstr, majorType);
+
+ size = sizeof(guidstr);
+ if (minorType && !RegQueryValueExW(key, subtype_name, NULL, NULL, (BYTE *)guidstr, &size))
+ CLSIDFromString(guidstr, minorType);
+
+ size = sizeof(guidstr);
+ if (sourceFilter && !RegQueryValueExW(key, source_filter_name, NULL, NULL, (BYTE *)guidstr, &size))
+ CLSIDFromString(guidstr, sourceFilter);
+
+ RegCloseKey(key);
+ return S_OK;
+ }
+ }
+
lRet = RegOpenKeyExW(HKEY_CLASSES_ROOT, wszMediaType, 0, KEY_READ, &hkeyMediaType);
hr = HRESULT_FROM_WIN32(lRet);
@@ -304,13 +280,7 @@ HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, GUID *
break;
if (RegOpenKeyExW(hkeyMediaType, wszMajorKeyName, 0, KEY_READ, &hkeyMajor) != ERROR_SUCCESS)
break;
- if (!wcscmp(wszExtensions, wszMajorKeyName))
- {
- if (process_extensions(hkeyMajor, pszFileName, majorType, minorType, sourceFilter) == S_OK)
- bFound = TRUE;
- }
- /* We need a reader interface to check bytes */
- else if (pReader)
+ if (wcscmp(wszExtensions, wszMajorKeyName) && pReader)
{
DWORD indexMinor;
--
2.20.1
More information about the wine-devel
mailing list