/////////////////////////////////////////////////////////////////////////////
// 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$
#if wxUSE_SOCKETS
#include "wx/socket.h"
+#include "wx/private/sckaddr.h"
#include <stddef.h>
#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;
/*
virtual void OnExit() = 0;
+ // create the socket implementation object matching this manager
+ virtual wxSocketImpl *CreateSocket(wxSocketBase& wxsocket) = 0;
+
// these functions enable or disable monitoring of the given socket for the
// specified events inside the currently running event loop (but notice
// 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() { }
Base class for all socket implementations providing functionality common to
BSD and Winsock sockets.
- Objects of this class are not created directly but only via its static
- Create() method which is implemented in port-specific code.
+ Objects of this class are not created directly but only via the factory
+ function wxSocketManager::CreateSocket().
*/
class wxSocketImpl
{
public:
- // static factory function: creates the low-level socket associated with
- // the given wxSocket (and inherits its attributes such as timeout)
- static wxSocketImpl *Create(wxSocketBase& wxsocket);
-
virtual ~wxSocketImpl();
// set various socket properties: all of those can only be called before
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; }
// 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:
int m_initialRecvBufferSize;
int m_initialSendBufferSize;
- GAddress *m_local;
- GAddress *m_peer;
+ wxSockAddressImpl m_local,
+ m_peer;
wxSocketError m_error;
bool m_stream;
// 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)
// socket is shut down
wxSocketBase *m_wxsocket;
- DECLARE_NO_COPY_CLASS(wxSocketImpl)
+ wxDECLARE_NO_COPY_CLASS(wxSocketImpl);
};
#if defined(__WXMSW__)
#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_ */