Merge branch 'vibhavp/wintypes-ipropertyset' into 'master'

dlls/wintypes: Add stubs for Windows.Foundation.Collections.PropertySet.

See merge request wine/wine!6766
This commit is contained in:
Vibhav Pant 2024-11-19 22:26:53 +00:00
commit df5615ad63
7 changed files with 971 additions and 1 deletions

View file

@ -5,4 +5,5 @@ IMPORTS = combase
SOURCES = \
classes.idl \
main.c \
propertyset.c \
wintypes_private.idl

View file

@ -31,6 +31,7 @@
#define WIDL_using_Windows_Foundation
#define WIDL_using_Windows_Foundation_Metadata
#define WIDL_using_Windows_Foundation_Collections
#include "windows.foundation.metadata.h"
#include "wintypes_private.h"
@ -1213,8 +1214,14 @@ HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID riid, void **out)
HRESULT WINAPI DllGetActivationFactory(HSTRING classid, IActivationFactory **factory)
{
const WCHAR *name;
TRACE("classid %s, factory %p.\n", debugstr_hstring(classid), factory);
*factory = &wintypes.IActivationFactory_iface;
name = WindowsGetStringRawBuffer(classid, NULL);
if (!wcscmp(name, RuntimeClass_Windows_Foundation_Collections_PropertySet))
*factory = IPropertySet_factory;
else
*factory = &wintypes.IActivationFactory_iface;
IUnknown_AddRef(*factory);
return S_OK;
}

812
dlls/wintypes/propertyset.c Normal file
View file

@ -0,0 +1,812 @@
/*
* Copyright 2024 Vibhav Pant
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define COBJMACROS
#include <winstring.h>
#include <objbase.h>
#include <wine/debug.h>
#include <activation.h>
#define WIDL_using_Windows_Foundation
#define WIDL_using_Windows_Foundation_Collections
#include "wintypes_private.h"
WINE_DEFAULT_DEBUG_CHANNEL( wintypes );
struct kvpair
{
IKeyValuePair_HSTRING_IInspectable IKeyValuePair_HSTRING_IInspectable_iface;
LONG ref;
};
static inline struct kvpair *
impl_from_IKeyValuePair_HSTRING_IInspectable( IKeyValuePair_HSTRING_IInspectable *iface )
{
return CONTAINING_RECORD( iface, struct kvpair, IKeyValuePair_HSTRING_IInspectable_iface );
}
static HRESULT STDMETHODCALLTYPE kvpair_QueryInterface( IKeyValuePair_HSTRING_IInspectable *iface,
REFIID iid, void **out )
{
TRACE( "(%p, %p, %p)\n", iface, debugstr_guid( iid ), out );
*out = NULL;
if (IsEqualGUID( iid, &IID_IUnknown ) ||
IsEqualGUID( iid, &IID_IInspectable ) ||
IsEqualGUID( iid, &IID_IKeyValuePair_HSTRING_IInspectable ))
{
*out = iface;
IUnknown_AddRef( (IUnknown *)(*out) );
return S_OK;
}
FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) );
return E_NOINTERFACE;
}
static ULONG STDMETHODCALLTYPE kvpair_AddRef( IKeyValuePair_HSTRING_IInspectable *iface )
{
struct kvpair *impl;
TRACE( "(%p)\n", iface );
impl = impl_from_IKeyValuePair_HSTRING_IInspectable( iface );
return InterlockedIncrement( &impl->ref );
}
static ULONG STDMETHODCALLTYPE kvpair_Release( IKeyValuePair_HSTRING_IInspectable *iface )
{
struct kvpair *impl;
ULONG ref;
TRACE( "(%p)\n", iface );
impl = impl_from_IKeyValuePair_HSTRING_IInspectable( iface );
ref = InterlockedDecrement( &impl->ref );
if (!ref)
free( impl );
return ref;
}
static HRESULT STDMETHODCALLTYPE kvpair_GetIIDs( IKeyValuePair_HSTRING_IInspectable *iface,
ULONG *iid_count, IID **iids )
{
FIXME( "(%p, %p, %p) stub!\n", iface, iid_count, iids );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE
kvpair_GetRuntimeClassName( IKeyValuePair_HSTRING_IInspectable *iface, HSTRING *class_name )
{
FIXME( "(%p, %p) stub!\n", iface, class_name );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE kvpair_GetTrustLevel( IKeyValuePair_HSTRING_IInspectable *iface,
TrustLevel *trust_level )
{
FIXME( "(%p, %p) stub!\n", iface, trust_level );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE kvpair_get_Key( IKeyValuePair_HSTRING_IInspectable *iface,
HSTRING *key )
{
FIXME( "(%p, %p) stub!\n", iface, key );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE kvpair_get_Value( IKeyValuePair_HSTRING_IInspectable *iface,
IInspectable **value )
{
FIXME( "(%p, %p) stub!\n", iface, value );
return E_NOTIMPL;
}
const static IKeyValuePair_HSTRING_IInspectableVtbl kvpair_vtbl =
{
kvpair_QueryInterface,
kvpair_AddRef,
kvpair_Release,
kvpair_GetIIDs,
kvpair_GetRuntimeClassName,
kvpair_GetTrustLevel,
kvpair_get_Key,
kvpair_get_Value,
};
static HRESULT kvpair_create( IKeyValuePair_HSTRING_IInspectable **kvpair )
{
struct kvpair *impl;
TRACE( "(%p)\n", kvpair );
*kvpair = NULL;
impl = calloc( 1, sizeof( *impl ) );
if (!impl)
return E_OUTOFMEMORY;
impl->IKeyValuePair_HSTRING_IInspectable_iface.lpVtbl = &kvpair_vtbl;
impl->ref = 1;
*kvpair = &impl->IKeyValuePair_HSTRING_IInspectable_iface;
return S_OK;
}
struct iterator_kvpair_HSTRING_IInspectable
{
IIterator_IKeyValuePair_HSTRING_IInspectable IIterator_IKeyValuePair_HSTRING_IInspectable_iface;
LONG ref;
};
static inline struct iterator_kvpair_HSTRING_IInspectable *
impl_from_IIterator_IKeyValuePair_HSTRING_IInspectable(
IIterator_IKeyValuePair_HSTRING_IInspectable *iface )
{
return CONTAINING_RECORD( iface, struct iterator_kvpair_HSTRING_IInspectable,
IIterator_IKeyValuePair_HSTRING_IInspectable_iface );
}
static HRESULT STDMETHODCALLTYPE iterator_kvpair_HSTRING_IInspectable_QueryInterface(
IIterator_IKeyValuePair_HSTRING_IInspectable *iface, REFIID iid, void **out )
{
TRACE( "(%p, %s, %p)\n", iface, debugstr_guid( iid ), out );
*out = NULL;
if (IsEqualGUID( iid, &IID_IUnknown ) ||
IsEqualGUID( iid, &IID_IInspectable ) ||
IsEqualGUID( iid, &IID_IIterator_IKeyValuePair_HSTRING_IInspectable ))
{
*out = iface;
IUnknown_AddRef( (IUnknown *)*out );
return S_OK;
}
FIXME( "%s not implemented, returning E_NOINTERFACE.", debugstr_guid( iid ) );
return E_NOINTERFACE;
}
static ULONG STDMETHODCALLTYPE
iterator_kvpair_HSTRING_IInspectable_AddRef( IIterator_IKeyValuePair_HSTRING_IInspectable *iface )
{
struct iterator_kvpair_HSTRING_IInspectable *impl;
TRACE( "(%p)\n", iface );
impl = impl_from_IIterator_IKeyValuePair_HSTRING_IInspectable( iface );
return InterlockedIncrement( &impl->ref );
}
static ULONG STDMETHODCALLTYPE
iterator_kvpair_HSTRING_IInspectable_Release( IIterator_IKeyValuePair_HSTRING_IInspectable *iface )
{
struct iterator_kvpair_HSTRING_IInspectable *impl;
ULONG ref;
TRACE( "(%p)\n", iface );
impl = impl_from_IIterator_IKeyValuePair_HSTRING_IInspectable( iface );
ref = InterlockedDecrement( &impl->ref );
if (!ref)
free( impl );
return ref;
}
static HRESULT STDMETHODCALLTYPE iterator_kvpair_HSTRING_IInspectable_GetIids(
IIterator_IKeyValuePair_HSTRING_IInspectable *iface, ULONG *iid_count, IID **iids )
{
FIXME( "(%p, %p, %p) stub!\n", iface, iid_count, iids );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE iterator_kvpair_HSTRING_IInspectable_GetRuntimeClassName(
IIterator_IKeyValuePair_HSTRING_IInspectable *iface, HSTRING *class_name )
{
FIXME( "(%p, %p) stub!\n", iface, class_name );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE iterator_kvpair_HSTRING_IInspectable_GetTrustLevel(
IIterator_IKeyValuePair_HSTRING_IInspectable *iface, TrustLevel *trust_level )
{
FIXME( "(%p, %p) stub!\n", iface, trust_level );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE
iterator_kvpair_HSTRING_IInspectable_get_Current( IIterator_IKeyValuePair_HSTRING_IInspectable *iface,
IKeyValuePair_HSTRING_IInspectable **kvpair )
{
FIXME( "(%p, %p) semi-stub!\n", iface, kvpair );
return kvpair_create( kvpair );
}
static HRESULT STDMETHODCALLTYPE iterator_kvpair_HSTRING_IInspectable_HasCurrent(
IIterator_IKeyValuePair_HSTRING_IInspectable *iface, boolean *exists )
{
FIXME( "(%p, %p) stub!\n", iface, exists );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE iterator_kvpair_HSTRING_IInspectable_MoveNext(
IIterator_IKeyValuePair_HSTRING_IInspectable *iface, boolean *valid )
{
FIXME( "(%p, %p) stub!\n", iface, valid );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE iterator_kvpair_HSTRING_IInspectable_GetMany(
IIterator_IKeyValuePair_HSTRING_IInspectable *iface, UINT32 count,
IKeyValuePair_HSTRING_IInspectable **items, UINT32 *value )
{
FIXME( "(%p, %u, %p, %p) stub!\n", iface, count, items, value );
return E_NOTIMPL;
}
const static IIterator_IKeyValuePair_HSTRING_IInspectableVtbl iterator_kvpair_HSTRING_IInspectable_vtbl =
{
/* IUnknown */
iterator_kvpair_HSTRING_IInspectable_QueryInterface,
iterator_kvpair_HSTRING_IInspectable_AddRef,
iterator_kvpair_HSTRING_IInspectable_Release,
/* IInspectable */
iterator_kvpair_HSTRING_IInspectable_GetIids,
iterator_kvpair_HSTRING_IInspectable_GetRuntimeClassName,
iterator_kvpair_HSTRING_IInspectable_GetTrustLevel,
/* IIterator<IKeyValuePair<HSTRING,IInspectable*>> */
iterator_kvpair_HSTRING_IInspectable_get_Current,
iterator_kvpair_HSTRING_IInspectable_HasCurrent,
iterator_kvpair_HSTRING_IInspectable_MoveNext,
iterator_kvpair_HSTRING_IInspectable_GetMany,
};
static HRESULT
iterator_kvpair_HSTRING_IInspectable_create( IIterator_IKeyValuePair_HSTRING_IInspectable **iface )
{
struct iterator_kvpair_HSTRING_IInspectable *impl_iter;
TRACE( "(%p)\n", iface );
impl_iter = calloc( 1, sizeof( *impl_iter ) );
if (!impl_iter)
return E_OUTOFMEMORY;
impl_iter->IIterator_IKeyValuePair_HSTRING_IInspectable_iface.lpVtbl = &iterator_kvpair_HSTRING_IInspectable_vtbl;
impl_iter->ref = 1;
*iface = &impl_iter->IIterator_IKeyValuePair_HSTRING_IInspectable_iface;
return S_OK;
}
struct mapview_HSTRING_IInspectable
{
IMapView_HSTRING_IInspectable IMapView_HSTRING_IInspectable_iface;
IIterable_IKeyValuePair_HSTRING_IInspectable IIterable_IKeyValuePair_HSTRING_IInspectable_iface;
LONG ref;
};
static inline struct mapview_HSTRING_IInspectable *
impl_from_IMapView_HSTRING_IInspectable( IMapView_HSTRING_IInspectable *iface )
{
return CONTAINING_RECORD( iface, struct mapview_HSTRING_IInspectable,
IMapView_HSTRING_IInspectable_iface );
}
static HRESULT STDMETHODCALLTYPE mapview_HSTRING_IInspectable_QueryInterface(
IMapView_HSTRING_IInspectable *iface, REFIID iid, void **out )
{
TRACE( "(%p, %s, %p)\n", iface, debugstr_guid( iid ), out );
*out = NULL;
if (IsEqualGUID( iid, &IID_IUnknown ) ||
IsEqualGUID( iid, &IID_IInspectable ) ||
IsEqualGUID( iid, &IID_IMapView_HSTRING_IInspectable ))
{
*out = iface;
IUnknown_AddRef( iface );
return S_OK;
}
if (IsEqualGUID( iid, &IID_IIterable_IKeyValuePair_HSTRING_IInspectable ))
{
struct mapview_HSTRING_IInspectable *impl =
impl_from_IMapView_HSTRING_IInspectable( iface );
*out = &impl->IIterable_IKeyValuePair_HSTRING_IInspectable_iface;
IUnknown_AddRef( iface );
return S_OK;
}
FIXME( "%s not implemented, returning E_NOTINTERFACE.\n", debugstr_guid( iid ) );
return E_NOINTERFACE;
}
static ULONG STDMETHODCALLTYPE
mapview_HSTRING_IInspectable_AddRef( IMapView_HSTRING_IInspectable *iface )
{
struct mapview_HSTRING_IInspectable *impl;
TRACE( "(%p)\n", iface );
impl = impl_from_IMapView_HSTRING_IInspectable( iface );
return InterlockedIncrement( &impl->ref );
}
static ULONG STDMETHODCALLTYPE
mapview_HSTRING_IInspectable_Release( IMapView_HSTRING_IInspectable *iface )
{
struct mapview_HSTRING_IInspectable *impl;
ULONG ref;
TRACE( "(%p)\n", iface );
impl = impl_from_IMapView_HSTRING_IInspectable( iface );
ref = InterlockedDecrement( &impl->ref );
if (!ref)
free( impl );
return ref;
}
static HRESULT STDMETHODCALLTYPE mapview_HSTRING_IInspectable_GetIids(
IMapView_HSTRING_IInspectable *iface, ULONG *iid_count, IID **iids )
{
FIXME( "(%p, %p, %p) stub!\n", iface, iid_count, iids );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE mapview_HSTRING_IInspectable_GetRuntimeClassName(
IMapView_HSTRING_IInspectable *iface, HSTRING *class_name )
{
FIXME( "(%p, %p) stub!\n", iface, class_name );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE mapview_HSTRING_IInspectable_GetTrustLevel(
IMapView_HSTRING_IInspectable *iface, TrustLevel *trust_level )
{
FIXME( "(%p, %p) stub!\n", iface, trust_level );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE
mapview_HSTRING_IInspectable_get_Size( IMapView_HSTRING_IInspectable *iface, UINT32 *size )
{
FIXME( "(%p, %p) stub!\n", iface, size );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE mapview_HSTRING_IInspectable_HaKey(
IMapView_HSTRING_IInspectable *iface, HSTRING key, boolean *exists )
{
FIXME( "(%p, %s, %p) stub!\n", iface, debugstr_hstring( key ), exists );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE mapview_HSTRING_IInspectable_Lookup(
IMapView_HSTRING_IInspectable *iface, HSTRING key, IInspectable **value )
{
FIXME( "(%p, %s, %p) stub!\n", iface, debugstr_hstring( key ), value );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE mapview_HSTRING_IInspectable_Split(
IMapView_HSTRING_IInspectable *iface, IMapView_HSTRING_IInspectable **first,
IMapView_HSTRING_IInspectable **second )
{
FIXME( "(%p, %p, %p) stub!\n", iface, first, second );
return E_NOTIMPL;
}
const static IMapView_HSTRING_IInspectableVtbl mapview_HSTRING_IInspectable_vtbl =
{
/* IUnknown */
mapview_HSTRING_IInspectable_QueryInterface,
mapview_HSTRING_IInspectable_AddRef,
mapview_HSTRING_IInspectable_Release,
/* IInspectable */
mapview_HSTRING_IInspectable_GetIids,
mapview_HSTRING_IInspectable_GetRuntimeClassName,
mapview_HSTRING_IInspectable_GetTrustLevel,
/* IMapView<HSTRING, IInspectable*> */
mapview_HSTRING_IInspectable_Lookup,
mapview_HSTRING_IInspectable_get_Size,
mapview_HSTRING_IInspectable_HaKey,
mapview_HSTRING_IInspectable_Split,
};
DEFINE_IINSPECTABLE_( mapview_iterable_kvpair_HSTRING_IInspectable,
IIterable_IKeyValuePair_HSTRING_IInspectable,
struct mapview_HSTRING_IInspectable,
mapview_impl_from_IIterable_IKeyValuePair_HSTRING_IInspectable,
IIterable_IKeyValuePair_HSTRING_IInspectable_iface,
&impl->IMapView_HSTRING_IInspectable_iface );
static HRESULT STDMETHODCALLTYPE mapview_iterable_kvpair_HSTRING_IInspectable_First(
IIterable_IKeyValuePair_HSTRING_IInspectable *iface,
IIterator_IKeyValuePair_HSTRING_IInspectable **iter )
{
FIXME( "(%p, %p) semi-stub!\n", iface, iter );
return iterator_kvpair_HSTRING_IInspectable_create( iter );
}
const static IIterable_IKeyValuePair_HSTRING_IInspectableVtbl
mapview_iterable_kvpair_HSTRING_IInspectable_vtbl =
{
/* IUnknown */
mapview_iterable_kvpair_HSTRING_IInspectable_QueryInterface,
mapview_iterable_kvpair_HSTRING_IInspectable_AddRef,
mapview_iterable_kvpair_HSTRING_IInspectable_Release,
/* IInspectable */
mapview_iterable_kvpair_HSTRING_IInspectable_GetIids,
mapview_iterable_kvpair_HSTRING_IInspectable_GetRuntimeClassName,
mapview_iterable_kvpair_HSTRING_IInspectable_GetTrustLevel,
/* IIterable<IKeyValuePair<HSTRING, IInspectable*>> */
mapview_iterable_kvpair_HSTRING_IInspectable_First
};
struct propertyset
{
IPropertySet IPropertySet_iface;
IObservableMap_HSTRING_IInspectable IObservableMap_HSTRING_IInspectable_iface;
IMap_HSTRING_IInspectable IMap_HSTRING_IInspectable_iface;
IIterable_IKeyValuePair_HSTRING_IInspectable IIterable_IKeyValuePair_HSTRING_IInspectable_iface;
LONG ref;
};
static inline struct propertyset *impl_from_IPropertySet( IPropertySet *iface )
{
return CONTAINING_RECORD( iface, struct propertyset, IPropertySet_iface );
}
static HRESULT STDMETHODCALLTYPE propertyset_QueryInterface( IPropertySet *iface, REFIID iid,
void **out )
{
struct propertyset *impl;
TRACE( "(%p, %s, %p)\n", iface, debugstr_guid( iid ), out );
impl = impl_from_IPropertySet( iface );
*out = NULL;
if (IsEqualGUID( iid, &IID_IUnknown ) ||
IsEqualGUID( iid, &IID_IInspectable ) ||
IsEqualGUID( iid, &IID_IPropertySet ))
{
*out = iface;
IUnknown_AddRef( (IUnknown *)*out );
return S_OK;
}
if (IsEqualGUID( iid, &IID_IObservableMap_HSTRING_IInspectable ))
{
*out = &impl->IObservableMap_HSTRING_IInspectable_iface;
IUnknown_AddRef( (IUnknown *)*out );
return S_OK;
}
if (IsEqualGUID( iid, &IID_IMap_HSTRING_IInspectable ))
{
*out = &impl->IMap_HSTRING_IInspectable_iface;
IUnknown_AddRef( (IUnknown *)iface );
return S_OK;
}
if (IsEqualGUID( iid, &IID_IIterable_IKeyValuePair_HSTRING_IInspectable ))
{
*out = &impl->IIterable_IKeyValuePair_HSTRING_IInspectable_iface;
IUnknown_AddRef( (IUnknown *)iface );
return S_OK;
}
FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) );
return E_NOINTERFACE;
}
static ULONG STDMETHODCALLTYPE propertyset_AddRef( IPropertySet *iface )
{
struct propertyset *impl;
TRACE( "(%p)\n", iface );
impl = impl_from_IPropertySet( iface );
return InterlockedIncrement( &impl->ref );
}
static ULONG STDMETHODCALLTYPE propertyset_Release( IPropertySet *iface )
{
struct propertyset *impl;
ULONG ref;
TRACE( "(%p)\n", iface );
impl = impl_from_IPropertySet( iface );
ref = InterlockedDecrement( &impl->ref );
if (!ref)
free( impl );
return ref;
}
static HRESULT STDMETHODCALLTYPE propertyset_GetIids( IPropertySet *iface, ULONG *iid_count,
IID **iids )
{
FIXME( "(%p, %p, %p) stub!\n", iface, iid_count, iids );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE propertyset_GetRuntimeClassName( IPropertySet *iface,
HSTRING *class_name )
{
FIXME( "(%p, %p) stub!\n", iface, class_name );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE propertyset_GetTrustLevel( IPropertySet *iface,
TrustLevel *trust_level )
{
FIXME( "(%p, %p) stub!\n", iface, trust_level );
return E_NOTIMPL;
}
static const IPropertySetVtbl propertyset_vtbl =
{
/* IUnknown */
propertyset_QueryInterface,
propertyset_AddRef,
propertyset_Release,
/* IInspectable */
propertyset_GetIids,
propertyset_GetRuntimeClassName,
propertyset_GetTrustLevel,
};
DEFINE_IINSPECTABLE( propertyset_IObservableMap, IObservableMap_HSTRING_IInspectable,
struct propertyset, IPropertySet_iface );
static HRESULT STDMETHODCALLTYPE propertyset_IObservableMap_add_MapChanged(
IObservableMap_HSTRING_IInspectable *iface,
IMapChangedEventHandler_HSTRING_IInspectable *handler, EventRegistrationToken *token )
{
FIXME( "(%p, %p, %p) stub!\n", iface, handler, token );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE propertyset_IObservableMap_remove_MapChanged(
IObservableMap_HSTRING_IInspectable *iface, EventRegistrationToken token )
{
FIXME( "(%p, %I64d) stub!\n", iface, token.value );
return E_NOTIMPL;
}
const static IObservableMap_HSTRING_IInspectableVtbl propertyset_IObservableMap_vtbl =
{
/* IUnknown */
propertyset_IObservableMap_QueryInterface,
propertyset_IObservableMap_AddRef,
propertyset_IObservableMap_Release,
/* IInspectable */
propertyset_IObservableMap_GetIids,
propertyset_IObservableMap_GetRuntimeClassName,
propertyset_IObservableMap_GetTrustLevel,
/* IObservableMap<HSTRING, IInspectable*> */
propertyset_IObservableMap_add_MapChanged,
propertyset_IObservableMap_remove_MapChanged,
};
DEFINE_IINSPECTABLE( propertyset_IMap, IMap_HSTRING_IInspectable, struct propertyset,
IPropertySet_iface );
static HRESULT STDMETHODCALLTYPE propertyset_Lookup( IMap_HSTRING_IInspectable *iface,
HSTRING key,
IInspectable **value )
{
FIXME( "(%p, %s, %p) stub!\n", iface, debugstr_hstring( key ), value );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE
propertyset_get_size( IMap_HSTRING_IInspectable *iface, UINT32 *size )
{
FIXME( "(%p, %p) stub!\n", iface, size );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE propertyset_HasKey( IMap_HSTRING_IInspectable *iface,
HSTRING key, boolean *exists )
{
FIXME( "(%p, %s, %p) stub!\n", iface, debugstr_hstring( key ), exists );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE propertyset_GetView(
IMap_HSTRING_IInspectable *iface, IMapView_HSTRING_IInspectable **view )
{
struct mapview_HSTRING_IInspectable *impl;
FIXME( "(%p, %p) semi-stub!\n", iface, view );
*view = NULL;
impl = calloc( 1, sizeof( *impl ) );
if (!impl)
return E_OUTOFMEMORY;
impl->IMapView_HSTRING_IInspectable_iface.lpVtbl = &mapview_HSTRING_IInspectable_vtbl;
impl->IIterable_IKeyValuePair_HSTRING_IInspectable_iface.lpVtbl =
&mapview_iterable_kvpair_HSTRING_IInspectable_vtbl;
impl->ref = 1;
*view = &impl->IMapView_HSTRING_IInspectable_iface;
return S_OK;
}
static HRESULT STDMETHODCALLTYPE propertyset_Insert( IMap_HSTRING_IInspectable *iface,
HSTRING key, IInspectable *value,
boolean *replaced )
{
FIXME( "(%p, %s, %p, %p) stub!\n", iface, debugstr_hstring( key ), value, replaced );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE propertyset_Remove( IMap_HSTRING_IInspectable *iface,
HSTRING key )
{
FIXME( "(%p, %s) stub!\n", iface, debugstr_hstring( key ) );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE propertyset_Clear( IMap_HSTRING_IInspectable *iface )
{
FIXME( "(%p) stub!\n", iface );
return E_NOTIMPL;
}
const static IMap_HSTRING_IInspectableVtbl propertyset_IMap_vtbl =
{
/* IUnknown */
propertyset_IMap_QueryInterface,
propertyset_IMap_AddRef,
propertyset_IMap_Release,
/* IInspectable */
propertyset_IMap_GetIids,
propertyset_IMap_GetRuntimeClassName,
propertyset_IMap_GetTrustLevel,
/* IMap<HSTRING, IInspectable*> */
propertyset_Lookup,
propertyset_get_size,
propertyset_HasKey,
propertyset_GetView,
propertyset_Insert,
propertyset_Remove,
propertyset_Clear,
};
DEFINE_IINSPECTABLE_( iterable_kvpair_HSTRING_IInspectable,
IIterable_IKeyValuePair_HSTRING_IInspectable, struct propertyset,
impl_from_IIterable_IKeyValuePair_HSTRING_IInspectable,
IIterable_IKeyValuePair_HSTRING_IInspectable_iface,
&impl->IMap_HSTRING_IInspectable_iface );
static HRESULT STDMETHODCALLTYPE
iterable_kvpair_HSTRING_IInspectable_First( IIterable_IKeyValuePair_HSTRING_IInspectable *iface,
IIterator_IKeyValuePair_HSTRING_IInspectable **iter )
{
FIXME( "(%p, %p) semi-stub!\n", iface, iter );
return iterator_kvpair_HSTRING_IInspectable_create( iter );
}
const static IIterable_IKeyValuePair_HSTRING_IInspectableVtbl iterable_kvpair_HSTRING_IInspectable_vtbl =
{
/* IUnknown */
iterable_kvpair_HSTRING_IInspectable_QueryInterface,
iterable_kvpair_HSTRING_IInspectable_AddRef,
iterable_kvpair_HSTRING_IInspectable_Release,
/* IInspectable */
iterable_kvpair_HSTRING_IInspectable_GetIids,
iterable_kvpair_HSTRING_IInspectable_GetRuntimeClassName,
iterable_kvpair_HSTRING_IInspectable_GetTrustLevel,
/* IIterable<IKeyValuePair<HSTRING, IInspectable*>> */
iterable_kvpair_HSTRING_IInspectable_First
};
struct propertyset_factory
{
IActivationFactory IActivationFactory_iface;
};
static HRESULT STDMETHODCALLTYPE factory_QueryInterface( IActivationFactory *iface, REFIID iid, void **out )
{
TRACE( "(%p, %s, %p)\n", iface, debugstr_guid( iid ), out );
*out = NULL;
if (IsEqualGUID( &IID_IUnknown, iid ) ||
IsEqualGUID( &IID_IInspectable, iid ) ||
IsEqualGUID( &IID_IAgileObject, iid ) ||
IsEqualGUID( &IID_IActivationFactory, iid ))
{
*out = iface;
IUnknown_AddRef( (IUnknown *)*out );
return S_OK;
}
FIXME( "%s not implemented, return E_NOINTERFACE.\n", debugstr_guid( iid ) );
return E_NOINTERFACE;
}
static ULONG STDMETHODCALLTYPE factory_AddRef( IActivationFactory *iface )
{
TRACE( "(%p)\n", iface );
return 2;
}
static ULONG STDMETHODCALLTYPE factory_Release( IActivationFactory *iface )
{
TRACE( "(%p)\n", iface );
return 1;
}
static HRESULT STDMETHODCALLTYPE factory_GetIids( IActivationFactory *iface, ULONG *iid_count, IID **iids )
{
FIXME( "(%p, %p, %p) stub!\n", iface, iid_count, iids );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE factory_GetRuntimeClassName( IActivationFactory *iface, HSTRING *class_name )
{
FIXME( "(%p, %p) stub!\n", iface, class_name );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE factory_GetTrustLevel( IActivationFactory *iface, TrustLevel *trust_level )
{
FIXME( "(%p, %p) stub!\n", iface, trust_level );
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE factory_ActivateInstance( IActivationFactory *iface, IInspectable **instance )
{
struct propertyset *impl;
TRACE( "(%p, %p)\n", iface, instance );
impl = calloc( 1, sizeof( *impl ) );
if (!impl)
return E_OUTOFMEMORY;
impl->IPropertySet_iface.lpVtbl = &propertyset_vtbl;
impl->IObservableMap_HSTRING_IInspectable_iface.lpVtbl = &propertyset_IObservableMap_vtbl;
impl->IMap_HSTRING_IInspectable_iface.lpVtbl = &propertyset_IMap_vtbl;
impl->IIterable_IKeyValuePair_HSTRING_IInspectable_iface.lpVtbl = &iterable_kvpair_HSTRING_IInspectable_vtbl;
impl->ref = 1;
*instance = (IInspectable *)&impl->IPropertySet_iface;
return S_OK;
}
static const IActivationFactoryVtbl propertyset_factory_vtbl =
{
/* IUnknown */
factory_QueryInterface,
factory_AddRef,
factory_Release,
/* IInspectable */
factory_GetIids,
factory_GetRuntimeClassName,
factory_GetTrustLevel,
/* IActivationFactory */
factory_ActivateInstance,
};
static struct propertyset_factory propertyset_factory =
{
{&propertyset_factory_vtbl},
};
IActivationFactory *IPropertySet_factory = &propertyset_factory.IActivationFactory_iface;

View file

@ -2,5 +2,6 @@ TESTDLL = wintypes.dll
IMPORTS = wintypes combase uuid
SOURCES = \
propertyset.c \
wintypes.c \
wintypes_test.idl

View file

@ -0,0 +1,131 @@
/*
* Copyright 2024 Vibhav Pant
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define COBJMACROS
#include "winstring.h"
#include "roapi.h"
#define WIDL_using_Windows_Foundation
#define WIDL_using_Windows_Foundation_Collections
#include "windows.foundation.h"
#include "wine/test.h"
static void test_IPropertySet(void)
{
static const WCHAR *class_name = RuntimeClass_Windows_Foundation_Collections_PropertySet;
IActivationFactory *factory;
IInspectable *inspectable;
IPropertySet *propset;
IMap_HSTRING_IInspectable *map;
IMapView_HSTRING_IInspectable *map_view;
IIterable_IKeyValuePair_HSTRING_IInspectable *iterable;
IIterator_IKeyValuePair_HSTRING_IInspectable *iterator;
IObservableMap_HSTRING_IInspectable *observable_map;
HRESULT hr;
HSTRING name;
hr = RoInitialize( RO_INIT_MULTITHREADED );
ok( SUCCEEDED( hr ), "got %#lx\n", hr );
hr = WindowsCreateString( class_name, wcslen( class_name ), &name );
ok( SUCCEEDED( hr ), "got %#lx\n", hr );
hr = RoGetActivationFactory( name, &IID_IActivationFactory, (void **)&factory );
WindowsDeleteString( name );
ok( hr == S_OK || broken( hr == REGDB_E_CLASSNOTREG ),
"RoGetActivationFactory failed, hr %#lx.\n", hr );
if (hr == REGDB_E_CLASSNOTREG)
{
win_skip( "%s runtimeclass not registered, skipping tests.\n",
wine_dbgstr_w( class_name ) );
RoUninitialize();
return;
}
hr = IActivationFactory_ActivateInstance( factory, &inspectable );
IActivationFactory_Release( factory );
ok( SUCCEEDED( hr ), "got %#lx\n", hr );
if (FAILED( hr ))
{
skip("could not activate PropertySet instance.\n");
RoUninitialize();
return;
}
hr = IInspectable_QueryInterface( inspectable, &IID_IPropertySet, (void **)&propset );
IInspectable_Release( inspectable );
ok( SUCCEEDED( hr ), "QueryInterface failed, got %#lx\n", hr );
if (FAILED( hr ))
{
RoUninitialize();
return;
}
hr = IPropertySet_QueryInterface( propset, &IID_IMap_HSTRING_IInspectable, (void **)&map );
ok( SUCCEEDED( hr ), "QueryInterface failed, got %#lx\n", hr );
if (FAILED( hr ))
{
RoUninitialize();
return;
}
hr = IPropertySet_QueryInterface( propset, &IID_IObservableMap_HSTRING_IInspectable,
(void *)&observable_map );
IPropertySet_Release(propset);
ok(SUCCEEDED(hr), "QueryInterface failed, got %#lx\n", hr);
hr = IMap_HSTRING_IInspectable_QueryInterface( map, &IID_IIterable_IKeyValuePair_HSTRING_IInspectable,
(void **)&iterable );
ok( SUCCEEDED( hr ), "QueryInterface failed, got %#lx\n", hr );
if (SUCCEEDED( hr ))
{
hr = IIterable_IKeyValuePair_HSTRING_IInspectable_First( iterable, &iterator );
ok( SUCCEEDED( hr ), "got %#lx\n", hr );
if (SUCCEEDED( hr ))
IIterable_IKeyValuePair_HSTRING_IInspectable_Release( iterable );
IIterator_IKeyValuePair_HSTRING_IInspectable_Release( iterator );
}
else
skip( "Could not obtain IIterable<IKeyValuePair<HSTRING, IInspectable *>> instance.\n");
hr = IMap_HSTRING_IInspectable_GetView( map, &map_view );
ok( SUCCEEDED( hr ), "GetView failed, got %#lx\n", hr );
if (SUCCEEDED( hr ))
{
hr = IMapView_HSTRING_IInspectable_QueryInterface( map_view, &IID_IIterable_IKeyValuePair_HSTRING_IInspectable,
(void **)&iterable );
ok( SUCCEEDED( hr ), "QueryInterface failed, got %#lx\n", hr );
if (SUCCEEDED( hr ))
{
hr = IIterable_IKeyValuePair_HSTRING_IInspectable_First( iterable, &iterator );
ok( SUCCEEDED( hr ), "got %#lx\n", hr );
if (SUCCEEDED( hr ))
IIterator_IKeyValuePair_HSTRING_IInspectable_Release( iterator );
IIterable_IKeyValuePair_HSTRING_IInspectable_Release( iterable );
}
}
IObservableMap_HSTRING_IInspectable_Release( observable_map );
IMap_HSTRING_IInspectable_Release( map );
RoUninitialize();
}
START_TEST(propertyset)
{
test_IPropertySet();
}

View file

@ -66,3 +66,5 @@ 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("extern IActivationFactory *IPropertySet_factory;")

View file

@ -30,6 +30,8 @@ import "windows.foundation.collections.idl";
namespace Windows.Foundation.Collections {
interface IPropertySet;
runtimeclass PropertySet;
declare {
interface Windows.Foundation.Collections.IKeyValuePair<HSTRING, HSTRING>;
interface Windows.Foundation.Collections.IKeyValuePair<HSTRING, IInspectable *>;
@ -57,6 +59,20 @@ namespace Windows.Foundation.Collections {
{
}
[
activatable(Windows.Foundation.FoundationContract, 1.0),
contract(Windows.Foundation.FoundationContract, 1.0),
marshaling_behavior(agile),
threading(both)
]
runtimeclass PropertySet
{
[default] interface Windows.Foundation.Collections.IPropertySet;
interface Windows.Foundation.Collections.IObservableMap<HSTRING, IInspectable *>;
interface Windows.Foundation.Collections.IMap<HSTRING, IInspectable *>;
interface Windows.Foundation.Collections.IIterable<Windows.Foundation.Collections.IKeyValuePair<HSTRING, IInspectable *> *>;
}
[
activatable(Windows.Foundation.FoundationContract, 1.0),
contract(Windows.Foundation.FoundationContract, 1.0),