/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: IPAddress.cpp Date: 2022-2-1 Author: Reece ***/ #include #include "Net.hpp" #include "IPAddress.hpp" namespace Aurora::IO::Net { IPAddress::IPAddress() { this->ip = EIPProtocol::eEnumInvalid; } IPAddress::IPAddress(const AuString &parse) { unsigned char buf[64]; static_assert(AuArraySize(buf) >= sizeof(struct in6_addr)); static_assert(AuArraySize(buf) >= sizeof(struct in_addr)); this->ip = EIPProtocol::eEnumInvalid; bool isIPV4 {}; if (parse.size() > 4) { isIPV4 = parse[1] == '.' || parse[2] == '.'; } if (inet_pton(isIPV4 ? AF_INET : AF_INET6, parse.c_str(), buf) != 1) { return; } if (isIPV4) { AuWriteU32BE(this->v4, 0, AuReadU32LE(buf, 0)); } else { auto ipv6 = reinterpret_cast(buf); AuWriteU16BE(&this->v6[0], 0, ipv6[0]); AuWriteU16BE(&this->v6[1], 0, ipv6[1]); AuWriteU16BE(&this->v6[2], 0, ipv6[2]); AuWriteU16BE(&this->v6[3], 0, ipv6[3]); AuWriteU16BE(&this->v6[4], 0, ipv6[4]); AuWriteU16BE(&this->v6[5], 0, ipv6[5]); AuWriteU16BE(&this->v6[6], 0, ipv6[6]); } } AuString IPAddress::ToString() const { return {}; } bool IPAddress::IsValid() const { return EIPProtocolIsValid(this->ip); } }