wsdapi: Build and write Scopes and XAddrs lists for Hello message.
[wine.git] / dlls / wsdapi / discovery.c
blobfc8acfb91c94e063bdd52e02f4cf750ede2dd379
1 /*
2 * Web Services on Devices
4 * Copyright 2017 Owen Rudge for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include <stdarg.h>
23 #define COBJMACROS
24 #define INITGUID
26 #include "wsdapi_internal.h"
27 #include "wine/debug.h"
28 #include "wine/heap.h"
29 #include "guiddef.h"
31 WINE_DEFAULT_DEBUG_CHANNEL(wsdapi);
33 static inline IWSDiscoveryPublisherImpl *impl_from_IWSDiscoveryPublisher(IWSDiscoveryPublisher *iface)
35 return CONTAINING_RECORD(iface, IWSDiscoveryPublisherImpl, IWSDiscoveryPublisher_iface);
38 static HRESULT WINAPI IWSDiscoveryPublisherImpl_QueryInterface(IWSDiscoveryPublisher *iface, REFIID riid, void **ppv)
40 IWSDiscoveryPublisherImpl *This = impl_from_IWSDiscoveryPublisher(iface);
42 TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppv);
44 if (!ppv)
46 WARN("Invalid parameter\n");
47 return E_INVALIDARG;
50 *ppv = NULL;
52 if (IsEqualIID(riid, &IID_IUnknown) ||
53 IsEqualIID(riid, &IID_IWSDiscoveryPublisher))
55 *ppv = &This->IWSDiscoveryPublisher_iface;
57 else
59 WARN("Unknown IID %s\n", debugstr_guid(riid));
60 return E_NOINTERFACE;
63 IUnknown_AddRef((IUnknown*)*ppv);
64 return S_OK;
67 static ULONG WINAPI IWSDiscoveryPublisherImpl_AddRef(IWSDiscoveryPublisher *iface)
69 IWSDiscoveryPublisherImpl *This = impl_from_IWSDiscoveryPublisher(iface);
70 ULONG ref = InterlockedIncrement(&This->ref);
72 TRACE("(%p) ref=%d\n", This, ref);
73 return ref;
76 static ULONG WINAPI IWSDiscoveryPublisherImpl_Release(IWSDiscoveryPublisher *iface)
78 IWSDiscoveryPublisherImpl *This = impl_from_IWSDiscoveryPublisher(iface);
79 ULONG ref = InterlockedDecrement(&This->ref);
80 struct notificationSink *sink, *cursor;
82 TRACE("(%p) ref=%d\n", This, ref);
84 if (ref == 0)
86 terminate_networking(This);
88 if (This->xmlContext != NULL)
90 IWSDXMLContext_Release(This->xmlContext);
93 LIST_FOR_EACH_ENTRY_SAFE(sink, cursor, &This->notificationSinks, struct notificationSink, entry)
95 IWSDiscoveryPublisherNotify_Release(sink->notificationSink);
96 list_remove(&sink->entry);
97 HeapFree(GetProcessHeap(), 0, sink);
100 HeapFree(GetProcessHeap(), 0, This);
103 return ref;
106 static HRESULT WINAPI IWSDiscoveryPublisherImpl_SetAddressFamily(IWSDiscoveryPublisher *This, DWORD dwAddressFamily)
108 IWSDiscoveryPublisherImpl *impl = impl_from_IWSDiscoveryPublisher(This);
110 TRACE("(%p, %d)\n", This, dwAddressFamily);
112 /* Has the address family already been set? */
113 if (impl->addressFamily != 0)
115 return STG_E_INVALIDFUNCTION;
118 if ((dwAddressFamily == WSDAPI_ADDRESSFAMILY_IPV4) || (dwAddressFamily == WSDAPI_ADDRESSFAMILY_IPV6) ||
119 (dwAddressFamily == (WSDAPI_ADDRESSFAMILY_IPV4 | WSDAPI_ADDRESSFAMILY_IPV6)))
121 /* TODO: Check that the address family is supported by the system */
122 impl->addressFamily = dwAddressFamily;
123 return S_OK;
126 return E_INVALIDARG;
129 static HRESULT WINAPI IWSDiscoveryPublisherImpl_RegisterNotificationSink(IWSDiscoveryPublisher *This, IWSDiscoveryPublisherNotify *pSink)
131 IWSDiscoveryPublisherImpl *impl = impl_from_IWSDiscoveryPublisher(This);
132 struct notificationSink *sink;
134 TRACE("(%p, %p)\n", This, pSink);
136 if (pSink == NULL)
138 return E_INVALIDARG;
141 sink = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*sink));
143 if (!sink)
145 return E_OUTOFMEMORY;
148 sink->notificationSink = pSink;
149 IWSDiscoveryPublisherNotify_AddRef(pSink);
151 list_add_tail(&impl->notificationSinks, &sink->entry);
153 if ((!impl->publisherStarted) && (!init_networking(impl)))
154 return E_FAIL;
156 return S_OK;
159 static HRESULT WINAPI IWSDiscoveryPublisherImpl_UnRegisterNotificationSink(IWSDiscoveryPublisher *This, IWSDiscoveryPublisherNotify *pSink)
161 IWSDiscoveryPublisherImpl *impl = impl_from_IWSDiscoveryPublisher(This);
162 struct notificationSink *sink;
164 TRACE("(%p, %p)\n", This, pSink);
166 if (pSink == NULL)
168 return E_INVALIDARG;
171 LIST_FOR_EACH_ENTRY(sink, &impl->notificationSinks, struct notificationSink, entry)
173 if (sink->notificationSink == pSink)
175 IWSDiscoveryPublisherNotify_Release(pSink);
176 list_remove(&sink->entry);
177 HeapFree(GetProcessHeap(), 0, sink);
179 return S_OK;
183 /* Notification sink is not registered */
184 return E_FAIL;
187 static HRESULT WINAPI IWSDiscoveryPublisherImpl_Publish(IWSDiscoveryPublisher *This, LPCWSTR pszId, ULONGLONG ullMetadataVersion, ULONGLONG ullInstanceId,
188 ULONGLONG ullMessageNumber, LPCWSTR pszSessionId, const WSD_NAME_LIST *pTypesList,
189 const WSD_URI_LIST *pScopesList, const WSD_URI_LIST *pXAddrsList)
191 return IWSDiscoveryPublisher_PublishEx(This, pszId, ullMetadataVersion, ullInstanceId, ullMessageNumber,
192 pszSessionId, pTypesList, pScopesList, pXAddrsList, NULL, NULL, NULL, NULL, NULL);
195 static HRESULT WINAPI IWSDiscoveryPublisherImpl_UnPublish(IWSDiscoveryPublisher *This, LPCWSTR pszId, ULONGLONG ullInstanceId, ULONGLONG ullMessageNumber,
196 LPCWSTR pszSessionId, const WSDXML_ELEMENT *pAny)
198 FIXME("(%p, %s, %s, %s, %s, %p)\n", This, debugstr_w(pszId), wine_dbgstr_longlong(ullInstanceId), wine_dbgstr_longlong(ullMessageNumber),
199 debugstr_w(pszSessionId), pAny);
201 return E_NOTIMPL;
204 static HRESULT WINAPI IWSDiscoveryPublisherImpl_MatchProbe(IWSDiscoveryPublisher *This, const WSD_SOAP_MESSAGE *pProbeMessage,
205 IWSDMessageParameters *pMessageParameters, LPCWSTR pszId, ULONGLONG ullMetadataVersion,
206 ULONGLONG ullInstanceId, ULONGLONG ullMessageNumber, LPCWSTR pszSessionId,
207 const WSD_NAME_LIST *pTypesList, const WSD_URI_LIST *pScopesList,
208 const WSD_URI_LIST *pXAddrsList)
210 FIXME("(%p, %p, %p, %s, %s, %s, %s, %s, %p, %p, %p)\n", This, pProbeMessage, pMessageParameters, debugstr_w(pszId),
211 wine_dbgstr_longlong(ullMetadataVersion), wine_dbgstr_longlong(ullInstanceId), wine_dbgstr_longlong(ullMessageNumber), debugstr_w(pszSessionId),
212 pTypesList, pScopesList, pXAddrsList);
214 return E_NOTIMPL;
217 static HRESULT WINAPI IWSDiscoveryPublisherImpl_MatchResolve(IWSDiscoveryPublisher *This, const WSD_SOAP_MESSAGE *pResolveMessage,
218 IWSDMessageParameters *pMessageParameters, LPCWSTR pszId, ULONGLONG ullMetadataVersion,
219 ULONGLONG ullInstanceId, ULONGLONG ullMessageNumber, LPCWSTR pszSessionId,
220 const WSD_NAME_LIST *pTypesList, const WSD_URI_LIST *pScopesList,
221 const WSD_URI_LIST *pXAddrsList)
223 FIXME("(%p, %p, %p, %s, %s, %s, %s, %s, %p, %p, %p)\n", This, pResolveMessage, pMessageParameters, debugstr_w(pszId),
224 wine_dbgstr_longlong(ullMetadataVersion), wine_dbgstr_longlong(ullInstanceId), wine_dbgstr_longlong(ullMessageNumber), debugstr_w(pszSessionId),
225 pTypesList, pScopesList, pXAddrsList);
227 return E_NOTIMPL;
230 static HRESULT WINAPI IWSDiscoveryPublisherImpl_PublishEx(IWSDiscoveryPublisher *This, LPCWSTR pszId, ULONGLONG ullMetadataVersion,
231 ULONGLONG ullInstanceId, ULONGLONG ullMessageNumber, LPCWSTR pszSessionId,
232 const WSD_NAME_LIST *pTypesList, const WSD_URI_LIST *pScopesList,
233 const WSD_URI_LIST *pXAddrsList, const WSDXML_ELEMENT *pHeaderAny,
234 const WSDXML_ELEMENT *pReferenceParameterAny, const WSDXML_ELEMENT *pPolicyAny,
235 const WSDXML_ELEMENT *pEndpointReferenceAny, const WSDXML_ELEMENT *pAny)
237 IWSDiscoveryPublisherImpl *impl = impl_from_IWSDiscoveryPublisher(This);
239 TRACE("(%p, %s, %s, %s, %s, %s, %p, %p, %p, %p, %p, %p, %p, %p)\n", This, debugstr_w(pszId), wine_dbgstr_longlong(ullMetadataVersion),
240 wine_dbgstr_longlong(ullInstanceId), wine_dbgstr_longlong(ullMessageNumber), debugstr_w(pszSessionId), pTypesList, pScopesList, pXAddrsList,
241 pHeaderAny, pReferenceParameterAny, pPolicyAny, pEndpointReferenceAny, pAny);
243 if ((!impl->publisherStarted) || (pszId == NULL) || (lstrlenW(pszId) > WSD_MAX_TEXT_LENGTH) ||
244 ((pszSessionId != NULL) && (lstrlenW(pszSessionId) > WSD_MAX_TEXT_LENGTH)))
246 return E_INVALIDARG;
249 return send_hello_message(impl, pszId, ullMetadataVersion, ullInstanceId, ullMessageNumber, pszSessionId,
250 pTypesList, pScopesList, pXAddrsList, pHeaderAny, pReferenceParameterAny, pEndpointReferenceAny, pAny);
253 static HRESULT WINAPI IWSDiscoveryPublisherImpl_MatchProbeEx(IWSDiscoveryPublisher *This, const WSD_SOAP_MESSAGE *pProbeMessage,
254 IWSDMessageParameters *pMessageParameters, LPCWSTR pszId, ULONGLONG ullMetadataVersion,
255 ULONGLONG ullInstanceId, ULONGLONG ullMessageNumber, LPCWSTR pszSessionId,
256 const WSD_NAME_LIST *pTypesList, const WSD_URI_LIST *pScopesList,
257 const WSD_URI_LIST *pXAddrsList, const WSDXML_ELEMENT *pHeaderAny,
258 const WSDXML_ELEMENT *pReferenceParameterAny, const WSDXML_ELEMENT *pPolicyAny,
259 const WSDXML_ELEMENT *pEndpointReferenceAny, const WSDXML_ELEMENT *pAny)
261 FIXME("(%p, %p, %p, %s, %s, %s, %s, %s, %p, %p, %p, %p, %p, %p, %p, %p)\n", This, pProbeMessage, pMessageParameters, debugstr_w(pszId),
262 wine_dbgstr_longlong(ullMetadataVersion), wine_dbgstr_longlong(ullInstanceId), wine_dbgstr_longlong(ullMessageNumber), debugstr_w(pszSessionId),
263 pTypesList, pScopesList, pXAddrsList, pHeaderAny, pReferenceParameterAny, pPolicyAny, pEndpointReferenceAny, pAny);
265 return E_NOTIMPL;
268 static HRESULT WINAPI IWSDiscoveryPublisherImpl_MatchResolveEx(IWSDiscoveryPublisher *This, const WSD_SOAP_MESSAGE *pResolveMessage,
269 IWSDMessageParameters *pMessageParameters, LPCWSTR pszId, ULONGLONG ullMetadataVersion,
270 ULONGLONG ullInstanceId, ULONGLONG ullMessageNumber, LPCWSTR pszSessionId,
271 const WSD_NAME_LIST *pTypesList, const WSD_URI_LIST *pScopesList,
272 const WSD_URI_LIST *pXAddrsList, const WSDXML_ELEMENT *pHeaderAny,
273 const WSDXML_ELEMENT *pReferenceParameterAny, const WSDXML_ELEMENT *pPolicyAny,
274 const WSDXML_ELEMENT *pEndpointReferenceAny, const WSDXML_ELEMENT *pAny)
276 FIXME("(%p, %p, %p, %s, %s, %s, %s, %s, %p, %p, %p, %p, %p, %p, %p, %p)\n", This, pResolveMessage, pMessageParameters, debugstr_w(pszId),
277 wine_dbgstr_longlong(ullMetadataVersion), wine_dbgstr_longlong(ullInstanceId), wine_dbgstr_longlong(ullMessageNumber), debugstr_w(pszSessionId),
278 pTypesList, pScopesList, pXAddrsList, pHeaderAny, pReferenceParameterAny, pPolicyAny, pEndpointReferenceAny, pAny);
280 return E_NOTIMPL;
283 static HRESULT WINAPI IWSDiscoveryPublisherImpl_RegisterScopeMatchingRule(IWSDiscoveryPublisher *This, IWSDScopeMatchingRule *pScopeMatchingRule)
285 FIXME("(%p, %p)\n", This, pScopeMatchingRule);
286 return E_NOTIMPL;
289 static HRESULT WINAPI IWSDiscoveryPublisherImpl_UnRegisterScopeMatchingRule(IWSDiscoveryPublisher *This, IWSDScopeMatchingRule *pScopeMatchingRule)
291 FIXME("(%p, %p)\n", This, pScopeMatchingRule);
292 return E_NOTIMPL;
295 static HRESULT WINAPI IWSDiscoveryPublisherImpl_GetXMLContext(IWSDiscoveryPublisher *This, IWSDXMLContext **ppContext)
297 IWSDiscoveryPublisherImpl *impl = impl_from_IWSDiscoveryPublisher(This);
299 TRACE("%p, %p)\n", This, ppContext);
301 if (ppContext == NULL)
302 return E_INVALIDARG;
304 if (impl->xmlContext != NULL)
306 IWSDXMLContext_AddRef(impl->xmlContext);
309 *ppContext = impl->xmlContext;
310 return S_OK;
313 static const IWSDiscoveryPublisherVtbl publisher_vtbl =
315 IWSDiscoveryPublisherImpl_QueryInterface,
316 IWSDiscoveryPublisherImpl_AddRef,
317 IWSDiscoveryPublisherImpl_Release,
318 IWSDiscoveryPublisherImpl_SetAddressFamily,
319 IWSDiscoveryPublisherImpl_RegisterNotificationSink,
320 IWSDiscoveryPublisherImpl_UnRegisterNotificationSink,
321 IWSDiscoveryPublisherImpl_Publish,
322 IWSDiscoveryPublisherImpl_UnPublish,
323 IWSDiscoveryPublisherImpl_MatchProbe,
324 IWSDiscoveryPublisherImpl_MatchResolve,
325 IWSDiscoveryPublisherImpl_PublishEx,
326 IWSDiscoveryPublisherImpl_MatchProbeEx,
327 IWSDiscoveryPublisherImpl_MatchResolveEx,
328 IWSDiscoveryPublisherImpl_RegisterScopeMatchingRule,
329 IWSDiscoveryPublisherImpl_UnRegisterScopeMatchingRule,
330 IWSDiscoveryPublisherImpl_GetXMLContext
333 HRESULT WINAPI WSDCreateDiscoveryPublisher(IWSDXMLContext *pContext, IWSDiscoveryPublisher **ppPublisher)
335 IWSDiscoveryPublisherImpl *obj;
336 HRESULT ret;
338 TRACE("(%p, %p)\n", pContext, ppPublisher);
340 if (ppPublisher == NULL)
342 WARN("Invalid parameter: ppPublisher == NULL\n");
343 return E_POINTER;
346 *ppPublisher = NULL;
348 obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*obj));
350 if (!obj)
352 WARN("Out of memory\n");
353 return E_OUTOFMEMORY;
356 obj->IWSDiscoveryPublisher_iface.lpVtbl = &publisher_vtbl;
357 obj->ref = 1;
359 if (pContext == NULL)
361 ret = WSDXMLCreateContext(&obj->xmlContext);
363 if (FAILED(ret))
365 WARN("Unable to create XML context\n");
366 heap_free(obj);
367 return ret;
370 else
372 obj->xmlContext = pContext;
373 IWSDXMLContext_AddRef(pContext);
376 ret = register_namespaces(obj->xmlContext);
378 if (FAILED(ret))
380 WARN("Unable to register default namespaces\n");
381 heap_free(obj);
383 return ret;
386 list_init(&obj->notificationSinks);
388 *ppPublisher = &obj->IWSDiscoveryPublisher_iface;
389 TRACE("Returning iface %p\n", *ppPublisher);
391 return S_OK;