diff --git a/Aurora.json b/Aurora.json index ec4b16b4..1252ce56 100644 --- a/Aurora.json +++ b/Aurora.json @@ -62,7 +62,8 @@ "Ntdll.lib", "Wer.lib", "wintrust.lib", - "Winmm.lib" + "Winmm.lib", + "Iphlpapi.lib" ] } }, diff --git a/Include/Aurora/IO/Net/INetAdapter.hpp b/Include/Aurora/IO/Net/INetAdapter.hpp new file mode 100644 index 00000000..eb3d5e8d --- /dev/null +++ b/Include/Aurora/IO/Net/INetAdapter.hpp @@ -0,0 +1,29 @@ +/*** + Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: INetAdapter.hpp + Date: 2022-12-11 + Author: Reece +***/ +#pragma once + +namespace Aurora::IO::Net +{ + struct INetAdapter + { + virtual const AuString &ToName() = 0; + virtual const AuString &ToDevice() = 0; + + virtual AuUInt16 GetIndex() = 0; + + virtual EIPProtocol ToFamily() = 0; + + virtual IPAddress ToAddress() = 0; + virtual IPAddress ToBroadcastAddress() = 0; + virtual IPAddress ToAnycastAddress() = 0; + virtual IPAddress ToSubnetMask() = 0; + virtual IPAddress ToGateway() = 0; + + virtual AuList GetDNS() = 0; + }; +}; \ No newline at end of file diff --git a/Include/Aurora/IO/Net/INetInterface.hpp b/Include/Aurora/IO/Net/INetInterface.hpp index a19f4950..da5cbcbf 100644 --- a/Include/Aurora/IO/Net/INetInterface.hpp +++ b/Include/Aurora/IO/Net/INetInterface.hpp @@ -13,20 +13,26 @@ namespace Aurora::IO::Net struct INetSrvResolve; struct INetSrvSockets; struct INetSrvWorkers; + struct INetSrvInterfaces; struct INetInterface { - virtual AuSPtr GetWorkersService() = 0; + virtual void Shutdown() = 0; - virtual AuSPtr GetResolveService() = 0; - - virtual AuSPtr GetSocketService() = 0; - virtual AuSPtr GetDatagramService() = 0; + virtual void Destroy() = 0; virtual bool TrySchedule(const AuSPtr &pWorkUnit) = 0; - virtual void Shutdown() = 0; - virtual void Destroy() = 0; + virtual AuSPtr GetWorkersService() = 0; + + virtual AuSPtr GetResolveService() = 0; + + virtual AuSPtr GetSocketService() = 0; + + virtual AuSPtr GetDatagramService() = 0; + + virtual AuSPtr GetInterfacesService() = 0; + }; AUKN_SYM AuSPtr NewNetworkInterface(); diff --git a/Include/Aurora/IO/Net/INetSrvInterfaces.hpp b/Include/Aurora/IO/Net/INetSrvInterfaces.hpp new file mode 100644 index 00000000..9a3aeffc --- /dev/null +++ b/Include/Aurora/IO/Net/INetSrvInterfaces.hpp @@ -0,0 +1,18 @@ +/*** + Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: INetSrvInterfaces.hpp + Date: 2022-12-11 + Author: Reece +***/ +#pragma once + +namespace Aurora::IO::Net +{ + struct INetSrvInterfaces + { + virtual const AuString & GetHostname() = 0; + virtual void ResetAdapterCache() = 0; + virtual AuList> GetAdapters() = 0; + }; +}; \ No newline at end of file diff --git a/Include/Aurora/IO/Net/NetExperimental.hpp b/Include/Aurora/IO/Net/NetExperimental.hpp index e8966f31..272fb147 100644 --- a/Include/Aurora/IO/Net/NetExperimental.hpp +++ b/Include/Aurora/IO/Net/NetExperimental.hpp @@ -35,6 +35,9 @@ #include "IResolver.hpp" +#include "INetAdapter.hpp" + +#include "INetSrvInterfaces.hpp" #include "INetSrvDatagram.hpp" #include "INetSrvResolve.hpp" #include "INetSrvSockets.hpp" diff --git a/Include/Aurora/Logging/IFormattedSink.hpp b/Include/Aurora/Logging/IFormattedSink.hpp new file mode 100644 index 00000000..f3c51505 --- /dev/null +++ b/Include/Aurora/Logging/IFormattedSink.hpp @@ -0,0 +1,16 @@ +/*** + Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: IFormattedSink.hpp + Date: 2022-11-14 + Author: Reece +***/ +#pragma once + +namespace Aurora::Logging +{ + struct IFormattedSink : IBasicSink, IFormatterContainer + { + + }; +} \ No newline at end of file diff --git a/Include/Aurora/Logging/IFormatter.hpp b/Include/Aurora/Logging/IFormatter.hpp new file mode 100644 index 00000000..9f5cf990 --- /dev/null +++ b/Include/Aurora/Logging/IFormatter.hpp @@ -0,0 +1,15 @@ +/*** + Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: IFormatter.hpp + Date: 2022-11-14 + Author: Reece +***/ +#pragma once + +namespace Aurora::Logging +{ + AUKN_INTERFACE(IFormatter, + AUI_METHOD(AuString, Format, (AuUInt8, level, const Console::ConsoleMessage &, msg)) + ); +} \ No newline at end of file diff --git a/Include/Aurora/Logging/IFormatterContainer.hpp b/Include/Aurora/Logging/IFormatterContainer.hpp new file mode 100644 index 00000000..4941da6d --- /dev/null +++ b/Include/Aurora/Logging/IFormatterContainer.hpp @@ -0,0 +1,17 @@ +/*** + Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: IFormatterContainer.hpp + Date: 2022-11-14 + Author: Reece +***/ +#pragma once + +namespace Aurora::Logging +{ + struct IFormatterContainer + { + virtual AuSPtr GetFormatter() = 0; + virtual void SetFormatter(const AuSPtr &pFormatter) = 0; + }; +} \ No newline at end of file diff --git a/Include/Aurora/Logging/Logging.hpp b/Include/Aurora/Logging/Logging.hpp index c22d7a09..2e051f85 100644 --- a/Include/Aurora/Logging/Logging.hpp +++ b/Include/Aurora/Logging/Logging.hpp @@ -7,8 +7,11 @@ ***/ #pragma once +#include "IFormatter.hpp" +#include "IFormatterContainer.hpp" #include "ILogger.hpp" #include "IBasicSink.hpp" +#include "IFormattedSink.hpp" #include "IBasicSinkRB.hpp" #include "IIPCLogger.hpp" #include "Sinks.hpp" diff --git a/Include/Aurora/Logging/Sinks.hpp b/Include/Aurora/Logging/Sinks.hpp index 0b6b49ef..17ec5bf8 100644 --- a/Include/Aurora/Logging/Sinks.hpp +++ b/Include/Aurora/Logging/Sinks.hpp @@ -24,8 +24,8 @@ namespace Aurora::Logging * @brief Constructs a UTF8 output sink. * Backed by stdconsole; supports posix fd stdin/out localized, visual studio debugger, and conhost */ - AUKN_SHARED_API(NewStdSink, IBasicSink); - + AUKN_SHARED_API(NewStdSink, IFormattedSink); + /** * @brief Unimplemented systemd or service (?) backend */ @@ -44,7 +44,7 @@ namespace Aurora::Logging /** * @brief Constructs a text of binary log file sink */ - AUKN_SHARED_API(NewFileSink, IBasicSink, const AuString &path, bool binary = false); + AUKN_SHARED_API(NewFileSink, IFormattedSink, const AuString &path, bool binary = false); /** * @brief Constructs a dedicated log directory subject to erasure as defined by defined DirectoryLogger diff --git a/Include/Aurora/Runtime.hpp b/Include/Aurora/Runtime.hpp index a4c7e1ce..62f36efd 100644 --- a/Include/Aurora/Runtime.hpp +++ b/Include/Aurora/Runtime.hpp @@ -209,7 +209,10 @@ namespace Aurora bool asyncVSLog {false}; /// Should stdout print the full date or a mere HH MM SS prefix? - bool stdOutShortTime {false}; + bool bStdOutShortTime { false }; + + /// + bool bStdOutUseLocalTime { true }; #if 1 /// FIO config diff --git a/Source/Console/Console.cpp b/Source/Console/Console.cpp index b73f19a8..6b2bc940 100644 --- a/Source/Console/Console.cpp +++ b/Source/Console/Console.cpp @@ -9,7 +9,7 @@ #include "Console.hpp" #include "Commands/Commands.hpp" #include "Hooks/Hooks.hpp" -#include "Logging/Logger.hpp" +#include "Logging/AuLogger.hpp" #include "ConsoleStd/ConsoleStd.hpp" #include "ConsoleWxWidgets/ConsoleWxWidgets.hpp" #include "ConsoleFIO/ConsoleFIO.hpp" diff --git a/Source/Console/ConsoleMessage.cpp b/Source/Console/ConsoleMessage.cpp index fb24bc90..c63c8bf2 100644 --- a/Source/Console/ConsoleMessage.cpp +++ b/Source/Console/ConsoleMessage.cpp @@ -11,7 +11,9 @@ namespace Aurora::Console { - static AuString StringifyTimeEx(const ConsoleMessage &msg, bool simple, bool utc) + static AuString StringifyTimeEx(const ConsoleMessage &msg, + bool simple, + bool utc) { try { @@ -38,94 +40,64 @@ namespace Aurora::Console { AuUInt8 ref; deserialize.Read(ref); - color = static_cast(ref); - deserialize.Read(prefix); - deserialize.Read(line); - deserialize.Read(time); - deserialize.Read(tid); + this->color = static_cast(ref); + deserialize.Read(this->prefix); + deserialize.Read(this->line); + deserialize.Read(this->time); + deserialize.Read(this->tid); } AUKN_SYM void ConsoleMessage::Write(Memory::ByteBuffer &serialize) const { - serialize.Write(static_cast(color)); - serialize.Write(prefix); - serialize.Write(line); - serialize.Write(time); - serialize.Write(tid); + serialize.Write(static_cast(this->color)); + serialize.Write(this->prefix); + serialize.Write(this->line); + serialize.Write(this->time); + serialize.Write(this->tid); } AuString ConsoleMessage::StringifyTime(bool simple) const { - try - { - return StringifyTimeEx(*this, simple, false); - } - catch (...) - { - return {}; - } + return StringifyTimeEx(*this, + simple, + false); } AuString ConsoleMessage::StringifyTimeUTC() const { - try - { - return StringifyTimeEx(*this, false, true); - } - catch (...) - { - return {}; - } + return StringifyTimeEx(*this, + false, + true); } AuString ConsoleMessage::GetWrappedTag() const { - return "[" + prefix + "]"; + return "[" + this->prefix + "]"; } AuString ConsoleMessage::ToConsole() const { - try + if (gRuntimeConfig.console.bStdOutUseLocalTime) { - return fmt::format("[{}] {:<8} | {}", - StringifyTime(gRuntimeConfig.console.stdOutShortTime), - GetWrappedTag(), - line);//, - //kAnsiColorForegroundToVirtualEscape[static_cast(EAnsiColor::eReset)]); + return this->ToPersistentString(); } - catch (...) - { - return {}; - } - + + return fmt::format("[{}] {:<8} | {}", + StringifyTime(gRuntimeConfig.console.bStdOutShortTime), + GetWrappedTag(), + this->line); } AuString ConsoleMessage::ToPersistentString() const { - try - { - - return fmt::format("[{}] {:<7} | {}", - StringifyTimeUTC(), - GetWrappedTag(), - line); - } - catch (...) - { - return {}; - } - + return fmt::format("[{}] {:<8} | {}", + StringifyTimeUTC(), + GetWrappedTag(), + this->line); } AuString ConsoleMessage::ToSimplified() const { - try - { - return fmt::format("{:<9} {:<8} | {}", StringifyTime(true), GetWrappedTag(), line); - } - catch (...) - { - return {}; - } + return fmt::format("{:<9} {:<8} | {}", StringifyTime(true), GetWrappedTag(), this->line); } } \ No newline at end of file diff --git a/Source/Console/ConsoleStd/ConsoleStd.cpp b/Source/Console/ConsoleStd/ConsoleStd.cpp index 5d42b2b4..bf3c4b08 100755 --- a/Source/Console/ConsoleStd/ConsoleStd.cpp +++ b/Source/Console/ConsoleStd/ConsoleStd.cpp @@ -90,7 +90,7 @@ namespace Aurora::Console::ConsoleStd #define IS_STREAM_HANDLE_VALID(h) (h != DEFAULT_HANDLE_VAL) static bool AsyncReadAnyOrReadStreamBlock(); - void WriteStdOut(AuUInt8 level, const ConsoleMessage &msg); + void WriteStdOut(AuUInt8 level, const ConsoleMessage &msg, const AuString &formatted); static const AuMach kLineBufferMax = 2048; static AuUInt8 gLineEncodedBuffer[kLineBufferMax]; @@ -1005,10 +1005,10 @@ namespace Aurora::Console::ConsoleStd FlushStdOutNb(); } - void WriteStdOut(AuUInt8 level, const ConsoleMessage &msg) + void WriteStdOut(AuUInt8 level, const ConsoleMessage &msg, const AuString &formatted) { bool bUseAlt {}; - auto writeLine = msg.ToConsole(); + auto writeLine = formatted; if (!gSupportsColorOutput) { diff --git a/Source/Console/ConsoleStd/ConsoleStd.hpp b/Source/Console/ConsoleStd/ConsoleStd.hpp index a9922dcc..1e7e0c30 100644 --- a/Source/Console/ConsoleStd/ConsoleStd.hpp +++ b/Source/Console/ConsoleStd/ConsoleStd.hpp @@ -25,7 +25,7 @@ namespace Aurora::Console::ConsoleStd AuUInt32 ReadStdIn(void *data, AuUInt32 length); AuUInt32 WriteStdOut(const void *data, AuUInt32 length); - void WriteStdOut(AuUInt8 level, const ConsoleMessage &msg); + void WriteStdOut(AuUInt8 level, const ConsoleMessage &msg, const AuString &formatted); inline bool gSupportsColorOutput { true }; diff --git a/Source/Console/ConsoleTTY/ConsoleTTY.cpp b/Source/Console/ConsoleTTY/ConsoleTTY.cpp index 403d625b..bc1fcecb 100644 --- a/Source/Console/ConsoleTTY/ConsoleTTY.cpp +++ b/Source/Console/ConsoleTTY/ConsoleTTY.cpp @@ -118,7 +118,18 @@ namespace Aurora::Console::ConsoleTTY { AU_LOCK_GUARD(this->messageLock); - AuTryInsert(this->messagesPending, msg); + AuConsole::ConsoleMessage msg2(msg); + msg2.line = msg.ToConsole(); + AuTryInsert(this->messagesPending, msg2); // TODO: ! + } + + void TTYConsole::BufferMessage(const AuConsole::ConsoleMessage &msg, const AuString &input) + { + AU_LOCK_GUARD(this->messageLock); + + AuConsole::ConsoleMessage msg2(msg); + msg2.line = input; + AuTryInsert(this->messagesPending, msg2); // TODO: ! } void TTYConsole::NoncanonicalTick() @@ -808,7 +819,7 @@ namespace Aurora::Console::ConsoleTTY { for (auto &message : messages) { - auto str = message.ToConsole(); + auto str = message.line; // Note: we replaced the line in BufferMessage while (str.size()) { @@ -2122,6 +2133,11 @@ x gTTYConsole.BufferMessage(msg); } + void WriteTTYOut(const AuConsole::ConsoleMessage &msg, const AuString &input) + { + gTTYConsole.BufferMessage(msg, input); + } + void Pump() { // :( @@ -2171,7 +2187,7 @@ x } - void WriteTTYOut(const AuConsole::ConsoleMessage &msg) + void WriteTTYOut(const AuConsole::ConsoleMessage &msg, const AuString &input) { } diff --git a/Source/Console/ConsoleTTY/ConsoleTTY.hpp b/Source/Console/ConsoleTTY/ConsoleTTY.hpp index 4b5e8b51..ff074a9c 100644 --- a/Source/Console/ConsoleTTY/ConsoleTTY.hpp +++ b/Source/Console/ConsoleTTY/ConsoleTTY.hpp @@ -17,6 +17,9 @@ namespace Aurora::Console::ConsoleTTY struct TTYConsole : ITTYConsole { void BufferMessage(const AuConsole::ConsoleMessage &msg) override; + void BufferMessage(const AuConsole::ConsoleMessage &msg, const AuString &input) ; + + // void Pump(); void PumpHistory(); @@ -268,6 +271,7 @@ namespace Aurora::Console::ConsoleTTY void Exit(); void OnEnter(); void WriteTTYOut(const AuConsole::ConsoleMessage &msg); + void WriteTTYOut(const AuConsole::ConsoleMessage &msg, const AuString &input); AUKN_SYM AuSPtr GetTTYConsole(); void PumpForce(); } \ No newline at end of file diff --git a/Source/Console/Flusher.cpp b/Source/Console/Flusher.cpp index d8a19546..7c2c990a 100644 --- a/Source/Console/Flusher.cpp +++ b/Source/Console/Flusher.cpp @@ -10,7 +10,7 @@ #include "ConsoleFIO/ConsoleFIO.hpp" #include "ConsoleStd/ConsoleStd.hpp" -#include "Logging/Logger.hpp" +#include "Logging/AuLogger.hpp" namespace Aurora::Console { diff --git a/Source/Grug/AuGrug.cpp b/Source/Grug/AuGrug.cpp index a2655c08..96937c7d 100644 --- a/Source/Grug/AuGrug.cpp +++ b/Source/Grug/AuGrug.cpp @@ -13,7 +13,7 @@ #include #include "AuGrug.hpp" -#include +#include #include #include #include diff --git a/Source/IO/Net/AuNetAdapter.Linux.cpp b/Source/IO/Net/AuNetAdapter.Linux.cpp new file mode 100644 index 00000000..e69de29b diff --git a/Source/IO/Net/AuNetAdapter.Linux.hpp b/Source/IO/Net/AuNetAdapter.Linux.hpp new file mode 100644 index 00000000..e69de29b diff --git a/Source/IO/Net/AuNetAdapter.NT.cpp b/Source/IO/Net/AuNetAdapter.NT.cpp new file mode 100644 index 00000000..b8a58d2b --- /dev/null +++ b/Source/IO/Net/AuNetAdapter.NT.cpp @@ -0,0 +1,226 @@ +/*** + Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: AuNetAdapter.NT.cpp + Date: 2022-11-14 + Author: Reece +***/ +#include "Networking.hpp" +#include "AuNetAdapter.hpp" +#include "AuNetEndpoint.hpp" + +#include +#include + +namespace Aurora::IO::Net +{ + static AuList> gIpv4Adapters; + static AuList> gIpv6Adapters; + + AuString NetAdapter::GetHostname() + { + #if defined(AURORA_PLATFORM_WIN32) + wchar_t buffer[128]; + DWORD dwLength { AuArraySize(buffer) }; + + if (!::GetComputerNameExW(ComputerNameDnsHostname, buffer, &dwLength)) + { + return {}; + } + + return AuLocale::ConvertFromWChar(buffer, dwLength); + #else + return ""; + #endif + } + +#if defined(AURORA_PLATFORM_WIN32) + AuSPtr GetAddressesForFamily(ULONG uFamily) + { + static const auto kDefSize = 15 * 1024; + + AuSPtr pAddresses; + DWORD outBufLen { kDefSize }; + DWORD dwRetVal; + + DWORD dwFlags = GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_INCLUDE_GATEWAYS; + DWORD dwIterations {}; + do + { + pAddresses = AuReinterpretCast(AuMakeSharedArray(kDefSize)); + SysAssert(pAddresses); + + dwRetVal = ::GetAdaptersAddresses(uFamily, dwFlags, NULL, pAddresses.get(), &outBufLen); + + if (dwRetVal == 0) + { + break; + } + else if (dwRetVal != ERROR_BUFFER_OVERFLOW) + { + } + else + { + SysPushErrorNet("Fail"); + break; + } + + dwIterations++; + + } + while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (dwIterations < 5)); + + return dwRetVal == NO_ERROR ? pAddresses : AuSPtr {}; + } + + AU_NOINLINE void AddressesToList(AuSPtr pAddresses, AuList> &adaptersOut) + { + auto pCurrAddresses = pAddresses.get(); + + while (pCurrAddresses) + { + auto pAdapter = AuMakeSharedThrow(); + auto &adapter = *pAdapter.get(); + adapter.device = pCurrAddresses->AdapterName; + adapter.name = AuLocale::ConvertFromWChar(pCurrAddresses->FriendlyName); + + auto pUnicast = pCurrAddresses->FirstUnicastAddress; + if (pUnicast) + { + NetEndpoint ep; + if (pUnicast->Address.iSockaddrLength <= sizeof(ep.hint)) + { + AuMemcpy(ep.hint, pUnicast->Address.lpSockaddr, pUnicast->Address.iSockaddrLength); + DeoptimizeEndpoint(ep); + } + + adapter.address = ep.ip; + } + + auto pMulticast = pCurrAddresses->FirstMulticastAddress; + if (pMulticast) + { + NetEndpoint ep; + if (pMulticast->Address.iSockaddrLength <= sizeof(ep.hint)) + { + AuMemcpy(ep.hint, pMulticast->Address.lpSockaddr, pMulticast->Address.iSockaddrLength); + DeoptimizeEndpoint(ep); + } + + adapter.broadcast = ep.ip; + } + + auto pAnycast = pCurrAddresses->FirstAnycastAddress; + if (pAnycast) + { + NetEndpoint ep; + if (pAnycast->Address.iSockaddrLength <= sizeof(ep.hint)) + { + AuMemcpy(ep.hint, pAnycast->Address.lpSockaddr, pAnycast->Address.iSockaddrLength); + DeoptimizeEndpoint(ep); + } + + adapter.anycast = ep.ip; + } + + + auto pGateway = pCurrAddresses->FirstGatewayAddress; + if (pAnycast) + { + NetEndpoint ep; + if (pGateway->Address.iSockaddrLength <= sizeof(ep.hint)) + { + AuMemcpy(ep.hint, pGateway->Address.lpSockaddr, pGateway->Address.iSockaddrLength); + DeoptimizeEndpoint(ep); + } + + adapter.anycast = ep.ip; + } + + auto pDnsServers = pCurrAddresses->FirstDnsServerAddress; + if (pDnsServers) + { + do + { + NetEndpoint ep; + if (pDnsServers->Address.iSockaddrLength <= sizeof(ep.hint)) + { + AuMemcpy(ep.hint, pDnsServers->Address.lpSockaddr, pDnsServers->Address.iSockaddrLength); + DeoptimizeEndpoint(ep); + } + + adapter.dns.push_back(ep.ip); + } + while (pDnsServers = pDnsServers->Next); + } + + adaptersOut.push_back(pAdapter); + + pCurrAddresses = pCurrAddresses->Next; + } + } + +#endif + + static void PrecacheAdapters() + { + #if 0 + ULONG ulOutBufLen = 0; + DWORD dwSize = 0; + DWORD dwRetVal = 0; + + dwRetVal = ::GetInterfaceInfo(NULL, &ulOutBufLen); + if (dwRetVal == ERROR_INSUFFICIENT_BUFFER) + { + gIpInfo = AuReinterpretCast(AuMakeSharedArray(ulOutBufLen)); + SysAssert(gIpInfo); + } + + dwRetVal = ::GetInterfaceInfo(gIpInfo.get(), &ulOutBufLen); + if (dwRetVal != NO_ERROR) + { + if (dwRetVal == ERROR_NO_DATA) + { + return; + } + + SysPushErrorNet("Couldn't fetch interfaces"); + return; + } + + for (AuUInt i = 0; + i < gIpInfo->NumAdapters; + i++) + { + printf("Adapter Index[%d]: %ld\n", i, + gIpInfo->Adapter[i].Index); + printf("Adapter Name[%d]: %ws\n\n", i, + gIpInfo->Adapter[i].Name); + } + #endif + + auto pAdaptersV4 = GetAddressesForFamily(AF_INET); + auto pAdaptersV6 = GetAddressesForFamily(AF_INET6); + AddressesToList(pAdaptersV4, gIpv4Adapters); + AddressesToList(pAdaptersV6, gIpv6Adapters); + } + + AuList> NetAdapter::GetIPv4s() + { + #if defined(AURORA_PLATFORM_WIN32) + PrecacheAdapters(); + return gIpv4Adapters; + #else + return {}; + #endif + } + + AuList> NetAdapter::GetIPv6s() + { + #if defined(AURORA_PLATFORM_WIN32) + return gIpv6Adapters; + #else + return {}; + #endif + } +} \ No newline at end of file diff --git a/Source/IO/Net/AuNetAdapter.NT.hpp b/Source/IO/Net/AuNetAdapter.NT.hpp new file mode 100644 index 00000000..e69de29b diff --git a/Source/IO/Net/AuNetAdapter.cpp b/Source/IO/Net/AuNetAdapter.cpp new file mode 100644 index 00000000..9b1bcc04 --- /dev/null +++ b/Source/IO/Net/AuNetAdapter.cpp @@ -0,0 +1,63 @@ +/*** + Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: AuNetAdapter.cpp + Date: 2022-11-14 + Author: Reece +***/ +#include "Networking.hpp" +#include "AuNetAdapter.hpp" +#include "AuNetAdapter.hpp" + +namespace Aurora::IO::Net +{ + const AuString &NetAdapter::ToName() + { + return this->name.empty() ? this->device : this->name; + } + + IPAddress NetAdapter::ToAddress() + { + return this->address; + } + + IPAddress NetAdapter::ToBroadcastAddress() + { + return this->broadcast; + } + + IPAddress NetAdapter::ToSubnetMask() + { + return this->subnet; + } + + const AuString &NetAdapter::ToDevice() + { + return this->device; + } + + EIPProtocol NetAdapter::ToFamily() + { + return this->address.ip; + } + + AuUInt16 NetAdapter::GetIndex() + { + return this->index; + } + + IPAddress NetAdapter::ToAnycastAddress() + { + return this->anycast; + } + + IPAddress NetAdapter::ToGateway() + { + return this->gateway; + } + + AuList NetAdapter::GetDNS() + { + return this->dns; + } +} \ No newline at end of file diff --git a/Source/IO/Net/AuNetAdapter.hpp b/Source/IO/Net/AuNetAdapter.hpp new file mode 100644 index 00000000..dbd74098 --- /dev/null +++ b/Source/IO/Net/AuNetAdapter.hpp @@ -0,0 +1,47 @@ +/*** + Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: AuNetAdapter.hpp + Date: 2022-11-14 + Author: Reece +***/ +#pragma once + +namespace Aurora::IO::Net +{ + struct NetAdapter : INetAdapter + { + const AuString &ToName() override; + const AuString &ToDevice() override; + + AuUInt16 GetIndex() override; + + EIPProtocol ToFamily() override; + + IPAddress ToAddress() override; + IPAddress ToBroadcastAddress() override; + IPAddress ToAnycastAddress() override; + IPAddress ToSubnetMask() override; + IPAddress ToGateway() override; + + AuList GetDNS() override; + + // FriendlyName + + static AuString GetHostname(); + static AuList> GetIPv4s(); // must be called first under lock + static AuList> GetIPv6s(); // followed by me + // other protocols can go here + + AuString name; + AuString device; + IPAddress address; + IPAddress broadcast; + IPAddress anycast; + IPAddress subnet; + IPAddress gateway; + AuList dns; + + AuUInt16 index {}; + }; +} \ No newline at end of file diff --git a/Source/IO/Net/AuNetInterface.cpp b/Source/IO/Net/AuNetInterface.cpp index 0f684cde..cecc0fbc 100644 --- a/Source/IO/Net/AuNetInterface.cpp +++ b/Source/IO/Net/AuNetInterface.cpp @@ -39,6 +39,15 @@ namespace Aurora::IO::Net return AuSPtr(AuSharedFromThis(), &this->netServiceDatagram_); } + AuSPtr NetInterface::GetInterfacesService() + { + if (!this->netServiceInterfaces_.IsSupportedOnOS()) + { + return {}; + } + return AuSPtr(AuSharedFromThis(), &this->netServiceInterfaces_); + } + bool NetInterface::TrySchedule(const AuSPtr &pWorkUnit) { auto workerId = AuAtomicAdd(&this->atomicCounter_, 1u) - 1u; diff --git a/Source/IO/Net/AuNetInterface.hpp b/Source/IO/Net/AuNetInterface.hpp index 66cf940c..4e965a7b 100644 --- a/Source/IO/Net/AuNetInterface.hpp +++ b/Source/IO/Net/AuNetInterface.hpp @@ -11,6 +11,7 @@ #include "AuNetSrvSockets.hpp" #include "AuNetSrvResolve.hpp" #include "AuNetSrvDatagram.hpp" +#include "AuNetSrvInterfaces.hpp" namespace Aurora::IO::Net { @@ -23,8 +24,11 @@ namespace Aurora::IO::Net AuSPtr GetResolveService() override; AuSPtr GetSocketService() override; + AuSPtr GetDatagramService() override; + AuSPtr GetInterfacesService() override; + bool TrySchedule(const AuSPtr &pWorkUnit) override; AuSPtr TryScheduleEx(); @@ -33,11 +37,10 @@ namespace Aurora::IO::Net private: NetSrvWorkers netServiceWorkers_; // Soviet Union Anthem - NetSrvSockets netServiceSockets_; NetSrvResolve netServiceResolve_; - NetSrvDatagram netServiceDatagram_; + NetSrvInterfaces netServiceInterfaces_; AuUInt atomicCounter_; }; diff --git a/Source/IO/Net/AuNetSrvInterfaces.cpp b/Source/IO/Net/AuNetSrvInterfaces.cpp new file mode 100644 index 00000000..efef28cc --- /dev/null +++ b/Source/IO/Net/AuNetSrvInterfaces.cpp @@ -0,0 +1,63 @@ +/*** + Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: AuNetSrvInterfaces.cpp + Date: 2022-11-14 + Author: Reece +***/ +#include "Networking.hpp" +#include "AuNetSrvInterfaces.hpp" +#include "AuNetAdapter.hpp" + +namespace Aurora::IO::Net +{ + const AuString &NetSrvInterfaces::GetHostname() + { + AU_LOCK_GUARD(this->lock); + if (this->bShouldUpdateCache) + { + UpdateCache(); + } + + return hostname; + } + + void NetSrvInterfaces::ResetAdapterCache() + { + AU_LOCK_GUARD(this->lock); + this->bShouldUpdateCache = true; + } + + void NetSrvInterfaces::UpdateCache() + { + this->hostname = NetAdapter::GetHostname(); + + auto ipv4s = NetAdapter::GetIPv4s(); + auto ipv6s = NetAdapter::GetIPv6s(); + + this->adapters.clear(); + this->adapters.insert(this->adapters.end(), ipv4s.begin(), ipv4s.end()); + this->adapters.insert(this->adapters.end(), ipv6s.begin(), ipv6s.end()); + } + + AuList> NetSrvInterfaces::GetAdapters() + { + AU_LOCK_GUARD(this->lock); + if (this->bShouldUpdateCache) + { + UpdateCache(); + } + return this->adapters; + } + + bool NetSrvInterfaces::IsSupportedOnOS() + { + #if defined(AURORA_PLATFORM_WIN32) + return true; + #endif + #if defined(AURORA_PLATFORM_LINUX) + //return true; + #endif + return false; + } +} \ No newline at end of file diff --git a/Source/IO/Net/AuNetSrvInterfaces.hpp b/Source/IO/Net/AuNetSrvInterfaces.hpp new file mode 100644 index 00000000..a7ae8a17 --- /dev/null +++ b/Source/IO/Net/AuNetSrvInterfaces.hpp @@ -0,0 +1,30 @@ +/*** + Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: AuNetSrvInterfaces.hpp + Date: 2022-11-14 + Author: Reece +***/ +#pragma once + +namespace Aurora::IO::Net +{ + struct NetSrvInterfaces : INetSrvInterfaces + { + const AuString &GetHostname() override; + void ResetAdapterCache() override; + AuList> GetAdapters() override; + + bool IsSupportedOnOS(); + + + private: + + void UpdateCache(); + + AuThreadPrimitives::SpinLock lock; + AuString hostname; + bool bShouldUpdateCache { true }; + AuList> adapters; + }; +} \ No newline at end of file diff --git a/Source/Logging/AuFormatterContainer.cpp b/Source/Logging/AuFormatterContainer.cpp new file mode 100644 index 00000000..8c50a402 --- /dev/null +++ b/Source/Logging/AuFormatterContainer.cpp @@ -0,0 +1,22 @@ +/*** + Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: AuFormatterContainer.cpp + Date: 2022-11-14 + Author: Reece +***/ +#include +#include "AuFormatterContainer.hpp" + +namespace Aurora::Logging +{ + AuSPtr FormatterContainer::GetFormatter() + { + return this->pFormatter; + } + + void FormatterContainer::SetFormatter(const AuSPtr &pFormatter) + { + this->pFormatter = pFormatter; + } +} \ No newline at end of file diff --git a/Source/Logging/AuFormatterContainer.hpp b/Source/Logging/AuFormatterContainer.hpp new file mode 100644 index 00000000..95d110f7 --- /dev/null +++ b/Source/Logging/AuFormatterContainer.hpp @@ -0,0 +1,59 @@ +/*** + Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. + + File: AuFormatterContainer.hpp + Date: 2022-11-14 + Author: Reece +***/ +#pragma once + +namespace Aurora::Logging +{ + struct FormatterContainer : IFormatterContainer + { + AuSPtr GetFormatter() override; + void SetFormatter(const AuSPtr &pFormatter) override; + AuSPtr pFormatter; + }; +} + +#define ADD_FORMATTER_CONTAINER \ + FormatterContainer formatter; \ + AuString FormatMessageHelper(AuUInt8 level, \ + const ConsoleMessage &msg, \ + bool bConsoleMode, \ + bool bPersistentString, \ + bool bSimplified) \ + { \ + if (auto pFormatter = this->formatter.GetFormatter()) \ + { \ + return pFormatter->Format(level, msg); \ + } \ + else \ + { \ + if (bConsoleMode) \ + { \ + return msg.ToConsole(); \ + } \ + \ + if (bPersistentString) \ + { \ + return msg.ToPersistentString(); \ + } \ + \ + if (bSimplified) \ + { \ + return msg.ToSimplified(); \ + } \ + \ + return msg.line; \ + } \ + } \ + AuSPtr GetFormatter() override \ + { \ + return this->formatter.GetFormatter(); \ + } \ + void SetFormatter(const AuSPtr &pFormatter) override \ + { \ + this->formatter.SetFormatter(pFormatter); \ + } \ No newline at end of file diff --git a/Source/Logging/Sinks.cpp b/Source/Logging/AuLogSinks.cpp similarity index 89% rename from Source/Logging/Sinks.cpp rename to Source/Logging/AuLogSinks.cpp index b9afaa58..b5706228 100644 --- a/Source/Logging/Sinks.cpp +++ b/Source/Logging/AuLogSinks.cpp @@ -1,12 +1,12 @@ /*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. - File: Sinks.cpp + File: AuLogSinks.cpp Date: 2022-1-21 Author: Reece ***/ #include -#include "Sinks.hpp" +#include "AuLogSinks.hpp" #include "Sinks/FileSink.hpp" #include "Sinks/StdConsole.hpp" @@ -28,12 +28,12 @@ namespace Aurora::Logging { - AUKN_SYM IBasicSink *NewStdSinkNew() + AUKN_SYM IFormattedSink *NewStdSinkNew() { return Sinks::NewStdSinkNew(); } - AUKN_SYM void NewStdSinkRelease(IBasicSink *sink) + AUKN_SYM void NewStdSinkRelease(IFormattedSink *sink) { Sinks::NewStdSinkRelease(sink); } @@ -88,12 +88,12 @@ namespace Aurora::Logging } - AUKN_SYM IBasicSink *NewFileSinkNew(const AuString &path, bool binary) + AUKN_SYM IFormattedSink *NewFileSinkNew(const AuString &path, bool binary) { return Sinks::NewFileSinkNew(path, binary); } - AUKN_SYM void NewFileSinkRelease(IBasicSink *sink) + AUKN_SYM void NewFileSinkRelease(IFormattedSink *sink) { Sinks::NewFileSinkRelease(sink); } diff --git a/Source/Logging/Sinks.hpp b/Source/Logging/AuLogSinks.hpp similarity index 86% rename from Source/Logging/Sinks.hpp rename to Source/Logging/AuLogSinks.hpp index b0c4b876..30a460fb 100644 --- a/Source/Logging/Sinks.hpp +++ b/Source/Logging/AuLogSinks.hpp @@ -1,7 +1,7 @@ /*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. - File: Sinks.hpp + File: AuLogSinks.hpp Date: 2022-1-21 Author: Reece ***/ diff --git a/Source/Logging/Logger.cpp b/Source/Logging/AuLogger.cpp similarity index 95% rename from Source/Logging/Logger.cpp rename to Source/Logging/AuLogger.cpp index a912013b..3e473393 100644 --- a/Source/Logging/Logger.cpp +++ b/Source/Logging/AuLogger.cpp @@ -1,12 +1,12 @@ /*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. - File: Logger.cpp + File: AuLogger.cpp Date: 2022-1-21 Author: Reece ***/ #include -#include "Logger.hpp" +#include "AuLogger.hpp" #include #include @@ -24,7 +24,7 @@ namespace Aurora::Logging AuMemset(shouldFilter, 0, sizeof(shouldFilter)); { AU_LOCK_GUARD(gGlobalSpin); - AuTryInsert(gFlushableLoggers, this); + SysAssert(AuTryInsert(gFlushableLoggers, this)); } } @@ -134,15 +134,8 @@ namespace Aurora::Logging void Logger::PopFilter() { - try - { - AU_LOCK_GUARD(spin); - filters.pop_back(); - } - catch (...) - { - - } + AU_LOCK_GUARD(this->spin); + this->filters.pop_back(); } void ForceFlushLoggers() @@ -362,13 +355,13 @@ namespace Aurora::Logging { try { - auto logger = _new Logger(sinks); - if (!logger) + auto pLogger = _new Logger(sinks); + if (!pLogger) { return nullptr; } - return logger; + return pLogger; } catch (...) { @@ -377,8 +370,8 @@ namespace Aurora::Logging } } - AUKN_SYM void NewLoggerRelease(ILogger *logger) + AUKN_SYM void NewLoggerRelease(ILogger *pLogger) { - AuSafeDelete(logger); + AuSafeDelete(pLogger); } } \ No newline at end of file diff --git a/Source/Logging/Logger.hpp b/Source/Logging/AuLogger.hpp similarity index 98% rename from Source/Logging/Logger.hpp rename to Source/Logging/AuLogger.hpp index 1c6b06aa..0f44da29 100644 --- a/Source/Logging/Logger.hpp +++ b/Source/Logging/AuLogger.hpp @@ -1,7 +1,7 @@ /*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. - File: Logger.hpp + File: AuLogger.hpp Date: 2022-1-21 Author: Reece ***/ diff --git a/Source/Logging/Logging.cpp b/Source/Logging/AuLogging.cpp similarity index 95% rename from Source/Logging/Logging.cpp rename to Source/Logging/AuLogging.cpp index d0cf52b1..ee4b8563 100644 --- a/Source/Logging/Logging.cpp +++ b/Source/Logging/AuLogging.cpp @@ -1,12 +1,12 @@ /*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. - File: Logging.cpp + File: AuLogging.cpp Date: 2022-1-21 Author: Reece ***/ #include -#include "Logger.hpp" +#include "AuLogger.hpp" #include #include diff --git a/Source/Logging/Sinks/DirLogArchive.cpp b/Source/Logging/Sinks/DirLogArchive.cpp index f19564e3..60fa37d5 100644 --- a/Source/Logging/Sinks/DirLogArchive.cpp +++ b/Source/Logging/Sinks/DirLogArchive.cpp @@ -11,7 +11,8 @@ namespace Aurora::Logging::Sinks { - static void EraseFilesByTimestamp(AuUInt32 maxLogs, const AuString &path, /*const its not worth reallocation*/ AuList &files) + static void EraseFilesByTimestamp(AuUInt32 maxLogs, + const AuString &path, /*const its not worth reallocation*/ AuList &files) { if (files.size() <= maxLogs) { @@ -60,7 +61,9 @@ namespace Aurora::Logging::Sinks // Didn't auRuntime v1.0 have this? } - IBasicSink *NewDirectoryLoggerNew(const AuString &baseDirectory, DirectoryLogger meta, bool binary) + IBasicSink *NewDirectoryLoggerNew(const AuString &baseDirectory, + DirectoryLogger meta, + bool bBinary) { AuString path; @@ -72,11 +75,11 @@ namespace Aurora::Logging::Sinks CleanupOldLogs(meta, baseDirectory); - return Sinks::NewFileSinkNew(path, binary); + return Sinks::NewFileSinkNew(path, bBinary); } - void NewDirectoryLoggerRelease(IBasicSink *logger) + void NewDirectoryLoggerRelease(IBasicSink *pLogger) { - Sinks::NewFileSinkRelease(logger); + Sinks::NewFileSinkRelease(AuStaticCast(pLogger)); } } \ No newline at end of file diff --git a/Source/Logging/Sinks/FileSink.cpp b/Source/Logging/Sinks/FileSink.cpp index 8eb80584..41c6a270 100644 --- a/Source/Logging/Sinks/FileSink.cpp +++ b/Source/Logging/Sinks/FileSink.cpp @@ -10,7 +10,9 @@ namespace Aurora::Logging::Sinks { - FIOSink::FIOSink(const AuString &path, bool binary) : path_(path), binary_(binary) + FIOSink::FIOSink(const AuString &path, bool bBinary) : + path_(path), + bBinary_(bBinary) { } @@ -22,14 +24,14 @@ namespace Aurora::Logging::Sinks return static_cast(this->file_) && static_cast(this->logMutex_); } - void FIOSink::OnMessageBlocking(AuUInt8 level, const ConsoleMessage &msg) + void FIOSink::OnMessageBlocking(AuUInt8 uLevel, const ConsoleMessage &msg) { AU_LOCK_GUARD(this->logMutex_); - auto str = msg.ToPersistentString(); + auto str = this->FormatMessageHelper(uLevel, msg, false, true, false); auto startOffset = this->logBuffer_.GetWriteOffset(); - if (this->binary_) + if (this->bBinary_) { msg.Write(this->logBuffer_); } @@ -51,7 +53,8 @@ namespace Aurora::Logging::Sinks } } - bool FIOSink::OnMessageNonblocking(AuUInt8 level, const ConsoleMessage &msg) + bool FIOSink::OnMessageNonblocking(AuUInt8 uLevel, + const ConsoleMessage &msg) { return true; } @@ -74,22 +77,22 @@ namespace Aurora::Logging::Sinks this->logBuffer_.ResetPositions(); } - IBasicSink *NewFileSinkNew(const AuString &str, bool binary) + IFormattedSink *NewFileSinkNew(const AuString &str, bool bBinary) { try { - auto logger = _new FIOSink(str, binary); - if (!logger) + auto pLogger = _new FIOSink(str, bBinary); + if (!pLogger) { return nullptr; } - if (!logger->Init()) + if (!pLogger->Init()) { return nullptr; } - return logger; + return pLogger; } catch (...) { @@ -97,8 +100,8 @@ namespace Aurora::Logging::Sinks } } - void NewFileSinkRelease(IBasicSink *logger) + void NewFileSinkRelease(IFormattedSink *pLogger) { - AuSafeDelete(logger); + AuSafeDelete(pLogger); } } \ No newline at end of file diff --git a/Source/Logging/Sinks/FileSink.hpp b/Source/Logging/Sinks/FileSink.hpp index 982db2c7..9a0a8756 100644 --- a/Source/Logging/Sinks/FileSink.hpp +++ b/Source/Logging/Sinks/FileSink.hpp @@ -7,11 +7,13 @@ ***/ #pragma once +#include "../AuFormatterContainer.hpp" + namespace Aurora::Logging::Sinks { - struct FIOSink : IBasicSink + struct FIOSink : IFormattedSink { - FIOSink(const AuString &path, bool binary); + FIOSink(const AuString &path, bool bBinary); bool Init(); @@ -22,11 +24,12 @@ namespace Aurora::Logging::Sinks private: const AuString path_; AuIOFS::OpenWriteUnique_t file_; - bool binary_; + bool bBinary_; AuByteBuffer logBuffer_; AuThreadPrimitives::MutexUnique_t logMutex_; + ADD_FORMATTER_CONTAINER; }; - void NewFileSinkRelease(IBasicSink *logger); - IBasicSink *NewFileSinkNew(const AuString &str, bool binary); + void NewFileSinkRelease(IFormattedSink *logger); + IFormattedSink *NewFileSinkNew(const AuString &str, bool bBinary); } \ No newline at end of file diff --git a/Source/Logging/Sinks/StdConsole.cpp b/Source/Logging/Sinks/StdConsole.cpp index b9bb8490..3abcb08a 100644 --- a/Source/Logging/Sinks/StdConsole.cpp +++ b/Source/Logging/Sinks/StdConsole.cpp @@ -18,11 +18,11 @@ namespace Aurora::Logging::Sinks if (Console::ConsoleTTY::gTTYConsoleEnabled) { - Console::ConsoleTTY::WriteTTYOut(msg); + Console::ConsoleTTY::WriteTTYOut(msg, this->FormatMessageHelper(level, msg, true, false, false)); } else { - Console::ConsoleStd::WriteStdOut(level, msg); + Console::ConsoleStd::WriteStdOut(level, msg, this->FormatMessageHelper(level, msg, true, false, false)); } } @@ -32,11 +32,11 @@ namespace Aurora::Logging::Sinks if (Console::ConsoleTTY::gTTYConsoleEnabled) { - Console::ConsoleTTY::WriteTTYOut(msg); + Console::ConsoleTTY::WriteTTYOut(msg, this->FormatMessageHelper(level, msg, true, false, false)); } else { - Console::ConsoleStd::WriteStdOut(level, msg); + Console::ConsoleStd::WriteStdOut(level, msg, this->FormatMessageHelper(level, msg, true, false, false)); } return {}; @@ -46,11 +46,11 @@ namespace Aurora::Logging::Sinks void ConsoleStdLogger::OnFlush() {} - IBasicSink *NewStdSinkNew() + IFormattedSink *NewStdSinkNew() { return &gStdConsoleSink; } - void NewStdSinkRelease(IBasicSink *registry) + void NewStdSinkRelease(IFormattedSink *pSink) {} } \ No newline at end of file diff --git a/Source/Logging/Sinks/StdConsole.hpp b/Source/Logging/Sinks/StdConsole.hpp index 0b15e44b..07bca2e5 100644 --- a/Source/Logging/Sinks/StdConsole.hpp +++ b/Source/Logging/Sinks/StdConsole.hpp @@ -7,9 +7,11 @@ ***/ #pragma once +#include "../AuFormatterContainer.hpp" + namespace Aurora::Logging::Sinks { - struct ConsoleStdLogger : IBasicSink + struct ConsoleStdLogger : IFormattedSink { void OnMessageBlocking(AuUInt8 level, const ConsoleMessage &msg) override; bool OnMessageNonblocking(AuUInt8 level, const ConsoleMessage &msg) override; @@ -17,10 +19,12 @@ namespace Aurora::Logging::Sinks private: //StringBuilder stringBuilder_; + + ADD_FORMATTER_CONTAINER; }; inline ConsoleStdLogger gStdConsoleSink; - IBasicSink *NewStdSinkNew(); - void NewStdSinkRelease(IBasicSink *registry); + IFormattedSink *NewStdSinkNew(); + void NewStdSinkRelease(IFormattedSink *registry); } \ No newline at end of file