1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        sckaddr.h
3 // Purpose:     Network address classes
4 // Author:      Guilhem Lavaux
5 // Modified by:
6 // Created:     26/04/1997
7 // RCS-ID:      $Id: sckaddr.h 35665 2005-09-24 21:43:15Z VZ $
8 // Copyright:   (c) 1997, 1998 Guilhem Lavaux
9 // Licence:     wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11 
12 #ifndef _WX_NETWORK_ADDRESS_H
13 #define _WX_NETWORK_ADDRESS_H
14 
15 #include "wx/defs.h"
16 
17 #if wxUSE_SOCKETS
18 
19 #include "wx/string.h"
20 #include "wx/gsocket.h"
21 
22 
23 class WXDLLIMPEXP_NET wxSockAddress : public wxObject {
24   DECLARE_ABSTRACT_CLASS(wxSockAddress)
25 public:
26   typedef enum { IPV4=1, IPV6=2, UNIX=3 } Addr;
27 
28   wxSockAddress();
29   wxSockAddress(const wxSockAddress& other);
30   virtual ~wxSockAddress();
31 
32   wxSockAddress& operator=(const wxSockAddress& other);
33 
34   virtual void Clear();
35   virtual int Type() = 0;
36 
GetAddress()37   GAddress *GetAddress() const { return m_address; }
38   void SetAddress(GAddress *address);
39 
40   // we need to be able to create copies of the addresses polymorphically (i.e.
41   // without knowing the exact address class)
42   virtual wxSockAddress *Clone() const = 0;
43 
44 protected:
45   GAddress *m_address;
46 
47 private:
48   void Init();
49 };
50 
51 // Interface to an IP address (either IPV4 or IPV6)
52 class WXDLLIMPEXP_NET wxIPaddress : public wxSockAddress {
53   DECLARE_ABSTRACT_CLASS(wxIPaddress)
54 public:
55   wxIPaddress();
56   wxIPaddress(const wxIPaddress& other);
57   virtual ~wxIPaddress();
58 
59   virtual bool Hostname(const wxString& name) = 0;
60   virtual bool Service(const wxString& name) = 0;
61   virtual bool Service(unsigned short port) = 0;
62 
63   virtual bool LocalHost() = 0;
64   virtual bool IsLocalHost() const = 0;
65 
66   virtual bool AnyAddress() = 0;
67 
68   virtual wxString IPAddress() const = 0;
69 
70   virtual wxString Hostname() const = 0;
71   virtual unsigned short Service() const = 0;
72 };
73 
74 class WXDLLIMPEXP_NET wxIPV4address : public wxIPaddress {
75   DECLARE_DYNAMIC_CLASS(wxIPV4address)
76 public:
77   wxIPV4address();
78   wxIPV4address(const wxIPV4address& other);
79   virtual ~wxIPV4address();
80 
81   // IPV4 name formats
82   //
83   //                    hostname
84   // dot format         a.b.c.d
85   virtual bool Hostname(const wxString& name);
86   bool Hostname(unsigned long addr);
87   virtual bool Service(const wxString& name);
88   virtual bool Service(unsigned short port);
89 
90   // localhost (127.0.0.1)
91   virtual bool LocalHost();
92   virtual bool IsLocalHost() const;
93 
94   // any (0.0.0.0)
95   virtual bool AnyAddress();
96 
97   virtual wxString Hostname() const;
OrigHostname()98   wxString OrigHostname() { return m_origHostname; }
99   virtual unsigned short Service() const;
100 
101   // a.b.c.d
102   virtual wxString IPAddress() const;
103 
Type()104   virtual int Type() { return wxSockAddress::IPV4; }
105   virtual wxSockAddress *Clone() const;
106 
107   bool operator==(const wxIPV4address& addr) const;
108 
109 private:
110   wxString m_origHostname;
111 };
112 
113 
114 // the IPv6 code probably doesn't work, untested -- set to 1 at your own risk
115 #ifndef wxUSE_IPV6
116     #define wxUSE_IPV6 0
117 #endif
118 
119 #if wxUSE_IPV6
120 
121 // Experimental Only:
122 //
123 // IPV6 has not yet been implemented in socket layer
124 class WXDLLIMPEXP_NET wxIPV6address : public wxIPaddress {
125   DECLARE_DYNAMIC_CLASS(wxIPV6address)
126 private:
127   struct sockaddr_in6 *m_addr;
128 public:
129   wxIPV6address();
130   wxIPV6address(const wxIPV6address& other);
131   virtual ~wxIPV6address();
132 
133   // IPV6 name formats
134   //
135   //                          hostname
136   //                          3ffe:ffff:0100:f101:0210:a4ff:fee3:9566
137   // compact (base85)         Itu&-ZQ82s>J%s99FJXT
138   // compressed format        ::1
139   // ipv4 mapped              ::ffff:1.2.3.4
140   virtual bool Hostname(const wxString& name);
141 
142   bool Hostname(unsigned char addr[16]);
143   virtual bool Service(const wxString& name);
144   virtual bool Service(unsigned short port);
145 
146   // localhost (0000:0000:0000:0000:0000:0000:0000:0001 (::1))
147   virtual bool LocalHost();
148   virtual bool IsLocalHost() const;
149 
150   // any (0000:0000:0000:0000:0000:0000:0000:0000 (::))
151   virtual bool AnyAddress();
152 
153   // 3ffe:ffff:0100:f101:0210:a4ff:fee3:9566
154   virtual wxString IPAddress() const;
155 
156   virtual wxString Hostname() const;
157   virtual unsigned short Service() const;
158 
Type()159   virtual int Type() { return wxSockAddress::IPV6; }
Clone()160   virtual wxSockAddress *Clone() const { return new wxIPV6address(*this); }
161 };
162 
163 #endif // wxUSE_IPV6
164 
165 #if defined(__UNIX__) && !defined(__WINE__) && (!defined(__WXMAC__) || defined(__DARWIN__)) && !defined(__WXMSW__)
166 #include <sys/socket.h>
167 #ifndef __VMS__
168 # include <sys/un.h>
169 #endif
170 
171 class WXDLLIMPEXP_NET wxUNIXaddress : public wxSockAddress {
172   DECLARE_DYNAMIC_CLASS(wxUNIXaddress)
173 private:
174   struct sockaddr_un *m_addr;
175 public:
176   wxUNIXaddress();
177   wxUNIXaddress(const wxUNIXaddress& other);
178   virtual ~wxUNIXaddress();
179 
180   void Filename(const wxString& name);
181   wxString Filename();
182 
Type()183   virtual int Type() { return wxSockAddress::UNIX; }
Clone()184   virtual wxSockAddress *Clone() const { return new wxUNIXaddress(*this); }
185 };
186 #endif
187   // __UNIX__
188 
189 #endif
190   // wxUSE_SOCKETS
191 
192 #endif
193   // _WX_NETWORK_ADDRESS_H
194