[PATCH 2/2 v3] devenum: Implement IMoniker::IsEqual().

Andrew Eikum aeikum at codeweavers.com
Tue Mar 28 08:52:55 CDT 2017


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>

On Mon, Mar 27, 2017 at 11:41:23PM +0800, Jactry Zeng wrote:
> Superseded patch 131897.
> 
> ChangeLog:
> v3:
> - Use FAILED() for checking;
> - Compare res with S_OK.
> v2:
> - Fix two trace messages;
> - Use SUCCEEDED() for checking.
> 
> Signed-off-by: Jactry Zeng <jzeng at codeweavers.com>
> ---
>  dlls/devenum/mediacatenum.c  | 31 ++++++++++++++-
>  dlls/devenum/tests/devenum.c | 90
> ++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 119 insertions(+), 2 deletions(-)
> 
> 

> diff --git a/dlls/devenum/mediacatenum.c b/dlls/devenum/mediacatenum.c
> index 8eec94b0e0..4edc4e9622 100644
> --- a/dlls/devenum/mediacatenum.c
> +++ b/dlls/devenum/mediacatenum.c
> @@ -528,9 +528,36 @@ static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Enum(IMoniker *iface, BOOL fForwa
>  
>  static HRESULT WINAPI DEVENUM_IMediaCatMoniker_IsEqual(IMoniker *iface, IMoniker *pmkOtherMoniker)
>  {
> -    FIXME("(%p)->(%p): stub\n", iface, pmkOtherMoniker);
> +    CLSID clsid;
> +    LPOLESTR this_name, other_name;
> +    IBindCtx *bind;
> +    HRESULT res;
>  
> -    return E_NOTIMPL;
> +    TRACE("(%p)->(%p)\n", iface, pmkOtherMoniker);
> +
> +    if (!pmkOtherMoniker)
> +        return E_INVALIDARG;
> +
> +    IMoniker_GetClassID(pmkOtherMoniker, &clsid);
> +    if (!IsEqualCLSID(&clsid, &CLSID_CDeviceMoniker))
> +        return S_FALSE;
> +
> +    res = CreateBindCtx(0, &bind);
> +    if (FAILED(res))
> +       return res;
> +
> +    res = S_FALSE;
> +    if (SUCCEEDED(IMoniker_GetDisplayName(iface, bind, NULL, &this_name)) &&
> +        SUCCEEDED(IMoniker_GetDisplayName(pmkOtherMoniker, bind, NULL, &other_name)))
> +    {
> +        int result = lstrcmpiW(this_name, other_name);
> +        CoTaskMemFree(this_name);
> +        CoTaskMemFree(other_name);
> +        if (!result)
> +            res = S_OK;
> +    }
> +    IBindCtx_Release(bind);
> +    return res;
>  }
>  
>  static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Hash(IMoniker *iface, DWORD *pdwHash)
> diff --git a/dlls/devenum/tests/devenum.c b/dlls/devenum/tests/devenum.c
> index e3c0f47256..c2173fedc1 100644
> --- a/dlls/devenum/tests/devenum.c
> +++ b/dlls/devenum/tests/devenum.c
> @@ -135,6 +135,94 @@ static void test_devenum(IBindCtx *bind_ctx)
>      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 (SUCCEEDED(IEnumMoniker_Next(enum_moniker0, 1, &moniker0, NULL)) &&
> +            SUCCEEDED(IEnumMoniker_Next(enum_moniker0, 1, &moniker1, NULL)))
> +        {
> +            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 (SUCCEEDED(IEnumMoniker_Next(enum_moniker0, 1, &moniker0, NULL)) &&
> +            SUCCEEDED(IEnumMoniker_Next(enum_moniker1, 1, &moniker1, NULL)))
> +        {
> +            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 (SUCCEEDED(IEnumMoniker_Next(enum_moniker0, 1, &moniker0, NULL)) &&
> +             SUCCEEDED(IEnumMoniker_Next(enum_moniker1, 1, &moniker1, NULL)))
> +        {
> +            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 */
>  
> @@ -155,5 +243,7 @@ START_TEST(devenum)
>          IBindCtx_Release(bind_ctx);
>      }
>  
> +    test_moniker_isequal();
> +
>      CoUninitialize();
>  }
> 

> 




More information about the wine-patches mailing list