1 | /* |
2 | IPAddress.h - Base class that provides IPAddress |
3 | Copyright (c) 2011 Adrian McEwen. All right reserved. |
4 | |
5 | This library is free software; you can redistribute it and/or |
6 | modify it under the terms of the GNU Lesser General Public |
7 | License as published by the Free Software Foundation; either |
8 | version 2.1 of the License, or (at your option) any later version. |
9 | |
10 | This library is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | Lesser General Public License for more details. |
14 | |
15 | You should have received a copy of the GNU Lesser General Public |
16 | License along with this library; if not, write to the Free Software |
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
18 | */ |
19 |
|
20 | #ifndef IPAddress_h |
21 | #define IPAddress_h |
22 |
|
23 | #include <stdint.h> |
24 | #include "Printable.h" |
25 | #include "WString.h" |
26 |
|
27 | // A class to make it easier to handle and pass around IP addresses |
28 |
|
29 | class IPAddress : public Printable { |
30 | private: |
31 | union { |
32 | uint8_t bytes[4]; // IPv4 address |
33 | uint32_t dword; |
34 | } _address; |
35 |
|
36 | // Access the raw byte array containing the address. Because this returns a pointer |
37 | // to the internal structure rather than a copy of the address this function should only |
38 | // be used when you know that the usage of the returned uint8_t* will be transient and not |
39 | // stored. |
40 | uint8_t* raw_address() { return _address.bytes; }; |
41 |
|
42 | public: |
43 | // Constructors |
44 | IPAddress(); |
45 | IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet); |
46 | IPAddress(uint32_t address); |
47 | IPAddress(const uint8_t *address); |
48 |
|
49 | bool fromString(const char *address); |
50 | bool fromString(const String &address) { return fromString(address.c_str()); } |
51 |
|
52 | // Overloaded cast operator to allow IPAddress objects to be used where a pointer |
53 | // to a four-byte uint8_t array is expected |
54 | operator uint32_t() const { return _address.dword; }; |
55 | bool operator==(const IPAddress& addr) const { return _address.dword == addr._address.dword; }; |
56 | bool operator==(const uint8_t* addr) const; |
57 |
|
58 | // Overloaded index operator to allow getting and setting individual octets of the address |
59 | uint8_t operator[](int index) const { return _address.bytes[index]; }; |
60 | uint8_t& operator[](int index) { return _address.bytes[index]; }; |
61 |
|
62 | // Overloaded copy operators to allow initialisation of IPAddress objects from other types |
63 | IPAddress& operator=(const uint8_t *address); |
64 | IPAddress& operator=(uint32_t address); |
65 |
|
66 | virtual size_t printTo(Print& p) const; |
67 |
|
68 | friend class EthernetClass; |
69 | friend class UDP; |
70 | friend class Client; |
71 | friend class Server; |
72 | friend class DhcpClass; |
73 | friend class DNSClient; |
74 | }; |
75 |
|
76 | const IPAddress INADDR_NONE(0,0,0,0); |
77 |
|
78 | #endif |
79 |
|