Owen Rudge : wsdapi: Implement matching of names in MatchProbeEx.
Alexandre Julliard
julliard at winehq.org
Thu Sep 20 13:45:32 CDT 2018
Module: wine
Branch: master
Commit: 2d1371001e4053b4d5a922a2f4af86a61ce3b4b6
URL: https://source.winehq.org/git/wine.git/?a=commit;h=2d1371001e4053b4d5a922a2f4af86a61ce3b4b6
Author: Owen Rudge <orudge at codeweavers.com>
Date: Wed Sep 19 21:29:07 2018 +0100
wsdapi: Implement matching of names in MatchProbeEx.
Signed-off-by: Owen Rudge <orudge at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wsdapi/discovery.c | 58 ++++++++++++++++++++++++++++++++++++++++---
dlls/wsdapi/soap.c | 9 +++++++
dlls/wsdapi/wsdapi_internal.h | 6 +++++
3 files changed, 69 insertions(+), 4 deletions(-)
diff --git a/dlls/wsdapi/discovery.c b/dlls/wsdapi/discovery.c
index a016e8d..fcbdfef 100644
--- a/dlls/wsdapi/discovery.c
+++ b/dlls/wsdapi/discovery.c
@@ -233,11 +233,13 @@ static HRESULT WINAPI IWSDiscoveryPublisherImpl_MatchProbe(IWSDiscoveryPublisher
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),
+ TRACE("(%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;
+ return IWSDiscoveryPublisher_MatchProbeEx(This, pProbeMessage, pMessageParameters, pszId, ullMetadataVersion,
+ ullInstanceId, ullMessageNumber, pszSessionId, pTypesList, pScopesList, pXAddrsList, NULL, NULL, NULL, NULL,
+ NULL);
}
static HRESULT WINAPI IWSDiscoveryPublisherImpl_MatchResolve(IWSDiscoveryPublisher *This, const WSD_SOAP_MESSAGE *pResolveMessage,
@@ -276,6 +278,24 @@ static HRESULT WINAPI IWSDiscoveryPublisherImpl_PublishEx(IWSDiscoveryPublisher
pTypesList, pScopesList, pXAddrsList, pHeaderAny, pReferenceParameterAny, pEndpointReferenceAny, pAny);
}
+static BOOL is_name_in_list(WSDXML_NAME *name, const WSD_NAME_LIST *list)
+{
+ const WSD_NAME_LIST *next = list;
+
+ while (next != NULL)
+ {
+ if ((lstrcmpW(next->Element->LocalName, name->LocalName) == 0) &&
+ (lstrcmpW(next->Element->Space->PreferredPrefix, name->Space->PreferredPrefix) == 0))
+ {
+ return TRUE;
+ }
+
+ next = next->Next;
+ }
+
+ return FALSE;
+}
+
static HRESULT WINAPI IWSDiscoveryPublisherImpl_MatchProbeEx(IWSDiscoveryPublisher *This, const WSD_SOAP_MESSAGE *pProbeMessage,
IWSDMessageParameters *pMessageParameters, LPCWSTR pszId, ULONGLONG ullMetadataVersion,
ULONGLONG ullInstanceId, ULONGLONG ullMessageNumber, LPCWSTR pszSessionId,
@@ -284,11 +304,41 @@ static HRESULT WINAPI IWSDiscoveryPublisherImpl_MatchProbeEx(IWSDiscoveryPublish
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),
+ IWSDiscoveryPublisherImpl *impl = impl_from_IWSDiscoveryPublisher(This);
+ WSD_NAME_LIST *next_name;
+ WSD_PROBE *probe_msg;
+
+ TRACE("(%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;
+ if (!impl->publisherStarted) return E_ABORT;
+
+ if ((pszId == NULL) || (lstrlenW(pszId) > WSD_MAX_TEXT_LENGTH) ||
+ ((pszSessionId != NULL) && (lstrlenW(pszSessionId) > WSD_MAX_TEXT_LENGTH)) || (pProbeMessage == NULL) ||
+ (pProbeMessage->Body == NULL))
+ {
+ return E_INVALIDARG;
+ }
+
+ probe_msg = (WSD_PROBE *) pProbeMessage->Body;
+ next_name = probe_msg->Types;
+
+ /* Verify that all names in the probe message are present in the types list */
+ while (next_name != NULL)
+ {
+ /* If a name isn't present, return success; we simply don't send a Probe Match message */
+ if (!is_name_in_list(next_name->Element, pTypesList)) return S_OK;
+
+ next_name = next_name->Next;
+ }
+
+ if ((probe_msg->Scopes != NULL) && (probe_msg->Scopes->Scopes != NULL))
+ FIXME("Scopes matching currently unimplemented\n");
+
+ return send_probe_matches_message(impl, pProbeMessage, pMessageParameters, pszId, ullMetadataVersion, ullInstanceId,
+ ullMessageNumber, pszSessionId, pTypesList, pScopesList, pXAddrsList, pHeaderAny, pReferenceParameterAny,
+ pEndpointReferenceAny, pAny);
}
static HRESULT WINAPI IWSDiscoveryPublisherImpl_MatchResolveEx(IWSDiscoveryPublisher *This, const WSD_SOAP_MESSAGE *pResolveMessage,
diff --git a/dlls/wsdapi/soap.c b/dlls/wsdapi/soap.c
index e2746b9..ef191a4 100644
--- a/dlls/wsdapi/soap.c
+++ b/dlls/wsdapi/soap.c
@@ -1110,6 +1110,15 @@ cleanup:
return ret;
}
+HRESULT send_probe_matches_message(IWSDiscoveryPublisherImpl *impl, const WSD_SOAP_MESSAGE *probe_msg,
+ IWSDMessageParameters *message_params, LPCWSTR id, ULONGLONG metadata_ver, ULONGLONG instance_id,
+ ULONGLONG msg_num, LPCWSTR session_id, const WSD_NAME_LIST *types_list, const WSD_URI_LIST *scopes_list,
+ const WSD_URI_LIST *xaddrs_list, const WSDXML_ELEMENT *header_any, const WSDXML_ELEMENT *ref_param_any,
+ const WSDXML_ELEMENT *endpoint_ref_any, const WSDXML_ELEMENT *any)
+{
+ return E_NOTIMPL;
+}
+
static LPWSTR xml_text_to_wide_string(void *parent_memory, WS_XML_TEXT *text)
{
if (text->textType == WS_XML_TEXT_TYPE_UTF8)
diff --git a/dlls/wsdapi/wsdapi_internal.h b/dlls/wsdapi/wsdapi_internal.h
index 3c9390a..a2b8902 100644
--- a/dlls/wsdapi/wsdapi_internal.h
+++ b/dlls/wsdapi/wsdapi_internal.h
@@ -78,6 +78,12 @@ HRESULT send_hello_message(IWSDiscoveryPublisherImpl *impl, LPCWSTR id, ULONGLON
HRESULT send_bye_message(IWSDiscoveryPublisherImpl *impl, LPCWSTR id, ULONGLONG instance_id, ULONGLONG msg_num,
LPCWSTR session_id, const WSDXML_ELEMENT *any);
+HRESULT send_probe_matches_message(IWSDiscoveryPublisherImpl *impl, const WSD_SOAP_MESSAGE *probe_msg,
+ IWSDMessageParameters *message_params, LPCWSTR id, ULONGLONG metadata_ver, ULONGLONG instance_id,
+ ULONGLONG msg_num, LPCWSTR session_id, const WSD_NAME_LIST *types_list, const WSD_URI_LIST *scopes_list,
+ const WSD_URI_LIST *xaddrs_list, const WSDXML_ELEMENT *header_any, const WSDXML_ELEMENT *ref_param_any,
+ const WSDXML_ELEMENT *endpoint_ref_any, const WSDXML_ELEMENT *any);
+
HRESULT register_namespaces(IWSDXMLContext *xml_context);
HRESULT read_message(IWSDiscoveryPublisherImpl *impl, const char *xml, int xml_length, WSD_SOAP_MESSAGE **out_msg,
More information about the wine-cvs
mailing list