AuroraRuntime/Source/Console/Hooks/Hooks.cpp
Reece 99c5e1fa65 A pretty large patch not worth breaking up into separate commits
[*] Split up Aurora Async
[*] Split Async app into seperate ThreadPool concept
[*] Fix various OSThread bugs and tls transfer issues
[*] Set default affinity to 0xFFFFFFFF
[*] Update Build script
[+] Add AuTuplePopFront
[+] New Network Interface (unimplemented)
[*] Stub out the interfaces required for a better logger
[*] Fix Win32 ShellExecute bug; windows 11 struggles without explicit com init per the docs - now deferring to thread pool
[*] Update gitignore
[*] Follow XDG home standard
[*] Refactor some namespaces to use the shorthand aliases
[*] Various stability fixes
2021-11-05 17:34:23 +00:00

88 lines
2.2 KiB
C++

/***
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
File: Hooks.cpp
Date: 2021-6-12
Author: Reece
***/
#include <Source/RuntimeInternal.hpp>
#include "Hooks.hpp"
namespace Aurora::Console::Hooks
{
static AuThreadPrimitives::MutexUnique_t gMutex;
static AuList<LineHook_cb> gLineFunctionalCallbacks;
static AuList<AuSPtr<IConsoleSubscriber>> gLineSubscribers;
AUKN_SYM void AddSubscription(const AuSPtr<IConsoleSubscriber> &subscriber)
{
AU_LOCK_GUARD(gMutex);
AuTryInsert(gLineSubscribers, subscriber);
}
AUKN_SYM void RemoveSubscription(const AuSPtr<IConsoleSubscriber> &subscriber)
{
AU_LOCK_GUARD(gMutex);
AuTryDeleteList(gLineSubscribers, subscriber);
}
AUKN_SYM void AddFunctionalHook(LineHook_cb hook)
{
AU_LOCK_GUARD(gMutex);
AuTryInsert(gLineFunctionalCallbacks, hook);
}
AUKN_SYM void SetCallbackAndDisableCmdProcessing(const AuSPtr<Hooks::ITextLineSubscriber> &subscriber)
{
gExternalLineProcessor = subscriber;
}
void WriteLine(const ConsoleMessage &msg)
{
AU_LOCK_GUARD(gMutex);
if (msg.line.find('\n') == AuString::npos) [[likely]]
{
for (const auto &callback : gLineFunctionalCallbacks)
{
callback(msg);
}
for (const auto &sub : gLineSubscribers)
{
sub->OnMessage(msg);
}
}
else [[unlikely]]
{
Parse::SplitNewlines(msg.line,
[&](const AuString &line)
{
ConsoleMessage dup = msg;
dup.line = line;
for (const auto &callback : gLineFunctionalCallbacks)
{
callback(dup);
}
for (const auto &sub : gLineSubscribers)
{
sub->OnMessage(dup);
}
});
}
}
void Init()
{
gMutex = AuThreadPrimitives::MutexUnique();
}
void Deinit()
{
gLineFunctionalCallbacks.clear();
gLineSubscribers.clear();
gMutex.reset();
}
}