AuroraRuntime/Source/Console/Hooks/Hooks.cpp

83 lines
2.1 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 Threading::Primitives::MutexUnique_t gMutex;
static AuList<Hooks::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);
}
void WriteLine(const ConsoleMessage &msg)
{
AU_LOCK_GUARD(gMutex);
if (msg.line.find('\n') == std::string::npos) [[likely]]
{
for (const auto &callback : gLineFunctionalCallbacks)
{
callback(msg);
}
for (const auto &sub : gLineSubscribers)
{
sub->OnMessage(msg);
}
}
else [[unlikely]]
{
Aurora::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 = Threading::Primitives::MutexUnique();
}
void Deinit()
{
gLineFunctionalCallbacks.clear();
gLineSubscribers.clear();
gMutex.reset();
}
}