diff --git a/dlls/wsdapi/Makefile.in b/dlls/wsdapi/Makefile.in index 134bb184fe2..56912ee6ba4 100644 --- a/dlls/wsdapi/Makefile.in +++ b/dlls/wsdapi/Makefile.in @@ -3,4 +3,5 @@ IMPORTLIB = wsdapi IMPORTS = kernel32 C_SRCS = \ + discovery.c \ main.c diff --git a/dlls/wsdapi/discovery.c b/dlls/wsdapi/discovery.c new file mode 100644 index 00000000000..990f030fd14 --- /dev/null +++ b/dlls/wsdapi/discovery.c @@ -0,0 +1,295 @@ +/* + * Web Services on Devices + * + * Copyright 2017 Owen Rudge for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#define COBJMACROS +#define INITGUID + +#include "windef.h" +#include "winbase.h" +#include "wine/debug.h" +#include "objbase.h" +#include "guiddef.h" +#include "wsdapi.h" + +WINE_DEFAULT_DEBUG_CHANNEL(wsdapi); + +typedef struct IWSDiscoveryPublisherImpl { + IWSDiscoveryPublisher IWSDiscoveryPublisher_iface; + LONG ref; + IWSDXMLContext *xmlContext; +} IWSDiscoveryPublisherImpl; + +static inline IWSDiscoveryPublisherImpl *impl_from_IWSDiscoveryPublisher(IWSDiscoveryPublisher *iface) +{ + return CONTAINING_RECORD(iface, IWSDiscoveryPublisherImpl, IWSDiscoveryPublisher_iface); +} + +static HRESULT WINAPI IWSDiscoveryPublisherImpl_QueryInterface(IWSDiscoveryPublisher *iface, REFIID riid, void **ppv) +{ + IWSDiscoveryPublisherImpl *This = impl_from_IWSDiscoveryPublisher(iface); + + TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppv); + + if (!ppv) + { + WARN("Invalid parameter\n"); + return E_INVALIDARG; + } + + *ppv = NULL; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IWSDiscoveryPublisher)) + { + *ppv = &This->IWSDiscoveryPublisher_iface; + } + else + { + WARN("Unknown IID %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI IWSDiscoveryPublisherImpl_AddRef(IWSDiscoveryPublisher *iface) +{ + IWSDiscoveryPublisherImpl *This = impl_from_IWSDiscoveryPublisher(iface); + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + return ref; +} + +static ULONG WINAPI IWSDiscoveryPublisherImpl_Release(IWSDiscoveryPublisher *iface) +{ + IWSDiscoveryPublisherImpl *This = impl_from_IWSDiscoveryPublisher(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if (ref == 0) + { + if (This->xmlContext != NULL) + { + IWSDXMLContext_Release(This->xmlContext); + } + } + + return ref; +} + +static HRESULT WINAPI IWSDiscoveryPublisherImpl_SetAddressFamily(IWSDiscoveryPublisher *This, DWORD dwAddressFamily) +{ + FIXME("(%p, %d)\n", This, dwAddressFamily); + return E_NOTIMPL; +} + +static HRESULT WINAPI IWSDiscoveryPublisherImpl_RegisterNotificationSink(IWSDiscoveryPublisher *This, IWSDiscoveryPublisherNotify *pSink) +{ + FIXME("(%p, %p)\n", This, pSink); + return E_NOTIMPL; +} + +static HRESULT WINAPI IWSDiscoveryPublisherImpl_UnRegisterNotificationSink(IWSDiscoveryPublisher *This, IWSDiscoveryPublisherNotify *pSink) +{ + FIXME("(%p, %p)\n", This, pSink); + return E_NOTIMPL; +} + +static HRESULT WINAPI IWSDiscoveryPublisherImpl_Publish(IWSDiscoveryPublisher *This, LPCWSTR pszId, ULONGLONG ullMetadataVersion, ULONGLONG ullInstanceId, + ULONGLONG ullMessageNumber, LPCWSTR pszSessionId, const WSD_NAME_LIST *pTypesList, + const WSD_URI_LIST *pScopesList, const WSD_URI_LIST *pXAddrsList) +{ + FIXME("(%p, %s, %s, %s, %s, %s, %p, %p, %p)\n", This, debugstr_w(pszId), wine_dbgstr_longlong(ullMetadataVersion), wine_dbgstr_longlong(ullInstanceId), + wine_dbgstr_longlong(ullMessageNumber), debugstr_w(pszSessionId), pTypesList, pScopesList, pXAddrsList); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IWSDiscoveryPublisherImpl_UnPublish(IWSDiscoveryPublisher *This, LPCWSTR pszId, ULONGLONG ullInstanceId, ULONGLONG ullMessageNumber, + LPCWSTR pszSessionId, const WSDXML_ELEMENT *pAny) +{ + FIXME("(%p, %s, %s, %s, %s, %p)\n", This, debugstr_w(pszId), wine_dbgstr_longlong(ullInstanceId), wine_dbgstr_longlong(ullMessageNumber), + debugstr_w(pszSessionId), pAny); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IWSDiscoveryPublisherImpl_MatchProbe(IWSDiscoveryPublisher *This, const WSD_SOAP_MESSAGE *pProbeMessage, + IWSDMessageParameters *pMessageParameters, LPCWSTR pszId, ULONGLONG ullMetadataVersion, + ULONGLONG ullInstanceId, ULONGLONG ullMessageNumber, LPCWSTR pszSessionId, + const WSD_NAME_LIST *pTypesList, const WSD_URI_LIST *pScopesList, + const WSD_URI_LIST *pXAddrsList) +{ + FIXME("(%p, %p, %p, %s, %s, %s, %s, %s, %p, %p, %p)\n", This, pProbeMessage, pMessageParameters, debugstr_w(pszId), + wine_dbgstr_longlong(ullMetadataVersion), wine_dbgstr_longlong(ullInstanceId), wine_dbgstr_longlong(ullMessageNumber), debugstr_w(pszSessionId), + pTypesList, pScopesList, pXAddrsList); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IWSDiscoveryPublisherImpl_MatchResolve(IWSDiscoveryPublisher *This, const WSD_SOAP_MESSAGE *pResolveMessage, + IWSDMessageParameters *pMessageParameters, LPCWSTR pszId, ULONGLONG ullMetadataVersion, + ULONGLONG ullInstanceId, ULONGLONG ullMessageNumber, LPCWSTR pszSessionId, + const WSD_NAME_LIST *pTypesList, const WSD_URI_LIST *pScopesList, + const WSD_URI_LIST *pXAddrsList) +{ + FIXME("(%p, %p, %p, %s, %s, %s, %s, %s, %p, %p, %p)\n", This, pResolveMessage, pMessageParameters, debugstr_w(pszId), + wine_dbgstr_longlong(ullMetadataVersion), wine_dbgstr_longlong(ullInstanceId), wine_dbgstr_longlong(ullMessageNumber), debugstr_w(pszSessionId), + pTypesList, pScopesList, pXAddrsList); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IWSDiscoveryPublisherImpl_PublishEx(IWSDiscoveryPublisher *This, LPCWSTR pszId, ULONGLONG ullMetadataVersion, + ULONGLONG ullInstanceId, ULONGLONG ullMessageNumber, LPCWSTR pszSessionId, + const WSD_NAME_LIST *pTypesList, const WSD_URI_LIST *pScopesList, + const WSD_URI_LIST *pXAddrsList, const WSDXML_ELEMENT *pHeaderAny, + const WSDXML_ELEMENT *pReferenceParameterAny, const WSDXML_ELEMENT *pPolicyAny, + const WSDXML_ELEMENT *pEndpointReferenceAny, const WSDXML_ELEMENT *pAny) +{ + FIXME("(%p, %s, %s, %s, %s, %s, %p, %p, %p, %p, %p, %p, %p, %p)\n", This, debugstr_w(pszId), wine_dbgstr_longlong(ullMetadataVersion), + wine_dbgstr_longlong(ullInstanceId), wine_dbgstr_longlong(ullMessageNumber), debugstr_w(pszSessionId), pTypesList, pScopesList, pXAddrsList, + pHeaderAny, pReferenceParameterAny, pPolicyAny, pEndpointReferenceAny, pAny); + + return E_NOTIMPL; +} + + +static HRESULT WINAPI IWSDiscoveryPublisherImpl_MatchProbeEx(IWSDiscoveryPublisher *This, const WSD_SOAP_MESSAGE *pProbeMessage, + IWSDMessageParameters *pMessageParameters, LPCWSTR pszId, ULONGLONG ullMetadataVersion, + ULONGLONG ullInstanceId, ULONGLONG ullMessageNumber, LPCWSTR pszSessionId, + const WSD_NAME_LIST *pTypesList, const WSD_URI_LIST *pScopesList, + const WSD_URI_LIST *pXAddrsList, const WSDXML_ELEMENT *pHeaderAny, + const WSDXML_ELEMENT *pReferenceParameterAny, const WSDXML_ELEMENT *pPolicyAny, + const WSDXML_ELEMENT *pEndpointReferenceAny, const WSDXML_ELEMENT *pAny) +{ + FIXME("(%p, %p, %p, %s, %s, %s, %s, %s, %p, %p, %p, %p, %p, %p, %p, %p)\n", This, pProbeMessage, pMessageParameters, debugstr_w(pszId), + wine_dbgstr_longlong(ullMetadataVersion), wine_dbgstr_longlong(ullInstanceId), wine_dbgstr_longlong(ullMessageNumber), debugstr_w(pszSessionId), + pTypesList, pScopesList, pXAddrsList, pHeaderAny, pReferenceParameterAny, pPolicyAny, pEndpointReferenceAny, pAny); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IWSDiscoveryPublisherImpl_MatchResolveEx(IWSDiscoveryPublisher *This, const WSD_SOAP_MESSAGE *pResolveMessage, + IWSDMessageParameters *pMessageParameters, LPCWSTR pszId, ULONGLONG ullMetadataVersion, + ULONGLONG ullInstanceId, ULONGLONG ullMessageNumber, LPCWSTR pszSessionId, + const WSD_NAME_LIST *pTypesList, const WSD_URI_LIST *pScopesList, + const WSD_URI_LIST *pXAddrsList, const WSDXML_ELEMENT *pHeaderAny, + const WSDXML_ELEMENT *pReferenceParameterAny, const WSDXML_ELEMENT *pPolicyAny, + const WSDXML_ELEMENT *pEndpointReferenceAny, const WSDXML_ELEMENT *pAny) +{ + FIXME("(%p, %p, %p, %s, %s, %s, %s, %s, %p, %p, %p, %p, %p, %p, %p, %p)\n", This, pResolveMessage, pMessageParameters, debugstr_w(pszId), + wine_dbgstr_longlong(ullMetadataVersion), wine_dbgstr_longlong(ullInstanceId), wine_dbgstr_longlong(ullMessageNumber), debugstr_w(pszSessionId), + pTypesList, pScopesList, pXAddrsList, pHeaderAny, pReferenceParameterAny, pPolicyAny, pEndpointReferenceAny, pAny); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IWSDiscoveryPublisherImpl_RegisterScopeMatchingRule(IWSDiscoveryPublisher *This, IWSDScopeMatchingRule *pScopeMatchingRule) +{ + FIXME("(%p, %p)\n", This, pScopeMatchingRule); + return E_NOTIMPL; +} + +static HRESULT WINAPI IWSDiscoveryPublisherImpl_UnRegisterScopeMatchingRule(IWSDiscoveryPublisher *This, IWSDScopeMatchingRule *pScopeMatchingRule) +{ + FIXME("(%p, %p)\n", This, pScopeMatchingRule); + return E_NOTIMPL; +} + +static HRESULT WINAPI IWSDiscoveryPublisherImpl_GetXMLContext(IWSDiscoveryPublisher *This, IWSDXMLContext **ppContext) +{ + IWSDiscoveryPublisherImpl *impl = impl_from_IWSDiscoveryPublisher(This); + + TRACE("%p, %p)\n", This, ppContext); + + if (ppContext == NULL) + return E_INVALIDARG; + + if (impl->xmlContext != NULL) + { + IWSDXMLContext_AddRef(impl->xmlContext); + } + + *ppContext = impl->xmlContext; + return S_OK; +} + +static const IWSDiscoveryPublisherVtbl publisher_vtbl = +{ + IWSDiscoveryPublisherImpl_QueryInterface, + IWSDiscoveryPublisherImpl_AddRef, + IWSDiscoveryPublisherImpl_Release, + IWSDiscoveryPublisherImpl_SetAddressFamily, + IWSDiscoveryPublisherImpl_RegisterNotificationSink, + IWSDiscoveryPublisherImpl_UnRegisterNotificationSink, + IWSDiscoveryPublisherImpl_Publish, + IWSDiscoveryPublisherImpl_UnPublish, + IWSDiscoveryPublisherImpl_MatchProbe, + IWSDiscoveryPublisherImpl_MatchResolve, + IWSDiscoveryPublisherImpl_PublishEx, + IWSDiscoveryPublisherImpl_MatchProbeEx, + IWSDiscoveryPublisherImpl_MatchResolveEx, + IWSDiscoveryPublisherImpl_RegisterScopeMatchingRule, + IWSDiscoveryPublisherImpl_UnRegisterScopeMatchingRule, + IWSDiscoveryPublisherImpl_GetXMLContext +}; + +HRESULT WINAPI WSDCreateDiscoveryPublisher(IWSDXMLContext *pContext, IWSDiscoveryPublisher **ppPublisher) +{ + IWSDiscoveryPublisherImpl *obj; + + TRACE("(%p, %p)\n", pContext, ppPublisher); + + if (ppPublisher == NULL) + { + WARN("Invalid parameter: ppPublisher == NULL\n"); + return E_POINTER; + } + + *ppPublisher = NULL; + + obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*obj)); + + if (!obj) + { + WARN("Out of memory\n"); + return E_OUTOFMEMORY; + } + + obj->IWSDiscoveryPublisher_iface.lpVtbl = &publisher_vtbl; + obj->ref = 1; + obj->xmlContext = pContext; + + if (pContext != NULL) + { + IWSDXMLContext_AddRef(pContext); + } + + *ppPublisher = &obj->IWSDiscoveryPublisher_iface; + TRACE("Returning iface %p\n", *ppPublisher); + + return S_OK; +} diff --git a/dlls/wsdapi/wsdapi.spec b/dlls/wsdapi/wsdapi.spec index 7771b7b93bf..3e1d2b69bad 100644 --- a/dlls/wsdapi/wsdapi.spec +++ b/dlls/wsdapi/wsdapi.spec @@ -17,7 +17,7 @@ @ stub WSDCreateDiscoveryProvider2 @ stub WSDCreateDiscoveryProvider @ stub WSDCreateDiscoveryPublisher2 -@ stub WSDCreateDiscoveryPublisher +@ stdcall WSDCreateDiscoveryPublisher(ptr ptr) @ stub WSDCreateHttpAddress @ stub WSDCreateHttpMessageParameters @ stub WSDCreateHttpTransport