1 /* WinRT Windows.Devices.Enumeration implementation
3 * Copyright 2022 Paul Gofman for CodeWeavers
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "wine/debug.h"
24 WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi
);
26 struct device_access_information
28 IDeviceAccessInformation IDeviceAccessInformation_iface
;
32 static inline struct device_access_information
*impl_from_IDeviceAccessInformation( IDeviceAccessInformation
*iface
)
34 return CONTAINING_RECORD( iface
, struct device_access_information
, IDeviceAccessInformation_iface
);
37 static HRESULT WINAPI
device_access_information_QueryInterface( IDeviceAccessInformation
*iface
,
38 REFIID iid
, void **out
)
40 struct device_access_information
*impl
= impl_from_IDeviceAccessInformation( iface
);
42 TRACE( "iface %p, iid %s, out %p.\n", iface
, debugstr_guid( iid
), out
);
44 if (IsEqualGUID( iid
, &IID_IUnknown
) ||
45 IsEqualGUID( iid
, &IID_IInspectable
) ||
46 IsEqualGUID( iid
, &IID_IAgileObject
) ||
47 IsEqualGUID( iid
, &IID_IDeviceAccessInformation
))
49 IInspectable_AddRef( (*out
= &impl
->IDeviceAccessInformation_iface
) );
53 FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid
) );
58 static ULONG WINAPI
device_access_information_AddRef( IDeviceAccessInformation
*iface
)
60 struct device_access_information
*impl
= impl_from_IDeviceAccessInformation( iface
);
61 ULONG ref
= InterlockedIncrement( &impl
->ref
);
62 TRACE( "iface %p increasing refcount to %lu.\n", iface
, ref
);
66 static ULONG WINAPI
device_access_information_Release( IDeviceAccessInformation
*iface
)
68 struct device_access_information
*impl
= impl_from_IDeviceAccessInformation( iface
);
69 ULONG ref
= InterlockedDecrement( &impl
->ref
);
71 TRACE( "iface %p decreasing refcount to %lu.\n", iface
, ref
);
79 static HRESULT WINAPI
device_access_information_GetIids( IDeviceAccessInformation
*iface
, ULONG
*iid_count
, IID
**iids
)
81 FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface
, iid_count
, iids
);
85 static HRESULT WINAPI
device_access_information_GetRuntimeClassName( IDeviceAccessInformation
*iface
,
88 return WindowsCreateString( RuntimeClass_Windows_Devices_Enumeration_DeviceAccessInformation
,
89 ARRAY_SIZE(RuntimeClass_Windows_Devices_Enumeration_DeviceAccessInformation
),
93 static HRESULT WINAPI
device_access_information_GetTrustLevel( IDeviceAccessInformation
*iface
,
94 TrustLevel
*trust_level
)
96 FIXME( "iface %p, trust_level %p stub!\n", iface
, trust_level
);
100 static HRESULT WINAPI
device_access_information_add_AccessChanged(
101 IDeviceAccessInformation
*iface
, ITypedEventHandler_DeviceAccessInformation_DeviceAccessChangedEventArgs
*handler
,
102 EventRegistrationToken
*cookie
)
104 static EventRegistrationToken dummy_token
= {.value
= 0xdeadbeef};
106 FIXME( "iface %p, handler %p, cookie %p stub.\n", iface
, handler
, cookie
);
108 *cookie
= dummy_token
;
112 static HRESULT WINAPI
device_access_information_remove_AccessChanged( IDeviceAccessInformation
*iface
,
113 EventRegistrationToken cookie
)
115 FIXME( "iface %p, cookie %#I64x stub.\n", iface
, cookie
.value
);
120 static HRESULT WINAPI
device_access_information_CurrentStatus( IDeviceAccessInformation
*iface
,
121 enum DeviceAccessStatus
*status
)
123 FIXME( "iface %p, status %p stub.\n", iface
, status
);
125 *status
= DeviceAccessStatus_Allowed
;
129 static const struct IDeviceAccessInformationVtbl device_access_information_vtbl
=
131 device_access_information_QueryInterface
,
132 device_access_information_AddRef
,
133 device_access_information_Release
,
134 /* IInspectable methods */
135 device_access_information_GetIids
,
136 device_access_information_GetRuntimeClassName
,
137 device_access_information_GetTrustLevel
,
138 /* IDeviceAccessInformation methods */
139 device_access_information_add_AccessChanged
,
140 device_access_information_remove_AccessChanged
,
141 device_access_information_CurrentStatus
,
144 static HRESULT
device_access_information_create( IDeviceAccessInformation
**out
)
146 struct device_access_information
*impl
;
148 if (!(impl
= calloc( 1, sizeof(*impl
) ))) return E_OUTOFMEMORY
;
149 impl
->IDeviceAccessInformation_iface
.lpVtbl
= &device_access_information_vtbl
;
152 *out
= &impl
->IDeviceAccessInformation_iface
;
153 TRACE( "created device_access_information %p.\n", *out
);
157 struct device_access_information_statics
159 IActivationFactory IActivationFactory_iface
;
160 IDeviceAccessInformationStatics IDeviceAccessInformationStatics_iface
;
164 static inline struct device_access_information_statics
*impl_from_IActivationFactory( IActivationFactory
*iface
)
166 return CONTAINING_RECORD( iface
, struct device_access_information_statics
, IActivationFactory_iface
);
169 static HRESULT WINAPI
factory_QueryInterface( IActivationFactory
*iface
, REFIID iid
, void **out
)
171 struct device_access_information_statics
*impl
= impl_from_IActivationFactory( iface
);
173 TRACE( "iface %p, iid %s, out %p stub!\n", iface
, debugstr_guid( iid
), out
);
175 if (IsEqualGUID( iid
, &IID_IUnknown
) ||
176 IsEqualGUID( iid
, &IID_IInspectable
) ||
177 IsEqualGUID( iid
, &IID_IActivationFactory
))
179 IInspectable_AddRef( (*out
= &impl
->IActivationFactory_iface
) );
183 if (IsEqualGUID( iid
, &IID_IDeviceAccessInformationStatics
))
185 IInspectable_AddRef( (*out
= &impl
->IDeviceAccessInformationStatics_iface
) );
189 FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid
) );
191 return E_NOINTERFACE
;
194 static ULONG WINAPI
factory_AddRef( IActivationFactory
*iface
)
196 struct device_access_information_statics
*impl
= impl_from_IActivationFactory( iface
);
197 ULONG ref
= InterlockedIncrement( &impl
->ref
);
198 TRACE( "iface %p, ref %lu.\n", iface
, ref
);
202 static ULONG WINAPI
factory_Release( IActivationFactory
*iface
)
204 struct device_access_information_statics
*impl
= impl_from_IActivationFactory( iface
);
205 ULONG ref
= InterlockedDecrement( &impl
->ref
);
206 TRACE( "iface %p, ref %lu.\n", iface
, ref
);
210 static HRESULT WINAPI
factory_GetIids( IActivationFactory
*iface
, ULONG
*iid_count
, IID
**iids
)
212 FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface
, iid_count
, iids
);
216 static HRESULT WINAPI
factory_GetRuntimeClassName( IActivationFactory
*iface
, HSTRING
*class_name
)
218 FIXME( "iface %p, class_name %p stub!\n", iface
, class_name
);
222 static HRESULT WINAPI
factory_GetTrustLevel( IActivationFactory
*iface
, TrustLevel
*trust_level
)
224 FIXME( "iface %p, trust_level %p stub!\n", iface
, trust_level
);
228 static HRESULT WINAPI
factory_ActivateInstance( IActivationFactory
*iface
, IInspectable
**instance
)
230 FIXME( "iface %p, instance %p stub!\n", iface
, instance
);
234 static const struct IActivationFactoryVtbl factory_vtbl
=
236 factory_QueryInterface
,
239 /* IInspectable methods */
241 factory_GetRuntimeClassName
,
242 factory_GetTrustLevel
,
243 /* IActivationFactory methods */
244 factory_ActivateInstance
,
247 DEFINE_IINSPECTABLE( statics
, IDeviceAccessInformationStatics
, struct device_access_information_statics
, IActivationFactory_iface
);
249 static HRESULT WINAPI
statics_CreateFromId( IDeviceAccessInformationStatics
*iface
,
250 HSTRING device_id
, IDeviceAccessInformation
**value
)
252 FIXME( "device_id %s, value %p stub.\n", debugstr_hstring( device_id
), value
);
254 return device_access_information_create( value
);
257 static HRESULT WINAPI
statics_CreateFromDeviceClassId( IDeviceAccessInformationStatics
*iface
,
258 GUID device_class_id
, IDeviceAccessInformation
**value
)
260 FIXME( "device_class_id %s, value %p stub.\n", debugstr_guid( &device_class_id
), value
);
262 return device_access_information_create( value
);
265 static HRESULT WINAPI
statics_CreateFromDeviceClass( IDeviceAccessInformationStatics
*iface
,
266 enum DeviceClass device_class
, IDeviceAccessInformation
**value
)
268 FIXME( "device_class %d, value %p stub.\n", device_class
, value
);
270 return device_access_information_create( value
);
273 static const struct IDeviceAccessInformationStaticsVtbl statics_vtbl
=
275 statics_QueryInterface
,
278 /* IInspectable methods */
280 statics_GetRuntimeClassName
,
281 statics_GetTrustLevel
,
282 /* IDeviceAccessInformationStatics methods */
283 statics_CreateFromId
,
284 statics_CreateFromDeviceClassId
,
285 statics_CreateFromDeviceClass
,
288 static struct device_access_information_statics device_access_information_statics
=
295 IActivationFactory
*device_access_factory
= &device_access_information_statics
.IActivationFactory_iface
;