From: Fabian Maurer dark.shadow4@web.de
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55126 --- .../main.c | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-)
diff --git a/dlls/windows.devices.geolocation.geolocator/main.c b/dlls/windows.devices.geolocation.geolocator/main.c index 0d51c70ebea..acb7548d991 100644 --- a/dlls/windows.devices.geolocation.geolocator/main.c +++ b/dlls/windows.devices.geolocation.geolocator/main.c @@ -38,6 +38,7 @@ struct geolocator IActivationFactory IActivationFactory_iface; IGeolocator IGeolocator_iface; IWeakReferenceSource IWeakReferenceSource_iface; + IWeakReference IWeakReference_iface; LONG ref; };
@@ -150,6 +151,44 @@ static const struct IGeolocatorVtbl geolocator_vtbl = geolocator_StatusChanged_remove, };
+static inline struct geolocator *impl_from_IWeakReference(IWeakReference *iface) +{ + return CONTAINING_RECORD(iface, struct geolocator, IWeakReference_iface); +} + +static HRESULT WINAPI weakreference_QueryInterface(IWeakReference *iface, REFIID iid, void **out) +{ + struct geolocator *impl = impl_from_IWeakReference(iface); + return geolocator_QueryInterface(&impl->IGeolocator_iface, iid, out); +} + +static ULONG WINAPI weakreference_AddRef(IWeakReference *iface) +{ + struct geolocator *impl = impl_from_IWeakReference(iface); + return geolocator_AddRef(&impl->IGeolocator_iface); +} + +static ULONG WINAPI weakreference_Release(IWeakReference *iface) +{ + struct geolocator *impl = impl_from_IWeakReference(iface); + return geolocator_Release(&impl->IGeolocator_iface); +} + +static HRESULT WINAPI weakreference_Resolve(IWeakReference *iface, REFIID iid, IInspectable **ref) +{ + TRACE("iface %p, ref %p stub.\n", iface, ref); + return E_NOTIMPL; +} + +static const struct IWeakReferenceVtbl weakreference_vtbl = +{ + weakreference_QueryInterface, + weakreference_AddRef, + weakreference_Release, + /* IWeakReference methods */ + weakreference_Resolve, +}; + static inline struct geolocator *impl_from_IWeakReferenceSource(IWeakReferenceSource *iface) { return CONTAINING_RECORD(iface, struct geolocator, IWeakReferenceSource_iface); @@ -175,9 +214,12 @@ static ULONG WINAPI weakreferencesource_Release(IWeakReferenceSource *iface)
static HRESULT WINAPI weakreferencesource_GetWeakReference(IWeakReferenceSource *iface , IWeakReference **ref) { - FIXME("iface %p, ref %p stub.\n", iface, ref); - *ref = 0; - return E_NOTIMPL; + struct geolocator *impl = impl_from_IWeakReferenceSource(iface); + + TRACE("iface %p, ref %p stub.\n", iface, ref); + *ref = &impl->IWeakReference_iface; + IWeakReference_AddRef(*ref); + return S_OK; }
static const struct IWeakReferenceSourceVtbl weakreferencesource_vtbl = @@ -280,6 +322,7 @@ static HRESULT WINAPI factory_ActivateInstance(IActivationFactory *iface, IInspe impl->IActivationFactory_iface.lpVtbl = &factory_vtbl; impl->IGeolocator_iface.lpVtbl = &geolocator_vtbl; impl->IWeakReferenceSource_iface.lpVtbl = &weakreferencesource_vtbl; + impl->IWeakReference_iface.lpVtbl = &weakreference_vtbl; impl->ref = 1;
*instance = (IInspectable *)&impl->IGeolocator_iface; @@ -304,6 +347,7 @@ static struct geolocator geolocator = {&factory_vtbl}, {&geolocator_vtbl}, {&weakreferencesource_vtbl}, + {&weakreference_vtbl}, 1, };