Owen Rudge : wsdapi: Implement RegisterNotificationSink and UnRegisterNotificationSink.
Alexandre Julliard
julliard at winehq.org
Thu Apr 20 16:41:32 CDT 2017
Module: wine
Branch: master
Commit: 44048e06ba7e08036e9a3e01684344223cb0a26a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=44048e06ba7e08036e9a3e01684344223cb0a26a
Author: Owen Rudge <orudge at codeweavers.com>
Date: Tue Apr 18 20:40:38 2017 +0100
wsdapi: Implement RegisterNotificationSink and UnRegisterNotificationSink.
Signed-off-by: Owen Rudge <orudge at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wsdapi/discovery.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 67 insertions(+), 4 deletions(-)
diff --git a/dlls/wsdapi/discovery.c b/dlls/wsdapi/discovery.c
index a3d7b9b..ea0f34b 100644
--- a/dlls/wsdapi/discovery.c
+++ b/dlls/wsdapi/discovery.c
@@ -26,17 +26,25 @@
#include "windef.h"
#include "winbase.h"
#include "wine/debug.h"
+#include "wine/list.h"
#include "objbase.h"
#include "guiddef.h"
#include "wsdapi.h"
WINE_DEFAULT_DEBUG_CHANNEL(wsdapi);
+struct notificationSink
+{
+ struct list entry;
+ IWSDiscoveryPublisherNotify *notificationSink;
+};
+
typedef struct IWSDiscoveryPublisherImpl {
IWSDiscoveryPublisher IWSDiscoveryPublisher_iface;
LONG ref;
IWSDXMLContext *xmlContext;
DWORD addressFamily;
+ struct list notificationSinks;
} IWSDiscoveryPublisherImpl;
static inline IWSDiscoveryPublisherImpl *impl_from_IWSDiscoveryPublisher(IWSDiscoveryPublisher *iface)
@@ -86,6 +94,7 @@ static ULONG WINAPI IWSDiscoveryPublisherImpl_Release(IWSDiscoveryPublisher *ifa
{
IWSDiscoveryPublisherImpl *This = impl_from_IWSDiscoveryPublisher(iface);
ULONG ref = InterlockedDecrement(&This->ref);
+ struct notificationSink *sink, *cursor;
TRACE("(%p) ref=%d\n", This, ref);
@@ -95,6 +104,15 @@ static ULONG WINAPI IWSDiscoveryPublisherImpl_Release(IWSDiscoveryPublisher *ifa
{
IWSDXMLContext_Release(This->xmlContext);
}
+
+ LIST_FOR_EACH_ENTRY_SAFE(sink, cursor, &This->notificationSinks, struct notificationSink, entry)
+ {
+ IWSDiscoveryPublisherNotify_Release(sink->notificationSink);
+ list_remove(&sink->entry);
+ HeapFree(GetProcessHeap(), 0, sink);
+ }
+
+ HeapFree(GetProcessHeap(), 0, This);
}
return ref;
@@ -125,14 +143,57 @@ static HRESULT WINAPI IWSDiscoveryPublisherImpl_SetAddressFamily(IWSDiscoveryPub
static HRESULT WINAPI IWSDiscoveryPublisherImpl_RegisterNotificationSink(IWSDiscoveryPublisher *This, IWSDiscoveryPublisherNotify *pSink)
{
- FIXME("(%p, %p)\n", This, pSink);
- return E_NOTIMPL;
+ IWSDiscoveryPublisherImpl *impl = impl_from_IWSDiscoveryPublisher(This);
+ struct notificationSink *sink;
+
+ TRACE("(%p, %p)\n", This, pSink);
+
+ if (pSink == NULL)
+ {
+ return E_INVALIDARG;
+ }
+
+ sink = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*sink));
+
+ if (!sink)
+ {
+ return E_OUTOFMEMORY;
+ }
+
+ sink->notificationSink = pSink;
+ IWSDiscoveryPublisherNotify_AddRef(pSink);
+
+ list_add_tail(&impl->notificationSinks, &sink->entry);
+
+ return S_OK;
}
static HRESULT WINAPI IWSDiscoveryPublisherImpl_UnRegisterNotificationSink(IWSDiscoveryPublisher *This, IWSDiscoveryPublisherNotify *pSink)
{
- FIXME("(%p, %p)\n", This, pSink);
- return E_NOTIMPL;
+ IWSDiscoveryPublisherImpl *impl = impl_from_IWSDiscoveryPublisher(This);
+ struct notificationSink *sink;
+
+ TRACE("(%p, %p)\n", This, pSink);
+
+ if (pSink == NULL)
+ {
+ return E_INVALIDARG;
+ }
+
+ LIST_FOR_EACH_ENTRY(sink, &impl->notificationSinks, struct notificationSink, entry)
+ {
+ if (sink->notificationSink == pSink)
+ {
+ IWSDiscoveryPublisherNotify_Release(pSink);
+ list_remove(&sink->entry);
+ HeapFree(GetProcessHeap(), 0, sink);
+
+ return S_OK;
+ }
+ }
+
+ /* Notification sink is not registered */
+ return E_FAIL;
}
static HRESULT WINAPI IWSDiscoveryPublisherImpl_Publish(IWSDiscoveryPublisher *This, LPCWSTR pszId, ULONGLONG ullMetadataVersion, ULONGLONG ullInstanceId,
@@ -306,6 +367,8 @@ HRESULT WINAPI WSDCreateDiscoveryPublisher(IWSDXMLContext *pContext, IWSDiscover
IWSDXMLContext_AddRef(pContext);
}
+ list_init(&obj->notificationSinks);
+
*ppPublisher = &obj->IWSDiscoveryPublisher_iface;
TRACE("Returning iface %p\n", *ppPublisher);
More information about the wine-cvs
mailing list