mirror of
https://gitlab.winehq.org/wine/wine.git
synced 2024-11-19 17:06:04 -07:00
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:
commit
df5615ad63
7 changed files with 971 additions and 1 deletions
|
@ -5,4 +5,5 @@ IMPORTS = combase
|
|||
SOURCES = \
|
||||
classes.idl \
|
||||
main.c \
|
||||
propertyset.c \
|
||||
wintypes_private.idl
|
||||
|
|
|
@ -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
812
dlls/wintypes/propertyset.c
Normal 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;
|
|
@ -2,5 +2,6 @@ TESTDLL = wintypes.dll
|
|||
IMPORTS = wintypes combase uuid
|
||||
|
||||
SOURCES = \
|
||||
propertyset.c \
|
||||
wintypes.c \
|
||||
wintypes_test.idl
|
||||
|
|
131
dlls/wintypes/tests/propertyset.c
Normal file
131
dlls/wintypes/tests/propertyset.c
Normal 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();
|
||||
}
|
|
@ -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;")
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Reference in a new issue