/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: Hooks.cpp Date: 2021-6-12 Author: Reece ***/ #include #include "Hooks.hpp" namespace Aurora::Console::Hooks { static Threading::Primitives::MutexUnique_t gMutex; static AuList gLineFunctionalCallbacks; static AuList> gLineSubscribers; AUKN_SYM void AddSubscription(const AuSPtr &subscriber) { AU_LOCK_GUARD(gMutex); AuTryInsert(gLineSubscribers, subscriber); } AUKN_SYM void RemoveSubscription(const AuSPtr &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(); } }