Module: wine Branch: master Commit: 25f9d3c17366b6454dba49b2897304c2248137fe URL: http://source.winehq.org/git/wine.git/?a=commit;h=25f9d3c17366b6454dba49b289...
Author: Maarten Lankhorst m.b.lankhorst@gmail.com Date: Thu Mar 13 20:28:09 2008 -0700
quartz: Implement detection on file extension in filesource.
---
dlls/quartz/Makefile.in | 2 +- dlls/quartz/filesource.c | 46 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 4 deletions(-)
diff --git a/dlls/quartz/Makefile.in b/dlls/quartz/Makefile.in index 207ea1e..ca47a41 100644 --- a/dlls/quartz/Makefile.in +++ b/dlls/quartz/Makefile.in @@ -4,7 +4,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = quartz.dll IMPORTLIB = quartz -IMPORTS = dsound msacm32 msvfw32 ole32 oleaut32 user32 gdi32 advapi32 kernel32 +IMPORTS = dsound msacm32 msvfw32 ole32 oleaut32 shlwapi user32 gdi32 advapi32 kernel32 EXTRALIBS = -lstrmiids -luuid
C_SRCS = \ diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c index 1200802..f30a3ad 100644 --- a/dlls/quartz/filesource.c +++ b/dlls/quartz/filesource.c @@ -30,6 +30,7 @@ #include "vfwmsgs.h" #include "winbase.h" #include "winreg.h" +#include "shlwapi.h" #include <assert.h>
WINE_DEFAULT_DEBUG_CHANNEL(quartz); @@ -62,10 +63,47 @@ static inline AsyncReader *impl_from_IFileSourceFilter( IFileSourceFilter *iface return (AsyncReader *)((char*)iface - FIELD_OFFSET(AsyncReader, lpVtblFSF)); }
+static WCHAR const mediatype_name[11] = { + 'M', 'e', 'd', 'i', 'a', ' ', 'T', 'y', 'p', 'e', 0 }; +static WCHAR const subtype_name[8] = { + 'S', 'u', 'b', 't', 'y', 'p', 'e', 0 }; + static HRESULT process_extensions(HKEY hkeyExtensions, LPCOLESTR pszFileName, GUID * majorType, GUID * minorType) { - /* FIXME: implement */ - return E_NOTIMPL; + WCHAR *extension; + LONG l; + HKEY hsub; + WCHAR keying[39]; + DWORD size; + + if (!pszFileName) + return E_POINTER; + + /* Get the part of the name that matters */ + extension = PathFindExtensionW(pszFileName); + if (*extension != '.') + return E_FAIL; + + l = RegOpenKeyExW(hkeyExtensions, extension, 0, KEY_READ, &hsub); + if (l) + return E_FAIL; + + size = sizeof(keying); + l = RegQueryValueExW(hsub, mediatype_name, NULL, NULL, (LPBYTE)keying, &size); + if (!l) + CLSIDFromString(keying, majorType); + + size = sizeof(keying); + if (!l) + l = RegQueryValueExW(hsub, subtype_name, NULL, NULL, (LPBYTE)keying, &size); + if (!l) + CLSIDFromString(keying, minorType); + + RegCloseKey(hsub); + + if (!l) + return S_OK; + return E_FAIL; }
static unsigned char byte_from_hex_char(WCHAR wHex) @@ -197,6 +235,8 @@ static HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, BOOL bFound = FALSE; static const WCHAR wszMediaType[] = {'M','e','d','i','a',' ','T','y','p','e',0};
+ TRACE("(%p, %s, %p, %p)\n", pReader, debugstr_w(pszFileName), majorType, minorType); + CopyMemory(majorType, &GUID_NULL, sizeof(*majorType)); CopyMemory(minorType, &GUID_NULL, sizeof(*minorType));
@@ -213,7 +253,7 @@ static HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, WCHAR wszMajorKeyName[CHARS_IN_GUID]; DWORD dwKeyNameLength = sizeof(wszMajorKeyName) / sizeof(wszMajorKeyName[0]); static const WCHAR wszExtensions[] = {'E','x','t','e','n','s','i','o','n','s',0}; - + if (RegEnumKeyExW(hkeyMediaType, indexMajor, wszMajorKeyName, &dwKeyNameLength, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) break; if (RegOpenKeyExW(hkeyMediaType, wszMajorKeyName, 0, KEY_READ, &hkeyMajor) != ERROR_SUCCESS)