summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/Network.cpp
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2014-08-25 23:59:43 +0200
committerJose <jose@zeroc.com>2014-08-25 23:59:43 +0200
commitf377794c3905e688edc82f87331d75eb75ce64eb (patch)
tree3dffbea6a4af357f7c240f83008f690f44703654 /cpp/src/Ice/Network.cpp
parentFix Ice.LogStdErr.Convert initialization (diff)
downloadice-f377794c3905e688edc82f87331d75eb75ce64eb.tar.bz2
ice-f377794c3905e688edc82f87331d75eb75ce64eb.tar.xz
ice-f377794c3905e688edc82f87331d75eb75ce64eb.zip
Fixed (ICE-5472) - WinRT stream acceptor and system allocated port
Diffstat (limited to 'cpp/src/Ice/Network.cpp')
-rw-r--r--cpp/src/Ice/Network.cpp57
1 files changed, 50 insertions, 7 deletions
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp
index 3fb73573abc..919826f6e2e 100644
--- a/cpp/src/Ice/Network.cpp
+++ b/cpp/src/Ice/Network.cpp
@@ -29,7 +29,7 @@
#if defined(ICE_OS_WINRT)
# include <IceUtil/InputUtil.h>
-# include <ppltasks.h> // For Concurrency::task
+# include <IceUtil/CountDownLatch.h>
#elif defined(_WIN32)
# include <winsock2.h>
# include <ws2tcpip.h>
@@ -1154,6 +1154,18 @@ IceInternal::compareAddress(const Address& addr1, const Address& addr2)
{
return o;
}
+ if(addr1.host == addr2.host)
+ {
+ return 0;
+ }
+ if(addr1.host == nullptr)
+ {
+ return -1;
+ }
+ if(addr2.host == nullptr)
+ {
+ return 1;
+ }
return String::CompareOrdinal(addr1.host->RawName, addr2.host->RawName);
#else
if(addr1.saStorage.ss_family < addr2.saStorage.ss_family)
@@ -2016,6 +2028,37 @@ IceInternal::setReuseAddress(SOCKET fd, bool reuse)
}
#endif
+
+#ifdef ICE_OS_WINRT
+void
+checkResultAndWait(IAsyncAction^ action)
+{
+ if(action->Status == Windows::Foundation::AsyncStatus::Started)
+ {
+ IceUtilInternal::CountDownLatch count(1);
+ HRESULT result = 0;
+ action->Completed = ref new AsyncActionCompletedHandler(
+ [&count, &result] (IAsyncAction^ action, Windows::Foundation::AsyncStatus status)
+ {
+ if(status != Windows::Foundation::AsyncStatus::Completed)
+ {
+ result = action->ErrorCode.Value;
+ }
+ count.countDown();
+ });
+ count.await();
+ if(result)
+ {
+ checkErrorCode(__FILE__, __LINE__, result);
+ }
+ }
+ else if(action->Status == Windows::Foundation::AsyncStatus::Error)
+ {
+ checkErrorCode(__FILE__, __LINE__, action->ErrorCode.Value);
+ }
+}
+#endif
+
Address
IceInternal::doBind(SOCKET fd, const Address& addr)
{
@@ -2028,11 +2071,11 @@ IceInternal::doBind(SOCKET fd, const Address& addr)
{
if(addr.host == nullptr) // inaddr_any
{
- concurrency::create_task(listener->BindServiceNameAsync(addr.port)).wait();
+ checkResultAndWait(listener->BindServiceNameAsync(addr.port));
}
else
{
- concurrency::create_task(listener->BindEndpointAsync(addr.host, addr.port)).wait();
+ checkResultAndWait(listener->BindEndpointAsync(addr.host, addr.port));
}
local.host = addr.host;
local.port = listener->Information->LocalPort;
@@ -2043,20 +2086,20 @@ IceInternal::doBind(SOCKET fd, const Address& addr)
{
if(addr.host == nullptr) // inaddr_any
{
- concurrency::create_task(datagram->BindServiceNameAsync(addr.port)).wait();
+ checkResultAndWait(datagram->BindServiceNameAsync(addr.port));
}
else
{
- concurrency::create_task(datagram->BindEndpointAsync(addr.host, addr.port)).wait();
+ checkResultAndWait(datagram->BindEndpointAsync(addr.host, addr.port));
}
local.host = datagram->Information->LocalAddress;
local.port = datagram->Information->LocalPort;
}
}
- catch(Platform::Exception^ pex)
+ catch(const Ice::SocketException&)
{
closeSocketNoThrow(fd);
- checkErrorCode(__FILE__, __LINE__, pex->HResult);
+ throw;
}
return local;
#else