diff options
Diffstat (limited to 'Swiften/Network/HostAddress.cpp')
-rw-r--r-- | Swiften/Network/HostAddress.cpp | 61 |
1 files changed, 27 insertions, 34 deletions
diff --git a/Swiften/Network/HostAddress.cpp b/Swiften/Network/HostAddress.cpp index e299429..b3876c0 100644 --- a/Swiften/Network/HostAddress.cpp +++ b/Swiften/Network/HostAddress.cpp @@ -9,8 +9,8 @@ #include <boost/numeric/conversion/cast.hpp> #include <boost/lexical_cast.hpp> #include <cassert> -#include <sstream> -#include <iomanip> +#include <stdexcept> +#include <boost/array.hpp> #include "Swiften/Base/foreach.h" #include "Swiften/Base/String.h" @@ -18,50 +18,43 @@ namespace Swift { HostAddress::HostAddress() { - for (int i = 0; i < 4; ++i) { - address_.push_back(0); - } } HostAddress::HostAddress(const String& address) { - std::vector<String> components = address.split('.'); - assert(components.size() == 4); - foreach(const String& component, components) { - address_.push_back(boost::lexical_cast<int>(component.getUTF8String())); + try { + address_ = boost::asio::ip::address::from_string(address.getUTF8String()); + } + catch (const std::exception& t) { } } HostAddress::HostAddress(const unsigned char* address, int length) { assert(length == 4 || length == 16); - address_.reserve(length); - for (int i = 0; i < length; ++i) { - address_.push_back(address[i]); - } -} - -std::string HostAddress::toString() const { - if (address_.size() == 4) { - std::ostringstream result; - for (size_t i = 0; i < address_.size() - 1; ++i) { - result << boost::numeric_cast<unsigned int>(address_[i]) << "."; - } - result << boost::numeric_cast<unsigned int>(address_[address_.size() - 1]); - return result.str(); - } - else if (address_.size() == 16) { - std::ostringstream result; - result << std::hex; - result.fill('0'); - for (size_t i = 0; i < (address_.size() / 2) - 1; ++i) { - result << std::setw(2) << boost::numeric_cast<unsigned int>(address_[2*i]) << std::setw(2) << boost::numeric_cast<unsigned int>(address_[(2*i)+1]) << ":"; + if (length == 4) { + boost::array<unsigned char, 4> data; + for (int i = 0; i < length; ++i) { + data[i] = address[i]; } - result << std::setw(2) << boost::numeric_cast<unsigned int>(address_[address_.size() - 2]) << std::setw(2) << boost::numeric_cast<unsigned int>(address_[address_.size() - 1]); - return result.str(); + address_ = boost::asio::ip::address(boost::asio::ip::address_v4(data)); } else { - assert(false); - return ""; + boost::array<unsigned char, 16> data; + for (int i = 0; i < length; ++i) { + data[i] = address[i]; + } + address_ = boost::asio::ip::address(boost::asio::ip::address_v6(data)); } } +HostAddress::HostAddress(const boost::asio::ip::address& address) : address_(address) { +} + +std::string HostAddress::toString() const { + return address_.to_string(); +} + +bool HostAddress::isValid() const { + return !(address_.is_v4() && address_.to_v4().to_ulong() == 0); +} + } |