AuroraRuntime/Source/IO/Net/IPAddress.cpp

64 lines
1.6 KiB
C++

/***
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
File: IPAddress.cpp
Date: 2022-2-1
Author: Reece
***/
#include <Source/RuntimeInternal.hpp>
#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<AuUInt16 *>(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);
}
}