danicoin/src/System/Ipv4Address.cpp
2016-01-18 15:33:29 +00:00

113 lines
3 KiB
C++
Executable file

// Copyright (c) 2011-2016 The Cryptonote developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "Ipv4Address.h"
#include <stdexcept>
namespace System {
namespace {
uint8_t readUint8(const std::string& source, size_t& offset) {
if (offset == source.size() || source[offset] < '0' || source[offset] > '9') {
throw std::runtime_error("Unable to read value from string");
}
uint8_t value = source[offset] - '0';
if (offset + 1 == source.size() || source[offset + 1] < '0' || source[offset + 1] > '9') {
offset = offset + 1;
return value;
}
if (value == 0) {
throw std::runtime_error("Unable to read value from string");
}
value = value * 10 + (source[offset + 1] - '0');
if (offset + 2 == source.size() || source[offset + 2] < '0' || source[offset + 2] > '9') {
offset = offset + 2;
return value;
}
if ((value == 25 && source[offset + 2] > '5') || value > 25) {
throw std::runtime_error("Unable to read value from string");
}
value = value * 10 + (source[offset + 2] - '0');
offset = offset + 3;
return value;
}
}
Ipv4Address::Ipv4Address(uint32_t value) : value(value) {
}
Ipv4Address::Ipv4Address(const std::string& dottedDecimal) {
size_t offset = 0;
value = readUint8(dottedDecimal, offset);
if (offset == dottedDecimal.size() || dottedDecimal[offset] != '.') {
throw std::runtime_error("Invalid Ipv4 address string");
}
++offset;
value = value << 8 | readUint8(dottedDecimal, offset);
if (offset == dottedDecimal.size() || dottedDecimal[offset] != '.') {
throw std::runtime_error("Invalid Ipv4 address string");
}
++offset;
value = value << 8 | readUint8(dottedDecimal, offset);
if (offset == dottedDecimal.size() || dottedDecimal[offset] != '.') {
throw std::runtime_error("Invalid Ipv4 address string");
}
++offset;
value = value << 8 | readUint8(dottedDecimal, offset);
if (offset < dottedDecimal.size()) {
throw std::runtime_error("Invalid Ipv4 address string");
}
}
bool Ipv4Address::operator!=(const Ipv4Address& other) const {
return value != other.value;
}
bool Ipv4Address::operator==(const Ipv4Address& other) const {
return value == other.value;
}
uint32_t Ipv4Address::getValue() const {
return value;
}
std::string Ipv4Address::toDottedDecimal() const {
std::string result;
result += std::to_string(value >> 24);
result += '.';
result += std::to_string(value >> 16 & 255);
result += '.';
result += std::to_string(value >> 8 & 255);
result += '.';
result += std::to_string(value & 255);
return result;
}
bool Ipv4Address::isLoopback() const {
// 127.0.0.0/8
return (value & 0xff000000) == (127 << 24);
}
bool Ipv4Address::isPrivate() const {
return
// 10.0.0.0/8
(value & 0xff000000) == (10 << 24) ||
// 172.16.0.0/12
(value & 0xfff00000) == ((172 << 24) | (16 << 16)) ||
// 192.168.0.0/16
(value & 0xffff0000) == ((192 << 24) | (168 << 16));
}
}