Jacek Caban : netprofm: Added semi-stub Advise and Unadvise implementation.
Alexandre Julliard
julliard at winehq.org
Thu Aug 17 18:55:08 CDT 2017
Module: wine
Branch: master
Commit: d53b711f27f15cdeb9700e86526dab13ddf8d731
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d53b711f27f15cdeb9700e86526dab13ddf8d731
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Aug 17 20:47:16 2017 +0200
netprofm: Added semi-stub Advise and Unadvise implementation.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/netprofm/list.c | 54 ++++++++++++++++++++++++++++++----
dlls/netprofm/tests/list.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 121 insertions(+), 5 deletions(-)
diff --git a/dlls/netprofm/list.c b/dlls/netprofm/list.c
index d82ae36..d59ee0c 100644
--- a/dlls/netprofm/list.c
+++ b/dlls/netprofm/list.c
@@ -91,6 +91,15 @@ struct connection_point
IConnectionPointContainer *container;
LONG refs;
IID iid;
+ struct list sinks;
+ DWORD cookie;
+};
+
+struct sink_entry
+{
+ struct list entry;
+ DWORD cookie;
+ IUnknown *unk;
};
static inline struct list_manager *impl_from_IConnectionPointContainer(IConnectionPointContainer *iface)
@@ -189,12 +198,33 @@ static HRESULT WINAPI connection_point_Advise(
DWORD *cookie )
{
struct connection_point *cp = impl_from_IConnectionPoint( iface );
- FIXME( "%p, %p, %p - stub\n", cp, sink, cookie );
+ struct sink_entry *sink_entry;
+ IUnknown *unk;
+ HRESULT hr;
+
+ FIXME( "%p, %p, %p - semi-stub\n", cp, sink, cookie );
if (!sink || !cookie)
return E_POINTER;
- return CONNECT_E_CANNOTCONNECT;
+ hr = IUnknown_QueryInterface( sink, &cp->iid, (void**)&unk );
+ if (FAILED(hr))
+ {
+ WARN( "iface %s not implemented by sink\n", debugstr_guid(&cp->iid) );
+ return CO_E_FAILEDTOOPENTHREADTOKEN;
+ }
+
+ sink_entry = heap_alloc( sizeof(*sink_entry) );
+ if (!sink_entry)
+ {
+ IUnknown_Release( unk );
+ return E_OUTOFMEMORY;
+ }
+
+ sink_entry->unk = unk;
+ *cookie = sink_entry->cookie = ++cp->cookie;
+ list_add_tail( &cp->sinks, &sink_entry->entry );
+ return S_OK;
}
static HRESULT WINAPI connection_point_Unadvise(
@@ -202,9 +232,21 @@ static HRESULT WINAPI connection_point_Unadvise(
DWORD cookie )
{
struct connection_point *cp = impl_from_IConnectionPoint( iface );
- FIXME( "%p, %d - stub\n", cp, cookie );
+ struct sink_entry *iter;
+
+ TRACE( "%p, %d\n", cp, cookie );
+
+ LIST_FOR_EACH_ENTRY( iter, &cp->sinks, struct sink_entry, entry )
+ {
+ if (iter->cookie != cookie) continue;
+ list_remove( &iter->entry );
+ IUnknown_Release( iter->unk );
+ heap_free( iter );
+ return S_OK;
+ }
- return E_POINTER;
+ WARN( "invalid cookie\n" );
+ return OLE_E_NOCONNECTION;
}
static HRESULT WINAPI connection_point_EnumConnections(
@@ -241,8 +283,10 @@ static HRESULT connection_point_create(
cp->IConnectionPoint_iface.lpVtbl = &connection_point_vtbl;
cp->container = container;
cp->refs = 1;
+ cp->cookie = 0;
+ cp->iid = *riid;
+ list_init( &cp->sinks );
- memcpy( &cp->iid, riid, sizeof(*riid) );
IConnectionPointContainer_AddRef( container );
*obj = &cp->IConnectionPoint_iface;
diff --git a/dlls/netprofm/tests/list.c b/dlls/netprofm/tests/list.c
index eb8477c..3937b2f 100644
--- a/dlls/netprofm/tests/list.c
+++ b/dlls/netprofm/tests/list.c
@@ -157,6 +157,64 @@ static void test_INetworkConnection( INetworkConnection *conn )
}
}
+static HRESULT WINAPI Unknown_QueryInterface(INetworkListManagerEvents *iface, REFIID riid, void **ppv)
+{
+ if(IsEqualGUID(riid, &IID_IUnknown)) {
+ *ppv = iface;
+ return S_OK;
+ }
+
+ *ppv = NULL;
+ return E_NOINTERFACE;
+}
+
+static HRESULT WINAPI NetworkListManagerEvents_QueryInterface(INetworkListManagerEvents *iface,
+ REFIID riid, void **ppv)
+{
+ if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_INetworkListManagerEvents)) {
+ *ppv = iface;
+ return S_OK;
+ }
+
+ *ppv = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI NetworkListManagerEvents_AddRef(INetworkListManagerEvents *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI NetworkListManagerEvents_Release(INetworkListManagerEvents *iface)
+{
+ return 1;
+}
+
+static HRESULT WINAPI NetworkListManagerEvents_ConnectivityChanged(INetworkListManagerEvents *iface,
+ NLM_CONNECTIVITY newConnectivity)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static const INetworkListManagerEventsVtbl mgr_sink_vtbl = {
+ NetworkListManagerEvents_QueryInterface,
+ NetworkListManagerEvents_AddRef,
+ NetworkListManagerEvents_Release,
+ NetworkListManagerEvents_ConnectivityChanged
+};
+
+static INetworkListManagerEvents mgr_sink = { &mgr_sink_vtbl };
+
+static const INetworkListManagerEventsVtbl mgr_sink_unk_vtbl = {
+ Unknown_QueryInterface,
+ NetworkListManagerEvents_AddRef,
+ NetworkListManagerEvents_Release,
+ NetworkListManagerEvents_ConnectivityChanged
+};
+
+static INetworkListManagerEvents mgr_sink_unk = { &mgr_sink_unk_vtbl };
+
static void test_INetworkListManager( void )
{
IConnectionPointContainer *cpc, *cpc2;
@@ -169,6 +227,7 @@ static void test_INetworkListManager( void )
INetwork *network;
IEnumNetworkConnections *conn_iter;
INetworkConnection *conn;
+ DWORD cookie;
HRESULT hr;
ULONG ref1, ref2;
IID iid;
@@ -247,6 +306,19 @@ static void test_INetworkListManager( void )
ok( hr == S_OK, "got %08x\n", hr );
ok( !memcmp( &iid, &IID_INetworkListManagerEvents, sizeof(iid) ),
"Expected iid to be IID_INetworkListManagerEvents\n" );
+
+ hr = IConnectionPoint_Advise( pt, (IUnknown*)&mgr_sink_unk, &cookie);
+ ok( hr == CO_E_FAILEDTOOPENTHREADTOKEN, "Advise failed: %08x\n", hr );
+
+ hr = IConnectionPoint_Advise( pt, (IUnknown*)&mgr_sink, &cookie);
+ ok( hr == S_OK, "Advise failed: %08x\n", hr );
+
+ hr = IConnectionPoint_Unadvise( pt, 0xdeadbeef );
+ ok( hr == OLE_E_NOCONNECTION || hr == CO_E_FAILEDTOIMPERSONATE, "Unadvise failed: %08x\n", hr );
+
+ hr = IConnectionPoint_Unadvise( pt, cookie );
+ ok( hr == S_OK, "Unadvise failed: %08x\n", hr );
+
IConnectionPoint_Release( pt );
hr = IConnectionPointContainer_FindConnectionPoint( cpc, &IID_INetworkCostManagerEvents, &pt );
More information about the wine-cvs
mailing list