From f857ad522555586c1f223bbf49d6f1214257b551 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Fri, 20 Jan 2012 22:29:35 +1100 Subject: [PATCH] mmcndmgr: Implement IMMCVersionInfo. --- configure | 1 + configure.ac | 1 + dlls/mmcndmgr/mmcndmgr.c | 123 ++++++++++++++++++++++++++++++-- dlls/mmcndmgr/tests/Makefile.in | 7 ++ dlls/mmcndmgr/tests/mmcndmgr.c | 66 +++++++++++++++++ 5 files changed, 193 insertions(+), 5 deletions(-) create mode 100644 dlls/mmcndmgr/tests/Makefile.in create mode 100644 dlls/mmcndmgr/tests/mmcndmgr.c diff --git a/configure b/configure index 5be9da3e967..77aea7889db 100755 --- a/configure +++ b/configure @@ -15296,6 +15296,7 @@ wine_fn_config_dll midimap enable_midimap wine_fn_config_dll mlang enable_mlang implib wine_fn_config_test dlls/mlang/tests mlang_test wine_fn_config_dll mmcndmgr enable_mmcndmgr +wine_fn_config_test dlls/mmcndmgr/tests mmcndmgr_test wine_fn_config_dll mmdevapi enable_mmdevapi wine_fn_config_test dlls/mmdevapi/tests mmdevapi_test wine_fn_config_dll mmdevldr.vxd enable_win16 diff --git a/configure.ac b/configure.ac index 52ef054e64b..50e55139ab9 100644 --- a/configure.ac +++ b/configure.ac @@ -2701,6 +2701,7 @@ WINE_CONFIG_DLL(midimap) WINE_CONFIG_DLL(mlang,,[implib]) WINE_CONFIG_TEST(dlls/mlang/tests) WINE_CONFIG_DLL(mmcndmgr) +WINE_CONFIG_TEST(dlls/mmcndmgr/tests) WINE_CONFIG_DLL(mmdevapi) WINE_CONFIG_TEST(dlls/mmdevapi/tests) WINE_CONFIG_DLL(mmdevldr.vxd,enable_win16) diff --git a/dlls/mmcndmgr/mmcndmgr.c b/dlls/mmcndmgr/mmcndmgr.c index 2a7e0d468c0..44492334303 100644 --- a/dlls/mmcndmgr/mmcndmgr.c +++ b/dlls/mmcndmgr/mmcndmgr.c @@ -30,21 +30,134 @@ #include "wine/debug.h" #include "wine/library.h" +#include "initguid.h" #include "mmc.h" WINE_DEFAULT_DEBUG_CHANNEL(mmc); static HINSTANCE MMC_hInstance; -HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +static HRESULT WINAPI mmcversion_QueryInterface(IMMCVersionInfo *iface, REFIID riid, void **ppv) { - FIXME("(%s, %s, %p): stub\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); - if(!ppv) - return E_INVALIDARG; + TRACE("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv); - return E_NOTIMPL; + if ( IsEqualGUID( riid, &IID_IMMCVersionInfo ) || + IsEqualGUID( riid, &IID_IUnknown ) ) + { + *ppv = iface; + } + else + { + TRACE("Unsupported interface %s\n", debugstr_guid(riid)); + *ppv = NULL; + return E_NOINTERFACE; + } + + IMMCVersionInfo_AddRef(iface); + return S_OK; } +static ULONG WINAPI mmcversion_AddRef(IMMCVersionInfo *iface) +{ + return 2; +} + +static ULONG WINAPI mmcversion_Release(IMMCVersionInfo *iface) +{ + return 1; +} + +static HRESULT WINAPI mmcversion_GetMMCVersion(IMMCVersionInfo *iface, LONG *pVersionMajor, LONG *pVersionMinor) +{ + TRACE("(%p, %p, %p): stub\n", iface, pVersionMajor, pVersionMinor); + + if(pVersionMajor) + *pVersionMajor = 3; + + if(pVersionMinor) + *pVersionMinor = 0; + + return S_OK; +} + +static const struct IMMCVersionInfoVtbl mmcversionVtbl = +{ + mmcversion_QueryInterface, + mmcversion_AddRef, + mmcversion_Release, + mmcversion_GetMMCVersion +}; + +static IMMCVersionInfo mmcVersionInfo = { &mmcversionVtbl }; + +/*********************************************************** + * ClassFactory implementation + */ +typedef HRESULT (*CreateInstanceFunc)(IUnknown*,REFIID,void**); + +static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFGUID riid, void **ppvObject) +{ + if(IsEqualGUID(&IID_IClassFactory, riid) || IsEqualGUID(&IID_IUnknown, riid)) { + IClassFactory_AddRef(iface); + *ppvObject = iface; + return S_OK; + } + + WARN("not supported iid %s\n", debugstr_guid(riid)); + *ppvObject = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) +{ + TRACE("(%p)\n", iface); + return 2; +} + +static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) +{ + TRACE("(%p)\n", iface); + + return 1; +} + +static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *outer, + REFIID riid, void **ppv) +{ + TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv); + return IMMCVersionInfo_QueryInterface(&mmcVersionInfo, riid, ppv); +} + +static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) +{ + TRACE("(%p)->(%x)\n", iface, fLock); + return S_OK; +} + +static const IClassFactoryVtbl MMCClassFactoryVtbl = { + ClassFactory_QueryInterface, + ClassFactory_AddRef, + ClassFactory_Release, + ClassFactory_CreateInstance, + ClassFactory_LockServer +}; + +static IClassFactory MMCVersionInfoFactory = { &MMCClassFactoryVtbl }; + +HRESULT WINAPI DllGetClassObject( REFCLSID riid, REFIID iid, LPVOID *ppv ) +{ + TRACE("%s %s %p\n", debugstr_guid(riid), debugstr_guid(iid), ppv ); + + if( IsEqualCLSID( riid, &CLSID_MMCVersionInfo )) + { + TRACE("(CLSID_MMCVersionInfo %s %p)\n", debugstr_guid(riid), ppv); + return IClassFactory_QueryInterface(&MMCVersionInfoFactory, iid, ppv); + } + + FIXME("Unsupported interface %s\n", debugstr_guid(riid)); + return CLASS_E_CLASSNOTAVAILABLE; + } + HRESULT WINAPI DllRegisterServer(void) { return __wine_register_resources( MMC_hInstance ); diff --git a/dlls/mmcndmgr/tests/Makefile.in b/dlls/mmcndmgr/tests/Makefile.in new file mode 100644 index 00000000000..1220069b650 --- /dev/null +++ b/dlls/mmcndmgr/tests/Makefile.in @@ -0,0 +1,7 @@ +TESTDLL = mmcndmgr.dll +IMPORTS = ole32 shlwapi uuid + +C_SRCS = \ + mmcndmgr.c + +@MAKE_TEST_RULES@ diff --git a/dlls/mmcndmgr/tests/mmcndmgr.c b/dlls/mmcndmgr/tests/mmcndmgr.c new file mode 100644 index 00000000000..07d905e762d --- /dev/null +++ b/dlls/mmcndmgr/tests/mmcndmgr.c @@ -0,0 +1,66 @@ +/* + * + * Copyright 2011 Alistair Leslie-Hughes + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define COBJMACROS +#include + +#include "windows.h" +#include "ole2.h" +#include "dispex.h" + +#include "wine/test.h" + +#include +#include + +static void test_get_version(void) +{ + IMMCVersionInfo * ver_info = NULL; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_MMCVersionInfo, NULL, CLSCTX_INPROC_SERVER, &IID_IMMCVersionInfo, (void**)&ver_info); + if (hr != S_OK) + { + trace("MMCVersionInfo interface not registered.\n"); + } + else + { + LONG lMajor, lMinor; + + hr = IMMCVersionInfo_GetMMCVersion(ver_info, &lMajor, &lMinor); + ok(hr == S_OK, "got 0x%08x, expected 0x%08x\n", hr, S_OK); + if (hr == S_OK) + trace("MMC Version is %d.%d\n", lMajor, lMinor); + } + + if (ver_info) + { + IMMCVersionInfo_Release(ver_info); + } +} + + +START_TEST(mmcndmgr) +{ + CoInitialize(NULL); + + test_get_version(); + + CoUninitialize(); +}