X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2b036c4b2365723b4c52890bd4c2f6bde20bbc00..e1ef506e13b7c8e96483b7fc0852dcb46688badd:/include/wx/private/socket.h diff --git a/include/wx/private/socket.h b/include/wx/private/socket.h index 97efcbbc6f..0e2d15ae91 100644 --- a/include/wx/private/socket.h +++ b/include/wx/private/socket.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: wx/private/socket.h -// Purpose: wxSocketImpl nd related declarations +// Purpose: wxSocketImpl and related declarations // Authors: Guilhem Lavaux, Vadim Zeitlin // Created: April 1997 // RCS-ID: $Id$ @@ -42,6 +42,7 @@ #if wxUSE_SOCKETS #include "wx/socket.h" +#include "wx/private/sckaddr.h" #include @@ -90,23 +91,8 @@ #define SOCKET_ERROR (-1) #endif -#if wxUSE_IPV6 - typedef struct sockaddr_storage wxSockAddr; -#else - typedef struct sockaddr wxSockAddr; -#endif - -enum GAddressType -{ - wxSOCKET_NOFAMILY = 0, - wxSOCKET_INET, - wxSOCKET_INET6, - wxSOCKET_UNIX -}; - typedef int wxSocketEventFlags; -struct GAddress; class wxSocketImpl; /* @@ -158,10 +144,15 @@ public: // that both BSD and Winsock implementations actually use socket->m_server // value to determine what exactly should be monitored so it needs to be // set before calling these functions) + // + // the default event value is used just for the convenience of wxMSW + // implementation which doesn't use this parameter anyhow, it doesn't make + // sense to pass wxSOCKET_LOST for the Unix implementation which does use + // this parameter virtual void Install_Callback(wxSocketImpl *socket, - wxSocketNotify event = wxSOCKET_MAX_EVENT) = 0; + wxSocketNotify event = wxSOCKET_LOST) = 0; virtual void Uninstall_Callback(wxSocketImpl *socket, - wxSocketNotify event = wxSOCKET_MAX_EVENT) = 0; + wxSocketNotify event = wxSOCKET_LOST) = 0; virtual ~wxSocketManager() { } @@ -200,16 +191,16 @@ public: m_initialSendBufferSize = send; } - wxSocketError SetLocal(GAddress *address); - wxSocketError SetPeer(GAddress *address); + wxSocketError SetLocal(const wxSockAddressImpl& address); + wxSocketError SetPeer(const wxSockAddressImpl& address); // accessors // --------- bool IsServer() const { return m_server; } - GAddress *GetLocal(); - GAddress *GetPeer(); + const wxSockAddressImpl& GetLocal(); // non const as may update m_local + const wxSockAddressImpl& GetPeer() const { return m_peer; } wxSocketError GetError() const { return m_error; } bool IsOk() const { return m_error == wxSOCKET_NOERROR; } @@ -250,14 +241,21 @@ public: // it was indeed created void Close(); - virtual void Shutdown(); + // shuts down the writing end of the socket and closes it, this is a more + // graceful way to close + // + // does nothing if the socket wasn't created + void Shutdown(); // IO operations // ------------- - virtual int Read(void *buffer, int size) = 0; - virtual int Write(const void *buffer, int size) = 0; + // basic IO, work for both TCP and UDP sockets + // + // return the number of bytes read/written (possibly 0) or -1 on error + int Read(void *buffer, int size); + int Write(const void *buffer, int size); // basically a wrapper for select(): returns the condition of the socket, // blocking for not longer than timeout if it is specified (otherwise just @@ -288,6 +286,11 @@ public: // named) OnRequest() method void NotifyOnStateChange(wxSocketNotify event); + // called after reading/writing the data from/to the socket and should + // enable back the wxSOCKET_INPUT/OUTPUT_FLAG notifications if they were + // turned off when this data was first detected + virtual void ReenableEvents(wxSocketEventFlags flags) = 0; + // TODO: make these fields protected and provide accessors for those of // them that wxSocketBase really needs //protected: @@ -296,8 +299,8 @@ public: int m_initialRecvBufferSize; int m_initialSendBufferSize; - GAddress *m_local; - GAddress *m_peer; + wxSockAddressImpl m_local, + m_peer; wxSocketError m_error; bool m_stream; @@ -308,8 +311,6 @@ public: struct timeval m_timeout; - wxSocketEventFlags m_detected; - protected: wxSocketImpl(wxSocketBase& wxsocket); @@ -327,7 +328,7 @@ private: // check that the socket wasn't created yet and that the given address // (either m_local or m_peer depending on the socket kind) is valid and // set m_error and return false if this is not the case - bool PreCreateCheck(GAddress *addr); + bool PreCreateCheck(const wxSockAddressImpl& addr); // set the given socket option: this just wraps setsockopt(SOL_SOCKET) int SetSocketOption(int optname, int optval) @@ -353,6 +354,12 @@ private: // update local address after binding/connecting wxSocketError UpdateLocalAddress(); + // functions used to implement Read/Write() + int RecvStream(void *buffer, int size); + int RecvDgram(void *buffer, int size); + int SendStream(const void *buffer, int size); + int SendDgram(const void *buffer, int size); + // set in ctor and never changed except that it's reset to NULL when the // socket is shut down @@ -367,79 +374,6 @@ private: #include "wx/unix/private/sockunix.h" #endif - -/* GAddress */ - -// TODO: make GAddress a real class instead of this mix of C and C++ - -// Represents a socket endpoint, i.e. -- in spite of its name -- not an address -// but an (address, port) pair -struct GAddress -{ - struct sockaddr *m_addr; - size_t m_len; - - GAddressType m_family; - int m_realfamily; - - wxSocketError m_error; -}; - -GAddress *GAddress_new(); -GAddress *GAddress_copy(GAddress *address); -void GAddress_destroy(GAddress *address); - -void GAddress_SetFamily(GAddress *address, GAddressType type); -GAddressType GAddress_GetFamily(GAddress *address); - -/* The use of any of the next functions will set the address family to - * the specific one. For example if you use GAddress_INET_SetHostName, - * address family will be implicitly set to AF_INET. - */ - -wxSocketError GAddress_INET_SetHostName(GAddress *address, const char *hostname); -wxSocketError GAddress_INET_SetBroadcastAddress(GAddress *address); -wxSocketError GAddress_INET_SetAnyAddress(GAddress *address); -wxSocketError GAddress_INET_SetHostAddress(GAddress *address, - unsigned long hostaddr); -wxSocketError GAddress_INET_SetPortName(GAddress *address, const char *port, - const char *protocol); -wxSocketError GAddress_INET_SetPort(GAddress *address, unsigned short port); - -wxSocketError GAddress_INET_GetHostName(GAddress *address, char *hostname, - size_t sbuf); -unsigned long GAddress_INET_GetHostAddress(GAddress *address); -unsigned short GAddress_INET_GetPort(GAddress *address); - -wxSocketError _GAddress_translate_from(GAddress *address, - struct sockaddr *addr, int len); -wxSocketError _GAddress_translate_to (GAddress *address, - struct sockaddr **addr, int *len); -wxSocketError _GAddress_Init_INET(GAddress *address); - -#if wxUSE_IPV6 - -wxSocketError GAddress_INET6_SetHostName(GAddress *address, const char *hostname); -wxSocketError GAddress_INET6_SetAnyAddress(GAddress *address); -wxSocketError GAddress_INET6_SetHostAddress(GAddress *address, - struct in6_addr hostaddr); -wxSocketError GAddress_INET6_SetPortName(GAddress *address, const char *port, - const char *protocol); -wxSocketError GAddress_INET6_SetPort(GAddress *address, unsigned short port); - -wxSocketError GAddress_INET6_GetHostName(GAddress *address, char *hostname, - size_t sbuf); -wxSocketError GAddress_INET6_GetHostAddress(GAddress *address,struct in6_addr *hostaddr); -unsigned short GAddress_INET6_GetPort(GAddress *address); - -#endif // wxUSE_IPV6 - -// these functions are available under all platforms but only implemented under -// Unix ones, elsewhere they just return wxSOCKET_INVADDR -wxSocketError _GAddress_Init_UNIX(GAddress *address); -wxSocketError GAddress_UNIX_SetPath(GAddress *address, const char *path); -wxSocketError GAddress_UNIX_GetPath(GAddress *address, char *path, size_t sbuf); - #endif /* wxUSE_SOCKETS */ #endif /* _WX_PRIVATE_SOCKET_H_ */