Module: wine Branch: master Commit: 3fe0cfef9c087b86d80ed2d95c4c4466f6203508 URL: https://gitlab.winehq.org/wine/wine/-/commit/3fe0cfef9c087b86d80ed2d95c4c446...
Author: Mohamad Al-Jaf mohamadaljaf@gmail.com Date: Mon Jul 3 02:43:04 2023 -0400
windows.networking.hostname: Implement IHostNameFactory::CreateHostName().
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54699
---
dlls/windows.networking.hostname/hostname.c | 139 +++++++++++++++++++++- dlls/windows.networking.hostname/private.h | 2 +- dlls/windows.networking.hostname/tests/hostname.c | 17 ++- 3 files changed, 150 insertions(+), 8 deletions(-)
diff --git a/dlls/windows.networking.hostname/hostname.c b/dlls/windows.networking.hostname/hostname.c index 538e897963f..f3ba7b5b20c 100644 --- a/dlls/windows.networking.hostname/hostname.c +++ b/dlls/windows.networking.hostname/hostname.c @@ -115,12 +115,147 @@ static const struct IActivationFactoryVtbl factory_vtbl = factory_ActivateInstance, };
+struct hostname +{ + IHostName IHostName_iface; + LONG ref; + + HSTRING rawname; +}; + +static inline struct hostname *impl_from_IHostName( IHostName *iface ) +{ + return CONTAINING_RECORD( iface, struct hostname, IHostName_iface ); +} + +static HRESULT WINAPI hostname_QueryInterface( IHostName *iface, REFIID iid, void **out ) +{ + struct hostname *impl = impl_from_IHostName( 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_IHostName )) + { + *out = &impl->IHostName_iface; + IInspectable_AddRef( *out ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI hostname_AddRef( IHostName *iface ) +{ + struct hostname *impl = impl_from_IHostName( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI hostname_Release( IHostName *iface ) +{ + struct hostname *impl = impl_from_IHostName( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static HRESULT WINAPI hostname_GetIids( IHostName *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 hostname_GetRuntimeClassName( IHostName *iface, HSTRING *class_name ) +{ + FIXME( "iface %p, class_name %p stub!\n", iface, class_name ); + return E_NOTIMPL; +} + +static HRESULT WINAPI hostname_GetTrustLevel( IHostName *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI hostname_get_IPInformation( IHostName *iface, IIPInformation **value ) +{ + FIXME( "iface %p, value %p stub!\n", iface, value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI hostname_get_RawName( IHostName *iface, HSTRING *value ) +{ + FIXME( "iface %p, value %p stub!\n", iface, value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI hostname_get_DisplayName( IHostName *iface, HSTRING *value ) +{ + FIXME( "iface %p, value %p stub!\n", iface, value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI hostname_get_CanonicalName( IHostName *iface, HSTRING *value ) +{ + FIXME( "iface %p, value %p stub!\n", iface, value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI hostname_get_Type( IHostName *iface, HostNameType *value ) +{ + FIXME( "iface %p, value %p stub!\n", iface, value ); + return E_NOTIMPL; +} + +static HRESULT WINAPI hostname_IsEqual( IHostName *iface, IHostName *name, boolean *equal ) +{ + FIXME( "iface %p, name %p, equal %p stub!\n", iface, name, equal ); + return E_NOTIMPL; +} + +static const struct IHostNameVtbl hostname_vtbl = +{ + hostname_QueryInterface, + hostname_AddRef, + hostname_Release, + /* IInspectable methods */ + hostname_GetIids, + hostname_GetRuntimeClassName, + hostname_GetTrustLevel, + /* IHostName methods */ + hostname_get_IPInformation, + hostname_get_RawName, + hostname_get_DisplayName, + hostname_get_CanonicalName, + hostname_get_Type, + hostname_IsEqual, +}; + DEFINE_IINSPECTABLE( hostname_factory, IHostNameFactory, struct hostname_statics, IActivationFactory_iface )
static HRESULT WINAPI hostname_factory_CreateHostName( IHostNameFactory *iface, HSTRING name, IHostName **value ) { - FIXME( "iface %p, name %s, value %p stub!\n", iface, debugstr_hstring(name), value ); - return E_NOTIMPL; + struct hostname *impl; + + TRACE( "iface %p, name %s, value %p\n", iface, debugstr_hstring(name), value ); + + if (!value) return E_POINTER; + if (!name) return E_INVALIDARG; + if (!(impl = calloc( 1, sizeof(*impl) ))) return E_OUTOFMEMORY; + + impl->IHostName_iface.lpVtbl = &hostname_vtbl; + impl->ref = 1; + impl->rawname = name; + + *value = &impl->IHostName_iface; + TRACE( "created IHostName %p.\n", *value ); + return S_OK; }
static const struct IHostNameFactoryVtbl hostname_factory_vtbl = diff --git a/dlls/windows.networking.hostname/private.h b/dlls/windows.networking.hostname/private.h index 55faba8cc96..a07690911c5 100644 --- a/dlls/windows.networking.hostname/private.h +++ b/dlls/windows.networking.hostname/private.h @@ -33,6 +33,7 @@ #define WIDL_using_Windows_Foundation_Collections #include "windows.foundation.h" #define WIDL_using_Windows_Networking +#define WIDL_using_Windows_Networking_Connectivity #include "windows.networking.h"
extern IActivationFactory *hostname_factory; @@ -75,5 +76,4 @@ extern IActivationFactory *hostname_factory; #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.networking.hostname/tests/hostname.c b/dlls/windows.networking.hostname/tests/hostname.c index 0d9ea85bdef..18cdec840ef 100644 --- a/dlls/windows.networking.hostname/tests/hostname.c +++ b/dlls/windows.networking.hostname/tests/hostname.c @@ -79,14 +79,19 @@ static void test_HostnameStatics(void) ok( hr == S_OK, "got hr %#lx.\n", hr );
hr = IHostNameFactory_CreateHostName( hostnamefactory, NULL, &hostname ); - todo_wine ok( hr == E_INVALIDARG, "got hr %#lx.\n", hr ); + ok( hr == E_INVALIDARG, "got hr %#lx.\n", hr ); hr = IHostNameFactory_CreateHostName( hostnamefactory, str, NULL ); - todo_wine ok( hr == E_POINTER, "got hr %#lx.\n", hr ); + ok( hr == E_POINTER, "got hr %#lx.\n", hr ); hr = IHostNameFactory_CreateHostName( hostnamefactory, NULL, NULL ); - todo_wine ok( hr == E_POINTER, "got hr %#lx.\n", hr ); + ok( hr == E_POINTER, "got hr %#lx.\n", hr ); hr = IHostNameFactory_CreateHostName( hostnamefactory, str, &hostname ); - todo_wine ok( hr == S_OK, "got hr %#lx.\n", hr ); - todo_wine ok( hostname != NULL, "got NULL hostname %p.\n", hostname ); + ok( hr == S_OK, "got hr %#lx.\n", hr ); + ok( hostname != NULL, "got NULL hostname %p.\n", hostname ); + + check_interface( hostname, &IID_IUnknown ); + check_interface( hostname, &IID_IInspectable ); + check_interface( hostname, &IID_IAgileObject ); + check_interface( hostname, &IID_IHostName );
hr = IHostName_get_RawName( hostname, NULL ); todo_wine ok( hr == E_INVALIDARG, "got hr %#lx.\n", hr ); @@ -98,6 +103,8 @@ static void test_HostnameStatics(void)
WindowsDeleteString( str ); WindowsDeleteString( rawname ); + ref = IHostName_Release( hostname ); + ok( !ref, "got ref %ld.\n", ref ); ref = IHostNameFactory_Release( hostnamefactory ); ok( ref == 2, "got ref %ld.\n", ref ); ref = IActivationFactory_Release( factory );