Commit 3fe0cfef authored by Mohamad Al-Jaf's avatar Mohamad Al-Jaf Committed by Alexandre Julliard

windows.networking.hostname: Implement IHostNameFactory::CreateHostName().

parent 790109da
...@@ -115,12 +115,147 @@ static const struct IActivationFactoryVtbl factory_vtbl = ...@@ -115,12 +115,147 @@ static const struct IActivationFactoryVtbl factory_vtbl =
factory_ActivateInstance, 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 ) DEFINE_IINSPECTABLE( hostname_factory, IHostNameFactory, struct hostname_statics, IActivationFactory_iface )
static HRESULT WINAPI hostname_factory_CreateHostName( IHostNameFactory *iface, HSTRING name, IHostName **value ) 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 ); struct hostname *impl;
return E_NOTIMPL;
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 = static const struct IHostNameFactoryVtbl hostname_factory_vtbl =
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#define WIDL_using_Windows_Foundation_Collections #define WIDL_using_Windows_Foundation_Collections
#include "windows.foundation.h" #include "windows.foundation.h"
#define WIDL_using_Windows_Networking #define WIDL_using_Windows_Networking
#define WIDL_using_Windows_Networking_Connectivity
#include "windows.networking.h" #include "windows.networking.h"
extern IActivationFactory *hostname_factory; extern IActivationFactory *hostname_factory;
...@@ -75,5 +76,4 @@ extern IActivationFactory *hostname_factory; ...@@ -75,5 +76,4 @@ extern IActivationFactory *hostname_factory;
#define DEFINE_IINSPECTABLE( pfx, iface_type, impl_type, base_iface ) \ #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 ) DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from_##iface_type, iface_type##_iface, &impl->base_iface )
#endif #endif
...@@ -79,14 +79,19 @@ static void test_HostnameStatics(void) ...@@ -79,14 +79,19 @@ static void test_HostnameStatics(void)
ok( hr == S_OK, "got hr %#lx.\n", hr ); ok( hr == S_OK, "got hr %#lx.\n", hr );
hr = IHostNameFactory_CreateHostName( hostnamefactory, NULL, &hostname ); 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 ); 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 ); 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 ); hr = IHostNameFactory_CreateHostName( hostnamefactory, str, &hostname );
todo_wine ok( hr == S_OK, "got hr %#lx.\n", hr ); ok( hr == S_OK, "got hr %#lx.\n", hr );
todo_wine ok( hostname != NULL, "got NULL hostname %p.\n", hostname ); 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 ); hr = IHostName_get_RawName( hostname, NULL );
todo_wine ok( hr == E_INVALIDARG, "got hr %#lx.\n", hr ); todo_wine ok( hr == E_INVALIDARG, "got hr %#lx.\n", hr );
...@@ -98,6 +103,8 @@ static void test_HostnameStatics(void) ...@@ -98,6 +103,8 @@ static void test_HostnameStatics(void)
WindowsDeleteString( str ); WindowsDeleteString( str );
WindowsDeleteString( rawname ); WindowsDeleteString( rawname );
ref = IHostName_Release( hostname );
ok( !ref, "got ref %ld.\n", ref );
ref = IHostNameFactory_Release( hostnamefactory ); ref = IHostNameFactory_Release( hostnamefactory );
ok( ref == 2, "got ref %ld.\n", ref ); ok( ref == 2, "got ref %ld.\n", ref );
ref = IActivationFactory_Release( factory ); ref = IActivationFactory_Release( factory );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment