This is my first time implementing an interface so thorough feedback would be appreciated.
-- v2: windows.media: Implement IClosedCaptionPropertiesStatics interface. include/windowscontracts: Bump contractversion to 14. windows.media: Add stub DLL.
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
--- v2: - Fix DllGetActivationFactory stub. - Fix formatting in DllGetClassObject. - Use the same debug channel, media, for captions.c and main.c. - Rename struct captions to captions_statics. --- configure.ac | 1 + dlls/windows.media/Makefile.in | 9 ++ dlls/windows.media/captions.c | 125 ++++++++++++++++++++++++++ dlls/windows.media/classes.idl | 23 +++++ dlls/windows.media/main.c | 38 ++++++++ dlls/windows.media/private.h | 38 ++++++++ dlls/windows.media/windows.media.spec | 3 + 7 files changed, 237 insertions(+) create mode 100644 dlls/windows.media/Makefile.in create mode 100644 dlls/windows.media/captions.c create mode 100644 dlls/windows.media/classes.idl create mode 100644 dlls/windows.media/main.c create mode 100644 dlls/windows.media/private.h create mode 100644 dlls/windows.media/windows.media.spec
diff --git a/configure.ac b/configure.ac index 7725c87bd99..0aaed1b943f 100644 --- a/configure.ac +++ b/configure.ac @@ -3185,6 +3185,7 @@ WINE_CONFIG_MAKEFILE(dlls/windows.media.devices) WINE_CONFIG_MAKEFILE(dlls/windows.media.devices/tests) WINE_CONFIG_MAKEFILE(dlls/windows.media.speech) WINE_CONFIG_MAKEFILE(dlls/windows.media.speech/tests) +WINE_CONFIG_MAKEFILE(dlls/windows.media) WINE_CONFIG_MAKEFILE(dlls/windows.networking) WINE_CONFIG_MAKEFILE(dlls/windowscodecs) WINE_CONFIG_MAKEFILE(dlls/windowscodecs/tests) diff --git a/dlls/windows.media/Makefile.in b/dlls/windows.media/Makefile.in new file mode 100644 index 00000000000..be5012c170f --- /dev/null +++ b/dlls/windows.media/Makefile.in @@ -0,0 +1,9 @@ +MODULE = windows.media.dll +IMPORTS = combase + +C_SRCS = \ + captions.c \ + main.c + +IDL_SRCS = \ + classes.idl diff --git a/dlls/windows.media/captions.c b/dlls/windows.media/captions.c new file mode 100644 index 00000000000..f8e6218a72d --- /dev/null +++ b/dlls/windows.media/captions.c @@ -0,0 +1,125 @@ +/* WinRT Windows.Media Closed Captions Implementation + * + * Copyright (C) 2022 Mohamad Al-Jaf + * + * 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 "private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(media); + +const char *debugstr_hstring( HSTRING hstr ) +{ + const WCHAR *str; + UINT32 len; + if (hstr && !((ULONG_PTR)hstr >> 16)) return "(invalid)"; + str = WindowsGetStringRawBuffer( hstr, &len ); + return wine_dbgstr_wn( str, len ); +} + +struct captions_statics +{ + IActivationFactory IActivationFactory_iface; + LONG ref; +}; + +static inline struct captions_statics *impl_from_IActivationFactory( IActivationFactory *iface ) +{ + return CONTAINING_RECORD( iface, struct captions_statics, IActivationFactory_iface ); +} + +static HRESULT WINAPI windows_media_QueryInterface( IActivationFactory *iface, REFIID iid, void **out ) +{ + struct captions_statics *impl = impl_from_IActivationFactory( iface ); + + TRACE( "(iface %p, iid %s, out %p.)\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IActivationFactory )) + { + *out = &impl->IActivationFactory_iface; + IInspectable_AddRef( *out ); + return S_OK; + } + + FIXME( "(%s not implemented, returning E_NOINTERFACE.)\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI windows_media_AddRef( IActivationFactory *iface ) +{ + struct captions_statics *impl = impl_from_IActivationFactory( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "(iface %p increasing refcount to %lu.)\n", iface, ref ); + return ref; +} + +static ULONG WINAPI windows_media_Release( IActivationFactory *iface ) +{ + struct captions_statics *impl = impl_from_IActivationFactory( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + TRACE( "(iface %p decreasing refcount to %lu.)\n", iface, ref ); + return ref; +} + +static HRESULT WINAPI windows_media_GetIids( IActivationFactory *iface, ULONG *iid_count, IID **iids ) +{ + FIXME( "(iface %p, iid_count %p, iids %p) - stub.\n", iface, iid_count, iids ); + return E_NOTIMPL; +} + +static HRESULT WINAPI windows_media_GetRuntimeClassName( IActivationFactory *iface, HSTRING *class_name ) +{ + FIXME( "(iface %p, class_name %p) - stub.\n", iface, class_name ); + return E_NOTIMPL; +} + +static HRESULT WINAPI windows_media_GetTrustLevel( IActivationFactory *iface, TrustLevel *trust_level ) +{ + FIXME( "(iface %p, trust_level %p) - stub.\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI windows_media_ActivateInstance( IActivationFactory *iface, IInspectable **instance ) +{ + FIXME( "(iface %p, instance %p) - stub.\n", iface, instance ); + return E_NOTIMPL; +} + +static const struct IActivationFactoryVtbl factory_vtbl = +{ + windows_media_QueryInterface, + windows_media_AddRef, + windows_media_Release, + /* IInspectable methods */ + windows_media_GetIids, + windows_media_GetRuntimeClassName, + windows_media_GetTrustLevel, + /* IActivationFactory methods */ + windows_media_ActivateInstance, +}; + +static struct captions_statics captions_statics = +{ + {&factory_vtbl}, + 1, +}; + +IActivationFactory *captions_factory = &captions_statics.IActivationFactory_iface; diff --git a/dlls/windows.media/classes.idl b/dlls/windows.media/classes.idl new file mode 100644 index 00000000000..12424bbc90a --- /dev/null +++ b/dlls/windows.media/classes.idl @@ -0,0 +1,23 @@ +/* + * Runtime Classes for windows.media.dll + * + * Copyright (C) 2022 Mohamad Al-Jaf + * + * 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 + */ + +#pragma makedep register + +#include "windows.media.closedcaptioning.idl" diff --git a/dlls/windows.media/main.c b/dlls/windows.media/main.c new file mode 100644 index 00000000000..2c9723749b2 --- /dev/null +++ b/dlls/windows.media/main.c @@ -0,0 +1,38 @@ +/* WinRT Windows.Media Implementation + * + * Copyright (C) 2022 Mohamad Al-Jaf + * + * 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 "private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(media); + +HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID riid, void **out) +{ + FIXME( "(clsid %s, riid %s, out %p) - stub.\n", debugstr_guid(clsid), debugstr_guid(riid), out ); + return CLASS_E_CLASSNOTAVAILABLE; +} + +HRESULT WINAPI DllGetActivationFactory(HSTRING classid, IActivationFactory **factory) +{ + FIXME( "(class %s, factory %p.) - stub.\n", debugstr_hstring(classid), factory ); + *factory = NULL; + return CLASS_E_CLASSNOTAVAILABLE; +} diff --git a/dlls/windows.media/private.h b/dlls/windows.media/private.h new file mode 100644 index 00000000000..e05fa6d36a9 --- /dev/null +++ b/dlls/windows.media/private.h @@ -0,0 +1,38 @@ +/* WinRT Windows.Media Implementation + * + * Copyright (C) 2022 Mohamad Al-Jaf + * + * 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 + */ + +#ifndef __WINE_WINDOWS_MEDIA_PRIVATE_H +#define __WINE_WINDOWS_MEDIA_PRIVATE_H + +#include <stdarg.h> + +#define COBJMACROS +#include "windef.h" +#include "winbase.h" +#include "winstring.h" + +#include "activation.h" + +#define WIDL_using_Windows_Foundation +#define WIDL_using_Windows_Foundation_Collections +#include "windows.foundation.h" + +extern const char *debugstr_hstring( HSTRING hstr ); + +#endif diff --git a/dlls/windows.media/windows.media.spec b/dlls/windows.media/windows.media.spec new file mode 100644 index 00000000000..31a5eafe950 --- /dev/null +++ b/dlls/windows.media/windows.media.spec @@ -0,0 +1,3 @@ +@ stdcall -private DllGetActivationFactory(ptr ptr) +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr)
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
Windows.UI includes a contract version of 12 for typedef struct WindowId which cannot compile due to being an incomplete type and not a pointer. --- My Windows SDK lists the contractversion as 14 so I updated it to that for accuracy, otherwise 12 works fine. --- include/windowscontracts.idl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/windowscontracts.idl b/include/windowscontracts.idl index 6bcf80ac954..5bcae48a5b5 100644 --- a/include/windowscontracts.idl +++ b/include/windowscontracts.idl @@ -26,7 +26,7 @@ namespace Windows { apicontract FoundationContract {};
- [contractversion(10)] + [contractversion(14)] apicontract UniversalApiContract {}; }
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
Needed by Chromium-based browsers. --- v2: - Add property prefixes to function names. - Rename captions_vtbl to captions_statics_vtbl. --- configure.ac | 1 + dlls/windows.media/captions.c | 155 +++++++++++++++++++++++++++ dlls/windows.media/main.c | 10 +- dlls/windows.media/private.h | 44 ++++++++ dlls/windows.media/tests/Makefile.in | 5 + dlls/windows.media/tests/captions.c | 94 ++++++++++++++++ 6 files changed, 308 insertions(+), 1 deletion(-) create mode 100644 dlls/windows.media/tests/Makefile.in create mode 100644 dlls/windows.media/tests/captions.c
diff --git a/configure.ac b/configure.ac index 0aaed1b943f..c3f7554347f 100644 --- a/configure.ac +++ b/configure.ac @@ -3186,6 +3186,7 @@ WINE_CONFIG_MAKEFILE(dlls/windows.media.devices/tests) WINE_CONFIG_MAKEFILE(dlls/windows.media.speech) WINE_CONFIG_MAKEFILE(dlls/windows.media.speech/tests) WINE_CONFIG_MAKEFILE(dlls/windows.media) +WINE_CONFIG_MAKEFILE(dlls/windows.media/tests) WINE_CONFIG_MAKEFILE(dlls/windows.networking) WINE_CONFIG_MAKEFILE(dlls/windowscodecs) WINE_CONFIG_MAKEFILE(dlls/windowscodecs/tests) diff --git a/dlls/windows.media/captions.c b/dlls/windows.media/captions.c index f8e6218a72d..07cc126be1a 100644 --- a/dlls/windows.media/captions.c +++ b/dlls/windows.media/captions.c @@ -35,6 +35,7 @@ const char *debugstr_hstring( HSTRING hstr ) struct captions_statics { IActivationFactory IActivationFactory_iface; + IClosedCaptionPropertiesStatics IClosedCaptionPropertiesStatics_iface; LONG ref; };
@@ -58,6 +59,13 @@ static HRESULT WINAPI windows_media_QueryInterface( IActivationFactory *iface, R return S_OK; }
+ if (IsEqualGUID( iid, &IID_IClosedCaptionPropertiesStatics )) + { + *out = &impl->IClosedCaptionPropertiesStatics_iface; + IInspectable_AddRef( *out ); + return S_OK; + } + FIXME( "(%s not implemented, returning E_NOINTERFACE.)\n", debugstr_guid( iid ) ); *out = NULL; return E_NOINTERFACE; @@ -116,9 +124,156 @@ static const struct IActivationFactoryVtbl factory_vtbl = windows_media_ActivateInstance, };
+DEFINE_IINSPECTABLE( captions, IClosedCaptionPropertiesStatics, struct captions_statics, IActivationFactory_iface ) + +static HRESULT WINAPI captions_get_FontColor( IClosedCaptionPropertiesStatics *iface, ClosedCaptionColor *value ) +{ + FIXME( "(iface %p, color %p) - stub.\n", iface, value ); + + if (!value) + return E_POINTER; + + return E_NOTIMPL; +} + +static HRESULT WINAPI captions_get_ComputedFontColor( IClosedCaptionPropertiesStatics *iface, Color *value ) +{ + FIXME( "(iface %p, computed color %p) - stub.\n", iface, value ); + + if (!value) + return E_POINTER; + + return E_NOTIMPL; +} + +static HRESULT WINAPI captions_get_FontOpacity( IClosedCaptionPropertiesStatics *iface, ClosedCaptionOpacity *value ) +{ + FIXME( "(iface %p, opacity %p) - stub.\n", iface, value ); + + if (!value) + return E_POINTER; + + return E_NOTIMPL; +} + +static HRESULT WINAPI captions_get_FontSize( IClosedCaptionPropertiesStatics *iface, ClosedCaptionSize *value ) +{ + FIXME( "(iface %p, size %p) - stub.\n", iface, value ); + + if (!value) + return E_POINTER; + + return E_NOTIMPL; +} + +static HRESULT WINAPI captions_get_FontStyle( IClosedCaptionPropertiesStatics *iface, ClosedCaptionStyle *value ) +{ + FIXME( "(iface %p, style %p) - stub.\n", iface, value ); + + if (!value) + return E_POINTER; + + return E_NOTIMPL; +} + +static HRESULT WINAPI captions_get_FontEffect( IClosedCaptionPropertiesStatics *iface, ClosedCaptionEdgeEffect *value ) +{ + FIXME( "(iface %p, effect %p) - stub.\n", iface, value ); + + if (!value) + return E_POINTER; + + return E_NOTIMPL; +} + +static HRESULT WINAPI captions_get_BackgroundColor( IClosedCaptionPropertiesStatics *iface, ClosedCaptionColor *value ) +{ + FIXME( "(iface %p, background color %p) - stub.\n", iface, value ); + + if (!value) + return E_POINTER; + + return E_NOTIMPL; +} + +static HRESULT WINAPI captions_get_ComputedBackgroundColor( IClosedCaptionPropertiesStatics *iface, Color *value ) +{ + FIXME( "(iface %p, computed background color %p) - stub.\n", iface, value ); + + if (!value) + return E_POINTER; + + return E_NOTIMPL; +} + +static HRESULT WINAPI captions_get_BackgroundOpacity( IClosedCaptionPropertiesStatics *iface, ClosedCaptionOpacity *value ) +{ + FIXME( "(iface %p, background opacity %p) - stub.\n", iface, value ); + + if (!value) + return E_POINTER; + + return E_NOTIMPL; +} + +static HRESULT WINAPI captions_get_RegionColor( IClosedCaptionPropertiesStatics *iface, ClosedCaptionColor *value ) +{ + FIXME( "(iface %p, region color %p) - stub.\n", iface, value ); + + if (!value) + return E_POINTER; + + return E_NOTIMPL; +} + +static HRESULT WINAPI captions_get_ComputedRegionColor( IClosedCaptionPropertiesStatics *iface, Color *value ) +{ + FIXME( "(iface %p, computed region color %p) - stub.\n", iface, value ); + + if (!value) + return E_POINTER; + + return E_NOTIMPL; +} + +static HRESULT WINAPI captions_get_RegionOpacity( IClosedCaptionPropertiesStatics *iface, ClosedCaptionOpacity *value ) +{ + FIXME( "(iface %p, region opacity %p) - stub.\n", iface, value ); + + if (!value) + return E_POINTER; + + return E_NOTIMPL; +} + +static const struct IClosedCaptionPropertiesStaticsVtbl captions_statics_vtbl = +{ + captions_QueryInterface, + captions_AddRef, + captions_Release, + /* IInspectable methods */ + captions_GetIids, + captions_GetRuntimeClassName, + captions_GetTrustLevel, + /* IClosedCaptionPropertiesStatics methods */ + captions_get_FontColor, + captions_get_ComputedFontColor, + captions_get_FontOpacity, + captions_get_FontSize, + captions_get_FontStyle, + captions_get_FontEffect, + captions_get_BackgroundColor, + captions_get_ComputedBackgroundColor, + captions_get_BackgroundOpacity, + captions_get_RegionColor, + captions_get_ComputedRegionColor, + captions_get_RegionOpacity, +}; + static struct captions_statics captions_statics = { {&factory_vtbl}, + {&captions_statics_vtbl}, 1, };
diff --git a/dlls/windows.media/main.c b/dlls/windows.media/main.c index 2c9723749b2..df2e8027a32 100644 --- a/dlls/windows.media/main.c +++ b/dlls/windows.media/main.c @@ -32,7 +32,15 @@ HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID riid, void **out)
HRESULT WINAPI DllGetActivationFactory(HSTRING classid, IActivationFactory **factory) { - FIXME( "(class %s, factory %p.) - stub.\n", debugstr_hstring(classid), factory ); + const WCHAR *buffer = WindowsGetStringRawBuffer( classid, NULL ); + + TRACE( "(class %s, factory %p.)\n", debugstr_hstring(classid), factory ); + *factory = NULL; + + if (!wcscmp( buffer, RuntimeClass_Windows_Media_ClosedCaptioning_ClosedCaptionProperties )) + IActivationFactory_QueryInterface( captions_factory, &IID_IActivationFactory, (void **)factory ); + + if (*factory) return S_OK; return CLASS_E_CLASSNOTAVAILABLE; } diff --git a/dlls/windows.media/private.h b/dlls/windows.media/private.h index e05fa6d36a9..d6353dede56 100644 --- a/dlls/windows.media/private.h +++ b/dlls/windows.media/private.h @@ -32,7 +32,51 @@ #define WIDL_using_Windows_Foundation #define WIDL_using_Windows_Foundation_Collections #include "windows.foundation.h" +#define WIDL_using_Windows_UI +#include "windows.ui.h" +#define WIDL_using_Windows_Media_ClosedCaptioning +#include "windows.media.closedcaptioning.h"
extern const char *debugstr_hstring( HSTRING hstr );
+extern IActivationFactory *captions_factory; + +#define DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from, iface_mem, expr ) \ + static inline impl_type *impl_from( iface_type *iface ) \ + { \ + return CONTAINING_RECORD( iface, impl_type, iface_mem ); \ + } \ + static HRESULT WINAPI pfx##_QueryInterface( iface_type *iface, REFIID iid, void **out ) \ + { \ + impl_type *impl = impl_from( iface ); \ + return IInspectable_QueryInterface( (IInspectable *)(expr), iid, out ); \ + } \ + static ULONG WINAPI pfx##_AddRef( iface_type *iface ) \ + { \ + impl_type *impl = impl_from( iface ); \ + return IInspectable_AddRef( (IInspectable *)(expr) ); \ + } \ + static ULONG WINAPI pfx##_Release( iface_type *iface ) \ + { \ + impl_type *impl = impl_from( iface ); \ + return IInspectable_Release( (IInspectable *)(expr) ); \ + } \ + static HRESULT WINAPI pfx##_GetIids( iface_type *iface, ULONG *iid_count, IID **iids ) \ + { \ + impl_type *impl = impl_from( iface ); \ + return IInspectable_GetIids( (IInspectable *)(expr), iid_count, iids ); \ + } \ + static HRESULT WINAPI pfx##_GetRuntimeClassName( iface_type *iface, HSTRING *class_name ) \ + { \ + impl_type *impl = impl_from( iface ); \ + return IInspectable_GetRuntimeClassName( (IInspectable *)(expr), class_name ); \ + } \ + static HRESULT WINAPI pfx##_GetTrustLevel( iface_type *iface, TrustLevel *trust_level ) \ + { \ + impl_type *impl = impl_from( iface ); \ + return IInspectable_GetTrustLevel( (IInspectable *)(expr), trust_level ); \ + } +#define DEFINE_IINSPECTABLE( pfx, iface_type, impl_type, base_iface ) \ + DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from_##iface_type, iface_type##_iface, &impl->base_iface ) + #endif diff --git a/dlls/windows.media/tests/Makefile.in b/dlls/windows.media/tests/Makefile.in new file mode 100644 index 00000000000..cc432fd73cc --- /dev/null +++ b/dlls/windows.media/tests/Makefile.in @@ -0,0 +1,5 @@ +TESTDLL = windows.media.dll +IMPORTS = combase + +C_SRCS = \ + captions.c diff --git a/dlls/windows.media/tests/captions.c b/dlls/windows.media/tests/captions.c new file mode 100644 index 00000000000..b1e1f4fd334 --- /dev/null +++ b/dlls/windows.media/tests/captions.c @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2022 Mohamad Al-Jaf + * + * 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 "initguid.h" +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "winstring.h" + +#include "roapi.h" + +#define WIDL_using_Windows_Foundation +#include "windows.foundation.h" +#define WIDL_using_Windows_Media_ClosedCaptioning +#include "windows.media.closedcaptioning.h" + +#include "wine/test.h" + +#define check_interface( obj, iid, exp ) check_interface_( __LINE__, obj, iid, exp ) +static void check_interface_( unsigned int line, void *obj, const IID *iid, BOOL supported ) +{ + IUnknown *iface = obj; + IUnknown *unk; + HRESULT hr, expected_hr; + + expected_hr = supported ? S_OK : E_NOINTERFACE; + + hr = IUnknown_QueryInterface( iface, iid, (void **)&unk ); + ok_( __FILE__, line )( hr == expected_hr || broken(hr == E_NOINTERFACE ), "Got hr %#lx, expected %#lx.\n", hr, expected_hr ); + if (SUCCEEDED(hr)) + IUnknown_Release( unk ); +} + +static void test_CaptionStatics(void) +{ + static const WCHAR *caption_properties_name = L"Windows.Media.ClosedCaptioning.ClosedCaptionProperties"; + IClosedCaptionPropertiesStatics *caption_statics; + IActivationFactory *factory; + HSTRING str; + HRESULT hr; + LONG ref; + + hr = WindowsCreateString( caption_properties_name, wcslen( caption_properties_name ), &str ); + ok( hr == S_OK, "got hr %#lx.\n", hr ); + + hr = RoGetActivationFactory( str, &IID_IActivationFactory, (void **)&factory ); + WindowsDeleteString( str ); + ok( hr == S_OK || broken( hr == REGDB_E_CLASSNOTREG ), "got hr %#lx.\n", hr ); + if (hr == REGDB_E_CLASSNOTREG) + { + win_skip( "%s runtimeclass not registered, skipping tests.\n", wine_dbgstr_w( caption_properties_name )); + return; + } + + check_interface( factory, &IID_IUnknown, TRUE ); + check_interface( factory, &IID_IInspectable, TRUE ); + check_interface( factory, &IID_IAgileObject, FALSE ); + + hr = IActivationFactory_QueryInterface( factory, &IID_IClosedCaptionPropertiesStatics, (void **)&caption_statics ); + ok( hr == S_OK, "got hr %#lx.\n", hr ); + + ref = IClosedCaptionPropertiesStatics_Release( caption_statics ); + ok( ref == 2, "got ref %ld.\n", ref ); + ref = IActivationFactory_Release( factory ); + ok( ref == 1, "got ref %ld.\n", ref ); +} + +START_TEST(captions) +{ + HRESULT hr; + + hr = RoInitialize( RO_INIT_MULTITHREADED ); + ok( hr == S_OK, "RoInitialize failed, hr %#lx\n", hr ); + + test_CaptionStatics(); + + RoUninitialize(); +}
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=126120
Your paranoid android.
=== debian11 (32 bit report) ===
Report validation errors: advapi32:security has no test summary line (early exit of the main process?) advapi32:security has unaccounted for todo messages
On Sun Nov 13 22:24:11 2022 +0000, Bernhard Kölbl wrote:
You're setting *factory to Null in the last statement and then check here if it's unequal 0 to return S_OK.
![86qLqaUq_400x400](/uploads/875d0d1e0066b2ccd1076604fc797de8/86qLqaUq_400x400.png)
I see.
I must have reviewed the patches at minimum 5 times and somehow missed this. D'oh lol.
On Sun Nov 13 22:13:39 2022 +0000, Mohamad Al-Jaf wrote:
changed this line in [version 2 of the diff](/wine/wine/-/merge_requests/1343/diffs?diff_id=18409&start_sha=c1095162ea5f9449c1f4158212294bcfb2da11a9#696910dbc43dafaa69c900fcca1eb163fc8ce197_129_129)
Yeah, they're all get functions.
Thanks for the feedback! :smile:
On Sun Nov 13 22:13:40 2022 +0000, Mohamad Al-Jaf wrote:
changed this line in [version 2 of the diff](/wine/wine/-/merge_requests/1343/diffs?diff_id=18409&start_sha=c1095162ea5f9449c1f4158212294bcfb2da11a9#696910dbc43dafaa69c900fcca1eb163fc8ce197_35_35)
That makes sense.
Thanks for the feedback! :smile: