Module: wine Branch: master Commit: af6712599a0b6d9d28f4910f9be953223e93c3da URL: http://source.winehq.org/git/wine.git/?a=commit;h=af6712599a0b6d9d28f4910f9b...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Mon Dec 29 13:25:45 2014 +0300
msdmo: Use specified category in DMOUnregister().
---
configure | 1 + configure.ac | 1 + dlls/msdmo/dmoreg.c | 73 ++++++++++++++++++++++++++++++-------------- dlls/msdmo/tests/Makefile.in | 5 +++ dlls/msdmo/tests/msdmo.c | 60 ++++++++++++++++++++++++++++++++++++ 5 files changed, 117 insertions(+), 23 deletions(-)
diff --git a/configure b/configure index 119eaa8..b4e041d 100755 --- a/configure +++ b/configure @@ -17215,6 +17215,7 @@ wine_fn_config_dll msctf enable_msctf clean wine_fn_config_test dlls/msctf/tests msctf_test wine_fn_config_dll msdaps enable_msdaps clean wine_fn_config_dll msdmo enable_msdmo implib +wine_fn_config_test dlls/msdmo/tests msdmo_test wine_fn_config_dll msftedit enable_msftedit wine_fn_config_dll msg711.acm enable_msg711_acm wine_fn_config_dll msgsm32.acm enable_msgsm32_acm diff --git a/configure.ac b/configure.ac index 9f64cd3..94b83ab 100644 --- a/configure.ac +++ b/configure.ac @@ -3039,6 +3039,7 @@ WINE_CONFIG_DLL(msctf,,[clean]) WINE_CONFIG_TEST(dlls/msctf/tests) WINE_CONFIG_DLL(msdaps,,[clean]) WINE_CONFIG_DLL(msdmo,,[implib]) +WINE_CONFIG_TEST(dlls/msdmo/tests) WINE_CONFIG_DLL(msftedit) WINE_CONFIG_DLL(msg711.acm) WINE_CONFIG_DLL(msgsm32.acm) diff --git a/dlls/msdmo/dmoreg.c b/dlls/msdmo/dmoreg.c index 74ab6b6..0abbea0 100644 --- a/dlls/msdmo/dmoreg.c +++ b/dlls/msdmo/dmoreg.c @@ -188,7 +188,10 @@ HRESULT WINAPI DMORegister( HKEY hckey = 0; HKEY hclskey = 0;
- TRACE("%s\n", debugstr_w(szName)); + TRACE("%s %s %s\n", debugstr_w(szName), debugstr_guid(clsidDMO), debugstr_guid(guidCategory)); + + if (IsEqualGUID(guidCategory, &GUID_NULL)) + return E_INVALIDARG;
hres = RegCreateKeyExW(HKEY_CLASSES_ROOT, szDMORootKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hrkey, NULL); @@ -252,46 +255,70 @@ lend: return hres; }
+static HRESULT unregister_dmo_from_category(const WCHAR *dmoW, const WCHAR *catW, HKEY categories) +{ + HKEY catkey; + LONG ret; + + ret = RegOpenKeyExW(categories, catW, 0, KEY_WRITE, &catkey); + if (!ret) + { + ret = RegDeleteKeyW(catkey, dmoW); + RegCloseKey(catkey); + } + + return !ret ? S_OK : S_FALSE; +}
/*************************************************************** * DMOUnregister (MSDMO.@) * * Unregister a DirectX Media Object. */ -HRESULT WINAPI DMOUnregister(REFCLSID clsidDMO, REFGUID guidCategory) +HRESULT WINAPI DMOUnregister(REFCLSID dmo, REFGUID category) { - WCHAR szguid[64]; - HKEY hrkey = 0; - HKEY hckey = 0; + HKEY rootkey = 0, categorieskey = 0; + WCHAR dmoW[64], catW[64]; + HRESULT hr = S_FALSE; LONG ret;
- GUIDToString(szguid, clsidDMO); + TRACE("%s %s\n", debugstr_guid(dmo), debugstr_guid(category));
- TRACE("%s %p\n", debugstr_w(szguid), guidCategory); + ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, szDMORootKey, 0, KEY_WRITE, &rootkey); + if (ret) + return HRESULT_FROM_WIN32(ret);
- ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, szDMORootKey, 0, KEY_WRITE, &hrkey); - if (ERROR_SUCCESS != ret) - goto lend; + GUIDToString(dmoW, dmo); + RegDeleteKeyW(rootkey, dmoW);
- ret = RegDeleteKeyW(hrkey, szguid); - if (ERROR_SUCCESS != ret) + /* open 'Categories' */ + ret = RegOpenKeyExW(rootkey, szDMOCategories, 0, KEY_WRITE|KEY_ENUMERATE_SUB_KEYS, &categorieskey); + RegCloseKey(rootkey); + if (ret) + { + hr = HRESULT_FROM_WIN32(ret); goto lend; + }
- ret = RegOpenKeyExW(hrkey, szDMOCategories, 0, KEY_WRITE, &hckey); - if (ERROR_SUCCESS != ret) - goto lend; + /* remove from all categories */ + if (IsEqualGUID(category, &GUID_NULL)) + { + DWORD index = 0, len = sizeof(catW)/sizeof(WCHAR);
- ret = RegDeleteKeyW(hckey, szguid); - if (ERROR_SUCCESS != ret) - goto lend; + while (!RegEnumKeyExW(categorieskey, index++, catW, &len, NULL, NULL, NULL, NULL)) + hr = unregister_dmo_from_category(dmoW, catW, categorieskey); + } + else + { + GUIDToString(catW, category); + hr = unregister_dmo_from_category(dmoW, catW, categorieskey); + }
lend: - if (hckey) - RegCloseKey(hckey); - if (hrkey) - RegCloseKey(hrkey); + if (categorieskey) + RegCloseKey(categorieskey);
- return HRESULT_FROM_WIN32(ret); + return hr; }
diff --git a/dlls/msdmo/tests/Makefile.in b/dlls/msdmo/tests/Makefile.in new file mode 100644 index 0000000..105baba --- /dev/null +++ b/dlls/msdmo/tests/Makefile.in @@ -0,0 +1,5 @@ +TESTDLL = msdmo.dll +IMPORTS = msdmo + +C_SRCS = \ + msdmo.c diff --git a/dlls/msdmo/tests/msdmo.c b/dlls/msdmo/tests/msdmo.c new file mode 100644 index 0000000..4fc0c35 --- /dev/null +++ b/dlls/msdmo/tests/msdmo.c @@ -0,0 +1,60 @@ +/* + * MSDMO tests + * + * Copyright 2014 Nikolay Sivov for CodeWeavers + * + * 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 + */ + +#include "initguid.h" +#include "dmo.h" +#include "wine/test.h" + +DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); +static const GUID GUID_unknowndmo = {0x14d99047,0x441f,0x4cd3,{0xbc,0xa8,0x3e,0x67,0x99,0xaf,0x34,0x75}}; +static const GUID GUID_unknowncategory = {0x14d99048,0x441f,0x4cd3,{0xbc,0xa8,0x3e,0x67,0x99,0xaf,0x34,0x75}}; + +static void test_DMOUnregister(void) +{ + static const WCHAR testdmoW[] = {'t','e','s','t','d','m','o',0}; + HRESULT hr; + + hr = DMOUnregister(&GUID_unknowndmo, &GUID_unknowncategory); + ok(hr == S_FALSE, "got 0x%08x\n", hr); + + hr = DMOUnregister(&GUID_unknowndmo, &GUID_NULL); + ok(hr == S_FALSE, "got 0x%08x\n", hr); + + /* can't register for all categories */ + hr = DMORegister(testdmoW, &GUID_unknowndmo, &GUID_NULL, 0, 0, NULL, 0, NULL); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + hr = DMORegister(testdmoW, &GUID_unknowndmo, &GUID_unknowncategory, 0, 0, NULL, 0, NULL); + if (hr != S_OK) { + win_skip("Failed to register DMO. Probably user doesn't have persmissions to do so.\n"); + return; + } + + hr = DMOUnregister(&GUID_unknowndmo, &GUID_NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = DMOUnregister(&GUID_unknowndmo, &GUID_NULL); + ok(hr == S_FALSE, "got 0x%08x\n", hr); +} + +START_TEST(msdmo) +{ + test_DMOUnregister(); +}