The idea I have is to use this module to declare class stubs until there is a good reason to split them to dedicated modules. WinRT modules aren't usually loaded directly, and instead the registry is queried to figure which module to load for which class.
This would help avoiding unnecessary proliferation of stub WinRT modules, while at the same time allowing to factor WinRT foundation code (such as vector / async, etc...) between the modules that seem to deserve to be implemented separately.
The relevant classes could then be split out to dedicated modules on a as-needed basis, when they get fleshed out.
-- v3: winewinrt: Factor IAsyncOperation<boolean> implementations. winewinrt: Factor IAsyncInfo implementations. winewinrt: Move Vector<HSTRING> from windows.media.speech. widl: Write C type names for function parameters. winewinrt: Factor Vector<IInspectable> implementations. winewinrt: Introduce new static library.
From: Rémi Bernon rbernon@codeweavers.com
--- MAINTAINERS | 4 ++ configure.ac | 1 + dlls/cryptowinrt/Makefile.in | 2 +- dlls/cryptowinrt/main.c | 9 --- dlls/cryptowinrt/private.h | 44 +----------- dlls/windows.devices.enumeration/Makefile.in | 2 +- dlls/windows.devices.enumeration/main.c | 9 --- dlls/windows.devices.enumeration/private.h | 43 +----------- dlls/windows.gaming.input/Makefile.in | 2 +- dlls/windows.gaming.input/private.h | 41 +---------- dlls/windows.gaming.ui.gamebar/Makefile.in | 2 +- dlls/windows.gaming.ui.gamebar/private.h | 38 +--------- dlls/windows.media.speech/Makefile.in | 2 +- dlls/windows.media.speech/private.h | 41 +---------- dlls/windows.media/Makefile.in | 2 +- dlls/windows.media/captions.c | 9 --- dlls/windows.media/private.h | 40 +---------- dlls/windows.perception.stub/Makefile.in | 2 +- dlls/windows.perception.stub/main.c | 9 --- dlls/windows.perception.stub/private.h | 40 +---------- .../Makefile.in | 2 +- .../main.c | 9 --- .../private.h | 38 +--------- include/Makefile.in | 1 + include/wine/winrt.idl | 70 +++++++++++++++++++ libs/winewinrt/Makefile.in | 4 ++ libs/winewinrt/debug.c | 28 ++++++++ libs/winewinrt/private.h | 35 ++++++++++ 28 files changed, 161 insertions(+), 368 deletions(-) create mode 100644 include/wine/winrt.idl create mode 100644 libs/winewinrt/Makefile.in create mode 100644 libs/winewinrt/debug.c create mode 100644 libs/winewinrt/private.h
diff --git a/MAINTAINERS b/MAINTAINERS index 9d60385414f..99b7ec6f6c0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -388,6 +388,10 @@ M: Alexandre Julliard julliard@winehq.org P: Erich E. Hoover erich.e.hoover@wine-staging.com F: server/
+Wine WinRT +M: Rémi Bernon rbernon@codeweavers.com +F: libs/winewinrt/ + Winemaker M: André Zwing nerv@dawncrow.de F: tools/winemaker/ diff --git a/configure.ac b/configure.ac index 35af177b013..3eb27701acf 100644 --- a/configure.ac +++ b/configure.ac @@ -3275,6 +3275,7 @@ WINE_CONFIG_MAKEFILE(libs/tiff) WINE_CONFIG_MAKEFILE(libs/uuid) WINE_CONFIG_MAKEFILE(libs/vkd3d) WINE_CONFIG_MAKEFILE(libs/wbemuuid) +WINE_CONFIG_MAKEFILE(libs/winewinrt) WINE_CONFIG_MAKEFILE(libs/wmcodecdspuuid) WINE_CONFIG_MAKEFILE(libs/xml2) WINE_CONFIG_MAKEFILE(libs/xslt) diff --git a/dlls/cryptowinrt/Makefile.in b/dlls/cryptowinrt/Makefile.in index 6f11a7cd05d..e58476eb6d6 100644 --- a/dlls/cryptowinrt/Makefile.in +++ b/dlls/cryptowinrt/Makefile.in @@ -1,5 +1,5 @@ MODULE = cryptowinrt.dll -IMPORTS = combase bcrypt uuid +IMPORTS = winewinrt combase bcrypt uuid
C_SRCS = \ async.c \ diff --git a/dlls/cryptowinrt/main.c b/dlls/cryptowinrt/main.c index 5f28382eba9..e6f811b5d12 100644 --- a/dlls/cryptowinrt/main.c +++ b/dlls/cryptowinrt/main.c @@ -31,15 +31,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(crypto);
-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 cryptobuffer_factory { IActivationFactory IActivationFactory_iface; diff --git a/dlls/cryptowinrt/private.h b/dlls/cryptowinrt/private.h index b1c195123f3..0cc2ba507b0 100644 --- a/dlls/cryptowinrt/private.h +++ b/dlls/cryptowinrt/private.h @@ -37,9 +37,9 @@ #define WIDL_using_Windows_Security_Credentials #include "windows.security.credentials.h"
-#include "provider.h" +#include "wine/winrt.h"
-extern const char *debugstr_hstring( HSTRING hstr ); +#include "provider.h"
extern IActivationFactory *credentials_activation_factory;
@@ -47,44 +47,4 @@ typedef HRESULT (WINAPI *async_operation_callback)( IUnknown *invoker, IUnknown extern HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *param, async_operation_callback callback, IAsyncOperation_boolean **out );
-#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 ) -#define DEFINE_IINSPECTABLE_OUTER( pfx, iface_type, impl_type, outer_iface ) \ - DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from_##iface_type, iface_type##_iface, impl->outer_iface ) - #endif diff --git a/dlls/windows.devices.enumeration/Makefile.in b/dlls/windows.devices.enumeration/Makefile.in index e5b492e2bb9..a77eb54987c 100644 --- a/dlls/windows.devices.enumeration/Makefile.in +++ b/dlls/windows.devices.enumeration/Makefile.in @@ -1,5 +1,5 @@ MODULE = windows.devices.enumeration.dll -IMPORTS = combase uuid +IMPORTS = winewinrt combase uuid
C_SRCS = \ access.c \ diff --git a/dlls/windows.devices.enumeration/main.c b/dlls/windows.devices.enumeration/main.c index 03bca4f0118..c87240df2db 100644 --- a/dlls/windows.devices.enumeration/main.c +++ b/dlls/windows.devices.enumeration/main.c @@ -25,15 +25,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(enumeration);
-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 device_watcher { IDeviceWatcher IDeviceWatcher_iface; diff --git a/dlls/windows.devices.enumeration/private.h b/dlls/windows.devices.enumeration/private.h index dd06b25926e..d7bd623e499 100644 --- a/dlls/windows.devices.enumeration/private.h +++ b/dlls/windows.devices.enumeration/private.h @@ -38,54 +38,13 @@ #include "windows.devices.enumeration.h"
#include "wine/list.h" +#include "wine/winrt.h"
extern IActivationFactory *device_access_factory;
-extern const char *debugstr_hstring( HSTRING hstr ); - HRESULT typed_event_handlers_append( struct list *list, ITypedEventHandler_IInspectable_IInspectable *handler, EventRegistrationToken *token ); HRESULT typed_event_handlers_remove( struct list *list, EventRegistrationToken *token ); HRESULT typed_event_handlers_notify( struct list *list, IInspectable *sender, IInspectable *args ); HRESULT typed_event_handlers_clear( struct list *list );
-#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 ) -#define DEFINE_IINSPECTABLE_OUTER( pfx, iface_type, impl_type, outer_iface ) \ - DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from_##iface_type, iface_type##_iface, impl->outer_iface ) - #endif diff --git a/dlls/windows.gaming.input/Makefile.in b/dlls/windows.gaming.input/Makefile.in index 3ec3dd0d864..273587444fb 100644 --- a/dlls/windows.gaming.input/Makefile.in +++ b/dlls/windows.gaming.input/Makefile.in @@ -1,5 +1,5 @@ MODULE = windows.gaming.input.dll -IMPORTS = combase uuid user32 dinput8 setupapi hid +IMPORTS = winewinrt combase uuid user32 dinput8 setupapi hid
C_SRCS = \ async.c \ diff --git a/dlls/windows.gaming.input/private.h b/dlls/windows.gaming.input/private.h index f53d5b5bc37..94904cfce8a 100644 --- a/dlls/windows.gaming.input/private.h +++ b/dlls/windows.gaming.input/private.h @@ -41,6 +41,7 @@
#include "wine/debug.h" #include "wine/list.h" +#include "wine/winrt.h"
#include "provider.h"
@@ -82,46 +83,6 @@ extern HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *para extern HRESULT async_operation_effect_result_create( IUnknown *invoker, IUnknown *param, async_operation_callback callback, IAsyncOperation_ForceFeedbackLoadEffectResult **out );
-#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 ) -#define DEFINE_IINSPECTABLE_OUTER( pfx, iface_type, impl_type, outer_iface ) \ - DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from_##iface_type, iface_type##_iface, impl->outer_iface ) - static inline const char *debugstr_vector3( const Vector3 *vector ) { if (!vector) return "(null)"; diff --git a/dlls/windows.gaming.ui.gamebar/Makefile.in b/dlls/windows.gaming.ui.gamebar/Makefile.in index a0eefc4b951..305bde3be3d 100644 --- a/dlls/windows.gaming.ui.gamebar/Makefile.in +++ b/dlls/windows.gaming.ui.gamebar/Makefile.in @@ -1,5 +1,5 @@ MODULE = windows.gaming.ui.gamebar.dll -IMPORTS = combase uuid +IMPORTS = winewinrt combase uuid
C_SRCS = \ main.c diff --git a/dlls/windows.gaming.ui.gamebar/private.h b/dlls/windows.gaming.ui.gamebar/private.h index 85f87b56e7b..0dd3a969804 100644 --- a/dlls/windows.gaming.ui.gamebar/private.h +++ b/dlls/windows.gaming.ui.gamebar/private.h @@ -30,40 +30,4 @@ #include "activation.h" #include "windows.gaming.ui.h"
-#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 ) +#include "wine/winrt.h" diff --git a/dlls/windows.media.speech/Makefile.in b/dlls/windows.media.speech/Makefile.in index 10903cb1d7b..3cf24580732 100644 --- a/dlls/windows.media.speech/Makefile.in +++ b/dlls/windows.media.speech/Makefile.in @@ -1,5 +1,5 @@ MODULE = windows.media.speech.dll -IMPORTS = combase uuid +IMPORTS = winewinrt combase uuid
C_SRCS = \ async.c \ diff --git a/dlls/windows.media.speech/private.h b/dlls/windows.media.speech/private.h index e80d73ec1fb..79d39f69b8c 100644 --- a/dlls/windows.media.speech/private.h +++ b/dlls/windows.media.speech/private.h @@ -42,6 +42,7 @@ #include "windows.media.speechrecognition.h"
#include "wine/list.h" +#include "wine/winrt.h"
/* * @@ -86,44 +87,4 @@ HRESULT vector_hstring_create( IVector_HSTRING **out ); HRESULT vector_hstring_create_copy( IIterable_HSTRING *iterable, IVector_HSTRING **out ); HRESULT vector_inspectable_create( const struct vector_iids *iids, IVector_IInspectable **out );
-#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 ) -#define DEFINE_IINSPECTABLE_OUTER( pfx, iface_type, impl_type, outer_iface ) \ - DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from_##iface_type, iface_type##_iface, impl->outer_iface ) - #endif diff --git a/dlls/windows.media/Makefile.in b/dlls/windows.media/Makefile.in index be5012c170f..f1832e43bf5 100644 --- a/dlls/windows.media/Makefile.in +++ b/dlls/windows.media/Makefile.in @@ -1,5 +1,5 @@ MODULE = windows.media.dll -IMPORTS = combase +IMPORTS = winewinrt combase
C_SRCS = \ captions.c \ diff --git a/dlls/windows.media/captions.c b/dlls/windows.media/captions.c index b7e07710603..d48445690d8 100644 --- a/dlls/windows.media/captions.c +++ b/dlls/windows.media/captions.c @@ -23,15 +23,6 @@
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; diff --git a/dlls/windows.media/private.h b/dlls/windows.media/private.h index d6353dede56..1af85adf54b 100644 --- a/dlls/windows.media/private.h +++ b/dlls/windows.media/private.h @@ -37,46 +37,8 @@ #define WIDL_using_Windows_Media_ClosedCaptioning #include "windows.media.closedcaptioning.h"
-extern const char *debugstr_hstring( HSTRING hstr ); +#include "wine/winrt.h"
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.perception.stub/Makefile.in b/dlls/windows.perception.stub/Makefile.in index c19496cdd66..bca60da63b7 100644 --- a/dlls/windows.perception.stub/Makefile.in +++ b/dlls/windows.perception.stub/Makefile.in @@ -1,5 +1,5 @@ MODULE = windows.perception.stub.dll -IMPORTS = combase +IMPORTS = winewinrt combase
C_SRCS = \ main.c \ diff --git a/dlls/windows.perception.stub/main.c b/dlls/windows.perception.stub/main.c index 094b1b60654..5b7ace09332 100644 --- a/dlls/windows.perception.stub/main.c +++ b/dlls/windows.perception.stub/main.c @@ -24,15 +24,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(perception);
-static 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 ); -} - 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 ); diff --git a/dlls/windows.perception.stub/private.h b/dlls/windows.perception.stub/private.h index a32f8221380..bd0efdaf1c7 100644 --- a/dlls/windows.perception.stub/private.h +++ b/dlls/windows.perception.stub/private.h @@ -35,44 +35,8 @@ #define WIDL_using_Windows_Perception_Spatial_Surfaces #include "windows.perception.spatial.surfaces.h"
-extern IActivationFactory *observer_factory; +#include "wine/winrt.h"
-#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 ) +extern IActivationFactory *observer_factory;
#endif diff --git a/dlls/windows.system.profile.systemmanufacturers/Makefile.in b/dlls/windows.system.profile.systemmanufacturers/Makefile.in index 9d07caa287c..8ad1f35e5d2 100644 --- a/dlls/windows.system.profile.systemmanufacturers/Makefile.in +++ b/dlls/windows.system.profile.systemmanufacturers/Makefile.in @@ -1,5 +1,5 @@ MODULE = windows.system.profile.systemmanufacturers.dll -IMPORTS = combase oleaut32 +IMPORTS = winewinrt combase oleaut32
C_SRCS = \ main.c diff --git a/dlls/windows.system.profile.systemmanufacturers/main.c b/dlls/windows.system.profile.systemmanufacturers/main.c index d2feb32054e..ba30d84e00b 100644 --- a/dlls/windows.system.profile.systemmanufacturers/main.c +++ b/dlls/windows.system.profile.systemmanufacturers/main.c @@ -24,15 +24,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(smbios);
-static 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 smbios_statics { IActivationFactory IActivationFactory_iface; diff --git a/dlls/windows.system.profile.systemmanufacturers/private.h b/dlls/windows.system.profile.systemmanufacturers/private.h index 374a2829130..a3d5a552d48 100644 --- a/dlls/windows.system.profile.systemmanufacturers/private.h +++ b/dlls/windows.system.profile.systemmanufacturers/private.h @@ -32,40 +32,4 @@
#include "wbemcli.h"
-#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 ) +#include "wine/winrt.h" diff --git a/include/Makefile.in b/include/Makefile.in index 27360fa5f21..97d4466d36b 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -882,6 +882,7 @@ SOURCES = \ wine/winedxgi.idl \ wine/wingdi16.h \ wine/winnet16.h \ + wine/winrt.idl \ wine/winuser16.h \ winerror.h \ winevt.h \ diff --git a/include/wine/winrt.idl b/include/wine/winrt.idl new file mode 100644 index 00000000000..e64ae3fc328 --- /dev/null +++ b/include/wine/winrt.idl @@ -0,0 +1,70 @@ +/* WinRT implementation + * + * Copyright 2022 Rémi Bernon 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 + */ + +#if 0 +#pragma makedep header +#endif + +#ifdef __WIDL__ +#pragma winrt ns_prefix +#endif + +import "windows.foundation.idl"; + +extern const char *debugstr_hstring( HSTRING hstr ); + +cpp_quote("#define DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from, iface_mem, expr ) \") +cpp_quote(" static inline impl_type *impl_from( iface_type *iface ) \") +cpp_quote(" { \") +cpp_quote(" return CONTAINING_RECORD( iface, impl_type, iface_mem ); \") +cpp_quote(" } \") +cpp_quote(" static HRESULT WINAPI pfx##_QueryInterface( iface_type *iface, REFIID iid, void **out ) \") +cpp_quote(" { \") +cpp_quote(" impl_type *impl = impl_from( iface ); \") +cpp_quote(" return IInspectable_QueryInterface( (IInspectable *)(expr), iid, out ); \") +cpp_quote(" } \") +cpp_quote(" static ULONG WINAPI pfx##_AddRef( iface_type *iface ) \") +cpp_quote(" { \") +cpp_quote(" impl_type *impl = impl_from( iface ); \") +cpp_quote(" return IInspectable_AddRef( (IInspectable *)(expr) ); \") +cpp_quote(" } \") +cpp_quote(" static ULONG WINAPI pfx##_Release( iface_type *iface ) \") +cpp_quote(" { \") +cpp_quote(" impl_type *impl = impl_from( iface ); \") +cpp_quote(" return IInspectable_Release( (IInspectable *)(expr) ); \") +cpp_quote(" } \") +cpp_quote(" static HRESULT WINAPI pfx##_GetIids( iface_type *iface, ULONG *iid_count, IID **iids ) \") +cpp_quote(" { \") +cpp_quote(" impl_type *impl = impl_from( iface ); \") +cpp_quote(" return IInspectable_GetIids( (IInspectable *)(expr), iid_count, iids ); \") +cpp_quote(" } \") +cpp_quote(" static HRESULT WINAPI pfx##_GetRuntimeClassName( iface_type *iface, HSTRING *class_name ) \") +cpp_quote(" { \") +cpp_quote(" impl_type *impl = impl_from( iface ); \") +cpp_quote(" return IInspectable_GetRuntimeClassName( (IInspectable *)(expr), class_name ); \") +cpp_quote(" } \") +cpp_quote(" static HRESULT WINAPI pfx##_GetTrustLevel( iface_type *iface, TrustLevel *trust_level ) \") +cpp_quote(" { \") +cpp_quote(" impl_type *impl = impl_from( iface ); \") +cpp_quote(" return IInspectable_GetTrustLevel( (IInspectable *)(expr), trust_level ); \") +cpp_quote(" }") +cpp_quote("#define DEFINE_IINSPECTABLE( pfx, iface_type, impl_type, base_iface ) \") +cpp_quote(" DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from_##iface_type, iface_type##_iface, &impl->base_iface )") +cpp_quote("#define DEFINE_IINSPECTABLE_OUTER( pfx, iface_type, impl_type, outer_iface ) \") +cpp_quote(" DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from_##iface_type, iface_type##_iface, impl->outer_iface )") diff --git a/libs/winewinrt/Makefile.in b/libs/winewinrt/Makefile.in new file mode 100644 index 00000000000..7c0f2c668d3 --- /dev/null +++ b/libs/winewinrt/Makefile.in @@ -0,0 +1,4 @@ +STATICLIB = libwinewinrt.a + +C_SRCS = \ + debug.c diff --git a/libs/winewinrt/debug.c b/libs/winewinrt/debug.c new file mode 100644 index 00000000000..99f2d28da29 --- /dev/null +++ b/libs/winewinrt/debug.c @@ -0,0 +1,28 @@ +/* + * Copyright 2022 Rémi Bernon 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 "private.h" + +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 ); +} diff --git a/libs/winewinrt/private.h b/libs/winewinrt/private.h new file mode 100644 index 00000000000..0b7ef8f9a8e --- /dev/null +++ b/libs/winewinrt/private.h @@ -0,0 +1,35 @@ +/* + * Copyright 2022 Rémi Bernon 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 <stdarg.h> +#include <stddef.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 +#define WIDL_using_Windows_Foundation_Numerics +#include "windows.foundation.h" + +#include "wine/debug.h" +#include "wine/list.h" +#include "wine/winrt.h"
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/windows.gaming.input/Makefile.in | 1 - dlls/windows.gaming.input/controller.c | 4 +- dlls/windows.gaming.input/gamepad.c | 2 +- dlls/windows.gaming.input/private.h | 9 - dlls/windows.gaming.input/racing_wheel.c | 2 +- dlls/windows.media.speech/private.h | 10 - dlls/windows.media.speech/recognizer.c | 2 +- dlls/windows.media.speech/synthesizer.c | 2 +- dlls/windows.media.speech/vector.c | 689 ------------------ include/wine/winrt.idl | 10 + libs/winewinrt/Makefile.in | 3 +- .../winewinrt/vector_inspectable.c | 322 ++++---- 12 files changed, 182 insertions(+), 874 deletions(-) rename dlls/windows.gaming.input/vector.c => libs/winewinrt/vector_inspectable.c (50%)
diff --git a/dlls/windows.gaming.input/Makefile.in b/dlls/windows.gaming.input/Makefile.in index 273587444fb..c7d1c2578e1 100644 --- a/dlls/windows.gaming.input/Makefile.in +++ b/dlls/windows.gaming.input/Makefile.in @@ -15,7 +15,6 @@ C_SRCS = \ provider.c \ racing_wheel.c \ ramp_effect.c \ - vector.c
IDL_SRCS = \ classes.idl \ diff --git a/dlls/windows.gaming.input/controller.c b/dlls/windows.gaming.input/controller.c index bd3d441c445..86e4d3bd030 100644 --- a/dlls/windows.gaming.input/controller.c +++ b/dlls/windows.gaming.input/controller.c @@ -50,7 +50,7 @@ static HRESULT init_controllers(void)
EnterCriticalSection( &controller_cs ); if (controllers) hr = S_OK; - else hr = vector_create( &iids, (void **)&controllers ); + else hr = vector_inspectable_create( &iids, (void **)&controllers ); LeaveCriticalSection( &controller_cs );
return hr; @@ -243,7 +243,7 @@ static HRESULT WINAPI raw_controller_get_ForceFeedbackMotors( IRawGameController
TRACE( "iface %p, value %p\n", iface, value );
- if (FAILED(hr = vector_create( &iids, (void **)&vector ))) return hr; + if (FAILED(hr = vector_inspectable_create( &iids, (void **)&vector ))) return hr;
if (SUCCEEDED(IWineGameControllerProvider_get_ForceFeedbackMotor( impl->wine_provider, &motor )) && motor) { diff --git a/dlls/windows.gaming.input/gamepad.c b/dlls/windows.gaming.input/gamepad.c index 112ec49a1d3..389659311ed 100644 --- a/dlls/windows.gaming.input/gamepad.c +++ b/dlls/windows.gaming.input/gamepad.c @@ -50,7 +50,7 @@ static HRESULT init_gamepads(void)
EnterCriticalSection( &gamepad_cs ); if (gamepads) hr = S_OK; - else hr = vector_create( &iids, (void **)&gamepads ); + else hr = vector_inspectable_create( &iids, (void **)&gamepads ); LeaveCriticalSection( &gamepad_cs );
return hr; diff --git a/dlls/windows.gaming.input/private.h b/dlls/windows.gaming.input/private.h index 94904cfce8a..fd1335c689a 100644 --- a/dlls/windows.gaming.input/private.h +++ b/dlls/windows.gaming.input/private.h @@ -55,15 +55,6 @@ extern IInspectable *ramp_effect_factory; extern IInspectable *periodic_effect_factory; extern IInspectable *condition_effect_factory;
-struct vector_iids -{ - const GUID *vector; - const GUID *view; - const GUID *iterable; - const GUID *iterator; -}; -extern HRESULT vector_create( const struct vector_iids *iids, void **out ); - extern void provider_create( const WCHAR *device_path ); extern void provider_remove( const WCHAR *device_path );
diff --git a/dlls/windows.gaming.input/racing_wheel.c b/dlls/windows.gaming.input/racing_wheel.c index d646ca26c03..5f186fa9e9f 100644 --- a/dlls/windows.gaming.input/racing_wheel.c +++ b/dlls/windows.gaming.input/racing_wheel.c @@ -50,7 +50,7 @@ static HRESULT init_racing_wheels(void)
EnterCriticalSection( &racing_wheel_cs ); if (racing_wheels) hr = S_OK; - else hr = vector_create( &iids, (void **)&racing_wheels ); + else hr = vector_inspectable_create( &iids, (void **)&racing_wheels ); LeaveCriticalSection( &racing_wheel_cs );
return hr; diff --git a/dlls/windows.media.speech/private.h b/dlls/windows.media.speech/private.h index 79d39f69b8c..f41024e2fe2 100644 --- a/dlls/windows.media.speech/private.h +++ b/dlls/windows.media.speech/private.h @@ -62,15 +62,6 @@ extern IActivationFactory *recognizer_factory; extern IActivationFactory *synthesizer_factory;
- -struct vector_iids -{ - const GUID *iterable; - const GUID *iterator; - const GUID *vector; - const GUID *view; -}; - typedef HRESULT (*async_action_callback)( IInspectable *invoker ); typedef HRESULT (*async_operation_inspectable_callback)( IInspectable *invoker, IInspectable **result );
@@ -85,6 +76,5 @@ HRESULT typed_event_handlers_clear( struct list* list );
HRESULT vector_hstring_create( IVector_HSTRING **out ); HRESULT vector_hstring_create_copy( IIterable_HSTRING *iterable, IVector_HSTRING **out ); -HRESULT vector_inspectable_create( const struct vector_iids *iids, IVector_IInspectable **out );
#endif diff --git a/dlls/windows.media.speech/recognizer.c b/dlls/windows.media.speech/recognizer.c index c2f386206b8..25f37a6d9d1 100644 --- a/dlls/windows.media.speech/recognizer.c +++ b/dlls/windows.media.speech/recognizer.c @@ -1119,7 +1119,7 @@ static HRESULT WINAPI recognizer_factory_Create( ISpeechRecognizerFactory *iface goto error; }
- if (FAILED(hr = vector_inspectable_create(&constraints_iids, (IVector_IInspectable**)&session->constraints))) + if (FAILED(hr = vector_inspectable_create(&constraints_iids, (void **)&session->constraints))) goto error;
if (FAILED(hr = recognizer_factory_create_audio_capture(session))) diff --git a/dlls/windows.media.speech/synthesizer.c b/dlls/windows.media.speech/synthesizer.c index 39d14b84ab7..b50be746d0f 100644 --- a/dlls/windows.media.speech/synthesizer.c +++ b/dlls/windows.media.speech/synthesizer.c @@ -268,7 +268,7 @@ static HRESULT synthesis_stream_create( ISpeechSynthesisStream **out )
impl->ISpeechSynthesisStream_iface.lpVtbl = &synthesis_stream_vtbl; impl->ref = 1; - if (FAILED(hr = vector_inspectable_create(&markers_iids, (IVector_IInspectable**)&impl->markers))) + if (FAILED(hr = vector_inspectable_create(&markers_iids, (void **)&impl->markers))) goto error;
TRACE("created ISpeechSynthesisStream %p.\n", impl); diff --git a/dlls/windows.media.speech/vector.c b/dlls/windows.media.speech/vector.c index c23fb9dc56e..61b63077d62 100644 --- a/dlls/windows.media.speech/vector.c +++ b/dlls/windows.media.speech/vector.c @@ -773,692 +773,3 @@ error: IVector_HSTRING_Release(*out); return hr; } - -/* - * - * IIterator<Inspectable*> - * - */ - -struct iterator_inspectable -{ - IIterator_IInspectable IIterator_IInspectable_iface; - const GUID *iid; - LONG ref; - - IVectorView_IInspectable *view; - UINT32 index; - UINT32 size; -}; - -static inline struct iterator_inspectable *impl_from_IIterator_IInspectable( IIterator_IInspectable *iface ) -{ - return CONTAINING_RECORD(iface, struct iterator_inspectable, IIterator_IInspectable_iface); -} - -static HRESULT WINAPI iterator_inspectable_QueryInterface( IIterator_IInspectable *iface, REFIID iid, void **out ) -{ - struct iterator_inspectable *impl = impl_from_IIterator_IInspectable(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_IAgileObject) || - IsEqualGUID(iid, impl->iid)) - { - IInspectable_AddRef((*out = &impl->IIterator_IInspectable_iface)); - return S_OK; - } - - WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); - *out = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI iterator_inspectable_AddRef( IIterator_IInspectable *iface ) -{ - struct iterator_inspectable *impl = impl_from_IIterator_IInspectable(iface); - ULONG ref = InterlockedIncrement(&impl->ref); - TRACE("iface %p increasing refcount to %lu.\n", iface, ref); - return ref; -} - -static ULONG WINAPI iterator_inspectable_Release( IIterator_IInspectable *iface ) -{ - struct iterator_inspectable *impl = impl_from_IIterator_IInspectable(iface); - ULONG ref = InterlockedDecrement(&impl->ref); - - TRACE("iface %p decreasing refcount to %lu.\n", iface, ref); - - if (!ref) - { - IVectorView_IInspectable_Release(impl->view); - free(impl); - } - - return ref; -} - -static HRESULT WINAPI iterator_inspectable_GetIids( IIterator_IInspectable *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 iterator_inspectable_GetRuntimeClassName( IIterator_IInspectable *iface, HSTRING *class_name ) -{ - FIXME("iface %p, class_name %p stub!\n", iface, class_name); - return E_NOTIMPL; -} - -static HRESULT WINAPI iterator_inspectable_GetTrustLevel( IIterator_IInspectable *iface, TrustLevel *trust_level ) -{ - FIXME("iface %p, trust_level %p stub!\n", iface, trust_level); - return E_NOTIMPL; -} - -static HRESULT WINAPI iterator_inspectable_get_Current( IIterator_IInspectable *iface, IInspectable **value ) -{ - struct iterator_inspectable *impl = impl_from_IIterator_IInspectable(iface); - TRACE("iface %p, value %p.\n", iface, value); - return IVectorView_IInspectable_GetAt(impl->view, impl->index, value); -} - -static HRESULT WINAPI iterator_inspectable_get_HasCurrent( IIterator_IInspectable *iface, BOOL *value ) -{ - struct iterator_inspectable *impl = impl_from_IIterator_IInspectable(iface); - - TRACE("iface %p, value %p.\n", iface, value); - - *value = impl->index < impl->size; - return S_OK; -} - -static HRESULT WINAPI iterator_inspectable_MoveNext( IIterator_IInspectable *iface, BOOL *value ) -{ - struct iterator_inspectable *impl = impl_from_IIterator_IInspectable(iface); - - TRACE("iface %p, value %p.\n", iface, value); - - if (impl->index < impl->size) impl->index++; - return IIterator_IInspectable_get_HasCurrent(iface, value); -} - -static HRESULT WINAPI iterator_inspectable_GetMany( IIterator_IInspectable *iface, UINT32 items_size, - IInspectable **items, UINT *count ) -{ - struct iterator_inspectable *impl = impl_from_IIterator_IInspectable(iface); - TRACE("iface %p, items_size %u, items %p, count %p.\n", iface, items_size, items, count); - return IVectorView_IInspectable_GetMany(impl->view, impl->index, items_size, items, count); -} - -static const IIterator_IInspectableVtbl iterator_inspectable_vtbl = -{ - /* IUnknown methods */ - iterator_inspectable_QueryInterface, - iterator_inspectable_AddRef, - iterator_inspectable_Release, - /* IInspectable methods */ - iterator_inspectable_GetIids, - iterator_inspectable_GetRuntimeClassName, - iterator_inspectable_GetTrustLevel, - /* IIterator<IInspectable*> methods */ - iterator_inspectable_get_Current, - iterator_inspectable_get_HasCurrent, - iterator_inspectable_MoveNext, - iterator_inspectable_GetMany -}; - -/* - * - * IVectorView<Inspectable*> - * - */ - -struct vector_view_inspectable -{ - IVectorView_IInspectable IVectorView_IInspectable_iface; - IIterable_IInspectable IIterable_IInspectable_iface; - struct vector_iids iids; - LONG ref; - - UINT32 size; - IInspectable *elements[]; -}; - -C_ASSERT(sizeof(struct vector_view_inspectable) == offsetof(struct vector_view_inspectable, elements[0])); - -static inline struct vector_view_inspectable *impl_from_IVectorView_IInspectable( IVectorView_IInspectable *iface ) -{ - return CONTAINING_RECORD(iface, struct vector_view_inspectable, IVectorView_IInspectable_iface); -} - -static HRESULT WINAPI vector_view_inspectable_QueryInterface( IVectorView_IInspectable *iface, REFIID iid, void **out ) -{ - struct vector_view_inspectable *impl = impl_from_IVectorView_IInspectable(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_IAgileObject) || - IsEqualGUID(iid, impl->iids.view)) - { - IInspectable_AddRef((*out = &impl->IVectorView_IInspectable_iface)); - return S_OK; - } - - if (IsEqualGUID(iid, impl->iids.iterable)) - { - IInspectable_AddRef((*out = &impl->IIterable_IInspectable_iface)); - return S_OK; - } - - WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); - *out = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI vector_view_inspectable_AddRef( IVectorView_IInspectable *iface ) -{ - struct vector_view_inspectable *impl = impl_from_IVectorView_IInspectable(iface); - ULONG ref = InterlockedIncrement(&impl->ref); - TRACE("iface %p increasing refcount to %lu.\n", iface, ref); - return ref; -} - -static ULONG WINAPI vector_view_inspectable_Release( IVectorView_IInspectable *iface ) -{ - struct vector_view_inspectable *impl = impl_from_IVectorView_IInspectable(iface); - ULONG i, ref = InterlockedDecrement(&impl->ref); - - TRACE("iface %p decreasing refcount to %lu.\n", iface, ref); - - if (!ref) - { - for (i = 0; i < impl->size; ++i) IInspectable_Release(impl->elements[i]); - free(impl); - } - - return ref; -} - -static HRESULT WINAPI vector_view_inspectable_GetIids( IVectorView_IInspectable *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 vector_view_inspectable_GetRuntimeClassName( IVectorView_IInspectable *iface, HSTRING *class_name ) -{ - FIXME("iface %p, class_name %p stub!\n", iface, class_name); - return E_NOTIMPL; -} - -static HRESULT WINAPI vector_view_inspectable_GetTrustLevel( IVectorView_IInspectable *iface, TrustLevel *trust_level ) -{ - FIXME("iface %p, trust_level %p stub!\n", iface, trust_level); - return E_NOTIMPL; -} - -static HRESULT WINAPI vector_view_inspectable_GetAt( IVectorView_IInspectable *iface, UINT32 index, IInspectable **value ) -{ - struct vector_view_inspectable *impl = impl_from_IVectorView_IInspectable(iface); - - TRACE("iface %p, index %u, value %p.\n", iface, index, value); - - *value = NULL; - if (index >= impl->size) return E_BOUNDS; - - IInspectable_AddRef((*value = impl->elements[index])); - return S_OK; -} - -static HRESULT WINAPI vector_view_inspectable_get_Size( IVectorView_IInspectable *iface, UINT32 *value ) -{ - struct vector_view_inspectable *impl = impl_from_IVectorView_IInspectable(iface); - - TRACE("iface %p, value %p.\n", iface, value); - - *value = impl->size; - return S_OK; -} - -static HRESULT WINAPI vector_view_inspectable_IndexOf( IVectorView_IInspectable *iface, IInspectable *element, - UINT32 *index, BOOLEAN *found ) -{ - struct vector_view_inspectable *impl = impl_from_IVectorView_IInspectable(iface); - ULONG i; - - TRACE("iface %p, element %p, index %p, found %p.\n", iface, element, index, found); - - for (i = 0; i < impl->size; ++i) if (impl->elements[i] == element) break; - if ((*found = (i < impl->size))) *index = i; - else *index = 0; - - return S_OK; -} - -static HRESULT WINAPI vector_view_inspectable_GetMany( IVectorView_IInspectable *iface, UINT32 start_index, - UINT32 items_size, IInspectable **items, UINT *count ) -{ - struct vector_view_inspectable *impl = impl_from_IVectorView_IInspectable(iface); - UINT32 i; - - TRACE("iface %p, start_index %u, items_size %u, items %p, count %p.\n", - iface, start_index, items_size, items, count); - - if (start_index >= impl->size) return E_BOUNDS; - - for (i = start_index; i < impl->size; ++i) - { - if (i - start_index >= items_size) break; - IInspectable_AddRef((items[i - start_index] = impl->elements[i])); - } - *count = i - start_index; - - return S_OK; -} - -static const struct IVectorView_IInspectableVtbl vector_view_inspectable_vtbl = -{ - /* IUnknown methods */ - vector_view_inspectable_QueryInterface, - vector_view_inspectable_AddRef, - vector_view_inspectable_Release, - /* IInspectable methods */ - vector_view_inspectable_GetIids, - vector_view_inspectable_GetRuntimeClassName, - vector_view_inspectable_GetTrustLevel, - /* IVectorView<IInspectable*> methods */ - vector_view_inspectable_GetAt, - vector_view_inspectable_get_Size, - vector_view_inspectable_IndexOf, - vector_view_inspectable_GetMany -}; - -/* - * - * IIterable<Inspectable*> - * - */ - -DEFINE_IINSPECTABLE_(iterable_view_inspectable, IIterable_IInspectable, struct vector_view_inspectable, - view_impl_from_IIterable_IInspectable, IIterable_IInspectable_iface, &impl->IVectorView_IInspectable_iface) - -static HRESULT WINAPI iterable_view_inspectable_First( IIterable_IInspectable *iface, IIterator_IInspectable **value ) -{ - struct vector_view_inspectable *impl = view_impl_from_IIterable_IInspectable(iface); - struct iterator_inspectable *iter; - - TRACE("iface %p, value %p.\n", iface, value); - - if (!(iter = calloc(1, sizeof(struct iterator_inspectable)))) return E_OUTOFMEMORY; - iter->IIterator_IInspectable_iface.lpVtbl = &iterator_inspectable_vtbl; - iter->iid = impl->iids.iterator; - iter->ref = 1; - - IVectorView_IInspectable_AddRef((iter->view = &impl->IVectorView_IInspectable_iface)); - iter->size = impl->size; - - *value = &iter->IIterator_IInspectable_iface; - return S_OK; -} - -static const struct IIterable_IInspectableVtbl iterable_view_inspectable_vtbl = -{ - /* IUnknown methods */ - iterable_view_inspectable_QueryInterface, - iterable_view_inspectable_AddRef, - iterable_view_inspectable_Release, - /* IInspectable methods */ - iterable_view_inspectable_GetIids, - iterable_view_inspectable_GetRuntimeClassName, - iterable_view_inspectable_GetTrustLevel, - /* IIterable<IInspectable*> methods */ - iterable_view_inspectable_First -}; - -/* - * - * IVector<Inspectable*> - * - */ - -struct vector_inspectable -{ - IVector_IInspectable IVector_IInspectable_iface; - IIterable_IInspectable IIterable_IInspectable_iface; - struct vector_iids iids; - LONG ref; - - UINT32 size; - UINT32 capacity; - IInspectable **elements; -}; - -static inline struct vector_inspectable *impl_from_IVector_IInspectable( IVector_IInspectable *iface ) -{ - return CONTAINING_RECORD(iface, struct vector_inspectable, IVector_IInspectable_iface); -} - -static HRESULT WINAPI vector_inspectable_QueryInterface( IVector_IInspectable *iface, REFIID iid, void **out ) -{ - struct vector_inspectable *impl = impl_from_IVector_IInspectable(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_IAgileObject) || - IsEqualGUID(iid, impl->iids.vector)) - { - IInspectable_AddRef((*out = &impl->IVector_IInspectable_iface)); - return S_OK; - } - - if (IsEqualGUID(iid, impl->iids.iterable)) - { - IInspectable_AddRef((*out = &impl->IIterable_IInspectable_iface)); - return S_OK; - } - - WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); - *out = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI vector_inspectable_AddRef( IVector_IInspectable *iface ) -{ - struct vector_inspectable *impl = impl_from_IVector_IInspectable(iface); - ULONG ref = InterlockedIncrement(&impl->ref); - TRACE("iface %p increasing refcount to %lu.\n", iface, ref); - return ref; -} - -static ULONG WINAPI vector_inspectable_Release( IVector_IInspectable *iface ) -{ - struct vector_inspectable *impl = impl_from_IVector_IInspectable(iface); - ULONG ref = InterlockedDecrement(&impl->ref); - - TRACE("iface %p decreasing refcount to %lu.\n", iface, ref); - - if (!ref) - { - IVector_IInspectable_Clear(iface); - free(impl); - } - - return ref; -} - -static HRESULT WINAPI vector_inspectable_GetIids( IVector_IInspectable *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 vector_inspectable_GetRuntimeClassName( IVector_IInspectable *iface, HSTRING *class_name ) -{ - FIXME("iface %p, class_name %p stub!\n", iface, class_name); - return E_NOTIMPL; -} - -static HRESULT WINAPI vector_inspectable_GetTrustLevel( IVector_IInspectable *iface, TrustLevel *trust_level ) -{ - FIXME("iface %p, trust_level %p stub!\n", iface, trust_level); - return E_NOTIMPL; -} - -static HRESULT WINAPI vector_inspectable_GetAt( IVector_IInspectable *iface, UINT32 index, IInspectable **value ) -{ - struct vector_inspectable *impl = impl_from_IVector_IInspectable(iface); - - TRACE("iface %p, index %u, value %p.\n", iface, index, value); - - *value = NULL; - if (index >= impl->size) return E_BOUNDS; - - IInspectable_AddRef((*value = impl->elements[index])); - return S_OK; -} - -static HRESULT WINAPI vector_inspectable_get_Size( IVector_IInspectable *iface, UINT32 *value ) -{ - struct vector_inspectable *impl = impl_from_IVector_IInspectable(iface); - TRACE("iface %p, value %p.\n", iface, value); - *value = impl->size; - return S_OK; -} - -static HRESULT WINAPI vector_inspectable_GetView( IVector_IInspectable *iface, IVectorView_IInspectable **value ) -{ - struct vector_inspectable *impl = impl_from_IVector_IInspectable(iface); - struct vector_view_inspectable *view; - ULONG i; - - TRACE("iface %p, value %p.\n", iface, value); - - if (!(view = calloc(1, offsetof(struct vector_view_inspectable, elements[impl->size])))) return E_OUTOFMEMORY; - view->IVectorView_IInspectable_iface.lpVtbl = &vector_view_inspectable_vtbl; - view->IIterable_IInspectable_iface.lpVtbl = &iterable_view_inspectable_vtbl; - view->iids = impl->iids; - view->ref = 1; - - for (i = 0; i < impl->size; ++i) IInspectable_AddRef((view->elements[view->size++] = impl->elements[i])); - - *value = &view->IVectorView_IInspectable_iface; - return S_OK; -} - -static HRESULT WINAPI vector_inspectable_IndexOf( IVector_IInspectable *iface, - IInspectable *element, UINT32 *index, BOOLEAN *found ) -{ - struct vector_inspectable *impl = impl_from_IVector_IInspectable(iface); - ULONG i; - - TRACE("iface %p, element %p, index %p, found %p.\n", iface, element, index, found); - - for (i = 0; i < impl->size; ++i) if (impl->elements[i] == element) break; - if ((*found = (i < impl->size))) *index = i; - else *index = 0; - - return S_OK; -} - -static HRESULT WINAPI vector_inspectable_SetAt( IVector_IInspectable *iface, UINT32 index, IInspectable *value ) -{ - struct vector_inspectable *impl = impl_from_IVector_IInspectable(iface); - - TRACE("iface %p, index %u, value %p.\n", iface, index, value); - - if (index >= impl->size) return E_BOUNDS; - IInspectable_Release(impl->elements[index]); - IInspectable_AddRef((impl->elements[index] = value)); - return S_OK; -} - -static HRESULT WINAPI vector_inspectable_InsertAt( IVector_IInspectable *iface, UINT32 index, IInspectable *value ) -{ - struct vector_inspectable *impl = impl_from_IVector_IInspectable(iface); - IInspectable **tmp = impl->elements; - - TRACE("iface %p, index %u, value %p.\n", iface, index, value); - - if (impl->size == impl->capacity) - { - impl->capacity = max(32, impl->capacity * 3 / 2); - if (!(impl->elements = realloc(impl->elements, impl->capacity * sizeof(*impl->elements)))) - { - impl->elements = tmp; - return E_OUTOFMEMORY; - } - } - - memmove(impl->elements + index + 1, impl->elements + index, (impl->size++ - index) * sizeof(*impl->elements)); - IInspectable_AddRef((impl->elements[index] = value)); - return S_OK; -} - -static HRESULT WINAPI vector_inspectable_RemoveAt( IVector_IInspectable *iface, UINT32 index ) -{ - struct vector_inspectable *impl = impl_from_IVector_IInspectable(iface); - - TRACE("iface %p, index %u.\n", iface, index); - - if (index >= impl->size) return E_BOUNDS; - IInspectable_Release(impl->elements[index]); - memmove(impl->elements + index, impl->elements + index + 1, (--impl->size - index) * sizeof(*impl->elements)); - return S_OK; -} - -static HRESULT WINAPI vector_inspectable_Append( IVector_IInspectable *iface, IInspectable *value ) -{ - struct vector_inspectable *impl = impl_from_IVector_IInspectable(iface); - - TRACE("iface %p, value %p.\n", iface, value); - - return IVector_IInspectable_InsertAt(iface, impl->size, value); -} - -static HRESULT WINAPI vector_inspectable_RemoveAtEnd( IVector_IInspectable *iface ) -{ - struct vector_inspectable *impl = impl_from_IVector_IInspectable(iface); - - TRACE("iface %p.\n", iface); - - if (impl->size) IInspectable_Release(impl->elements[--impl->size]); - return S_OK; -} - -static HRESULT WINAPI vector_inspectable_Clear( IVector_IInspectable *iface ) -{ - struct vector_inspectable *impl = impl_from_IVector_IInspectable(iface); - - TRACE("iface %p.\n", iface); - - while (impl->size) IVector_IInspectable_RemoveAtEnd(iface); - free(impl->elements); - impl->capacity = 0; - impl->elements = NULL; - - return S_OK; -} - -static HRESULT WINAPI vector_inspectable_GetMany( IVector_IInspectable *iface, UINT32 start_index, - UINT32 items_size, IInspectable **items, UINT *count ) -{ - struct vector_inspectable *impl = impl_from_IVector_IInspectable(iface); - UINT32 i; - - TRACE("iface %p, start_index %u, items_size %u, items %p, count %p.\n", - iface, start_index, items_size, items, count); - - if (start_index >= impl->size) return E_BOUNDS; - - for (i = start_index; i < impl->size; ++i) - { - if (i - start_index >= items_size) break; - IInspectable_AddRef((items[i - start_index] = impl->elements[i])); - } - *count = i - start_index; - - return S_OK; -} - -static HRESULT WINAPI vector_inspectable_ReplaceAll( IVector_IInspectable *iface, UINT32 count, IInspectable **items ) -{ - HRESULT hr; - ULONG i; - - TRACE("iface %p, count %u, items %p.\n", iface, count, items); - - hr = IVector_IInspectable_Clear(iface); - for (i = 0; i < count && SUCCEEDED(hr); ++i) hr = IVector_IInspectable_Append(iface, items[i]); - return hr; -} - -static const struct IVector_IInspectableVtbl vector_inspectable_vtbl = -{ - /* IUnknown methods */ - vector_inspectable_QueryInterface, - vector_inspectable_AddRef, - vector_inspectable_Release, - /* IInspectable methods */ - vector_inspectable_GetIids, - vector_inspectable_GetRuntimeClassName, - vector_inspectable_GetTrustLevel, - /* IVector<IInspectable*> methods */ - vector_inspectable_GetAt, - vector_inspectable_get_Size, - vector_inspectable_GetView, - vector_inspectable_IndexOf, - vector_inspectable_SetAt, - vector_inspectable_InsertAt, - vector_inspectable_RemoveAt, - vector_inspectable_Append, - vector_inspectable_RemoveAtEnd, - vector_inspectable_Clear, - vector_inspectable_GetMany, - vector_inspectable_ReplaceAll -}; - -/* - * - * IIterable<Inspectable*> - * - */ - -DEFINE_IINSPECTABLE(iterable_inspectable, IIterable_IInspectable, struct vector_inspectable, IVector_IInspectable_iface) - -static HRESULT WINAPI iterable_inspectable_First( IIterable_IInspectable *iface, IIterator_IInspectable **value ) -{ - struct vector_inspectable *impl = impl_from_IIterable_IInspectable(iface); - IIterable_IInspectable *iterable; - IVectorView_IInspectable *view; - HRESULT hr; - - TRACE("iface %p, value %p.\n", iface, value); - - if (FAILED(hr = IVector_IInspectable_GetView(&impl->IVector_IInspectable_iface, &view))) return hr; - - hr = IVectorView_IInspectable_QueryInterface(view, impl->iids.iterable, (void **)&iterable); - IVectorView_IInspectable_Release(view); - if (FAILED(hr)) return hr; - - hr = IIterable_IInspectable_First(iterable, value); - IIterable_IInspectable_Release(iterable); - return hr; -} - -static const struct IIterable_IInspectableVtbl iterable_inspectable_vtbl = -{ - /* IUnknown methods */ - iterable_inspectable_QueryInterface, - iterable_inspectable_AddRef, - iterable_inspectable_Release, - /* IInspectable methods */ - iterable_inspectable_GetIids, - iterable_inspectable_GetRuntimeClassName, - iterable_inspectable_GetTrustLevel, - /* IIterable<IInspectable*> methods */ - iterable_inspectable_First -}; - -HRESULT vector_inspectable_create( const struct vector_iids *iids, IVector_IInspectable **out ) -{ - struct vector_inspectable *impl; - - TRACE("iid %s, out %p.\n", debugstr_guid(iids->vector), out); - - if (!(impl = calloc(1, sizeof(*impl)))) return E_OUTOFMEMORY; - impl->IVector_IInspectable_iface.lpVtbl = &vector_inspectable_vtbl; - impl->IIterable_IInspectable_iface.lpVtbl = &iterable_inspectable_vtbl; - impl->iids = *iids; - impl->ref = 1; - - *out = &impl->IVector_IInspectable_iface; - TRACE("created %p\n", *out); - return S_OK; -} diff --git a/include/wine/winrt.idl b/include/wine/winrt.idl index e64ae3fc328..9a4285dd70f 100644 --- a/include/wine/winrt.idl +++ b/include/wine/winrt.idl @@ -27,6 +27,16 @@
import "windows.foundation.idl";
+struct vector_iids +{ + const GUID *vector; + const GUID *view; + const GUID *iterable; + const GUID *iterator; +}; + +extern HRESULT vector_inspectable_create( const struct vector_iids *iids, void **out ); + extern const char *debugstr_hstring( HSTRING hstr );
cpp_quote("#define DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from, iface_mem, expr ) \") diff --git a/libs/winewinrt/Makefile.in b/libs/winewinrt/Makefile.in index 7c0f2c668d3..6998a68b1c1 100644 --- a/libs/winewinrt/Makefile.in +++ b/libs/winewinrt/Makefile.in @@ -1,4 +1,5 @@ STATICLIB = libwinewinrt.a
C_SRCS = \ - debug.c + debug.c \ + vector_inspectable.c diff --git a/dlls/windows.gaming.input/vector.c b/libs/winewinrt/vector_inspectable.c similarity index 50% rename from dlls/windows.gaming.input/vector.c rename to libs/winewinrt/vector_inspectable.c index 8958b07c0f2..4d0f61d7f53 100644 --- a/dlls/windows.gaming.input/vector.c +++ b/libs/winewinrt/vector_inspectable.c @@ -1,4 +1,4 @@ -/* WinRT Windows.Gaming.Input implementation +/* WinRT Vector<IInspectable> implementation * * Copyright 2021 Rémi Bernon for CodeWeavers * @@ -19,11 +19,9 @@
#include "private.h"
-#include "wine/debug.h" +WINE_DEFAULT_DEBUG_CHANNEL(winrt);
-WINE_DEFAULT_DEBUG_CHANNEL(combase); - -struct iterator +struct iterator_inspectable { IIterator_IInspectable IIterator_IInspectable_iface; const GUID *iid; @@ -34,14 +32,14 @@ struct iterator UINT32 size; };
-static inline struct iterator *impl_from_IIterator_IInspectable( IIterator_IInspectable *iface ) +static inline struct iterator_inspectable *impl_from_IIterator_IInspectable( IIterator_IInspectable *iface ) { - return CONTAINING_RECORD( iface, struct iterator, IIterator_IInspectable_iface ); + return CONTAINING_RECORD( iface, struct iterator_inspectable, IIterator_IInspectable_iface ); }
-static HRESULT WINAPI iterator_QueryInterface( IIterator_IInspectable *iface, REFIID iid, void **out ) +static HRESULT WINAPI iterator_inspectable_QueryInterface( IIterator_IInspectable *iface, REFIID iid, void **out ) { - struct iterator *impl = impl_from_IIterator_IInspectable( iface ); + struct iterator_inspectable *impl = impl_from_IIterator_IInspectable( iface );
TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out );
@@ -59,17 +57,17 @@ static HRESULT WINAPI iterator_QueryInterface( IIterator_IInspectable *iface, RE return E_NOINTERFACE; }
-static ULONG WINAPI iterator_AddRef( IIterator_IInspectable *iface ) +static ULONG WINAPI iterator_inspectable_AddRef( IIterator_IInspectable *iface ) { - struct iterator *impl = impl_from_IIterator_IInspectable( iface ); + struct iterator_inspectable *impl = impl_from_IIterator_IInspectable( iface ); ULONG ref = InterlockedIncrement( &impl->ref ); TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); return ref; }
-static ULONG WINAPI iterator_Release( IIterator_IInspectable *iface ) +static ULONG WINAPI iterator_inspectable_Release( IIterator_IInspectable *iface ) { - struct iterator *impl = impl_from_IIterator_IInspectable( iface ); + struct iterator_inspectable *impl = impl_from_IIterator_IInspectable( iface ); ULONG ref = InterlockedDecrement( &impl->ref );
TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); @@ -83,34 +81,34 @@ static ULONG WINAPI iterator_Release( IIterator_IInspectable *iface ) return ref; }
-static HRESULT WINAPI iterator_GetIids( IIterator_IInspectable *iface, ULONG *iid_count, IID **iids ) +static HRESULT WINAPI iterator_inspectable_GetIids( IIterator_IInspectable *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 iterator_GetRuntimeClassName( IIterator_IInspectable *iface, HSTRING *class_name ) +static HRESULT WINAPI iterator_inspectable_GetRuntimeClassName( IIterator_IInspectable *iface, HSTRING *class_name ) { FIXME( "iface %p, class_name %p stub!\n", iface, class_name ); return E_NOTIMPL; }
-static HRESULT WINAPI iterator_GetTrustLevel( IIterator_IInspectable *iface, TrustLevel *trust_level ) +static HRESULT WINAPI iterator_inspectable_GetTrustLevel( IIterator_IInspectable *iface, TrustLevel *trust_level ) { FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); return E_NOTIMPL; }
-static HRESULT WINAPI iterator_get_Current( IIterator_IInspectable *iface, IInspectable **value ) +static HRESULT WINAPI iterator_inspectable_get_Current( IIterator_IInspectable *iface, IInspectable **value ) { - struct iterator *impl = impl_from_IIterator_IInspectable( iface ); + struct iterator_inspectable *impl = impl_from_IIterator_IInspectable( iface ); TRACE( "iface %p, value %p.\n", iface, value ); return IVectorView_IInspectable_GetAt( impl->view, impl->index, value ); }
-static HRESULT WINAPI iterator_get_HasCurrent( IIterator_IInspectable *iface, BOOL *value ) +static HRESULT WINAPI iterator_inspectable_get_HasCurrent( IIterator_IInspectable *iface, BOOL *value ) { - struct iterator *impl = impl_from_IIterator_IInspectable( iface ); + struct iterator_inspectable *impl = impl_from_IIterator_IInspectable( iface );
TRACE( "iface %p, value %p.\n", iface, value );
@@ -118,9 +116,9 @@ static HRESULT WINAPI iterator_get_HasCurrent( IIterator_IInspectable *iface, BO return S_OK; }
-static HRESULT WINAPI iterator_MoveNext( IIterator_IInspectable *iface, BOOL *value ) +static HRESULT WINAPI iterator_inspectable_MoveNext( IIterator_IInspectable *iface, BOOL *value ) { - struct iterator *impl = impl_from_IIterator_IInspectable( iface ); + struct iterator_inspectable *impl = impl_from_IIterator_IInspectable( iface );
TRACE( "iface %p, value %p.\n", iface, value );
@@ -128,31 +126,32 @@ static HRESULT WINAPI iterator_MoveNext( IIterator_IInspectable *iface, BOOL *va return IIterator_IInspectable_get_HasCurrent( iface, value ); }
-static HRESULT WINAPI iterator_GetMany( IIterator_IInspectable *iface, UINT32 items_size, - IInspectable **items, UINT *count ) +static HRESULT WINAPI iterator_inspectable_GetMany( IIterator_IInspectable *iface, UINT32 items_size, + IInspectable **items, UINT32 *count ) { - struct iterator *impl = impl_from_IIterator_IInspectable( iface ); + struct iterator_inspectable *impl = impl_from_IIterator_IInspectable( iface ); TRACE( "iface %p, items_size %u, items %p, count %p.\n", iface, items_size, items, count ); return IVectorView_IInspectable_GetMany( impl->view, impl->index, items_size, items, count ); }
-static const IIterator_IInspectableVtbl iterator_vtbl = +static const IIterator_IInspectableVtbl iterator_inspectable_vtbl = { - iterator_QueryInterface, - iterator_AddRef, - iterator_Release, + /* IUnknown methods */ + iterator_inspectable_QueryInterface, + iterator_inspectable_AddRef, + iterator_inspectable_Release, /* IInspectable methods */ - iterator_GetIids, - iterator_GetRuntimeClassName, - iterator_GetTrustLevel, + iterator_inspectable_GetIids, + iterator_inspectable_GetRuntimeClassName, + iterator_inspectable_GetTrustLevel, /* IIterator<IInspectable*> methods */ - iterator_get_Current, - iterator_get_HasCurrent, - iterator_MoveNext, - iterator_GetMany, + iterator_inspectable_get_Current, + iterator_inspectable_get_HasCurrent, + iterator_inspectable_MoveNext, + iterator_inspectable_GetMany, };
-struct vector_view +struct vector_view_inspectable { IVectorView_IInspectable IVectorView_IInspectable_iface; IIterable_IInspectable IIterable_IInspectable_iface; @@ -160,17 +159,19 @@ struct vector_view LONG ref;
UINT32 size; - IInspectable *elements[1]; + IInspectable *elements[]; };
-static inline struct vector_view *impl_from_IVectorView_IInspectable( IVectorView_IInspectable *iface ) +C_ASSERT( sizeof(struct vector_view_inspectable) == offsetof( struct vector_view_inspectable, elements[0] ) ); + +static inline struct vector_view_inspectable *impl_from_IVectorView_IInspectable( IVectorView_IInspectable *iface ) { - return CONTAINING_RECORD( iface, struct vector_view, IVectorView_IInspectable_iface ); + return CONTAINING_RECORD( iface, struct vector_view_inspectable, IVectorView_IInspectable_iface ); }
-static HRESULT WINAPI vector_view_QueryInterface( IVectorView_IInspectable *iface, REFIID iid, void **out ) +static HRESULT WINAPI vector_view_inspectable_QueryInterface( IVectorView_IInspectable *iface, REFIID iid, void **out ) { - struct vector_view *impl = impl_from_IVectorView_IInspectable( iface ); + struct vector_view_inspectable *impl = impl_from_IVectorView_IInspectable( iface );
TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out );
@@ -194,17 +195,17 @@ static HRESULT WINAPI vector_view_QueryInterface( IVectorView_IInspectable *ifac return E_NOINTERFACE; }
-static ULONG WINAPI vector_view_AddRef( IVectorView_IInspectable *iface ) +static ULONG WINAPI vector_view_inspectable_AddRef( IVectorView_IInspectable *iface ) { - struct vector_view *impl = impl_from_IVectorView_IInspectable( iface ); + struct vector_view_inspectable *impl = impl_from_IVectorView_IInspectable( iface ); ULONG ref = InterlockedIncrement( &impl->ref ); TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); return ref; }
-static ULONG WINAPI vector_view_Release( IVectorView_IInspectable *iface ) +static ULONG WINAPI vector_view_inspectable_Release( IVectorView_IInspectable *iface ) { - struct vector_view *impl = impl_from_IVectorView_IInspectable( iface ); + struct vector_view_inspectable *impl = impl_from_IVectorView_IInspectable( iface ); ULONG i, ref = InterlockedDecrement( &impl->ref );
TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); @@ -218,27 +219,27 @@ static ULONG WINAPI vector_view_Release( IVectorView_IInspectable *iface ) return ref; }
-static HRESULT WINAPI vector_view_GetIids( IVectorView_IInspectable *iface, ULONG *iid_count, IID **iids ) +static HRESULT WINAPI vector_view_inspectable_GetIids( IVectorView_IInspectable *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 vector_view_GetRuntimeClassName( IVectorView_IInspectable *iface, HSTRING *class_name ) +static HRESULT WINAPI vector_view_inspectable_GetRuntimeClassName( IVectorView_IInspectable *iface, HSTRING *class_name ) { FIXME( "iface %p, class_name %p stub!\n", iface, class_name ); return E_NOTIMPL; }
-static HRESULT WINAPI vector_view_GetTrustLevel( IVectorView_IInspectable *iface, TrustLevel *trust_level ) +static HRESULT WINAPI vector_view_inspectable_GetTrustLevel( IVectorView_IInspectable *iface, TrustLevel *trust_level ) { FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); return E_NOTIMPL; }
-static HRESULT WINAPI vector_view_GetAt( IVectorView_IInspectable *iface, UINT32 index, IInspectable **value ) +static HRESULT WINAPI vector_view_inspectable_GetAt( IVectorView_IInspectable *iface, UINT32 index, IInspectable **value ) { - struct vector_view *impl = impl_from_IVectorView_IInspectable( iface ); + struct vector_view_inspectable *impl = impl_from_IVectorView_IInspectable( iface );
TRACE( "iface %p, index %u, value %p.\n", iface, index, value );
@@ -249,9 +250,9 @@ static HRESULT WINAPI vector_view_GetAt( IVectorView_IInspectable *iface, UINT32 return S_OK; }
-static HRESULT WINAPI vector_view_get_Size( IVectorView_IInspectable *iface, UINT32 *value ) +static HRESULT WINAPI vector_view_inspectable_get_Size( IVectorView_IInspectable *iface, UINT32 *value ) { - struct vector_view *impl = impl_from_IVectorView_IInspectable( iface ); + struct vector_view_inspectable *impl = impl_from_IVectorView_IInspectable( iface );
TRACE( "iface %p, value %p.\n", iface, value );
@@ -259,10 +260,10 @@ static HRESULT WINAPI vector_view_get_Size( IVectorView_IInspectable *iface, UIN return S_OK; }
-static HRESULT WINAPI vector_view_IndexOf( IVectorView_IInspectable *iface, IInspectable *element, - UINT32 *index, BOOLEAN *found ) +static HRESULT WINAPI vector_view_inspectable_IndexOf( IVectorView_IInspectable *iface, IInspectable *element, + UINT32 *index, BOOLEAN *found ) { - struct vector_view *impl = impl_from_IVectorView_IInspectable( iface ); + struct vector_view_inspectable *impl = impl_from_IVectorView_IInspectable( iface ); ULONG i;
TRACE( "iface %p, element %p, index %p, found %p.\n", iface, element, index, found ); @@ -274,10 +275,10 @@ static HRESULT WINAPI vector_view_IndexOf( IVectorView_IInspectable *iface, IIns return S_OK; }
-static HRESULT WINAPI vector_view_GetMany( IVectorView_IInspectable *iface, UINT32 start_index, - UINT32 items_size, IInspectable **items, UINT *count ) +static HRESULT WINAPI vector_view_inspectable_GetMany( IVectorView_IInspectable *iface, UINT32 start_index, + UINT32 items_size, IInspectable **items, UINT32 *count ) { - struct vector_view *impl = impl_from_IVectorView_IInspectable( iface ); + struct vector_view_inspectable *impl = impl_from_IVectorView_IInspectable( iface ); UINT32 i;
TRACE( "iface %p, start_index %u, items_size %u, items %p, count %p.\n", @@ -295,34 +296,35 @@ static HRESULT WINAPI vector_view_GetMany( IVectorView_IInspectable *iface, UINT return S_OK; }
-static const struct IVectorView_IInspectableVtbl vector_view_vtbl = +static const struct IVectorView_IInspectableVtbl vector_view_inspectable_vtbl = { - vector_view_QueryInterface, - vector_view_AddRef, - vector_view_Release, + /* IUnknown methods */ + vector_view_inspectable_QueryInterface, + vector_view_inspectable_AddRef, + vector_view_inspectable_Release, /* IInspectable methods */ - vector_view_GetIids, - vector_view_GetRuntimeClassName, - vector_view_GetTrustLevel, + vector_view_inspectable_GetIids, + vector_view_inspectable_GetRuntimeClassName, + vector_view_inspectable_GetTrustLevel, /* IVectorView<IInspectable*> methods */ - vector_view_GetAt, - vector_view_get_Size, - vector_view_IndexOf, - vector_view_GetMany, + vector_view_inspectable_GetAt, + vector_view_inspectable_get_Size, + vector_view_inspectable_IndexOf, + vector_view_inspectable_GetMany, };
-DEFINE_IINSPECTABLE_( iterable_view, IIterable_IInspectable, struct vector_view, view_impl_from_IIterable_IInspectable, +DEFINE_IINSPECTABLE_( iterable_view_inspectable, IIterable_IInspectable, struct vector_view_inspectable, view_impl_from_IIterable_IInspectable, IIterable_IInspectable_iface, &impl->IVectorView_IInspectable_iface )
-static HRESULT WINAPI iterable_view_First( IIterable_IInspectable *iface, IIterator_IInspectable **value ) +static HRESULT WINAPI iterable_view_inspectable_First( IIterable_IInspectable *iface, IIterator_IInspectable **value ) { - struct vector_view *impl = view_impl_from_IIterable_IInspectable( iface ); - struct iterator *iter; + struct vector_view_inspectable *impl = view_impl_from_IIterable_IInspectable( iface ); + struct iterator_inspectable *iter;
TRACE( "iface %p, value %p.\n", iface, value );
- if (!(iter = calloc( 1, sizeof(struct iterator) ))) return E_OUTOFMEMORY; - iter->IIterator_IInspectable_iface.lpVtbl = &iterator_vtbl; + if (!(iter = calloc( 1, sizeof(struct iterator_inspectable) ))) return E_OUTOFMEMORY; + iter->IIterator_IInspectable_iface.lpVtbl = &iterator_inspectable_vtbl; iter->iid = impl->iids.iterator; iter->ref = 1;
@@ -333,20 +335,21 @@ static HRESULT WINAPI iterable_view_First( IIterable_IInspectable *iface, IItera return S_OK; }
-static const struct IIterable_IInspectableVtbl iterable_view_vtbl = +static const struct IIterable_IInspectableVtbl iterable_view_inspectable_vtbl = { - iterable_view_QueryInterface, - iterable_view_AddRef, - iterable_view_Release, + /* IUnknown methods */ + iterable_view_inspectable_QueryInterface, + iterable_view_inspectable_AddRef, + iterable_view_inspectable_Release, /* IInspectable methods */ - iterable_view_GetIids, - iterable_view_GetRuntimeClassName, - iterable_view_GetTrustLevel, + iterable_view_inspectable_GetIids, + iterable_view_inspectable_GetRuntimeClassName, + iterable_view_inspectable_GetTrustLevel, /* IIterable<T> methods */ - iterable_view_First, + iterable_view_inspectable_First, };
-struct vector +struct vector_inspectable { IVector_IInspectable IVector_IInspectable_iface; IIterable_IInspectable IIterable_IInspectable_iface; @@ -358,14 +361,14 @@ struct vector IInspectable **elements; };
-static inline struct vector *impl_from_IVector_IInspectable( IVector_IInspectable *iface ) +static inline struct vector_inspectable *impl_from_IVector_IInspectable( IVector_IInspectable *iface ) { - return CONTAINING_RECORD( iface, struct vector, IVector_IInspectable_iface ); + return CONTAINING_RECORD( iface, struct vector_inspectable, IVector_IInspectable_iface ); }
-static HRESULT WINAPI vector_QueryInterface( IVector_IInspectable *iface, REFIID iid, void **out ) +static HRESULT WINAPI vector_inspectable_QueryInterface( IVector_IInspectable *iface, REFIID iid, void **out ) { - struct vector *impl = impl_from_IVector_IInspectable( iface ); + struct vector_inspectable *impl = impl_from_IVector_IInspectable( iface );
TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out );
@@ -389,17 +392,17 @@ static HRESULT WINAPI vector_QueryInterface( IVector_IInspectable *iface, REFIID return E_NOINTERFACE; }
-static ULONG WINAPI vector_AddRef( IVector_IInspectable *iface ) +static ULONG WINAPI vector_inspectable_AddRef( IVector_IInspectable *iface ) { - struct vector *impl = impl_from_IVector_IInspectable( iface ); + struct vector_inspectable *impl = impl_from_IVector_IInspectable( iface ); ULONG ref = InterlockedIncrement( &impl->ref ); TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); return ref; }
-static ULONG WINAPI vector_Release( IVector_IInspectable *iface ) +static ULONG WINAPI vector_inspectable_Release( IVector_IInspectable *iface ) { - struct vector *impl = impl_from_IVector_IInspectable( iface ); + struct vector_inspectable *impl = impl_from_IVector_IInspectable( iface ); ULONG ref = InterlockedDecrement( &impl->ref );
TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); @@ -413,27 +416,27 @@ static ULONG WINAPI vector_Release( IVector_IInspectable *iface ) return ref; }
-static HRESULT WINAPI vector_GetIids( IVector_IInspectable *iface, ULONG *iid_count, IID **iids ) +static HRESULT WINAPI vector_inspectable_GetIids( IVector_IInspectable *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 vector_GetRuntimeClassName( IVector_IInspectable *iface, HSTRING *class_name ) +static HRESULT WINAPI vector_inspectable_GetRuntimeClassName( IVector_IInspectable *iface, HSTRING *class_name ) { FIXME( "iface %p, class_name %p stub!\n", iface, class_name ); return E_NOTIMPL; }
-static HRESULT WINAPI vector_GetTrustLevel( IVector_IInspectable *iface, TrustLevel *trust_level ) +static HRESULT WINAPI vector_inspectable_GetTrustLevel( IVector_IInspectable *iface, TrustLevel *trust_level ) { FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); return E_NOTIMPL; }
-static HRESULT WINAPI vector_GetAt( IVector_IInspectable *iface, UINT32 index, IInspectable **value ) +static HRESULT WINAPI vector_inspectable_GetAt( IVector_IInspectable *iface, UINT32 index, IInspectable **value ) { - struct vector *impl = impl_from_IVector_IInspectable( iface ); + struct vector_inspectable *impl = impl_from_IVector_IInspectable( iface );
TRACE( "iface %p, index %u, value %p.\n", iface, index, value );
@@ -444,25 +447,25 @@ static HRESULT WINAPI vector_GetAt( IVector_IInspectable *iface, UINT32 index, I return S_OK; }
-static HRESULT WINAPI vector_get_Size( IVector_IInspectable *iface, UINT32 *value ) +static HRESULT WINAPI vector_inspectable_get_Size( IVector_IInspectable *iface, UINT32 *value ) { - struct vector *impl = impl_from_IVector_IInspectable( iface ); + struct vector_inspectable *impl = impl_from_IVector_IInspectable( iface ); TRACE( "iface %p, value %p.\n", iface, value ); *value = impl->size; return S_OK; }
-static HRESULT WINAPI vector_GetView( IVector_IInspectable *iface, IVectorView_IInspectable **value ) +static HRESULT WINAPI vector_inspectable_GetView( IVector_IInspectable *iface, IVectorView_IInspectable **value ) { - struct vector *impl = impl_from_IVector_IInspectable( iface ); - struct vector_view *view; + struct vector_inspectable *impl = impl_from_IVector_IInspectable( iface ); + struct vector_view_inspectable *view; ULONG i;
TRACE( "iface %p, value %p.\n", iface, value );
- if (!(view = calloc( 1, offsetof( struct vector_view, elements[impl->size] ) ))) return E_OUTOFMEMORY; - view->IVectorView_IInspectable_iface.lpVtbl = &vector_view_vtbl; - view->IIterable_IInspectable_iface.lpVtbl = &iterable_view_vtbl; + if (!(view = calloc( 1, offsetof( struct vector_view_inspectable, elements[impl->size] ) ))) return E_OUTOFMEMORY; + view->IVectorView_IInspectable_iface.lpVtbl = &vector_view_inspectable_vtbl; + view->IIterable_IInspectable_iface.lpVtbl = &iterable_view_inspectable_vtbl; view->iids = impl->iids; view->ref = 1;
@@ -472,9 +475,10 @@ static HRESULT WINAPI vector_GetView( IVector_IInspectable *iface, IVectorView_I return S_OK; }
-static HRESULT WINAPI vector_IndexOf( IVector_IInspectable *iface, IInspectable *element, UINT32 *index, BOOLEAN *found ) +static HRESULT WINAPI vector_inspectable_IndexOf( IVector_IInspectable *iface, IInspectable *element, + UINT32 *index, BOOLEAN *found ) { - struct vector *impl = impl_from_IVector_IInspectable( iface ); + struct vector_inspectable *impl = impl_from_IVector_IInspectable( iface ); ULONG i;
TRACE( "iface %p, element %p, index %p, found %p.\n", iface, element, index, found ); @@ -486,9 +490,9 @@ static HRESULT WINAPI vector_IndexOf( IVector_IInspectable *iface, IInspectable return S_OK; }
-static HRESULT WINAPI vector_SetAt( IVector_IInspectable *iface, UINT32 index, IInspectable *value ) +static HRESULT WINAPI vector_inspectable_SetAt( IVector_IInspectable *iface, UINT32 index, IInspectable *value ) { - struct vector *impl = impl_from_IVector_IInspectable( iface ); + struct vector_inspectable *impl = impl_from_IVector_IInspectable( iface );
TRACE( "iface %p, index %u, value %p.\n", iface, index, value );
@@ -498,9 +502,9 @@ static HRESULT WINAPI vector_SetAt( IVector_IInspectable *iface, UINT32 index, I return S_OK; }
-static HRESULT WINAPI vector_InsertAt( IVector_IInspectable *iface, UINT32 index, IInspectable *value ) +static HRESULT WINAPI vector_inspectable_InsertAt( IVector_IInspectable *iface, UINT32 index, IInspectable *value ) { - struct vector *impl = impl_from_IVector_IInspectable( iface ); + struct vector_inspectable *impl = impl_from_IVector_IInspectable( iface ); IInspectable **tmp = impl->elements;
TRACE( "iface %p, index %u, value %p.\n", iface, index, value ); @@ -520,9 +524,9 @@ static HRESULT WINAPI vector_InsertAt( IVector_IInspectable *iface, UINT32 index return S_OK; }
-static HRESULT WINAPI vector_RemoveAt( IVector_IInspectable *iface, UINT32 index ) +static HRESULT WINAPI vector_inspectable_RemoveAt( IVector_IInspectable *iface, UINT32 index ) { - struct vector *impl = impl_from_IVector_IInspectable( iface ); + struct vector_inspectable *impl = impl_from_IVector_IInspectable( iface );
TRACE( "iface %p, index %u.\n", iface, index );
@@ -532,18 +536,18 @@ static HRESULT WINAPI vector_RemoveAt( IVector_IInspectable *iface, UINT32 index return S_OK; }
-static HRESULT WINAPI vector_Append( IVector_IInspectable *iface, IInspectable *value ) +static HRESULT WINAPI vector_inspectable_Append( IVector_IInspectable *iface, IInspectable *value ) { - struct vector *impl = impl_from_IVector_IInspectable( iface ); + struct vector_inspectable *impl = impl_from_IVector_IInspectable( iface );
TRACE( "iface %p, value %p.\n", iface, value );
return IVector_IInspectable_InsertAt( iface, impl->size, value ); }
-static HRESULT WINAPI vector_RemoveAtEnd( IVector_IInspectable *iface ) +static HRESULT WINAPI vector_inspectable_RemoveAtEnd( IVector_IInspectable *iface ) { - struct vector *impl = impl_from_IVector_IInspectable( iface ); + struct vector_inspectable *impl = impl_from_IVector_IInspectable( iface );
TRACE( "iface %p.\n", iface );
@@ -551,9 +555,9 @@ static HRESULT WINAPI vector_RemoveAtEnd( IVector_IInspectable *iface ) return S_OK; }
-static HRESULT WINAPI vector_Clear( IVector_IInspectable *iface ) +static HRESULT WINAPI vector_inspectable_Clear( IVector_IInspectable *iface ) { - struct vector *impl = impl_from_IVector_IInspectable( iface ); + struct vector_inspectable *impl = impl_from_IVector_IInspectable( iface );
TRACE( "iface %p.\n", iface );
@@ -565,10 +569,10 @@ static HRESULT WINAPI vector_Clear( IVector_IInspectable *iface ) return S_OK; }
-static HRESULT WINAPI vector_GetMany( IVector_IInspectable *iface, UINT32 start_index, - UINT32 items_size, IInspectable **items, UINT *count ) +static HRESULT WINAPI vector_inspectable_GetMany( IVector_IInspectable *iface, UINT32 start_index, + UINT32 items_size, IInspectable **items, UINT32 *count ) { - struct vector *impl = impl_from_IVector_IInspectable( iface ); + struct vector_inspectable *impl = impl_from_IVector_IInspectable( iface ); UINT32 i;
TRACE( "iface %p, start_index %u, items_size %u, items %p, count %p.\n", @@ -586,7 +590,7 @@ static HRESULT WINAPI vector_GetMany( IVector_IInspectable *iface, UINT32 start_ return S_OK; }
-static HRESULT WINAPI vector_ReplaceAll( IVector_IInspectable *iface, UINT32 count, IInspectable **items ) +static HRESULT WINAPI vector_inspectable_ReplaceAll( IVector_IInspectable *iface, UINT32 count, IInspectable **items ) { HRESULT hr; ULONG i; @@ -598,35 +602,36 @@ static HRESULT WINAPI vector_ReplaceAll( IVector_IInspectable *iface, UINT32 cou return hr; }
-static const struct IVector_IInspectableVtbl vector_vtbl = +static const struct IVector_IInspectableVtbl vector_inspectable_vtbl = { - vector_QueryInterface, - vector_AddRef, - vector_Release, + /* IUnknown methods */ + vector_inspectable_QueryInterface, + vector_inspectable_AddRef, + vector_inspectable_Release, /* IInspectable methods */ - vector_GetIids, - vector_GetRuntimeClassName, - vector_GetTrustLevel, + vector_inspectable_GetIids, + vector_inspectable_GetRuntimeClassName, + vector_inspectable_GetTrustLevel, /* IVector<IInspectable*> methods */ - vector_GetAt, - vector_get_Size, - vector_GetView, - vector_IndexOf, - vector_SetAt, - vector_InsertAt, - vector_RemoveAt, - vector_Append, - vector_RemoveAtEnd, - vector_Clear, - vector_GetMany, - vector_ReplaceAll, + vector_inspectable_GetAt, + vector_inspectable_get_Size, + vector_inspectable_GetView, + vector_inspectable_IndexOf, + vector_inspectable_SetAt, + vector_inspectable_InsertAt, + vector_inspectable_RemoveAt, + vector_inspectable_Append, + vector_inspectable_RemoveAtEnd, + vector_inspectable_Clear, + vector_inspectable_GetMany, + vector_inspectable_ReplaceAll, };
-DEFINE_IINSPECTABLE( iterable, IIterable_IInspectable, struct vector, IVector_IInspectable_iface ) +DEFINE_IINSPECTABLE( iterable_inspectable, IIterable_IInspectable, struct vector_inspectable, IVector_IInspectable_iface )
-static HRESULT WINAPI iterable_First( IIterable_IInspectable *iface, IIterator_IInspectable **value ) +static HRESULT WINAPI iterable_inspectable_First( IIterable_IInspectable *iface, IIterator_IInspectable **value ) { - struct vector *impl = impl_from_IIterable_IInspectable( iface ); + struct vector_inspectable *impl = impl_from_IIterable_IInspectable( iface ); IIterable_IInspectable *iterable; IVectorView_IInspectable *view; HRESULT hr; @@ -644,28 +649,29 @@ static HRESULT WINAPI iterable_First( IIterable_IInspectable *iface, IIterator_I return hr; }
-static const struct IIterable_IInspectableVtbl iterable_vtbl = +static const struct IIterable_IInspectableVtbl iterable_inspectable_vtbl = { - iterable_QueryInterface, - iterable_AddRef, - iterable_Release, + /* IUnknown methods */ + iterable_inspectable_QueryInterface, + iterable_inspectable_AddRef, + iterable_inspectable_Release, /* IInspectable methods */ - iterable_GetIids, - iterable_GetRuntimeClassName, - iterable_GetTrustLevel, + iterable_inspectable_GetIids, + iterable_inspectable_GetRuntimeClassName, + iterable_inspectable_GetTrustLevel, /* IIterable<T> methods */ - iterable_First, + iterable_inspectable_First, };
-HRESULT vector_create( const struct vector_iids *iids, void **out ) +HRESULT vector_inspectable_create( const struct vector_iids *iids, void **out ) { - struct vector *impl; + struct vector_inspectable *impl;
TRACE( "iid %s, out %p.\n", debugstr_guid( iids->vector ), out );
if (!(impl = calloc( 1, sizeof(*impl) ))) return E_OUTOFMEMORY; - impl->IVector_IInspectable_iface.lpVtbl = &vector_vtbl; - impl->IIterable_IInspectable_iface.lpVtbl = &iterable_vtbl; + impl->IVector_IInspectable_iface.lpVtbl = &vector_inspectable_vtbl; + impl->IIterable_IInspectable_iface.lpVtbl = &iterable_inspectable_vtbl; impl->iids = *iids; impl->ref = 1;
From: Rémi Bernon rbernon@codeweavers.com
--- tools/widl/header.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/widl/header.c b/tools/widl/header.c index 35163bfa86b..5854c681975 100644 --- a/tools/widl/header.c +++ b/tools/widl/header.c @@ -563,7 +563,7 @@ void write_type_right(FILE *h, type_t *t, int is_field) { const var_list_t *args = type_function_get_args(t); fputc('(', h); - if (args) write_args(h, args, NULL, 0, FALSE, NAME_DEFAULT); + if (args) write_args(h, args, NULL, 0, FALSE, NAME_C); else fprintf(h, "void"); fputc(')', h);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/windows.media.speech/Makefile.in | 3 +- dlls/windows.media.speech/listconstraint.c | 4 +- dlls/windows.media.speech/private.h | 3 - include/wine/winrt.idl | 3 + libs/winewinrt/Makefile.in | 1 + .../winewinrt/vector_hstring.c | 342 ++++++++---------- 6 files changed, 163 insertions(+), 193 deletions(-) rename dlls/windows.media.speech/vector.c => libs/winewinrt/vector_hstring.c (62%)
diff --git a/dlls/windows.media.speech/Makefile.in b/dlls/windows.media.speech/Makefile.in index 3cf24580732..c7faee34f46 100644 --- a/dlls/windows.media.speech/Makefile.in +++ b/dlls/windows.media.speech/Makefile.in @@ -7,7 +7,6 @@ C_SRCS = \ listconstraint.c \ main.c \ recognizer.c \ - synthesizer.c \ - vector.c + synthesizer.c
IDL_SRCS = classes.idl diff --git a/dlls/windows.media.speech/listconstraint.c b/dlls/windows.media.speech/listconstraint.c index ef0dff0e4d5..24194fdf38a 100644 --- a/dlls/windows.media.speech/listconstraint.c +++ b/dlls/windows.media.speech/listconstraint.c @@ -129,7 +129,7 @@ static HRESULT WINAPI list_constraint_get_Commands( ISpeechRecognitionListConst hr = IVector_HSTRING_QueryInterface(impl->commands, &IID_IIterable_HSTRING, (void **)&iterable); if (FAILED(hr)) return hr;
- hr = vector_hstring_create_copy(iterable, value); + hr = vector_hstring_copy(iterable, value); IIterable_HSTRING_Release(iterable);
return hr; @@ -359,7 +359,7 @@ static HRESULT WINAPI constraint_factory_CreateWithTag( ISpeechRecognitionListCo return E_POINTER;
if (!(impl = calloc(1, sizeof(*impl)))) return E_OUTOFMEMORY; - if (FAILED(hr = vector_hstring_create_copy(commands, &impl->commands))) goto error; + if (FAILED(hr = vector_hstring_copy(commands, &impl->commands))) goto error;
impl->ISpeechRecognitionListConstraint_iface.lpVtbl = &speech_recognition_list_constraint_vtbl; impl->ISpeechRecognitionConstraint_iface.lpVtbl = &speech_recognition_constraint_vtbl; diff --git a/dlls/windows.media.speech/private.h b/dlls/windows.media.speech/private.h index f41024e2fe2..3195df11033 100644 --- a/dlls/windows.media.speech/private.h +++ b/dlls/windows.media.speech/private.h @@ -74,7 +74,4 @@ HRESULT typed_event_handlers_remove( struct list *list, EventRegistrationToken * HRESULT typed_event_handlers_notify( struct list *list, IInspectable *sender, IInspectable *args ); HRESULT typed_event_handlers_clear( struct list* list );
-HRESULT vector_hstring_create( IVector_HSTRING **out ); -HRESULT vector_hstring_create_copy( IIterable_HSTRING *iterable, IVector_HSTRING **out ); - #endif diff --git a/include/wine/winrt.idl b/include/wine/winrt.idl index 9a4285dd70f..95322875656 100644 --- a/include/wine/winrt.idl +++ b/include/wine/winrt.idl @@ -35,6 +35,9 @@ struct vector_iids const GUID *iterator; };
+extern HRESULT vector_hstring_create( Windows.Foundation.Collections.IVector<HSTRING> **out ); +extern HRESULT vector_hstring_copy( Windows.Foundation.Collections.IIterable<HSTRING> *iterable, + Windows.Foundation.Collections.IVector<HSTRING> **out ); extern HRESULT vector_inspectable_create( const struct vector_iids *iids, void **out );
extern const char *debugstr_hstring( HSTRING hstr ); diff --git a/libs/winewinrt/Makefile.in b/libs/winewinrt/Makefile.in index 6998a68b1c1..937df798735 100644 --- a/libs/winewinrt/Makefile.in +++ b/libs/winewinrt/Makefile.in @@ -2,4 +2,5 @@ STATICLIB = libwinewinrt.a
C_SRCS = \ debug.c \ + vector_hstring.c \ vector_inspectable.c diff --git a/dlls/windows.media.speech/vector.c b/libs/winewinrt/vector_hstring.c similarity index 62% rename from dlls/windows.media.speech/vector.c rename to libs/winewinrt/vector_hstring.c index 61b63077d62..fa6a01c6ddc 100644 --- a/dlls/windows.media.speech/vector.c +++ b/libs/winewinrt/vector_hstring.c @@ -1,4 +1,4 @@ -/* WinRT Windows.Media.Speech implementation +/* WinRT Vector<HSTRING> implementation * * Copyright 2022 Bernhard Kölbl for CodeWeavers * @@ -19,70 +19,62 @@
#include "private.h"
-#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(speech); - -/* - * - * IIterator<HSTRING> - * - */ +WINE_DEFAULT_DEBUG_CHANNEL(winrt);
struct iterator_hstring { - IIterator_HSTRING IIterator_HSTRING_iface; - LONG ref; + IIterator_HSTRING IIterator_HSTRING_iface; + LONG ref;
- IVectorView_HSTRING *view; - UINT32 index; - UINT32 size; + IVectorView_HSTRING *view; + UINT32 index; + UINT32 size; };
static inline struct iterator_hstring *impl_from_IIterator_HSTRING( IIterator_HSTRING *iface ) { - return CONTAINING_RECORD(iface, struct iterator_hstring, IIterator_HSTRING_iface); + return CONTAINING_RECORD( iface, struct iterator_hstring, IIterator_HSTRING_iface ); }
static HRESULT WINAPI iterator_hstring_QueryInterface( IIterator_HSTRING *iface, REFIID iid, void **out ) { - struct iterator_hstring *impl = impl_from_IIterator_HSTRING(iface); + struct iterator_hstring *impl = impl_from_IIterator_HSTRING( iface );
- TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); + 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_IAgileObject) || - IsEqualGUID(iid, &IID_IIterator_HSTRING)) + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IIterator_HSTRING )) { - IInspectable_AddRef((*out = &impl->IIterator_HSTRING_iface)); - return S_OK; + IInspectable_AddRef( (*out = &impl->IIterator_HSTRING_iface) ); + return S_OK; }
- WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); *out = NULL; return E_NOINTERFACE; }
static ULONG WINAPI iterator_hstring_AddRef( IIterator_HSTRING *iface ) { - struct iterator_hstring *impl = impl_from_IIterator_HSTRING(iface); - ULONG ref = InterlockedIncrement(&impl->ref); - TRACE("iface %p increasing refcount to %lu.\n", iface, ref); + struct iterator_hstring *impl = impl_from_IIterator_HSTRING( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); return ref; }
static ULONG WINAPI iterator_hstring_Release( IIterator_HSTRING *iface ) { - struct iterator_hstring *impl = impl_from_IIterator_HSTRING(iface); - ULONG ref = InterlockedDecrement(&impl->ref); + struct iterator_hstring *impl = impl_from_IIterator_HSTRING( iface ); + ULONG ref = InterlockedDecrement( &impl->ref );
- TRACE("iface %p decreasing refcount to %lu.\n", iface, ref); + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref );
if (!ref) { - IVectorView_HSTRING_Release(impl->view); - free(impl); + IVectorView_HSTRING_Release( impl->view ); + free( impl ); }
return ref; @@ -90,34 +82,34 @@ static ULONG WINAPI iterator_hstring_Release( IIterator_HSTRING *iface )
static HRESULT WINAPI iterator_hstring_GetIids( IIterator_HSTRING *iface, ULONG *iid_count, IID **iids ) { - FIXME("iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids); + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); return E_NOTIMPL; }
static HRESULT WINAPI iterator_hstring_GetRuntimeClassName( IIterator_HSTRING *iface, HSTRING *class_name ) { - FIXME("iface %p, class_name %p stub!\n", iface, class_name); + FIXME( "iface %p, class_name %p stub!\n", iface, class_name ); return E_NOTIMPL; }
static HRESULT WINAPI iterator_hstring_GetTrustLevel( IIterator_HSTRING *iface, TrustLevel *trust_level ) { - FIXME("iface %p, trust_level %p stub!\n", iface, trust_level); + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); return E_NOTIMPL; }
static HRESULT WINAPI iterator_hstring_get_Current( IIterator_HSTRING *iface, HSTRING *value ) { - struct iterator_hstring *impl = impl_from_IIterator_HSTRING(iface); - TRACE("iface %p, value %p.\n", iface, value); - return IVectorView_HSTRING_GetAt(impl->view, impl->index, value); + struct iterator_hstring *impl = impl_from_IIterator_HSTRING( iface ); + TRACE( "iface %p, value %p.\n", iface, value ); + return IVectorView_HSTRING_GetAt( impl->view, impl->index, value ); }
static HRESULT WINAPI iterator_hstring_get_HasCurrent( IIterator_HSTRING *iface, BOOL *value ) { - struct iterator_hstring *impl = impl_from_IIterator_HSTRING(iface); + struct iterator_hstring *impl = impl_from_IIterator_HSTRING( iface );
- TRACE("iface %p, value %p.\n", iface, value); + TRACE( "iface %p, value %p.\n", iface, value );
*value = impl->index < impl->size; return S_OK; @@ -125,20 +117,19 @@ static HRESULT WINAPI iterator_hstring_get_HasCurrent( IIterator_HSTRING *iface,
static HRESULT WINAPI iterator_hstring_MoveNext( IIterator_HSTRING *iface, BOOL *value ) { - struct iterator_hstring *impl = impl_from_IIterator_HSTRING(iface); + struct iterator_hstring *impl = impl_from_IIterator_HSTRING( iface );
- TRACE("iface %p, value %p.\n", iface, value); + TRACE( "iface %p, value %p.\n", iface, value );
if (impl->index < impl->size) impl->index++; - return IIterator_HSTRING_get_HasCurrent(iface, value); + return IIterator_HSTRING_get_HasCurrent( iface, value ); }
-static HRESULT WINAPI iterator_hstring_GetMany( IIterator_HSTRING *iface, UINT32 items_size, - HSTRING *items, UINT *count ) +static HRESULT WINAPI iterator_hstring_GetMany( IIterator_HSTRING *iface, UINT32 items_size, HSTRING *items, UINT *count ) { - struct iterator_hstring *impl = impl_from_IIterator_HSTRING(iface); - TRACE("iface %p, items_size %u, items %p, count %p.\n", iface, items_size, items, count); - return IVectorView_HSTRING_GetMany(impl->view, impl->index, items_size, items, count); + struct iterator_hstring *impl = impl_from_IIterator_HSTRING( iface ); + TRACE( "iface %p, items_size %u, items %p, count %p.\n", iface, items_size, items, count ); + return IVectorView_HSTRING_GetMany( impl->view, impl->index, items_size, items, count ); }
static const IIterator_HSTRINGVtbl iterator_hstring_vtbl = @@ -158,12 +149,6 @@ static const IIterator_HSTRINGVtbl iterator_hstring_vtbl = iterator_hstring_GetMany, };
-/* - * - * IVectorView<HSTRING> - * - */ - struct vector_view_hstring { IVectorView_HSTRING IVectorView_HSTRING_iface; @@ -174,58 +159,58 @@ struct vector_view_hstring HSTRING elements[]; };
-C_ASSERT(sizeof(struct vector_view_hstring) == offsetof(struct vector_view_hstring, elements[0])); +C_ASSERT( sizeof(struct vector_view_hstring) == offsetof( struct vector_view_hstring, elements[0] ) );
static inline struct vector_view_hstring *impl_from_IVectorView_HSTRING( IVectorView_HSTRING *iface ) { - return CONTAINING_RECORD(iface, struct vector_view_hstring, IVectorView_HSTRING_iface); + return CONTAINING_RECORD( iface, struct vector_view_hstring, IVectorView_HSTRING_iface ); }
static HRESULT WINAPI vector_view_hstring_QueryInterface( IVectorView_HSTRING *iface, REFIID iid, void **out ) { - struct vector_view_hstring *impl = impl_from_IVectorView_HSTRING(iface); + struct vector_view_hstring *impl = impl_from_IVectorView_HSTRING( iface );
- TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); + 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_IAgileObject) || - IsEqualGUID(iid, &IID_IVectorView_HSTRING)) + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IVectorView_HSTRING )) { - IInspectable_AddRef((*out = &impl->IVectorView_HSTRING_iface)); + IInspectable_AddRef( (*out = &impl->IVectorView_HSTRING_iface) ); return S_OK; }
- if (IsEqualGUID(iid, &IID_IIterable_HSTRING)) + if (IsEqualGUID( iid, &IID_IIterable_HSTRING )) { - IInspectable_AddRef((*out = &impl->IIterable_HSTRING_iface)); + IInspectable_AddRef( (*out = &impl->IIterable_HSTRING_iface) ); return S_OK; }
- WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); *out = NULL; return E_NOINTERFACE; }
static ULONG WINAPI vector_view_hstring_AddRef( IVectorView_HSTRING *iface ) { - struct vector_view_hstring *impl = impl_from_IVectorView_HSTRING(iface); - ULONG ref = InterlockedIncrement(&impl->ref); - TRACE("iface %p increasing refcount to %lu.\n", iface, ref); + struct vector_view_hstring *impl = impl_from_IVectorView_HSTRING( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); return ref; }
static ULONG WINAPI vector_view_hstring_Release( IVectorView_HSTRING *iface ) { - struct vector_view_hstring *impl = impl_from_IVectorView_HSTRING(iface); - ULONG i, ref = InterlockedDecrement(&impl->ref); + struct vector_view_hstring *impl = impl_from_IVectorView_HSTRING( iface ); + ULONG i, ref = InterlockedDecrement( &impl->ref );
- TRACE("iface %p decreasing refcount to %lu.\n", iface, ref); + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref );
if (!ref) { - for (i = 0; i < impl->size; ++i) WindowsDeleteString(impl->elements[i]); - free(impl); + for (i = 0; i < impl->size; ++i) WindowsDeleteString( impl->elements[i] ); + free( impl ); }
return ref; @@ -233,39 +218,39 @@ static ULONG WINAPI vector_view_hstring_Release( IVectorView_HSTRING *iface )
static HRESULT WINAPI vector_view_hstring_GetIids( IVectorView_HSTRING *iface, ULONG *iid_count, IID **iids ) { - FIXME("iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids); + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); return E_NOTIMPL; }
static HRESULT WINAPI vector_view_hstring_GetRuntimeClassName( IVectorView_HSTRING *iface, HSTRING *class_name ) { - FIXME("iface %p, class_name %p stub!\n", iface, class_name); + FIXME( "iface %p, class_name %p stub!\n", iface, class_name ); return E_NOTIMPL; }
static HRESULT WINAPI vector_view_hstring_GetTrustLevel( IVectorView_HSTRING *iface, TrustLevel *trust_level ) { - FIXME("iface %p, trust_level %p stub!\n", iface, trust_level); + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); return E_NOTIMPL; }
static HRESULT WINAPI vector_view_hstring_GetAt( IVectorView_HSTRING *iface, UINT32 index, HSTRING *value ) { - struct vector_view_hstring *impl = impl_from_IVectorView_HSTRING(iface); + struct vector_view_hstring *impl = impl_from_IVectorView_HSTRING( iface );
- TRACE("iface %p, index %u, value %p.\n", iface, index, value); + TRACE( "iface %p, index %u, value %p.\n", iface, index, value );
*value = NULL; if (index >= impl->size) return E_BOUNDS;
- return WindowsDuplicateString(impl->elements[index], value); + return WindowsDuplicateString( impl->elements[index], value ); }
static HRESULT WINAPI vector_view_hstring_get_Size( IVectorView_HSTRING *iface, UINT32 *value ) { - struct vector_view_hstring *impl = impl_from_IVectorView_HSTRING(iface); + struct vector_view_hstring *impl = impl_from_IVectorView_HSTRING( iface );
- TRACE("iface %p, value %p.\n", iface, value); + TRACE( "iface %p, value %p.\n", iface, value );
*value = impl->size; return S_OK; @@ -274,10 +259,10 @@ static HRESULT WINAPI vector_view_hstring_get_Size( IVectorView_HSTRING *iface, static HRESULT WINAPI vector_view_hstring_IndexOf( IVectorView_HSTRING *iface, HSTRING element, UINT32 *index, BOOLEAN *found ) { - struct vector_view_hstring *impl = impl_from_IVectorView_HSTRING(iface); + struct vector_view_hstring *impl = impl_from_IVectorView_HSTRING( iface ); ULONG i;
- TRACE("iface %p, element %p, index %p, found %p.\n", iface, element, index, found); + TRACE( "iface %p, element %p, index %p, found %p.\n", iface, element, index, found );
for (i = 0; i < impl->size; ++i) if (impl->elements[i] == element) break; if ((*found = (i < impl->size))) *index = i; @@ -289,7 +274,7 @@ static HRESULT WINAPI vector_view_hstring_IndexOf( IVectorView_HSTRING *iface, H static HRESULT WINAPI vector_view_hstring_GetMany( IVectorView_HSTRING *iface, UINT32 start_index, UINT32 items_size, HSTRING *items, UINT *count ) { - struct vector_view_hstring *impl = impl_from_IVectorView_HSTRING(iface); + struct vector_view_hstring *impl = impl_from_IVectorView_HSTRING( iface ); HRESULT hr; UINT32 i;
@@ -301,7 +286,7 @@ static HRESULT WINAPI vector_view_hstring_GetMany( IVectorView_HSTRING *iface, U for (i = start_index; i < impl->size; ++i) { if (i - start_index >= items_size) break; - if (FAILED(hr = WindowsDuplicateString(impl->elements[i], &items[i - start_index]))) goto error; + if (FAILED(hr = WindowsDuplicateString( impl->elements[i], &items[i - start_index] ))) goto error; } *count = i - start_index;
@@ -309,7 +294,7 @@ static HRESULT WINAPI vector_view_hstring_GetMany( IVectorView_HSTRING *iface, U
error: *count = 0; - while (i-- > start_index) WindowsDeleteString(items[i-start_index]); + while (i-- > start_index) WindowsDeleteString( items[i - start_index] ); return hr; }
@@ -330,27 +315,21 @@ static const struct IVectorView_HSTRINGVtbl vector_view_hstring_vtbl = vector_view_hstring_GetMany, };
-/* - * - * IIterable<HSTRING> - * - */ - -DEFINE_IINSPECTABLE_(iterable_view_hstring, IIterable_HSTRING, struct vector_view_hstring, view_impl_from_IIterable_HSTRING, - IIterable_HSTRING_iface, &impl->IVectorView_HSTRING_iface) +DEFINE_IINSPECTABLE_( iterable_view_hstring, IIterable_HSTRING, struct vector_view_hstring, view_impl_from_IIterable_HSTRING, + IIterable_HSTRING_iface, &impl->IVectorView_HSTRING_iface )
static HRESULT WINAPI iterable_view_hstring_First( IIterable_HSTRING *iface, IIterator_HSTRING **value ) { - struct vector_view_hstring *impl = view_impl_from_IIterable_HSTRING(iface); + struct vector_view_hstring *impl = view_impl_from_IIterable_HSTRING( iface ); struct iterator_hstring *iter;
- TRACE("iface %p, value %p.\n", iface, value); + TRACE( "iface %p, value %p.\n", iface, value );
- if (!(iter = calloc(1, sizeof(*iter)))) return E_OUTOFMEMORY; + if (!(iter = calloc( 1, sizeof(struct iterator_hstring) ))) return E_OUTOFMEMORY; iter->IIterator_HSTRING_iface.lpVtbl = &iterator_hstring_vtbl; iter->ref = 1;
- IVectorView_HSTRING_AddRef((iter->view = &impl->IVectorView_HSTRING_iface)); + IVectorView_HSTRING_AddRef( (iter->view = &impl->IVectorView_HSTRING_iface) ); iter->size = impl->size;
*value = &iter->IIterator_HSTRING_iface; @@ -371,12 +350,6 @@ static const struct IIterable_HSTRINGVtbl iterable_view_hstring_vtbl = iterable_view_hstring_First, };
-/* - * - * IVector<HSTRING> - * - */ - struct vector_hstring { IVector_HSTRING IVector_HSTRING_iface; @@ -390,54 +363,54 @@ struct vector_hstring
static inline struct vector_hstring *impl_from_IVector_HSTRING( IVector_HSTRING *iface ) { - return CONTAINING_RECORD(iface, struct vector_hstring, IVector_HSTRING_iface); + return CONTAINING_RECORD( iface, struct vector_hstring, IVector_HSTRING_iface ); }
static HRESULT WINAPI vector_hstring_QueryInterface( IVector_HSTRING *iface, REFIID iid, void **out ) { - struct vector_hstring *impl = impl_from_IVector_HSTRING(iface); + struct vector_hstring *impl = impl_from_IVector_HSTRING( iface );
- TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); + 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_IAgileObject) || - IsEqualGUID(iid, &IID_IVector_HSTRING)) + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IVector_HSTRING )) { - IInspectable_AddRef((*out = &impl->IVector_HSTRING_iface)); + IInspectable_AddRef( (*out = &impl->IVector_HSTRING_iface) ); return S_OK; }
- if (IsEqualGUID(iid, &IID_IIterable_HSTRING)) + if (IsEqualGUID( iid, &IID_IIterable_HSTRING )) { - IInspectable_AddRef((*out = &impl->IIterable_HSTRING_iface)); + IInspectable_AddRef( (*out = &impl->IIterable_HSTRING_iface) ); return S_OK; }
- WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); *out = NULL; return E_NOINTERFACE; }
static ULONG WINAPI vector_hstring_AddRef( IVector_HSTRING *iface ) { - struct vector_hstring *impl = impl_from_IVector_HSTRING(iface); - ULONG ref = InterlockedIncrement(&impl->ref); - TRACE("iface %p, ref %lu.\n", iface, ref); + struct vector_hstring *impl = impl_from_IVector_HSTRING( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); return ref; }
static ULONG WINAPI vector_hstring_Release( IVector_HSTRING *iface ) { - struct vector_hstring *impl = impl_from_IVector_HSTRING(iface); - ULONG ref = InterlockedDecrement(&impl->ref); + struct vector_hstring *impl = impl_from_IVector_HSTRING( iface ); + ULONG ref = InterlockedDecrement( &impl->ref );
- TRACE("iface %p, ref %lu.\n", iface, ref); + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref );
if (!ref) { - IVector_HSTRING_Clear(iface); - free(impl); + IVector_HSTRING_Clear( iface ); + free( impl ); }
return ref; @@ -463,19 +436,19 @@ static HRESULT WINAPI vector_hstring_GetTrustLevel( IVector_HSTRING *iface, Trus
static HRESULT WINAPI vector_hstring_GetAt( IVector_HSTRING *iface, UINT32 index, HSTRING *value ) { - struct vector_hstring *impl = impl_from_IVector_HSTRING(iface); + struct vector_hstring *impl = impl_from_IVector_HSTRING( iface );
TRACE( "iface %p, index %u, value %p.\n", iface, index, value );
*value = NULL; if (index >= impl->size) return E_BOUNDS;
- return WindowsDuplicateString(impl->elements[index], value); + return WindowsDuplicateString( impl->elements[index], value ); }
static HRESULT WINAPI vector_hstring_get_Size( IVector_HSTRING *iface, UINT32 *value ) { - struct vector_hstring *impl = impl_from_IVector_HSTRING(iface); + struct vector_hstring *impl = impl_from_IVector_HSTRING( iface ); TRACE( "iface %p, value %p.\n", iface, value ); *value = impl->size; return S_OK; @@ -483,36 +456,39 @@ static HRESULT WINAPI vector_hstring_get_Size( IVector_HSTRING *iface, UINT32 *v
static HRESULT WINAPI vector_hstring_GetView( IVector_HSTRING *iface, IVectorView_HSTRING **value ) { - struct vector_hstring *impl = impl_from_IVector_HSTRING(iface); + struct vector_hstring *impl = impl_from_IVector_HSTRING( iface ); struct vector_view_hstring *view; HRESULT hr; ULONG i;
- TRACE("iface %p, value %p.\n", iface, value); + TRACE( "iface %p, value %p.\n", iface, value );
- if (!(view = calloc(1, offsetof(struct vector_view_hstring, elements[impl->size])))) return E_OUTOFMEMORY; + if (!(view = calloc( 1, offsetof( struct vector_view_hstring, elements[impl->size] ) ))) return E_OUTOFMEMORY; view->IVectorView_HSTRING_iface.lpVtbl = &vector_view_hstring_vtbl; view->IIterable_HSTRING_iface.lpVtbl = &iterable_view_hstring_vtbl; view->ref = 1;
for (i = 0; i < impl->size; ++i) - if (FAILED(hr = WindowsDuplicateString(impl->elements[i], &view->elements[view->size++]))) goto error; + { + hr = WindowsDuplicateString( impl->elements[i], &view->elements[view->size++] ); + if (FAILED(hr)) goto error; + }
*value = &view->IVectorView_HSTRING_iface; return S_OK;
error: - while (i-- > 0) WindowsDeleteString(view->elements[i]); - free(view); + while (i-- > 0) WindowsDeleteString( view->elements[i] ); + free( view ); return hr; }
static HRESULT WINAPI vector_hstring_IndexOf( IVector_HSTRING *iface, HSTRING element, UINT32 *index, BOOLEAN *found ) { - struct vector_hstring *impl = impl_from_IVector_HSTRING(iface); + struct vector_hstring *impl = impl_from_IVector_HSTRING( iface ); ULONG i;
- TRACE("iface %p, element %p, index %p, found %p.\n", iface, element, index, found); + TRACE( "iface %p, element %p, index %p, found %p.\n", iface, element, index, found );
for (i = 0; i < impl->size; ++i) if (impl->elements[i] == element) break; if ((*found = (i < impl->size))) *index = i; @@ -523,86 +499,85 @@ static HRESULT WINAPI vector_hstring_IndexOf( IVector_HSTRING *iface, HSTRING el
static HRESULT WINAPI vector_hstring_SetAt( IVector_HSTRING *iface, UINT32 index, HSTRING value ) { - struct vector_hstring *impl = impl_from_IVector_HSTRING(iface); + struct vector_hstring *impl = impl_from_IVector_HSTRING( iface ); HSTRING tmp; HRESULT hr;
TRACE( "iface %p, index %u, value %p.\n", iface, index, value );
if (index >= impl->size) return E_BOUNDS; + if (FAILED(hr = WindowsDuplicateString( value, &tmp ))) return hr;
- if (FAILED(hr = WindowsDuplicateString(value, &tmp))) return hr; - - WindowsDeleteString(impl->elements[index]); + WindowsDeleteString( impl->elements[index] ); impl->elements[index] = tmp; return S_OK; }
static HRESULT WINAPI vector_hstring_InsertAt( IVector_HSTRING *iface, UINT32 index, HSTRING value ) { - struct vector_hstring *impl = impl_from_IVector_HSTRING(iface); - HSTRING tmp, *tmp2 = impl->elements; + struct vector_hstring *impl = impl_from_IVector_HSTRING( iface ); + HSTRING tmp, *elements = impl->elements; HRESULT hr;
TRACE( "iface %p, index %u, value %p.\n", iface, index, value );
- if (FAILED(hr = WindowsDuplicateString(value, &tmp))) return hr; + if (FAILED(hr = WindowsDuplicateString( value, &tmp ))) return hr;
if (impl->size == impl->capacity) { - impl->capacity = max(32, impl->capacity * 3 / 2); - if (!(impl->elements = realloc(impl->elements, impl->capacity * sizeof(*impl->elements)))) + impl->capacity = max( 32, impl->capacity * 3 / 2 ); + if (!(impl->elements = realloc( impl->elements, impl->capacity * sizeof(*impl->elements) ))) { - impl->elements = tmp2; + impl->elements = elements; return E_OUTOFMEMORY; } }
- memmove(impl->elements + index + 1, impl->elements + index, (impl->size++ - index) * sizeof(*impl->elements)); + memmove( impl->elements + index + 1, impl->elements + index, (impl->size++ - index) * sizeof(*impl->elements) ); impl->elements[index] = tmp; return S_OK; }
static HRESULT WINAPI vector_hstring_RemoveAt( IVector_HSTRING *iface, UINT32 index ) { - struct vector_hstring *impl = impl_from_IVector_HSTRING(iface); + struct vector_hstring *impl = impl_from_IVector_HSTRING( iface );
- TRACE("iface %p, index %u.\n", iface, index); + TRACE( "iface %p, index %u.\n", iface, index );
if (index >= impl->size) return E_BOUNDS;
- WindowsDeleteString(impl->elements[index]); - memmove(impl->elements + index, impl->elements + index + 1, (--impl->size - index) * sizeof(*impl->elements)); + WindowsDeleteString( impl->elements[index] ); + memmove( impl->elements + index, impl->elements + index + 1, (--impl->size - index) * sizeof(*impl->elements) ); return S_OK; }
static HRESULT WINAPI vector_hstring_Append( IVector_HSTRING *iface, HSTRING value ) { - struct vector_hstring *impl = impl_from_IVector_HSTRING(iface); + struct vector_hstring *impl = impl_from_IVector_HSTRING( iface );
- TRACE("iface %p, value %p.\n", iface, value); + TRACE( "iface %p, value %p.\n", iface, value );
- return IVector_HSTRING_InsertAt(iface, impl->size, value); + return IVector_HSTRING_InsertAt( iface, impl->size, value ); }
static HRESULT WINAPI vector_hstring_RemoveAtEnd( IVector_HSTRING *iface ) { - struct vector_hstring *impl = impl_from_IVector_HSTRING(iface); + struct vector_hstring *impl = impl_from_IVector_HSTRING( iface );
- TRACE("iface %p.\n", iface); + TRACE( "iface %p.\n", iface );
- if (impl->size) WindowsDeleteString(impl->elements[--impl->size]); + if (impl->size) WindowsDeleteString( impl->elements[--impl->size] ); return S_OK; }
static HRESULT WINAPI vector_hstring_Clear( IVector_HSTRING *iface ) { - struct vector_hstring *impl = impl_from_IVector_HSTRING(iface); + struct vector_hstring *impl = impl_from_IVector_HSTRING( iface );
- TRACE("iface %p.\n", iface); + TRACE( "iface %p.\n", iface );
- while (impl->size) IVector_HSTRING_RemoveAtEnd(iface); - free(impl->elements); + while (impl->size) IVector_HSTRING_RemoveAtEnd( iface ); + free( impl->elements ); impl->capacity = 0; impl->elements = NULL;
@@ -612,18 +587,19 @@ static HRESULT WINAPI vector_hstring_Clear( IVector_HSTRING *iface ) static HRESULT WINAPI vector_hstring_GetMany( IVector_HSTRING *iface, UINT32 start_index, UINT32 items_size, HSTRING *items, UINT32 *count ) { - struct vector_hstring *impl = impl_from_IVector_HSTRING(iface); + struct vector_hstring *impl = impl_from_IVector_HSTRING( iface ); HRESULT hr; UINT32 i;
- TRACE("iface %p, start_index %u, items_size %u, items %p, count %p.\n", iface, start_index, items_size, items, count); + TRACE( "iface %p, start_index %u, items_size %u, items %p, count %p.\n", + iface, start_index, items_size, items, count );
if (start_index >= impl->size) return E_BOUNDS;
for (i = start_index; i < impl->size; ++i) { if (i - start_index >= items_size) break; - if (FAILED(hr = WindowsDuplicateString(impl->elements[i], &items[i-start_index]))) goto error; + if (FAILED(hr = WindowsDuplicateString( impl->elements[i], &items[i - start_index] ))) goto error; } *count = i - start_index;
@@ -631,7 +607,7 @@ static HRESULT WINAPI vector_hstring_GetMany( IVector_HSTRING *iface, UINT32 sta
error: *count = 0; - while (i-- > start_index) WindowsDeleteString(items[i-start_index]); + while (i-- > start_index) WindowsDeleteString( items[i - start_index] ); return hr; }
@@ -640,10 +616,10 @@ static HRESULT WINAPI vector_hstring_ReplaceAll( IVector_HSTRING *iface, UINT32 HRESULT hr; ULONG i;
- TRACE("iface %p, count %u, items %p.\n", iface, count, items); + TRACE( "iface %p, count %u, items %p.\n", iface, count, items );
- hr = IVector_HSTRING_Clear(iface); - for (i = 0; i < count && SUCCEEDED(hr); ++i) hr = IVector_HSTRING_Append(iface, items[i]); + hr = IVector_HSTRING_Clear( iface ); + for (i = 0; i < count && SUCCEEDED(hr); ++i) hr = IVector_HSTRING_Append( iface, items[i] ); return hr; }
@@ -672,31 +648,25 @@ static const struct IVector_HSTRINGVtbl vector_hstring_vtbl = vector_hstring_ReplaceAll, };
-/* - * - * IIterable<HSTRING> - * - */ - -DEFINE_IINSPECTABLE(iterable_hstring, IIterable_HSTRING, struct vector_hstring, IVector_HSTRING_iface) +DEFINE_IINSPECTABLE( iterable_hstring, IIterable_HSTRING, struct vector_hstring, IVector_HSTRING_iface )
static HRESULT WINAPI iterable_hstring_First( IIterable_HSTRING *iface, IIterator_HSTRING **value ) { - struct vector_hstring *impl = impl_from_IIterable_HSTRING(iface); + struct vector_hstring *impl = impl_from_IIterable_HSTRING( iface ); IIterable_HSTRING *iterable; IVectorView_HSTRING *view; HRESULT hr;
- TRACE("iface %p, value %p.\n", iface, value); + TRACE( "iface %p, value %p.\n", iface, value );
- if (FAILED(hr = IVector_HSTRING_GetView(&impl->IVector_HSTRING_iface, &view))) return hr; + if (FAILED(hr = IVector_HSTRING_GetView( &impl->IVector_HSTRING_iface, &view ))) return hr;
- hr = IVectorView_HSTRING_QueryInterface(view, &IID_IIterable_HSTRING, (void **)&iterable); - IVectorView_HSTRING_Release(view); + hr = IVectorView_HSTRING_QueryInterface( view, &IID_IIterable_HSTRING, (void **)&iterable ); + IVectorView_HSTRING_Release( view ); if (FAILED(hr)) return hr;
- hr = IIterable_HSTRING_First(iterable, value); - IIterable_HSTRING_Release(iterable); + hr = IIterable_HSTRING_First( iterable, value ); + IIterable_HSTRING_Release( iterable ); return hr; }
@@ -718,19 +688,19 @@ HRESULT vector_hstring_create( IVector_HSTRING **out ) { struct vector_hstring *impl;
- TRACE("out %p.\n", out); + TRACE( "out %p.\n", out );
- if (!(impl = calloc(1, sizeof(*impl)))) return E_OUTOFMEMORY; + if (!(impl = calloc( 1, sizeof(*impl) ))) return E_OUTOFMEMORY; impl->IVector_HSTRING_iface.lpVtbl = &vector_hstring_vtbl; impl->IIterable_HSTRING_iface.lpVtbl = &iterable_hstring_vtbl; impl->ref = 1;
*out = &impl->IVector_HSTRING_iface; - TRACE("created %p\n", *out); + TRACE( "created %p\n", *out ); return S_OK; }
-HRESULT vector_hstring_create_copy( IIterable_HSTRING *iterable, IVector_HSTRING **out ) +HRESULT vector_hstring_copy( IIterable_HSTRING *iterable, IVector_HSTRING **out ) { struct vector_hstring *impl; IIterator_HSTRING *iterator;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/cryptowinrt/Makefile.in | 3 +- dlls/cryptowinrt/async.c | 340 +------------------ dlls/cryptowinrt/credentials.c | 2 +- dlls/cryptowinrt/private.h | 5 +- dlls/cryptowinrt/provider.idl | 47 --- dlls/windows.gaming.input/async.c | 342 +------------------ dlls/windows.gaming.input/force_feedback.c | 10 +- dlls/windows.gaming.input/private.h | 5 +- dlls/windows.gaming.input/provider.idl | 14 - include/wine/winrt.idl | 27 ++ libs/winewinrt/Makefile.in | 1 + libs/winewinrt/async_info.c | 361 +++++++++++++++++++++ 12 files changed, 402 insertions(+), 755 deletions(-) delete mode 100644 dlls/cryptowinrt/provider.idl create mode 100644 libs/winewinrt/async_info.c
diff --git a/dlls/cryptowinrt/Makefile.in b/dlls/cryptowinrt/Makefile.in index e58476eb6d6..0f99c556acb 100644 --- a/dlls/cryptowinrt/Makefile.in +++ b/dlls/cryptowinrt/Makefile.in @@ -7,5 +7,4 @@ C_SRCS = \ main.c
IDL_SRCS = \ - classes.idl \ - provider.idl + classes.idl diff --git a/dlls/cryptowinrt/async.c b/dlls/cryptowinrt/async.c index dbf111cc880..8fb94e88312 100644 --- a/dlls/cryptowinrt/async.c +++ b/dlls/cryptowinrt/async.c @@ -24,344 +24,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(crypto);
-#define Closed 4 -#define HANDLER_NOT_SET ((void *)~(ULONG_PTR)0) - -struct async_info -{ - IWineAsyncInfoImpl IWineAsyncInfoImpl_iface; - IAsyncInfo IAsyncInfo_iface; - IInspectable *IInspectable_outer; - LONG ref; - - async_operation_callback callback; - TP_WORK *async_run_work; - IUnknown *invoker; - IUnknown *param; - - CRITICAL_SECTION cs; - IWineAsyncOperationCompletedHandler *handler; - PROPVARIANT result; - AsyncStatus status; - HRESULT hr; -}; - -static inline struct async_info *impl_from_IWineAsyncInfoImpl( IWineAsyncInfoImpl *iface ) -{ - return CONTAINING_RECORD( iface, struct async_info, IWineAsyncInfoImpl_iface ); -} - -static HRESULT WINAPI async_impl_QueryInterface( IWineAsyncInfoImpl *iface, REFIID iid, void **out ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( 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_IAgileObject ) || - IsEqualGUID( iid, &IID_IWineAsyncInfoImpl )) - { - IInspectable_AddRef( (*out = &impl->IWineAsyncInfoImpl_iface) ); - return S_OK; - } - - if (IsEqualGUID( iid, &IID_IAsyncInfo )) - { - IInspectable_AddRef( (*out = &impl->IAsyncInfo_iface) ); - return S_OK; - } - - FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); - *out = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI async_impl_AddRef( IWineAsyncInfoImpl *iface ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); - ULONG ref = InterlockedIncrement( &impl->ref ); - TRACE( "iface %p, ref %lu.\n", iface, ref ); - return ref; -} - -static ULONG WINAPI async_impl_Release( IWineAsyncInfoImpl *iface ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); - ULONG ref = InterlockedDecrement( &impl->ref ); - TRACE( "iface %p, ref %lu.\n", iface, ref ); - - if (!ref) - { - if (impl->handler && impl->handler != HANDLER_NOT_SET) IWineAsyncOperationCompletedHandler_Release( impl->handler ); - IAsyncInfo_Close( &impl->IAsyncInfo_iface ); - if (impl->param) IUnknown_Release( impl->param ); - if (impl->invoker) IUnknown_Release( impl->invoker ); - impl->cs.DebugInfo->Spare[0] = 0; - DeleteCriticalSection( &impl->cs ); - free( impl ); - } - - return ref; -} - -static HRESULT WINAPI async_impl_put_Completed( IWineAsyncInfoImpl *iface, IWineAsyncOperationCompletedHandler *handler ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); - HRESULT hr = S_OK; - - TRACE( "iface %p, handler %p.\n", iface, handler ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; - else if (impl->handler != HANDLER_NOT_SET) hr = E_ILLEGAL_DELEGATE_ASSIGNMENT; - else if ((impl->handler = handler)) - { - IWineAsyncOperationCompletedHandler_AddRef( impl->handler ); - - if (impl->status > Started) - { - IInspectable *operation = impl->IInspectable_outer; - AsyncStatus status = impl->status; - impl->handler = NULL; /* Prevent concurrent invoke. */ - LeaveCriticalSection( &impl->cs ); - - IWineAsyncOperationCompletedHandler_Invoke( handler, operation, status ); - IWineAsyncOperationCompletedHandler_Release( handler ); - - return S_OK; - } - } - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static HRESULT WINAPI async_impl_get_Completed( IWineAsyncInfoImpl *iface, IWineAsyncOperationCompletedHandler **handler ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); - HRESULT hr = S_OK; - - TRACE( "iface %p, handler %p.\n", iface, handler ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; - if (impl->handler == NULL || impl->handler == HANDLER_NOT_SET) *handler = NULL; - else IWineAsyncOperationCompletedHandler_AddRef( (*handler = impl->handler) ); - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static HRESULT WINAPI async_impl_get_Result( IWineAsyncInfoImpl *iface, PROPVARIANT *result ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); - HRESULT hr = E_ILLEGAL_METHOD_CALL; - - TRACE( "iface %p, result %p.\n", iface, result ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Completed || impl->status == Error) - { - PropVariantCopy( result, &impl->result ); - hr = impl->hr; - } - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static HRESULT WINAPI async_impl_Start( IWineAsyncInfoImpl *iface ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); - - TRACE( "iface %p.\n", iface ); - - /* keep the async alive in the callback */ - IInspectable_AddRef( impl->IInspectable_outer ); - SubmitThreadpoolWork( impl->async_run_work ); - - return S_OK; -} - -static const struct IWineAsyncInfoImplVtbl async_impl_vtbl = -{ - /* IUnknown methods */ - async_impl_QueryInterface, - async_impl_AddRef, - async_impl_Release, - /* IWineAsyncInfoImpl */ - async_impl_put_Completed, - async_impl_get_Completed, - async_impl_get_Result, - async_impl_Start, -}; - -DEFINE_IINSPECTABLE_OUTER( async_info, IAsyncInfo, struct async_info, IInspectable_outer ) - -static HRESULT WINAPI async_info_get_Id( IAsyncInfo *iface, UINT32 *id ) -{ - struct async_info *impl = impl_from_IAsyncInfo( iface ); - HRESULT hr = S_OK; - - TRACE( "iface %p, id %p.\n", iface, id ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; - *id = 1; - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static HRESULT WINAPI async_info_get_Status( IAsyncInfo *iface, AsyncStatus *status ) -{ - struct async_info *impl = impl_from_IAsyncInfo( iface ); - HRESULT hr = S_OK; - - TRACE( "iface %p, status %p.\n", iface, status ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; - *status = impl->status; - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static HRESULT WINAPI async_info_get_ErrorCode( IAsyncInfo *iface, HRESULT *error_code ) -{ - struct async_info *impl = impl_from_IAsyncInfo( iface ); - HRESULT hr = S_OK; - - TRACE( "iface %p, error_code %p.\n", iface, error_code ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Closed) *error_code = hr = E_ILLEGAL_METHOD_CALL; - else *error_code = impl->hr; - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static HRESULT WINAPI async_info_Cancel( IAsyncInfo *iface ) -{ - struct async_info *impl = impl_from_IAsyncInfo( iface ); - HRESULT hr = S_OK; - - TRACE( "iface %p.\n", iface ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; - else if (impl->status == Started) impl->status = Canceled; - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static HRESULT WINAPI async_info_Close( IAsyncInfo *iface ) -{ - struct async_info *impl = impl_from_IAsyncInfo( iface ); - HRESULT hr = S_OK; - - TRACE( "iface %p.\n", iface ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Started) - hr = E_ILLEGAL_STATE_CHANGE; - else if (impl->status != Closed) - { - CloseThreadpoolWork( impl->async_run_work ); - impl->async_run_work = NULL; - impl->status = Closed; - } - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static const struct IAsyncInfoVtbl async_info_vtbl = -{ - /* IUnknown methods */ - async_info_QueryInterface, - async_info_AddRef, - async_info_Release, - /* IInspectable methods */ - async_info_GetIids, - async_info_GetRuntimeClassName, - async_info_GetTrustLevel, - /* IAsyncInfo */ - async_info_get_Id, - async_info_get_Status, - async_info_get_ErrorCode, - async_info_Cancel, - async_info_Close, -}; - -static void CALLBACK async_info_callback( TP_CALLBACK_INSTANCE *instance, void *iface, TP_WORK *work ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); - IInspectable *operation = impl->IInspectable_outer; - PROPVARIANT result; - HRESULT hr; - - hr = impl->callback( impl->invoker, impl->param, &result ); - - EnterCriticalSection( &impl->cs ); - if (impl->status != Closed) impl->status = FAILED(hr) ? Error : Completed; - PropVariantCopy( &impl->result, &result ); - impl->hr = hr; - - if (impl->handler != NULL && impl->handler != HANDLER_NOT_SET) - { - IWineAsyncOperationCompletedHandler *handler = impl->handler; - AsyncStatus status = impl->status; - impl->handler = NULL; /* Prevent concurrent invoke. */ - LeaveCriticalSection( &impl->cs ); - - IWineAsyncOperationCompletedHandler_Invoke( handler, operation, status ); - IWineAsyncOperationCompletedHandler_Release( handler ); - } - else LeaveCriticalSection( &impl->cs ); - - /* release refcount acquired in Start */ - IInspectable_Release( operation ); - - PropVariantClear( &result ); -} - -static HRESULT async_info_create( IUnknown *invoker, IUnknown *param, async_operation_callback callback, - IInspectable *outer, IWineAsyncInfoImpl **out ) -{ - struct async_info *impl; - HRESULT hr; - - if (!(impl = calloc( 1, sizeof(struct async_info) ))) return E_OUTOFMEMORY; - impl->IWineAsyncInfoImpl_iface.lpVtbl = &async_impl_vtbl; - impl->IAsyncInfo_iface.lpVtbl = &async_info_vtbl; - impl->IInspectable_outer = outer; - impl->ref = 1; - - impl->callback = callback; - impl->handler = HANDLER_NOT_SET; - impl->status = Started; - if (!(impl->async_run_work = CreateThreadpoolWork( async_info_callback, &impl->IWineAsyncInfoImpl_iface, NULL ))) - { - hr = HRESULT_FROM_WIN32( GetLastError() ); - free( impl ); - return hr; - } - - if ((impl->invoker = invoker)) IUnknown_AddRef( impl->invoker ); - if ((impl->param = param)) IUnknown_AddRef( impl->param ); - - InitializeCriticalSection( &impl->cs ); - impl->cs.DebugInfo->Spare[0] = (DWORD_PTR)( __FILE__ ": async_info.cs" ); - - *out = &impl->IWineAsyncInfoImpl_iface; - return S_OK; -} - struct async_bool { IAsyncOperation_boolean IAsyncOperation_boolean_iface; @@ -483,7 +145,7 @@ static const struct IAsyncOperation_booleanVtbl async_bool_vtbl = async_bool_GetResults, };
-HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *param, async_operation_callback callback, +HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *param, async_callback callback, IAsyncOperation_boolean **out ) { struct async_bool *impl; diff --git a/dlls/cryptowinrt/credentials.c b/dlls/cryptowinrt/credentials.c index e23c5d94696..960c5fabf8f 100644 --- a/dlls/cryptowinrt/credentials.c +++ b/dlls/cryptowinrt/credentials.c @@ -118,7 +118,7 @@ static const struct IActivationFactoryVtbl factory_vtbl =
DEFINE_IINSPECTABLE( credentials_statics, IKeyCredentialManagerStatics, struct credentials_statics, IActivationFactory_iface );
-static HRESULT WINAPI is_supported_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) +static HRESULT is_supported_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) { result->vt = VT_BOOL; result->boolVal = FALSE; diff --git a/dlls/cryptowinrt/private.h b/dlls/cryptowinrt/private.h index 0cc2ba507b0..e83aa41671a 100644 --- a/dlls/cryptowinrt/private.h +++ b/dlls/cryptowinrt/private.h @@ -39,12 +39,9 @@
#include "wine/winrt.h"
-#include "provider.h" - extern IActivationFactory *credentials_activation_factory;
-typedef HRESULT (WINAPI *async_operation_callback)( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ); -extern HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *param, async_operation_callback callback, +extern HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *param, async_callback callback, IAsyncOperation_boolean **out );
#endif diff --git a/dlls/cryptowinrt/provider.idl b/dlls/cryptowinrt/provider.idl deleted file mode 100644 index 7196119dba0..00000000000 --- a/dlls/cryptowinrt/provider.idl +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2022 Mohamad Al-Jaf - * Copyright 2022 Rémi Bernon 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 - */ - -#pragma makedep header - -#ifdef __WIDL__ -#pragma winrt ns_prefix -#endif - -import "propidl.idl"; -import "inspectable.idl"; -import "asyncinfo.idl"; -import "eventtoken.idl"; -import "windowscontracts.idl"; -import "windows.foundation.idl"; - -namespace Windows.Security.Credentials { - /* type-pruning version of AsyncOperationCompletedHandler<T> */ - delegate HRESULT WineAsyncOperationCompletedHandler([in] IInspectable *async, [in] AsyncStatus status); - - [ - uuid(83f377ee-c799-11ec-9d64-0242ac120002) - ] - interface IWineAsyncInfoImpl : IUnknown - { - [propput] HRESULT Completed([in] WineAsyncOperationCompletedHandler *handler); - [propget] HRESULT Completed([out, retval] WineAsyncOperationCompletedHandler **handler); - [propget] HRESULT Result([out, retval] PROPVARIANT *result); - HRESULT Start(); - } -} diff --git a/dlls/windows.gaming.input/async.c b/dlls/windows.gaming.input/async.c index c41abe96cd1..0e3814d5ac4 100644 --- a/dlls/windows.gaming.input/async.c +++ b/dlls/windows.gaming.input/async.c @@ -25,344 +25,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(input);
-#define Closed 4 -#define HANDLER_NOT_SET ((void *)~(ULONG_PTR)0) - -struct async_info -{ - IWineAsyncInfoImpl IWineAsyncInfoImpl_iface; - IAsyncInfo IAsyncInfo_iface; - IInspectable *IInspectable_outer; - LONG ref; - - async_operation_callback callback; - TP_WORK *async_run_work; - IUnknown *invoker; - IUnknown *param; - - CRITICAL_SECTION cs; - IWineAsyncOperationCompletedHandler *handler; - PROPVARIANT result; - AsyncStatus status; - HRESULT hr; -}; - -static inline struct async_info *impl_from_IWineAsyncInfoImpl( IWineAsyncInfoImpl *iface ) -{ - return CONTAINING_RECORD( iface, struct async_info, IWineAsyncInfoImpl_iface ); -} - -static HRESULT WINAPI async_impl_QueryInterface( IWineAsyncInfoImpl *iface, REFIID iid, void **out ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( 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_IAgileObject ) || - IsEqualGUID( iid, &IID_IWineAsyncInfoImpl )) - { - IInspectable_AddRef( (*out = &impl->IWineAsyncInfoImpl_iface) ); - return S_OK; - } - - if (IsEqualGUID( iid, &IID_IAsyncInfo )) - { - IInspectable_AddRef( (*out = &impl->IAsyncInfo_iface) ); - return S_OK; - } - - FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); - *out = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI async_impl_AddRef( IWineAsyncInfoImpl *iface ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); - ULONG ref = InterlockedIncrement( &impl->ref ); - TRACE( "iface %p, ref %lu.\n", iface, ref ); - return ref; -} - -static ULONG WINAPI async_impl_Release( IWineAsyncInfoImpl *iface ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); - ULONG ref = InterlockedDecrement( &impl->ref ); - TRACE( "iface %p, ref %lu.\n", iface, ref ); - - if (!ref) - { - if (impl->handler && impl->handler != HANDLER_NOT_SET) IWineAsyncOperationCompletedHandler_Release( impl->handler ); - IAsyncInfo_Close( &impl->IAsyncInfo_iface ); - if (impl->param) IUnknown_Release( impl->param ); - if (impl->invoker) IUnknown_Release( impl->invoker ); - impl->cs.DebugInfo->Spare[0] = 0; - DeleteCriticalSection( &impl->cs ); - free( impl ); - } - - return ref; -} - -static HRESULT WINAPI async_impl_put_Completed( IWineAsyncInfoImpl *iface, IWineAsyncOperationCompletedHandler *handler ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); - HRESULT hr = S_OK; - - TRACE( "iface %p, handler %p.\n", iface, handler ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; - else if (impl->handler != HANDLER_NOT_SET) hr = E_ILLEGAL_DELEGATE_ASSIGNMENT; - else if ((impl->handler = handler)) - { - IWineAsyncOperationCompletedHandler_AddRef( impl->handler ); - - if (impl->status > Started) - { - IInspectable *operation = impl->IInspectable_outer; - AsyncStatus status = impl->status; - impl->handler = NULL; /* Prevent concurrent invoke. */ - LeaveCriticalSection( &impl->cs ); - - IWineAsyncOperationCompletedHandler_Invoke( handler, operation, status ); - IWineAsyncOperationCompletedHandler_Release( handler ); - - return S_OK; - } - } - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static HRESULT WINAPI async_impl_get_Completed( IWineAsyncInfoImpl *iface, IWineAsyncOperationCompletedHandler **handler ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); - HRESULT hr = S_OK; - - TRACE( "iface %p, handler %p.\n", iface, handler ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; - if (impl->handler == NULL || impl->handler == HANDLER_NOT_SET) *handler = NULL; - else IWineAsyncOperationCompletedHandler_AddRef( (*handler = impl->handler) ); - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static HRESULT WINAPI async_impl_get_Result( IWineAsyncInfoImpl *iface, PROPVARIANT *result ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); - HRESULT hr = E_ILLEGAL_METHOD_CALL; - - TRACE( "iface %p, result %p.\n", iface, result ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Completed || impl->status == Error) - { - PropVariantCopy( result, &impl->result ); - hr = impl->hr; - } - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static HRESULT WINAPI async_impl_Start( IWineAsyncInfoImpl *iface ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); - - TRACE( "iface %p.\n", iface ); - - /* keep the async alive in the callback */ - IInspectable_AddRef( impl->IInspectable_outer ); - SubmitThreadpoolWork( impl->async_run_work ); - - return S_OK; -} - -static const struct IWineAsyncInfoImplVtbl async_impl_vtbl = -{ - /* IUnknown methods */ - async_impl_QueryInterface, - async_impl_AddRef, - async_impl_Release, - /* IWineAsyncInfoImpl */ - async_impl_put_Completed, - async_impl_get_Completed, - async_impl_get_Result, - async_impl_Start, -}; - -DEFINE_IINSPECTABLE_OUTER( async_info, IAsyncInfo, struct async_info, IInspectable_outer ) - -static HRESULT WINAPI async_info_get_Id( IAsyncInfo *iface, UINT32 *id ) -{ - struct async_info *impl = impl_from_IAsyncInfo( iface ); - HRESULT hr = S_OK; - - TRACE( "iface %p, id %p.\n", iface, id ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; - *id = 1; - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static HRESULT WINAPI async_info_get_Status( IAsyncInfo *iface, AsyncStatus *status ) -{ - struct async_info *impl = impl_from_IAsyncInfo( iface ); - HRESULT hr = S_OK; - - TRACE( "iface %p, status %p.\n", iface, status ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; - *status = impl->status; - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static HRESULT WINAPI async_info_get_ErrorCode( IAsyncInfo *iface, HRESULT *error_code ) -{ - struct async_info *impl = impl_from_IAsyncInfo( iface ); - HRESULT hr = S_OK; - - TRACE( "iface %p, error_code %p.\n", iface, error_code ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Closed) *error_code = hr = E_ILLEGAL_METHOD_CALL; - else *error_code = impl->hr; - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static HRESULT WINAPI async_info_Cancel( IAsyncInfo *iface ) -{ - struct async_info *impl = impl_from_IAsyncInfo( iface ); - HRESULT hr = S_OK; - - TRACE( "iface %p.\n", iface ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; - else if (impl->status == Started) impl->status = Canceled; - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static HRESULT WINAPI async_info_Close( IAsyncInfo *iface ) -{ - struct async_info *impl = impl_from_IAsyncInfo( iface ); - HRESULT hr = S_OK; - - TRACE( "iface %p.\n", iface ); - - EnterCriticalSection( &impl->cs ); - if (impl->status == Started) - hr = E_ILLEGAL_STATE_CHANGE; - else if (impl->status != Closed) - { - CloseThreadpoolWork( impl->async_run_work ); - impl->async_run_work = NULL; - impl->status = Closed; - } - LeaveCriticalSection( &impl->cs ); - - return hr; -} - -static const struct IAsyncInfoVtbl async_info_vtbl = -{ - /* IUnknown methods */ - async_info_QueryInterface, - async_info_AddRef, - async_info_Release, - /* IInspectable methods */ - async_info_GetIids, - async_info_GetRuntimeClassName, - async_info_GetTrustLevel, - /* IAsyncInfo */ - async_info_get_Id, - async_info_get_Status, - async_info_get_ErrorCode, - async_info_Cancel, - async_info_Close, -}; - -static void CALLBACK async_info_callback( TP_CALLBACK_INSTANCE *instance, void *iface, TP_WORK *work ) -{ - struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); - IInspectable *operation = impl->IInspectable_outer; - PROPVARIANT result; - HRESULT hr; - - hr = impl->callback( impl->invoker, impl->param, &result ); - - EnterCriticalSection( &impl->cs ); - if (impl->status != Closed) impl->status = FAILED(hr) ? Error : Completed; - PropVariantCopy( &impl->result, &result ); - impl->hr = hr; - - if (impl->handler != NULL && impl->handler != HANDLER_NOT_SET) - { - IWineAsyncOperationCompletedHandler *handler = impl->handler; - AsyncStatus status = impl->status; - impl->handler = NULL; /* Prevent concurrent invoke. */ - LeaveCriticalSection( &impl->cs ); - - IWineAsyncOperationCompletedHandler_Invoke( handler, operation, status ); - IWineAsyncOperationCompletedHandler_Release( handler ); - } - else LeaveCriticalSection( &impl->cs ); - - /* release refcount acquired in Start */ - IInspectable_Release( operation ); - - PropVariantClear( &result ); -} - -static HRESULT async_info_create( IUnknown *invoker, IUnknown *param, async_operation_callback callback, - IInspectable *outer, IWineAsyncInfoImpl **out ) -{ - struct async_info *impl; - HRESULT hr; - - if (!(impl = calloc( 1, sizeof(struct async_info) ))) return E_OUTOFMEMORY; - impl->IWineAsyncInfoImpl_iface.lpVtbl = &async_impl_vtbl; - impl->IAsyncInfo_iface.lpVtbl = &async_info_vtbl; - impl->IInspectable_outer = outer; - impl->ref = 1; - - impl->callback = callback; - impl->handler = HANDLER_NOT_SET; - impl->status = Started; - if (!(impl->async_run_work = CreateThreadpoolWork( async_info_callback, &impl->IWineAsyncInfoImpl_iface, NULL ))) - { - hr = HRESULT_FROM_WIN32( GetLastError() ); - free( impl ); - return hr; - } - - if ((impl->invoker = invoker)) IUnknown_AddRef( impl->invoker ); - if ((impl->param = param)) IUnknown_AddRef( impl->param ); - - InitializeCriticalSection( &impl->cs ); - impl->cs.DebugInfo->Spare[0] = (DWORD_PTR)( __FILE__ ": async_info.cs" ); - - *out = &impl->IWineAsyncInfoImpl_iface; - return S_OK; -} - struct async_bool { IAsyncOperation_boolean IAsyncOperation_boolean_iface; @@ -484,7 +146,7 @@ static const struct IAsyncOperation_booleanVtbl async_bool_vtbl = async_bool_GetResults, };
-HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *param, async_operation_callback callback, +HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *param, async_callback callback, IAsyncOperation_boolean **out ) { struct async_bool *impl; @@ -627,7 +289,7 @@ static const struct IAsyncOperation_ForceFeedbackLoadEffectResultVtbl async_resu async_result_GetResults, };
-HRESULT async_operation_effect_result_create( IUnknown *invoker, IUnknown *param, async_operation_callback callback, +HRESULT async_operation_effect_result_create( IUnknown *invoker, IUnknown *param, async_callback callback, IAsyncOperation_ForceFeedbackLoadEffectResult **out ) { struct async_result *impl; diff --git a/dlls/windows.gaming.input/force_feedback.c b/dlls/windows.gaming.input/force_feedback.c index cff3c184bf9..dd2b56375cf 100644 --- a/dlls/windows.gaming.input/force_feedback.c +++ b/dlls/windows.gaming.input/force_feedback.c @@ -601,7 +601,7 @@ static HRESULT WINAPI motor_get_SupportedAxes( IForceFeedbackMotor *iface, enum return hr; }
-static HRESULT WINAPI motor_load_effect_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) +static HRESULT motor_load_effect_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) { struct effect *effect = impl_from_IForceFeedbackEffect( (IForceFeedbackEffect *)param ); IForceFeedbackMotor *motor = (IForceFeedbackMotor *)invoker; @@ -693,7 +693,7 @@ static HRESULT WINAPI motor_StopAllEffects( IForceFeedbackMotor *iface ) return IDirectInputDevice8_SendForceFeedbackCommand( impl->device, DISFFC_STOPALL ); }
-static HRESULT WINAPI motor_try_disable_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) +static HRESULT motor_try_disable_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) { struct motor *impl = impl_from_IForceFeedbackMotor( (IForceFeedbackMotor *)invoker ); HRESULT hr; @@ -711,7 +711,7 @@ static HRESULT WINAPI motor_TryDisableAsync( IForceFeedbackMotor *iface, IAsyncO return async_operation_boolean_create( (IUnknown *)iface, NULL, motor_try_disable_async, async_op ); }
-static HRESULT WINAPI motor_try_enable_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) +static HRESULT motor_try_enable_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) { struct motor *impl = impl_from_IForceFeedbackMotor( (IForceFeedbackMotor *)invoker ); HRESULT hr; @@ -729,7 +729,7 @@ static HRESULT WINAPI motor_TryEnableAsync( IForceFeedbackMotor *iface, IAsyncOp return async_operation_boolean_create( (IUnknown *)iface, NULL, motor_try_enable_async, async_op ); }
-static HRESULT WINAPI motor_try_reset_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) +static HRESULT motor_try_reset_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) { struct motor *impl = impl_from_IForceFeedbackMotor( (IForceFeedbackMotor *)invoker ); HRESULT hr; @@ -747,7 +747,7 @@ static HRESULT WINAPI motor_TryResetAsync( IForceFeedbackMotor *iface, IAsyncOpe return async_operation_boolean_create( (IUnknown *)iface, NULL, motor_try_reset_async, async_op ); }
-static HRESULT WINAPI motor_unload_effect_async( IUnknown *iface, IUnknown *param, PROPVARIANT *result ) +static HRESULT motor_unload_effect_async( IUnknown *iface, IUnknown *param, PROPVARIANT *result ) { struct effect *effect = impl_from_IForceFeedbackEffect( (IForceFeedbackEffect *)param ); IDirectInputEffect *dinput_effect; diff --git a/dlls/windows.gaming.input/private.h b/dlls/windows.gaming.input/private.h index fd1335c689a..0b0abd3f1f6 100644 --- a/dlls/windows.gaming.input/private.h +++ b/dlls/windows.gaming.input/private.h @@ -68,10 +68,9 @@ extern void event_handlers_notify( struct list *list, IInspectable *element ); extern HRESULT force_feedback_motor_create( IDirectInputDevice8W *device, IForceFeedbackMotor **out ); extern HRESULT force_feedback_effect_create( enum WineForceFeedbackEffectType type, IInspectable *outer, IWineForceFeedbackEffectImpl **out );
-typedef HRESULT (WINAPI *async_operation_callback)( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ); -extern HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *param, async_operation_callback callback, +extern HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *param, async_callback callback, IAsyncOperation_boolean **out ); -extern HRESULT async_operation_effect_result_create( IUnknown *invoker, IUnknown *param, async_operation_callback callback, +extern HRESULT async_operation_effect_result_create( IUnknown *invoker, IUnknown *param, async_callback callback, IAsyncOperation_ForceFeedbackLoadEffectResult **out );
static inline const char *debugstr_vector3( const Vector3 *vector ) diff --git a/dlls/windows.gaming.input/provider.idl b/dlls/windows.gaming.input/provider.idl index e7b6e96b8aa..ebf6cef6e4a 100644 --- a/dlls/windows.gaming.input/provider.idl +++ b/dlls/windows.gaming.input/provider.idl @@ -46,9 +46,6 @@ namespace Windows.Gaming.Input.Custom { interface IWineGameControllerProvider; runtimeclass WineGameControllerProvider;
- /* type-pruning version of AsyncOperationCompletedHandler<T> */ - delegate HRESULT WineAsyncOperationCompletedHandler([in] IInspectable *async, [in] AsyncStatus status); - enum WineGameControllerType { Joystick = 0, @@ -195,17 +192,6 @@ namespace Windows.Gaming.Input.Custom { [in, optional] WineForceFeedbackEffectEnvelope *envelope); }
- [ - uuid(83f377ee-c799-11ec-9d64-0242ac120002) - ] - interface IWineAsyncInfoImpl : IUnknown - { - [propput] HRESULT Completed([in] WineAsyncOperationCompletedHandler *handler); - [propget] HRESULT Completed([out, retval] WineAsyncOperationCompletedHandler **handler); - [propget] HRESULT Result([out, retval] PROPVARIANT *result); - HRESULT Start(); - } - [ marshaling_behavior(agile), threading(both) diff --git a/include/wine/winrt.idl b/include/wine/winrt.idl index 95322875656..59a6da28ee2 100644 --- a/include/wine/winrt.idl +++ b/include/wine/winrt.idl @@ -25,6 +25,11 @@ #pragma winrt ns_prefix #endif
+import "propidl.idl"; +import "inspectable.idl"; +import "asyncinfo.idl"; +import "eventtoken.idl"; +import "windowscontracts.idl"; import "windows.foundation.idl";
struct vector_iids @@ -40,6 +45,28 @@ extern HRESULT vector_hstring_copy( Windows.Foundation.Collections.IIterable<HST Windows.Foundation.Collections.IVector<HSTRING> **out ); extern HRESULT vector_inspectable_create( const struct vector_iids *iids, void **out );
+namespace Windows.Foundation { + + /* type-pruning version of AsyncOperationCompletedHandler<T> */ + delegate HRESULT WineAsyncOperationCompletedHandler([in] IInspectable *async, [in] AsyncStatus status); + + [ + uuid(83f377ee-c799-11ec-9d64-0242ac120002) + ] + interface IWineAsyncInfoImpl : IUnknown + { + [propput] HRESULT Completed([in] WineAsyncOperationCompletedHandler *handler); + [propget] HRESULT Completed([out, retval] WineAsyncOperationCompletedHandler **handler); + [propget] HRESULT Result([out, retval] PROPVARIANT *result); + HRESULT Start(); + } + +} + +typedef HRESULT (*async_callback)( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ); +extern HRESULT async_info_create( IUnknown *invoker, IUnknown *param, async_callback callback, + IInspectable *outer, Windows.Foundation.IWineAsyncInfoImpl **out ); + extern const char *debugstr_hstring( HSTRING hstr );
cpp_quote("#define DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from, iface_mem, expr ) \") diff --git a/libs/winewinrt/Makefile.in b/libs/winewinrt/Makefile.in index 937df798735..fce5844ee51 100644 --- a/libs/winewinrt/Makefile.in +++ b/libs/winewinrt/Makefile.in @@ -1,6 +1,7 @@ STATICLIB = libwinewinrt.a
C_SRCS = \ + async_info.c \ debug.c \ vector_hstring.c \ vector_inspectable.c diff --git a/libs/winewinrt/async_info.c b/libs/winewinrt/async_info.c new file mode 100644 index 00000000000..0e1db19e1fb --- /dev/null +++ b/libs/winewinrt/async_info.c @@ -0,0 +1,361 @@ +/* WinRT IAsyncInfo implementation + * + * Copyright 2022 Bernhard Kölbl for CodeWeavers + * Copyright 2022 Rémi Bernon 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 "private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(winrt); + +#define Closed 4 +#define HANDLER_NOT_SET ((void *)~(ULONG_PTR)0) + +struct async_info +{ + IWineAsyncInfoImpl IWineAsyncInfoImpl_iface; + IAsyncInfo IAsyncInfo_iface; + IInspectable *IInspectable_outer; + LONG ref; + + async_callback callback; + TP_WORK *async_run_work; + IUnknown *invoker; + IUnknown *param; + + CRITICAL_SECTION cs; + IWineAsyncOperationCompletedHandler *handler; + PROPVARIANT result; + AsyncStatus status; + HRESULT hr; +}; + +static inline struct async_info *impl_from_IWineAsyncInfoImpl( IWineAsyncInfoImpl *iface ) +{ + return CONTAINING_RECORD( iface, struct async_info, IWineAsyncInfoImpl_iface ); +} + +static HRESULT WINAPI async_impl_QueryInterface( IWineAsyncInfoImpl *iface, REFIID iid, void **out ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( 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_IAgileObject ) || + IsEqualGUID( iid, &IID_IWineAsyncInfoImpl )) + { + IInspectable_AddRef( (*out = &impl->IWineAsyncInfoImpl_iface) ); + return S_OK; + } + + if (IsEqualGUID( iid, &IID_IAsyncInfo )) + { + IInspectable_AddRef( (*out = &impl->IAsyncInfo_iface) ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI async_impl_AddRef( IWineAsyncInfoImpl *iface ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p, ref %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI async_impl_Release( IWineAsyncInfoImpl *iface ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + TRACE( "iface %p, ref %lu.\n", iface, ref ); + + if (!ref) + { + if (impl->handler && impl->handler != HANDLER_NOT_SET) IWineAsyncOperationCompletedHandler_Release( impl->handler ); + IAsyncInfo_Close( &impl->IAsyncInfo_iface ); + if (impl->param) IUnknown_Release( impl->param ); + if (impl->invoker) IUnknown_Release( impl->invoker ); + impl->cs.DebugInfo->Spare[0] = 0; + DeleteCriticalSection( &impl->cs ); + free( impl ); + } + + return ref; +} + +static HRESULT WINAPI async_impl_put_Completed( IWineAsyncInfoImpl *iface, IWineAsyncOperationCompletedHandler *handler ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); + HRESULT hr = S_OK; + + TRACE( "iface %p, handler %p.\n", iface, handler ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; + else if (impl->handler != HANDLER_NOT_SET) hr = E_ILLEGAL_DELEGATE_ASSIGNMENT; + else if ((impl->handler = handler)) + { + IWineAsyncOperationCompletedHandler_AddRef( impl->handler ); + + if (impl->status > Started) + { + IInspectable *operation = impl->IInspectable_outer; + AsyncStatus status = impl->status; + impl->handler = NULL; /* Prevent concurrent invoke. */ + LeaveCriticalSection( &impl->cs ); + + IWineAsyncOperationCompletedHandler_Invoke( handler, operation, status ); + IWineAsyncOperationCompletedHandler_Release( handler ); + + return S_OK; + } + } + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI async_impl_get_Completed( IWineAsyncInfoImpl *iface, IWineAsyncOperationCompletedHandler **handler ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); + HRESULT hr = S_OK; + + TRACE( "iface %p, handler %p.\n", iface, handler ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; + if (impl->handler == NULL || impl->handler == HANDLER_NOT_SET) *handler = NULL; + else IWineAsyncOperationCompletedHandler_AddRef( (*handler = impl->handler) ); + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI async_impl_get_Result( IWineAsyncInfoImpl *iface, PROPVARIANT *result ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); + HRESULT hr = E_ILLEGAL_METHOD_CALL; + + TRACE( "iface %p, result %p.\n", iface, result ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Completed || impl->status == Error) + { + PropVariantCopy( result, &impl->result ); + hr = impl->hr; + } + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI async_impl_Start( IWineAsyncInfoImpl *iface ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); + + TRACE( "iface %p.\n", iface ); + + /* keep the async alive in the callback */ + IInspectable_AddRef( impl->IInspectable_outer ); + SubmitThreadpoolWork( impl->async_run_work ); + + return S_OK; +} + +static const struct IWineAsyncInfoImplVtbl async_impl_vtbl = +{ + /* IUnknown methods */ + async_impl_QueryInterface, + async_impl_AddRef, + async_impl_Release, + /* IWineAsyncInfoImpl */ + async_impl_put_Completed, + async_impl_get_Completed, + async_impl_get_Result, + async_impl_Start, +}; + +DEFINE_IINSPECTABLE_OUTER( async_info, IAsyncInfo, struct async_info, IInspectable_outer ) + +static HRESULT WINAPI async_info_get_Id( IAsyncInfo *iface, UINT32 *id ) +{ + struct async_info *impl = impl_from_IAsyncInfo( iface ); + HRESULT hr = S_OK; + + TRACE( "iface %p, id %p.\n", iface, id ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; + *id = 1; + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI async_info_get_Status( IAsyncInfo *iface, AsyncStatus *status ) +{ + struct async_info *impl = impl_from_IAsyncInfo( iface ); + HRESULT hr = S_OK; + + TRACE( "iface %p, status %p.\n", iface, status ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; + *status = impl->status; + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI async_info_get_ErrorCode( IAsyncInfo *iface, HRESULT *error_code ) +{ + struct async_info *impl = impl_from_IAsyncInfo( iface ); + HRESULT hr = S_OK; + + TRACE( "iface %p, error_code %p.\n", iface, error_code ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Closed) *error_code = hr = E_ILLEGAL_METHOD_CALL; + else *error_code = impl->hr; + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI async_info_Cancel( IAsyncInfo *iface ) +{ + struct async_info *impl = impl_from_IAsyncInfo( iface ); + HRESULT hr = S_OK; + + TRACE( "iface %p.\n", iface ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; + else if (impl->status == Started) impl->status = Canceled; + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI async_info_Close( IAsyncInfo *iface ) +{ + struct async_info *impl = impl_from_IAsyncInfo( iface ); + HRESULT hr = S_OK; + + TRACE( "iface %p.\n", iface ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Started) + hr = E_ILLEGAL_STATE_CHANGE; + else if (impl->status != Closed) + { + CloseThreadpoolWork( impl->async_run_work ); + impl->async_run_work = NULL; + impl->status = Closed; + } + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static const struct IAsyncInfoVtbl async_info_vtbl = +{ + /* IUnknown methods */ + async_info_QueryInterface, + async_info_AddRef, + async_info_Release, + /* IInspectable methods */ + async_info_GetIids, + async_info_GetRuntimeClassName, + async_info_GetTrustLevel, + /* IAsyncInfo */ + async_info_get_Id, + async_info_get_Status, + async_info_get_ErrorCode, + async_info_Cancel, + async_info_Close, +}; + +static void CALLBACK async_info_callback( TP_CALLBACK_INSTANCE *instance, void *iface, TP_WORK *work ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); + IInspectable *operation = impl->IInspectable_outer; + PROPVARIANT result; + HRESULT hr; + + hr = impl->callback( impl->invoker, impl->param, &result ); + + EnterCriticalSection( &impl->cs ); + if (impl->status != Closed) impl->status = FAILED(hr) ? Error : Completed; + PropVariantCopy( &impl->result, &result ); + impl->hr = hr; + + if (impl->handler != NULL && impl->handler != HANDLER_NOT_SET) + { + IWineAsyncOperationCompletedHandler *handler = impl->handler; + AsyncStatus status = impl->status; + impl->handler = NULL; /* Prevent concurrent invoke. */ + LeaveCriticalSection( &impl->cs ); + + IWineAsyncOperationCompletedHandler_Invoke( handler, operation, status ); + IWineAsyncOperationCompletedHandler_Release( handler ); + } + else LeaveCriticalSection( &impl->cs ); + + /* release refcount acquired in Start */ + IInspectable_Release( operation ); + + PropVariantClear( &result ); +} + +HRESULT async_info_create( IUnknown *invoker, IUnknown *param, async_callback callback, + IInspectable *outer, IWineAsyncInfoImpl **out ) +{ + struct async_info *impl; + HRESULT hr; + + if (!(impl = calloc( 1, sizeof(struct async_info) ))) return E_OUTOFMEMORY; + impl->IWineAsyncInfoImpl_iface.lpVtbl = &async_impl_vtbl; + impl->IAsyncInfo_iface.lpVtbl = &async_info_vtbl; + impl->IInspectable_outer = outer; + impl->ref = 1; + + impl->callback = callback; + impl->handler = HANDLER_NOT_SET; + impl->status = Started; + if (!(impl->async_run_work = CreateThreadpoolWork( async_info_callback, &impl->IWineAsyncInfoImpl_iface, NULL ))) + { + hr = HRESULT_FROM_WIN32( GetLastError() ); + free( impl ); + return hr; + } + + if ((impl->invoker = invoker)) IUnknown_AddRef( impl->invoker ); + if ((impl->param = param)) IUnknown_AddRef( impl->param ); + + InitializeCriticalSection( &impl->cs ); + impl->cs.DebugInfo->Spare[0] = (DWORD_PTR)( __FILE__ ": async_info.cs" ); + + *out = &impl->IWineAsyncInfoImpl_iface; + return S_OK; +}
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/cryptowinrt/Makefile.in | 1 - dlls/cryptowinrt/credentials.c | 2 +- dlls/cryptowinrt/private.h | 3 - dlls/windows.gaming.input/async.c | 145 ------------------ dlls/windows.gaming.input/force_feedback.c | 8 +- dlls/windows.gaming.input/private.h | 2 - include/wine/winrt.idl | 2 + libs/winewinrt/Makefile.in | 1 + .../async.c => libs/winewinrt/async_bool.c | 9 +- 9 files changed, 12 insertions(+), 161 deletions(-) rename dlls/cryptowinrt/async.c => libs/winewinrt/async_bool.c (96%)
diff --git a/dlls/cryptowinrt/Makefile.in b/dlls/cryptowinrt/Makefile.in index 0f99c556acb..56fcd79e895 100644 --- a/dlls/cryptowinrt/Makefile.in +++ b/dlls/cryptowinrt/Makefile.in @@ -2,7 +2,6 @@ MODULE = cryptowinrt.dll IMPORTS = winewinrt combase bcrypt uuid
C_SRCS = \ - async.c \ credentials.c \ main.c
diff --git a/dlls/cryptowinrt/credentials.c b/dlls/cryptowinrt/credentials.c index 960c5fabf8f..159bd1d9277 100644 --- a/dlls/cryptowinrt/credentials.c +++ b/dlls/cryptowinrt/credentials.c @@ -128,7 +128,7 @@ static HRESULT is_supported_async( IUnknown *invoker, IUnknown *param, PROPVARIA static HRESULT WINAPI credentials_statics_IsSupportedAsync( IKeyCredentialManagerStatics *iface, IAsyncOperation_boolean **value ) { TRACE( "iface %p, value %p.\n", iface, value ); - return async_operation_boolean_create( (IUnknown *)iface, NULL, is_supported_async, value ); + return async_bool_create( (IUnknown *)iface, NULL, is_supported_async, value ); }
static HRESULT WINAPI credentials_statics_RenewAttestationAsync( IKeyCredentialManagerStatics *iface, IAsyncAction **operation ) diff --git a/dlls/cryptowinrt/private.h b/dlls/cryptowinrt/private.h index e83aa41671a..0890143cbe7 100644 --- a/dlls/cryptowinrt/private.h +++ b/dlls/cryptowinrt/private.h @@ -41,7 +41,4 @@
extern IActivationFactory *credentials_activation_factory;
-extern HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *param, async_callback callback, - IAsyncOperation_boolean **out ); - #endif diff --git a/dlls/windows.gaming.input/async.c b/dlls/windows.gaming.input/async.c index 0e3814d5ac4..ca69afac588 100644 --- a/dlls/windows.gaming.input/async.c +++ b/dlls/windows.gaming.input/async.c @@ -25,151 +25,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(input);
-struct async_bool -{ - IAsyncOperation_boolean IAsyncOperation_boolean_iface; - IWineAsyncInfoImpl *IWineAsyncInfoImpl_inner; - LONG ref; -}; - -static inline struct async_bool *impl_from_IAsyncOperation_boolean( IAsyncOperation_boolean *iface ) -{ - return CONTAINING_RECORD( iface, struct async_bool, IAsyncOperation_boolean_iface ); -} - -static HRESULT WINAPI async_bool_QueryInterface( IAsyncOperation_boolean *iface, REFIID iid, void **out ) -{ - struct async_bool *impl = impl_from_IAsyncOperation_boolean( 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_IAgileObject ) || - IsEqualGUID( iid, &IID_IAsyncOperation_boolean )) - { - IInspectable_AddRef( (*out = &impl->IAsyncOperation_boolean_iface) ); - return S_OK; - } - - return IWineAsyncInfoImpl_QueryInterface( impl->IWineAsyncInfoImpl_inner, iid, out ); -} - -static ULONG WINAPI async_bool_AddRef( IAsyncOperation_boolean *iface ) -{ - struct async_bool *impl = impl_from_IAsyncOperation_boolean( iface ); - ULONG ref = InterlockedIncrement( &impl->ref ); - TRACE( "iface %p, ref %lu.\n", iface, ref ); - return ref; -} - -static ULONG WINAPI async_bool_Release( IAsyncOperation_boolean *iface ) -{ - struct async_bool *impl = impl_from_IAsyncOperation_boolean( iface ); - ULONG ref = InterlockedDecrement( &impl->ref ); - TRACE( "iface %p, ref %lu.\n", iface, ref ); - - if (!ref) - { - /* guard against re-entry if inner releases an outer iface */ - InterlockedIncrement( &impl->ref ); - IWineAsyncInfoImpl_Release( impl->IWineAsyncInfoImpl_inner ); - free( impl ); - } - - return ref; -} - -static HRESULT WINAPI async_bool_GetIids( IAsyncOperation_boolean *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 async_bool_GetRuntimeClassName( IAsyncOperation_boolean *iface, HSTRING *class_name ) -{ - return WindowsCreateString( L"Windows.Foundation.IAsyncOperation`1<Boolean>", - ARRAY_SIZE(L"Windows.Foundation.IAsyncOperation`1<Boolean>"), - class_name ); -} - -static HRESULT WINAPI async_bool_GetTrustLevel( IAsyncOperation_boolean *iface, TrustLevel *trust_level ) -{ - FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); - return E_NOTIMPL; -} - -static HRESULT WINAPI async_bool_put_Completed( IAsyncOperation_boolean *iface, IAsyncOperationCompletedHandler_boolean *bool_handler ) -{ - IWineAsyncOperationCompletedHandler *handler = (IWineAsyncOperationCompletedHandler *)bool_handler; - struct async_bool *impl = impl_from_IAsyncOperation_boolean( iface ); - TRACE( "iface %p, handler %p.\n", iface, handler ); - return IWineAsyncInfoImpl_put_Completed( impl->IWineAsyncInfoImpl_inner, (IWineAsyncOperationCompletedHandler *)handler ); -} - -static HRESULT WINAPI async_bool_get_Completed( IAsyncOperation_boolean *iface, IAsyncOperationCompletedHandler_boolean **bool_handler ) -{ - IWineAsyncOperationCompletedHandler **handler = (IWineAsyncOperationCompletedHandler **)bool_handler; - struct async_bool *impl = impl_from_IAsyncOperation_boolean( iface ); - TRACE( "iface %p, handler %p.\n", iface, handler ); - return IWineAsyncInfoImpl_get_Completed( impl->IWineAsyncInfoImpl_inner, (IWineAsyncOperationCompletedHandler **)handler ); -} - -static HRESULT WINAPI async_bool_GetResults( IAsyncOperation_boolean *iface, BOOLEAN *results ) -{ - struct async_bool *impl = impl_from_IAsyncOperation_boolean( iface ); - PROPVARIANT result = {.vt = VT_BOOL}; - HRESULT hr; - - TRACE( "iface %p, results %p.\n", iface, results ); - - hr = IWineAsyncInfoImpl_get_Result( impl->IWineAsyncInfoImpl_inner, &result ); - - *results = result.boolVal; - PropVariantClear( &result ); - return hr; -} - -static const struct IAsyncOperation_booleanVtbl async_bool_vtbl = -{ - /* IUnknown methods */ - async_bool_QueryInterface, - async_bool_AddRef, - async_bool_Release, - /* IInspectable methods */ - async_bool_GetIids, - async_bool_GetRuntimeClassName, - async_bool_GetTrustLevel, - /* IAsyncOperation<boolean> */ - async_bool_put_Completed, - async_bool_get_Completed, - async_bool_GetResults, -}; - -HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *param, async_callback callback, - IAsyncOperation_boolean **out ) -{ - struct async_bool *impl; - HRESULT hr; - - *out = NULL; - if (!(impl = calloc( 1, sizeof(*impl) ))) return E_OUTOFMEMORY; - impl->IAsyncOperation_boolean_iface.lpVtbl = &async_bool_vtbl; - impl->ref = 1; - - if (FAILED(hr = async_info_create( invoker, param, callback, (IInspectable *)&impl->IAsyncOperation_boolean_iface, &impl->IWineAsyncInfoImpl_inner )) || - FAILED(hr = IWineAsyncInfoImpl_Start( impl->IWineAsyncInfoImpl_inner ))) - { - if (impl->IWineAsyncInfoImpl_inner) IWineAsyncInfoImpl_Release( impl->IWineAsyncInfoImpl_inner ); - free( impl ); - return hr; - } - - *out = &impl->IAsyncOperation_boolean_iface; - TRACE( "created IAsyncOperation_boolean %p\n", *out ); - return S_OK; -} - struct async_result { IAsyncOperation_ForceFeedbackLoadEffectResult IAsyncOperation_ForceFeedbackLoadEffectResult_iface; diff --git a/dlls/windows.gaming.input/force_feedback.c b/dlls/windows.gaming.input/force_feedback.c index dd2b56375cf..73a75cbe735 100644 --- a/dlls/windows.gaming.input/force_feedback.c +++ b/dlls/windows.gaming.input/force_feedback.c @@ -708,7 +708,7 @@ static HRESULT motor_try_disable_async( IUnknown *invoker, IUnknown *param, PROP static HRESULT WINAPI motor_TryDisableAsync( IForceFeedbackMotor *iface, IAsyncOperation_boolean **async_op ) { TRACE( "iface %p, async_op %p.\n", iface, async_op ); - return async_operation_boolean_create( (IUnknown *)iface, NULL, motor_try_disable_async, async_op ); + return async_bool_create( (IUnknown *)iface, NULL, motor_try_disable_async, async_op ); }
static HRESULT motor_try_enable_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) @@ -726,7 +726,7 @@ static HRESULT motor_try_enable_async( IUnknown *invoker, IUnknown *param, PROPV static HRESULT WINAPI motor_TryEnableAsync( IForceFeedbackMotor *iface, IAsyncOperation_boolean **async_op ) { TRACE( "iface %p, async_op %p.\n", iface, async_op ); - return async_operation_boolean_create( (IUnknown *)iface, NULL, motor_try_enable_async, async_op ); + return async_bool_create( (IUnknown *)iface, NULL, motor_try_enable_async, async_op ); }
static HRESULT motor_try_reset_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) @@ -744,7 +744,7 @@ static HRESULT motor_try_reset_async( IUnknown *invoker, IUnknown *param, PROPVA static HRESULT WINAPI motor_TryResetAsync( IForceFeedbackMotor *iface, IAsyncOperation_boolean **async_op ) { TRACE( "iface %p, async_op %p.\n", iface, async_op ); - return async_operation_boolean_create( (IUnknown *)iface, NULL, motor_try_reset_async, async_op ); + return async_bool_create( (IUnknown *)iface, NULL, motor_try_reset_async, async_op ); }
static HRESULT motor_unload_effect_async( IUnknown *iface, IUnknown *param, PROPVARIANT *result ) @@ -783,7 +783,7 @@ static HRESULT WINAPI motor_TryUnloadEffectAsync( IForceFeedbackMotor *iface, IF LeaveCriticalSection( &impl->cs ); if (FAILED(hr)) return hr;
- return async_operation_boolean_create( (IUnknown *)iface, (IUnknown *)effect, motor_unload_effect_async, async_op ); + return async_bool_create( (IUnknown *)iface, (IUnknown *)effect, motor_unload_effect_async, async_op ); }
static const struct IForceFeedbackMotorVtbl motor_vtbl = diff --git a/dlls/windows.gaming.input/private.h b/dlls/windows.gaming.input/private.h index 0b0abd3f1f6..19772b9ebeb 100644 --- a/dlls/windows.gaming.input/private.h +++ b/dlls/windows.gaming.input/private.h @@ -68,8 +68,6 @@ extern void event_handlers_notify( struct list *list, IInspectable *element ); extern HRESULT force_feedback_motor_create( IDirectInputDevice8W *device, IForceFeedbackMotor **out ); extern HRESULT force_feedback_effect_create( enum WineForceFeedbackEffectType type, IInspectable *outer, IWineForceFeedbackEffectImpl **out );
-extern HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *param, async_callback callback, - IAsyncOperation_boolean **out ); extern HRESULT async_operation_effect_result_create( IUnknown *invoker, IUnknown *param, async_callback callback, IAsyncOperation_ForceFeedbackLoadEffectResult **out );
diff --git a/include/wine/winrt.idl b/include/wine/winrt.idl index 59a6da28ee2..374e30902e2 100644 --- a/include/wine/winrt.idl +++ b/include/wine/winrt.idl @@ -66,6 +66,8 @@ namespace Windows.Foundation { typedef HRESULT (*async_callback)( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ); extern HRESULT async_info_create( IUnknown *invoker, IUnknown *param, async_callback callback, IInspectable *outer, Windows.Foundation.IWineAsyncInfoImpl **out ); +extern HRESULT async_bool_create( IUnknown *invoker, IUnknown *param, async_callback callback, + Windows.Foundation.IAsyncOperation<boolean> **out );
extern const char *debugstr_hstring( HSTRING hstr );
diff --git a/libs/winewinrt/Makefile.in b/libs/winewinrt/Makefile.in index fce5844ee51..d06bfa31dcf 100644 --- a/libs/winewinrt/Makefile.in +++ b/libs/winewinrt/Makefile.in @@ -1,6 +1,7 @@ STATICLIB = libwinewinrt.a
C_SRCS = \ + async_bool.c \ async_info.c \ debug.c \ vector_hstring.c \ diff --git a/dlls/cryptowinrt/async.c b/libs/winewinrt/async_bool.c similarity index 96% rename from dlls/cryptowinrt/async.c rename to libs/winewinrt/async_bool.c index 8fb94e88312..aa7645ccdd3 100644 --- a/dlls/cryptowinrt/async.c +++ b/libs/winewinrt/async_bool.c @@ -1,5 +1,4 @@ -/* CryptoWinRT Implementation - * +/* * Copyright 2022 Bernhard Kölbl for CodeWeavers * Copyright 2022 Rémi Bernon for CodeWeavers * @@ -22,7 +21,7 @@
#include "wine/debug.h"
-WINE_DEFAULT_DEBUG_CHANNEL(crypto); +WINE_DEFAULT_DEBUG_CHANNEL(winrt);
struct async_bool { @@ -145,8 +144,8 @@ static const struct IAsyncOperation_booleanVtbl async_bool_vtbl = async_bool_GetResults, };
-HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *param, async_callback callback, - IAsyncOperation_boolean **out ) +HRESULT async_bool_create( IUnknown *invoker, IUnknown *param, async_callback callback, + IAsyncOperation_boolean **out ) { struct async_bool *impl; HRESULT hr;
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 full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=130369
Your paranoid android.
=== debian11 (build log) ===
error: patch failed: dlls/cryptowinrt/async.c:22 Task: Patch failed to apply
=== debian11b (build log) ===
error: patch failed: dlls/cryptowinrt/async.c:22 Task: Patch failed to apply
v3: Use a static library to factor common code instead. Fwiw this saves ~1300 LOC already and up to 2000 with more factorization that I didn't include in the MR yet.
On Wed Mar 8 08:58:43 2023 +0000, Rémi Bernon wrote:
v3: Use a static library to factor common code instead. Fwiw this saves ~1300 LOC already and up to 2000 with more factorization that I didn't include in the MR yet.
And it would make WinRT DLL logs a lot more readable, as they won't be spammed with "stdlib things" anymore.
On Wed Mar 8 08:12:10 2023 +0000, Rémi Bernon wrote:
I don't think we want to implement all of WinRT inside a single module.
The idea would be to use `apisetschema` for stub modules.
I think the v3 address most of my concerns, the fact `winewinrt` is loaded when stub modules are loaded made me less worry about application compatibility.
Pinging this after seeing https://gitlab.winehq.org/wine/wine/-/merge_requests/4985, to see if there's a good path forward? Isn't a static library a good solution? What makes this different from other cases like strmbase?