Module: wine Branch: master Commit: 4f1dca9db07dc98223aedf479b1465612a88c9a9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4f1dca9db07dc98223aedf479b...
Author: Owen Rudge orudge@codeweavers.com Date: Mon Jun 26 22:35:54 2017 +0100
wsdapi: Implement IWSDUdpAddress_SetTransportAddress.
Signed-off-by: Owen Rudge orudge@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wsdapi/Makefile.in | 2 +- dlls/wsdapi/address.c | 30 ++++++++++++++++++++++++++++-- dlls/wsdapi/tests/address.c | 10 +++++----- dlls/wsdapi/tests/msgparams.c | 4 ++-- 4 files changed, 36 insertions(+), 10 deletions(-)
diff --git a/dlls/wsdapi/Makefile.in b/dlls/wsdapi/Makefile.in index 0f28ce5..5c95351 100644 --- a/dlls/wsdapi/Makefile.in +++ b/dlls/wsdapi/Makefile.in @@ -1,6 +1,6 @@ MODULE = wsdapi.dll IMPORTLIB = wsdapi -IMPORTS = user32 +IMPORTS = user32 ws2_32
C_SRCS = \ address.c \ diff --git a/dlls/wsdapi/address.c b/dlls/wsdapi/address.c index 7efcac2..587d090 100644 --- a/dlls/wsdapi/address.c +++ b/dlls/wsdapi/address.c @@ -22,6 +22,8 @@
#define COBJMACROS
+#include "winsock2.h" +#include "ws2tcpip.h" #include "windef.h" #include "winbase.h" #include "wine/debug.h" @@ -32,6 +34,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wsdapi); typedef struct IWSDUdpAddressImpl { IWSDUdpAddress IWSDUdpAddress_iface; LONG ref; + SOCKADDR_STORAGE sockAddr; } IWSDUdpAddressImpl;
static inline IWSDUdpAddressImpl *impl_from_IWSDUdpAddress(IWSDUdpAddress *iface) @@ -132,8 +135,31 @@ static HRESULT WINAPI IWSDUdpAddressImpl_GetTransportAddressEx(IWSDUdpAddress *T
static HRESULT WINAPI IWSDUdpAddressImpl_SetTransportAddress(IWSDUdpAddress *This, LPCWSTR pszAddress) { - FIXME("(%p, %s)\n", This, debugstr_w(pszAddress)); - return E_NOTIMPL; + IWSDUdpAddressImpl *impl = impl_from_IWSDUdpAddress(This); + ADDRINFOW *addrInfo = NULL; + ADDRINFOW hints; + int ret; + + TRACE("(%p, %s)\n", impl, debugstr_w(pszAddress)); + + if (pszAddress == NULL) + return E_INVALIDARG; + + ZeroMemory(&hints, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + + ret = GetAddrInfoW(pszAddress, NULL, &hints, &addrInfo); + + if (ret == 0) + { + ZeroMemory(&impl->sockAddr, sizeof(SOCKADDR_STORAGE)); + memcpy(&impl->sockAddr, addrInfo->ai_addr, addrInfo->ai_addrlen); + } + + if (addrInfo != NULL) + FreeAddrInfoW(addrInfo); + + return HRESULT_FROM_WIN32(ret); }
static HRESULT WINAPI IWSDUdpAddressImpl_SetSockaddr(IWSDUdpAddress *This, const SOCKADDR_STORAGE *pSockAddr) diff --git a/dlls/wsdapi/tests/address.c b/dlls/wsdapi/tests/address.c index fefc253..8861d2f 100644 --- a/dlls/wsdapi/tests/address.c +++ b/dlls/wsdapi/tests/address.c @@ -98,15 +98,15 @@ static void GetSetTransportAddress_udp_tests(void)
/* Try setting a null address */ rc = IWSDUdpAddress_SetTransportAddress(udpAddress, NULL); - todo_wine ok(rc == E_INVALIDARG, "SetTransportAddress(NULL) returned unexpected result: %08x\n", rc); + ok(rc == E_INVALIDARG, "SetTransportAddress(NULL) returned unexpected result: %08x\n", rc);
/* Try setting an invalid address */ rc = IWSDUdpAddress_SetTransportAddress(udpAddress, invalidAddress); - todo_wine ok(rc == HRESULT_FROM_WIN32(WSAHOST_NOT_FOUND), "SetTransportAddress(invalidAddress) returned unexpected result: %08x\n", rc); + ok(rc == HRESULT_FROM_WIN32(WSAHOST_NOT_FOUND), "SetTransportAddress(invalidAddress) returned unexpected result: %08x\n", rc);
/* Try setting an IPv4 address */ rc = IWSDUdpAddress_SetTransportAddress(udpAddress, ipv4Address); - todo_wine ok(rc == S_OK, "SetTransportAddress(ipv4Address) failed: %08x\n", rc); + ok(rc == S_OK, "SetTransportAddress(ipv4Address) failed: %08x\n", rc);
rc = IWSDUdpAddress_GetTransportAddress(udpAddress, NULL); todo_wine ok(rc == E_POINTER, "GetTransportAddress(NULL) returned unexpected result: %08x\n", rc); @@ -118,7 +118,7 @@ static void GetSetTransportAddress_udp_tests(void)
/* Try setting an IPv6 address */ rc = IWSDUdpAddress_SetTransportAddress(udpAddress, ipv6Address); - todo_wine ok(rc == S_OK, "SetTransportAddress(ipv6Address) failed: %08x\n", rc); + ok(rc == S_OK, "SetTransportAddress(ipv6Address) failed: %08x\n", rc);
rc = IWSDUdpAddress_GetTransportAddress(udpAddress, &returnedAddress); todo_wine ok(rc == S_OK, "GetTransportAddress returned unexpected result: %08x\n", rc); @@ -264,7 +264,7 @@ static void GetSetSockaddr_udp_tests(void)
/* Try setting a transport address */ rc = IWSDUdpAddress_SetTransportAddress(udpAddress, expectedIpv6TransportAddr); - todo_wine ok(rc == S_OK, "SetTransportAddress failed: %08x\n", rc); + ok(rc == S_OK, "SetTransportAddress failed: %08x\n", rc);
/* A socket address should be returned */ rc = IWSDUdpAddress_GetSockaddr(udpAddress, &returnedStorage); diff --git a/dlls/wsdapi/tests/msgparams.c b/dlls/wsdapi/tests/msgparams.c index 0621950..9322ce1 100644 --- a/dlls/wsdapi/tests/msgparams.c +++ b/dlls/wsdapi/tests/msgparams.c @@ -96,7 +96,7 @@ static void LocalAddress_tests(void) ok(origUdpAddress != NULL, "WSDCreateUdpMessageParameters(NULL, &origUdpAddress) failed: origUdpAddress == NULL\n");
rc = IWSDUdpAddress_SetTransportAddress(origUdpAddress, address); - todo_wine ok(rc == S_OK, "SetTransportAddress failed: %08x\n", rc); + ok(rc == S_OK, "SetTransportAddress failed: %08x\n", rc);
rc = IWSDUdpMessageParameters_SetLocalAddress(udpMessageParams, (IWSDAddress *)origUdpAddress); ok(rc == S_OK, "SetLocalAddress failed: %08x\n", rc); @@ -154,7 +154,7 @@ static void RemoteAddress_tests(void) ok(origUdpAddress != NULL, "WSDCreateUdpMessageParameters(NULL, &origUdpAddress) failed: origUdpAddress == NULL\n");
rc = IWSDUdpAddress_SetTransportAddress(origUdpAddress, address); - todo_wine ok(rc == S_OK, "SetTransportAddress failed: %08x\n", rc); + ok(rc == S_OK, "SetTransportAddress failed: %08x\n", rc);
rc = IWSDUdpMessageParameters_SetRemoteAddress(udpMessageParams, (IWSDAddress *)origUdpAddress); ok(rc == S_OK, "SetRemoteAddress failed: %08x\n", rc);