X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f4ada568223b79c8a5769cc351c36a8e2ccd7841..7344108e8a129a3f9b4df5ab0f98a1713db03b89:/include/wx/sckaddr.h diff --git a/include/wx/sckaddr.h b/include/wx/sckaddr.h index 392a9d1387..09646f4ae0 100644 --- a/include/wx/sckaddr.h +++ b/include/wx/sckaddr.h @@ -1,136 +1,223 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: sckaddr.h +// Name: wx/sckaddr.h // Purpose: Network address classes // Author: Guilhem Lavaux -// Modified by: +// Modified by: Vadim Zeitlin to switch to wxSockAddressImpl implementation // Created: 26/04/1997 // RCS-ID: $Id$ // Copyright: (c) 1997, 1998 Guilhem Lavaux -// Licence: wxWindows license +// (c) 2008, 2009 Vadim Zeitlin +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifndef _WX_NETWORK_ADDRESS_H -#define _WX_NETWORK_ADDRESS_H -#if defined(__WINDOWS__) && defined(WXSOCK_INTERNAL) -#include +#ifndef _WX_SCKADDR_H_ +#define _WX_SCKADDR_H_ -#elif defined(__UNIX__) && defined(WXSOCK_INTERNAL) +#include "wx/defs.h" -#include -#include -#include -#endif +#if wxUSE_SOCKETS -#ifdef __GNUG__ -#pragma interface -#endif +#include "wx/string.h" -#ifdef WXPREC -#include -#else -#include -#endif +class wxSockAddressImpl; -class WXDLLEXPORT wxSockAddress : public wxObject { - DECLARE_ABSTRACT_CLASS(wxSockAddress) +// forward declare it instead of including the system headers defining it which +// can bring in under Windows which we don't want to include from +// public wx headers +struct sockaddr; + +// Any socket address kind +class WXDLLIMPEXP_NET wxSockAddress : public wxObject +{ public: - typedef enum { IPV4=1, IPV6=2, UNIX=3 } Addr; + enum Family + { + NONE, + IPV4, + IPV6, + UNIX + }; - wxSockAddress() {}; - virtual ~wxSockAddress() {}; + wxSockAddress(); + wxSockAddress(const wxSockAddress& other); + virtual ~wxSockAddress(); - virtual void Clear() = 0; + wxSockAddress& operator=(const wxSockAddress& other); - virtual void Build(struct sockaddr*& addr, size_t& len) = 0; - virtual void Disassemble(struct sockaddr *addr, size_t len) = 0; - virtual int SockAddrLen() = 0; + virtual void Clear(); + virtual Family Type() = 0; - virtual int GetFamily() = 0; - virtual int Type() = 0; -}; + // accessors for the low level address represented by this object + const sockaddr *GetAddressData() const; + int GetAddressDataLen() const; + + // we need to be able to create copies of the addresses polymorphically + // (i.e. without knowing the exact address class) + virtual wxSockAddress *Clone() const = 0; + + + // implementation only, don't use + const wxSockAddressImpl& GetAddress() const { return *m_impl; } + void SetAddress(const wxSockAddressImpl& address); + +protected: + wxSockAddressImpl *m_impl; -class WXDLLEXPORT wxIPV4address : public wxSockAddress { - DECLARE_DYNAMIC_CLASS(wxIPV4address) private: - struct sockaddr_in *m_addr; + void Init(); + DECLARE_ABSTRACT_CLASS(wxSockAddress) +}; + +// An IP address (either IPv4 or IPv6) +class WXDLLIMPEXP_NET wxIPaddress : public wxSockAddress +{ public: - wxIPV4address(); - virtual ~wxIPV4address(); + wxIPaddress() : wxSockAddress() { } + wxIPaddress(const wxIPaddress& other) + : wxSockAddress(other), + m_origHostname(other.m_origHostname) + { + } + + bool operator==(const wxIPaddress& addr) const; - virtual void Clear(); -// const wxSockAddress& operator =(const wxSockAddress& addr); + bool Hostname(const wxString& name); + bool Service(const wxString& name); + bool Service(unsigned short port); - virtual bool Hostname(const wxString& name); - virtual bool Hostname(unsigned long addr); - virtual bool Service(const wxString& name); - virtual bool Service(unsigned short port); - virtual bool LocalHost(); + bool LocalHost(); + virtual bool IsLocalHost() const = 0; - wxString Hostname(); - unsigned short Service(); + bool AnyAddress(); - void Build(struct sockaddr*& addr, size_t& len); - void Disassemble(struct sockaddr *addr, size_t len); + virtual wxString IPAddress() const = 0; - inline int SockAddrLen(); - inline int GetFamily(); - inline int Type() { return wxSockAddress::IPV4; } + wxString Hostname() const; + unsigned short Service() const; + + wxString OrigHostname() const { return m_origHostname; } + +protected: + // get m_impl initialized to the right family if it hadn't been done yet + wxSockAddressImpl& GetImpl(); + const wxSockAddressImpl& GetImpl() const + { + return const_cast(this)->GetImpl(); + } + + // host name originally passed to Hostname() + wxString m_origHostname; + +private: + // create the wxSockAddressImpl object of the correct family if it's + // currently uninitialized + virtual void DoInitImpl() = 0; + + + DECLARE_ABSTRACT_CLASS(wxIPaddress) }; -#ifdef ENABLE_IPV6 -class WXDLLEXPORT wxIPV6address : public wxSockAddress { - DECLARE_DYNAMIC_CLASS(wxIPV6address) +// An IPv4 address +class WXDLLIMPEXP_NET wxIPV4address : public wxIPaddress +{ +public: + wxIPV4address() : wxIPaddress() { } + wxIPV4address(const wxIPV4address& other) : wxIPaddress(other) { } + + // implement wxSockAddress pure virtuals: + virtual Family Type() { return IPV4; } + virtual wxSockAddress *Clone() const { return new wxIPV4address(*this); } + + + // implement wxIPaddress pure virtuals: + virtual bool IsLocalHost() const; + + virtual wxString IPAddress() const; + + + // IPv4-specific methods: + bool Hostname(unsigned long addr); + + // make base class methods hidden by our overload visible + // + // FIXME-VC6: replace this with "using IPAddress::Hostname" (not supported + // by VC6) when support for it is dropped + wxString Hostname() const { return wxIPaddress::Hostname(); } + bool Hostname(const wxString& name) { return wxIPaddress::Hostname(name); } + + bool BroadcastAddress(); + private: - struct sockaddr_in6 *m_addr; + virtual void DoInitImpl(); + + DECLARE_DYNAMIC_CLASS(wxIPV4address) +}; + + +#if wxUSE_IPV6 + +// An IPv6 address +class WXDLLIMPEXP_NET wxIPV6address : public wxIPaddress +{ public: - wxIPV6address(); - ~wxIPV6address(); + wxIPV6address() : wxIPaddress() { } + wxIPV6address(const wxIPV6address& other) : wxIPaddress(other) { } + + // implement wxSockAddress pure virtuals: + virtual Family Type() { return IPV6; } + virtual wxSockAddress *Clone() const { return new wxIPV6address(*this); } - void Clear(); -// const wxSockAddress& operator =(const wxSockAddress& addr); - bool Hostname(const wxString& name); - bool Hostname(unsigned char addr[16]); - bool Service(const wxString& name); - bool Service(unsigned short port); - bool LocalHost(); + // implement wxIPaddress pure virtuals: + virtual bool IsLocalHost() const; - wxString Hostname() const; - unsigned short Service() const; + virtual wxString IPAddress() const; - void Build(struct sockaddr*& addr, size_t& len); - void Disassemble(struct sockaddr *addr, size_t len); + // IPv6-specific methods: + bool Hostname(unsigned char addr[16]); - inline int SockAddrLen(); - inline int GetFamily(); - inline int Type() { return wxSockAddress::IPV6; } + using wxIPaddress::Hostname; + +private: + virtual void DoInitImpl(); + + DECLARE_DYNAMIC_CLASS(wxIPV6address) }; + +#endif // wxUSE_IPV6 + +// Unix domain sockets are only available under, well, Unix +#if defined(__UNIX__) && !defined(__WINDOWS__) && !defined(__WINE__) + #define wxHAS_UNIX_DOMAIN_SOCKETS #endif -#ifdef __UNIX__ -#include +#ifdef wxHAS_UNIX_DOMAIN_SOCKETS -class WXDLLEXPORT wxUNIXaddress : public wxSockAddress { - DECLARE_DYNAMIC_CLASS(wxUNIXaddress) -private: - struct sockaddr_un *m_addr; +// A Unix domain socket address +class WXDLLIMPEXP_NET wxUNIXaddress : public wxSockAddress +{ public: - wxUNIXaddress(); - ~wxUNIXaddress(); + wxUNIXaddress() : wxSockAddress() { } + wxUNIXaddress(const wxUNIXaddress& other) : wxSockAddress(other) { } - void Clear(); -// const wxSockAddress& operator =(const wxSockAddress& addr); + void Filename(const wxString& name); + wxString Filename() const; - void Filename(const wxString& name); - wxString Filename(); + virtual Family Type() { return UNIX; } + virtual wxSockAddress *Clone() const { return new wxUNIXaddress(*this); } - void Build(struct sockaddr*& addr, size_t& len); - void Disassemble(struct sockaddr *addr, size_t len); +private: + wxSockAddressImpl& GetUNIX(); + const wxSockAddressImpl& GetUNIX() const + { + return const_cast(this)->GetUNIX(); + } - inline int SockAddrLen(); - inline int GetFamily(); - inline int Type() { return wxSockAddress::UNIX; } + DECLARE_DYNAMIC_CLASS(wxUNIXaddress) }; -#endif -#endif +#endif // wxHAS_UNIX_DOMAIN_SOCKETS + +#endif // wxUSE_SOCKETS + +#endif // _WX_SCKADDR_H_