/* * Some unit tests for devenum * * Copyright (C) 2012 Christian Costa * * 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 "wine/test.h" #include "initguid.h" #include "ole2.h" #include "strmif.h" #include "uuids.h" static const WCHAR friendly_name[] = {'F','r','i','e','n','d','l','y','N','a','m','e',0}; static const WCHAR fcc_handlerW[] = {'F','c','c','H','a','n','d','l','e','r',0}; static const WCHAR mrleW[] = {'m','r','l','e',0}; struct category { const char * name; const GUID * clsid; }; static struct category am_categories[] = { { "Legacy AM Filter category", &CLSID_LegacyAmFilterCategory }, { "Audio renderer category", &CLSID_AudioRendererCategory }, { "Midi renderer category", &CLSID_MidiRendererCategory }, { "Audio input device category", &CLSID_AudioInputDeviceCategory }, { "Video input device category", &CLSID_VideoInputDeviceCategory }, { "Audio compressor category", &CLSID_AudioCompressorCategory }, { "Video compressor category", &CLSID_VideoCompressorCategory } }; static void test_devenum(IBindCtx *bind_ctx) { HRESULT res; ICreateDevEnum* create_devenum; IEnumMoniker* enum_moniker = NULL; BOOL have_mrle = FALSE; int i; res = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, &IID_ICreateDevEnum, (LPVOID*)&create_devenum); if (res != S_OK) { skip("Cannot create SystemDeviceEnum object (%x)\n", res); return; } for (i = 0; i < (sizeof(am_categories) / sizeof(struct category)); i++) { if (winetest_debug > 1) trace("%s:\n", am_categories[i].name); res = ICreateDevEnum_CreateClassEnumerator(create_devenum, am_categories[i].clsid, &enum_moniker, 0); ok(SUCCEEDED(res), "Cannot create enum moniker (res = %x)\n", res); if (res == S_OK) { IMoniker* moniker; while (IEnumMoniker_Next(enum_moniker, 1, &moniker, NULL) == S_OK) { IPropertyBag* prop_bag = NULL; VARIANT var; HRESULT hr; CLSID clsid = {0}; hr = IMoniker_GetClassID(moniker, NULL); ok(hr == E_INVALIDARG, "IMoniker_GetClassID should failed %x\n", hr); hr = IMoniker_GetClassID(moniker, &clsid); ok(hr == S_OK, "IMoniker_GetClassID failed with error %x\n", hr); ok(IsEqualGUID(&clsid, &CLSID_CDeviceMoniker), "Expected CLSID_CDeviceMoniker got %s\n", wine_dbgstr_guid(&clsid)); VariantInit(&var); hr = IMoniker_BindToStorage(moniker, bind_ctx, NULL, &IID_IPropertyBag, (LPVOID*)&prop_bag); ok(hr == S_OK, "IMoniker_BindToStorage failed with error %x\n", hr); if (SUCCEEDED(hr)) { hr = IPropertyBag_Read(prop_bag, friendly_name, &var, NULL); ok((hr == S_OK) || broken(hr == 0x80070002), "IPropertyBag_Read failed with error %x\n", hr); if (SUCCEEDED(hr)) { if (winetest_debug > 1) trace(" %s\n", wine_dbgstr_w(V_BSTR(&var))); VariantClear(&var); } else { trace(" ???\n"); } if (IsEqualGUID(&CLSID_VideoCompressorCategory, am_categories[i].clsid)) { /* Test well known compressor to ensure that we really enumerate codecs */ hr = IPropertyBag_Read(prop_bag, fcc_handlerW, &var, NULL); if (SUCCEEDED(hr)) { ok(V_VT(&var) == VT_BSTR, "V_VT(var) = %d\n", V_VT(&var)); if(!lstrcmpW(V_BSTR(&var), mrleW)) have_mrle = TRUE; VariantClear(&var); } } } if (prop_bag) IPropertyBag_Release(prop_bag); IMoniker_Release(moniker); } IEnumMoniker_Release(enum_moniker); } } ICreateDevEnum_Release(create_devenum); /* 64-bit windows are missing mrle codec */ if(sizeof(void*) == 4) ok(have_mrle, "mrle codec not found\n"); } static void test_moniker_isequal(void) { HRESULT res; ICreateDevEnum *create_devenum = NULL; IEnumMoniker *enum_moniker0 = NULL, *enum_moniker1 = NULL; IMoniker *moniker0 = NULL, *moniker1 = NULL; res = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, &IID_ICreateDevEnum, (LPVOID*)&create_devenum); if (FAILED(res)) { skip("Cannot create SystemDeviceEnum object (%x)\n", res); return; } res = ICreateDevEnum_CreateClassEnumerator(create_devenum, &CLSID_LegacyAmFilterCategory, &enum_moniker0, 0); ok(SUCCEEDED(res), "Cannot create enum moniker (res = %x)\n", res); if (SUCCEEDED(res)) { if (IEnumMoniker_Next(enum_moniker0, 1, &moniker0, NULL) == S_OK && IEnumMoniker_Next(enum_moniker0, 1, &moniker1, NULL) == S_OK) { res = IMoniker_IsEqual(moniker0, moniker1); ok(res == S_FALSE, "IMoniker_IsEqual should fail (res = %x)\n", res); res = IMoniker_IsEqual(moniker1, moniker0); ok(res == S_FALSE, "IMoniker_IsEqual should fail (res = %x)\n", res); IMoniker_Release(moniker0); IMoniker_Release(moniker1); } else skip("Cannot get moniker for testing.\n"); } IEnumMoniker_Release(enum_moniker0); res = ICreateDevEnum_CreateClassEnumerator(create_devenum, &CLSID_LegacyAmFilterCategory, &enum_moniker0, 0); ok(SUCCEEDED(res), "Cannot create enum moniker (res = %x)\n", res); res = ICreateDevEnum_CreateClassEnumerator(create_devenum, &CLSID_AudioRendererCategory, &enum_moniker1, 0); ok(SUCCEEDED(res), "Cannot create enum moniker (res = %x)\n", res); if (SUCCEEDED(res)) { if (IEnumMoniker_Next(enum_moniker0, 1, &moniker0, NULL) == S_OK && IEnumMoniker_Next(enum_moniker1, 1, &moniker1, NULL) == S_OK) { res = IMoniker_IsEqual(moniker0, moniker1); ok(res == S_FALSE, "IMoniker_IsEqual should failed (res = %x)\n", res); res = IMoniker_IsEqual(moniker1, moniker0); ok(res == S_FALSE, "IMoniker_IsEqual should failed (res = %x)\n", res); IMoniker_Release(moniker0); IMoniker_Release(moniker1); } else skip("Cannot get moniker for testing.\n"); } IEnumMoniker_Release(enum_moniker0); IEnumMoniker_Release(enum_moniker1); res = ICreateDevEnum_CreateClassEnumerator(create_devenum, &CLSID_LegacyAmFilterCategory, &enum_moniker0, 0); ok(SUCCEEDED(res), "Cannot create enum moniker (res = %x)\n", res); res = ICreateDevEnum_CreateClassEnumerator(create_devenum, &CLSID_LegacyAmFilterCategory, &enum_moniker1, 0); ok(SUCCEEDED(res), "Cannot create enum moniker (res = %x)\n", res); if (SUCCEEDED(res)) { if (IEnumMoniker_Next(enum_moniker0, 1, &moniker0, NULL) == S_OK && IEnumMoniker_Next(enum_moniker1, 1, &moniker1, NULL) == S_OK) { res = IMoniker_IsEqual(moniker0, moniker1); ok(res == S_OK, "IMoniker_IsEqual failed (res = %x)\n", res); res = IMoniker_IsEqual(moniker1, moniker0); ok(res == S_OK, "IMoniker_IsEqual failed (res = %x)\n", res); IMoniker_Release(moniker0); IMoniker_Release(moniker1); } else skip("Cannot get moniker for testing.\n"); } IEnumMoniker_Release(enum_moniker0); IEnumMoniker_Release(enum_moniker1); ICreateDevEnum_Release(create_devenum); return; } /* CLSID_CDeviceMoniker */ START_TEST(devenum) { IBindCtx *bind_ctx = NULL; HRESULT hr; CoInitialize(NULL); test_devenum(NULL); /* IBindCtx is allowed in IMoniker_BindToStorage (IMediaCatMoniker_BindToStorage) */ hr = CreateBindCtx(0, &bind_ctx); ok(hr == S_OK, "Cannot create BindCtx: (res = 0x%x)\n", hr); if (bind_ctx) { test_devenum(bind_ctx); IBindCtx_Release(bind_ctx); } test_moniker_isequal(); CoUninitialize(); }