Merge branch 'master' of ssh://repo.or.cz/srv/git/ail
[ail.git] / source / net.cpp
blob7d29ca18d38eec5ee267d2fea19304270a98229d
1 #include <ail/net.hpp>
2 #include <ail/string.hpp>
4 #include <sstream>
6 //#include <boost/format.hpp>
7 #include <boost/foreach.hpp>
9 namespace ail
11 void extract_data(boost::asio::streambuf & stream_buffer, std::string & buffer)
13 std::size_t size = stream_buffer.in_avail();
14 char * char_buffer = new char[size];
15 stream_buffer.sgetn(char_buffer, size);
16 buffer.append(char_buffer, size);
17 delete[] char_buffer;
20 std::string extract_data(boost::asio::streambuf & stream_buffer)
22 std::string output;
23 extract_data(stream_buffer, output);
24 return output;
27 std::string convert_ipv4(ulong input)
29 std::stringstream output;
30 bool first = true;
31 for(long i = 3; i >= 0; i--)
33 if(first)
34 first = false;
35 else
36 output << ".";
37 output << ((input >> (i * 8)) & 0xff);
39 return output.str();
42 bool convert_ipv4(std::string const & input, ulong & output)
44 std::size_t const token_count = 4;
46 string_vector tokens = tokenise(input, ".");
47 if(tokens.size() != token_count)
48 return false;
50 output = 0;
52 for(std::size_t i = 0; i < token_count; i++)
54 ulong value;
55 if(!string_to_number<ulong>(tokens[i], value))
56 return false;
57 if(value < 0 || value > 0xff)
58 return false;
59 output <<= 8;
60 output |= value;
63 return true;
66 std::string get_ipv6_unit(std::string const & input)
68 if(input[0] == 0 && input[1] == 0)
69 return "";
70 std::stringstream output;
71 BOOST_FOREACH(char i, input)
73 output.width(2);
74 output.fill('0');
75 output << std::hex;
76 output << static_cast<ulong>(static_cast<unsigned char>(i));
78 return output.str();
81 std::string convert_ipv6(std::string const & input)
83 if(input.size() != 16)
84 throw exception("Invalid IPv6 address input");
85 bool first = true;
86 std::string output;
87 for(std::size_t i = 0; i < input.size(); i += 4)
89 std::string unit = input.substr(i, 4);
90 if(first)
91 first = false;
92 else
93 output += ":";
94 output += get_ipv6_unit(unit);
96 return output;
99 ulong convert_ipv4(std::string const & input)
101 ulong output;
102 if(!convert_ipv4(input, output))
103 throw exception("Failed to convert IPv4 address");
104 return output;