diff options
Diffstat (limited to 'cpp/src/Ice/Network.h')
-rw-r--r-- | cpp/src/Ice/Network.h | 153 |
1 files changed, 96 insertions, 57 deletions
diff --git a/cpp/src/Ice/Network.h b/cpp/src/Ice/Network.h index 8e5ca6eda68..66c700dbf23 100644 --- a/cpp/src/Ice/Network.h +++ b/cpp/src/Ice/Network.h @@ -15,11 +15,14 @@ #endif #include <Ice/Config.h> + #include <Ice/PropertiesF.h> // For setTcpBufSize #include <Ice/LoggerF.h> // For setTcpBufSize #include <Ice/Protocol.h> -#ifdef _WIN32 +#ifdef ICE_OS_WINRT +# include <Ice/EventHandlerF.h> +#elif defined(_WIN32) # include <winsock2.h> # include <ws2tcpip.h> typedef int ssize_t; @@ -39,7 +42,8 @@ typedef int ssize_t; #elif (defined(__APPLE__) || defined(__FreeBSD__)) && !defined(ICE_NO_KQUEUE) # define ICE_USE_KQUEUE 1 #elif defined(_WIN32) -# if !defined(ICE_NO_IOCP) +# if defined(ICE_OS_WINRT) +# elif !defined(ICE_NO_IOCP) # define ICE_USE_IOCP 1 # else # define ICE_USE_SELECT 1 @@ -52,10 +56,14 @@ typedef int ssize_t; typedef int socklen_t; #endif -#ifndef _WIN32 +#if !defined(_WIN32) # define SOCKET int -# define SOCKET_ERROR -1 # define INVALID_SOCKET -1 +# define SOCKET_ERROR -1 +#elif defined(ICE_OS_WINRT) + typedef Platform::Object^ SOCKET; +# define INVALID_SOCKET nullptr +# define SOCKET_ERROR -1 #endif #ifndef SHUT_RD @@ -81,6 +89,19 @@ typedef int socklen_t; namespace IceInternal { +// +// Use Address typedef/struct depending on the platform +// +#ifdef ICE_OS_WINRT +struct ICE_API Address +{ + Windows::Networking::HostName^ host; + Platform::String^ port; +}; +#else +typedef struct sockaddr_storage Address; +#endif + enum SocketOperation { SocketOperationNone = 0, @@ -89,8 +110,11 @@ enum SocketOperation SocketOperationConnect = 2 }; -#ifdef ICE_USE_IOCP - +// +// AsyncInfo struct for Windows IOCP or WinRT holds the result of +// asynchronous operations after it completed. +// +#if defined(ICE_USE_IOCP) struct ICE_API AsyncInfo : WSAOVERLAPPED { AsyncInfo(SocketOperation); @@ -101,8 +125,15 @@ struct ICE_API AsyncInfo : WSAOVERLAPPED DWORD count; int error; }; - -#endif +#elif defined(ICE_OS_WINRT) +struct ICE_API AsyncInfo +{ + int count; + int error; +}; + +public delegate void SocketOperationCompletedHandler(int); +#endif class ICE_API NativeInfo : virtual public IceUtil::Shared { @@ -117,11 +148,13 @@ public: return _fd; } -#ifdef ICE_USE_IOCP // // This is implemented by transceiver and acceptor implementations. // +#if defined(ICE_USE_IOCP) virtual AsyncInfo* getAsyncInfo(SocketOperation) = 0; +#elif defined(ICE_OS_WINRT) + virtual void setCompletedHandler(SocketOperationCompletedHandler^) = 0; #endif protected: @@ -130,73 +163,79 @@ protected: }; typedef IceUtil::Handle<NativeInfo> NativeInfoPtr; -ICE_API bool interrupted(); -ICE_API bool acceptInterrupted(); -ICE_API bool noBuffers(); -ICE_API bool wouldBlock(); -ICE_API bool connectFailed(); -ICE_API bool connectionRefused(); -ICE_API bool connectInProgress(); -ICE_API bool connectionLost(); -ICE_API bool notConnected(); -ICE_API bool recvTruncated(); ICE_API bool noMoreFds(int); +ICE_API std::string errorToStringDNS(int); +ICE_API std::vector<Address> getAddresses(const std::string&, int, ProtocolSupport, bool); +ICE_API ProtocolSupport getProtocolSupport(const Address&); +ICE_API Address getAddressForServer(const std::string&, int, ProtocolSupport); +ICE_API Address getAddress(const std::string&, int, ProtocolSupport); +ICE_API int compareAddress(const Address&, const Address&); -ICE_API SOCKET createSocket(bool, int); -ICE_API void closeSocket(SOCKET); +ICE_API SOCKET createSocket(bool, const Address&); ICE_API void closeSocketNoThrow(SOCKET); -ICE_API void shutdownSocketWrite(SOCKET); -ICE_API void shutdownSocketReadWrite(SOCKET); +ICE_API void closeSocket(SOCKET); + +ICE_API std::string addrToString(const Address&); +ICE_API void fdToLocalAddress(SOCKET, Address&); +ICE_API bool fdToRemoteAddress(SOCKET, Address&); +ICE_API std::string fdToString(SOCKET); +ICE_API void fdToAddressAndPort(SOCKET, std::string&, int&, std::string&, int&); +ICE_API void addrToAddressAndPort(const Address&, std::string&, int&); +ICE_API std::string addressesToString(const Address&, const Address&, bool); +ICE_API bool isAddressValid(const Address&); + +ICE_API std::vector<std::string> getHostsForEndpointExpand(const std::string&, ProtocolSupport, bool); + +ICE_API std::string inetAddrToString(const Address&); +ICE_API int getPort(const Address&); +ICE_API void setPort(Address&, int); + +ICE_API bool isMulticast(const Address&); +ICE_API void setTcpBufSize(SOCKET, const Ice::PropertiesPtr&, const Ice::LoggerPtr&); ICE_API void setBlock(SOCKET, bool); -ICE_API void setTcpNoDelay(SOCKET); -ICE_API void setKeepAlive(SOCKET); ICE_API void setSendBufferSize(SOCKET, int); ICE_API int getSendBufferSize(SOCKET); ICE_API void setRecvBufferSize(SOCKET, int); ICE_API int getRecvBufferSize(SOCKET); -ICE_API void setMcastGroup(SOCKET, const struct sockaddr_storage&, const std::string&); -ICE_API void setMcastInterface(SOCKET, const std::string&, bool); -ICE_API void setMcastTtl(SOCKET, int, bool); + +ICE_API void setMcastGroup(SOCKET, const Address&, const std::string&); +ICE_API void setMcastInterface(SOCKET, const std::string&, const Address&); +ICE_API void setMcastTtl(SOCKET, int, const Address&); ICE_API void setReuseAddress(SOCKET, bool); -ICE_API struct sockaddr_storage doBind(SOCKET, const struct sockaddr_storage&); +ICE_API Address doBind(SOCKET, const Address&); + +#ifndef ICE_OS_WINRT +ICE_API bool interrupted(); +ICE_API bool acceptInterrupted(); +ICE_API bool noBuffers(); +ICE_API bool wouldBlock(); +ICE_API bool notConnected(); +ICE_API bool recvTruncated(); + +ICE_API bool connectFailed(); +ICE_API bool connectionRefused(); +ICE_API bool connectInProgress(); +ICE_API bool connectionLost(); + ICE_API void doListen(SOCKET, int); -ICE_API bool doConnect(SOCKET, const struct sockaddr_storage&); +ICE_API bool doConnect(SOCKET, const Address&); ICE_API void doFinishConnect(SOCKET); -#ifdef ICE_USE_IOCP -ICE_API void doConnectAsync(SOCKET, const struct sockaddr_storage&, AsyncInfo&); -ICE_API void doFinishConnectAsync(SOCKET, AsyncInfo&); -#endif ICE_API SOCKET doAccept(SOCKET); -ICE_API struct sockaddr_storage getAddressForServer(const std::string&, int, ProtocolSupport); -ICE_API struct sockaddr_storage getAddress(const std::string&, int, ProtocolSupport); -ICE_API std::vector<struct sockaddr_storage> getAddresses(const std::string&, int, ProtocolSupport, bool); - -ICE_API int compareAddress(const struct sockaddr_storage&, const struct sockaddr_storage&); - ICE_API void createPipe(SOCKET fds[2]); -ICE_API std::string errorToStringDNS(int); - -ICE_API std::string fdToString(SOCKET); -ICE_API void fdToAddressAndPort(SOCKET, std::string&, int&, std::string&, int&); -ICE_API void addrToAddressAndPort(const struct sockaddr_storage&, std::string&, int&); -ICE_API std::string addressesToString(const struct sockaddr_storage&, const struct sockaddr_storage&, bool); -ICE_API void fdToLocalAddress(SOCKET, struct sockaddr_storage&); -ICE_API bool fdToRemoteAddress(SOCKET, struct sockaddr_storage&); -ICE_API std::string inetAddrToString(const struct sockaddr_storage&); -ICE_API std::string addrToString(const struct sockaddr_storage&); -ICE_API bool isMulticast(const struct sockaddr_storage&); -ICE_API int getPort(const struct sockaddr_storage&); -ICE_API void setPort(struct sockaddr_storage&, int); - -ICE_API std::vector<std::string> getHostsForEndpointExpand(const std::string&, ProtocolSupport, bool); -ICE_API void setTcpBufSize(SOCKET, const Ice::PropertiesPtr&, const Ice::LoggerPtr&); - ICE_API int getSocketErrno(); +#else +ICE_API void checkConnectErrorCode(const char*, int, HRESULT, Windows::Networking::HostName^); +ICE_API void checkErrorCode(const char*, int, HRESULT); +#endif +#if defined(ICE_USE_IOCP) +ICE_API void doConnectAsync(SOCKET, const Address&, AsyncInfo&); +ICE_API void doFinishConnectAsync(SOCKET, AsyncInfo&); +#endif } #endif |