// This file is a part of Framsticks SDK. http://www.framsticks.com/ // Copyright (C) 1999-2015 Maciej Komosinski and Szymon Ulatowski. // See LICENSE.txt for details. #include "mhandlers.h" #include void _HmessageSingleLine(const char *o, const char *m, const char *txt, int w) { tlsGetRef(message_handler_manager_instance).send(o, m, txt, w); } THREAD_LOCAL_DEF(MessageHandlerManager, message_handler_manager_instance); void MessageHandlerManager::send(int level, const char *o, const char *m, const char *bl, int w) { if (level >= handlers.size()) level = handlers.size() - 1; bool blocked = 0; for (int i = level; i >= 0; i--) { MessageHandlerBase *r = handlers(i); if ((!(r->options & MessageHandlerBase::Paused)) && ((!blocked) || (r->options & MessageHandlerBase::CannotBeBlocked))) { r->handle(o, m, bl, w); if (!(r->options & MessageHandlerBase::DontBlock)) blocked = 1; } } } int MessageHandlerManager::add(MessageHandlerBase *h) { h->manager = this; handlers += h; return handlers.size() - 1; } void MessageHandlerManager::remove(int i) { MessageHandlerBase *h = handlers(i); h->manager = NULL; handlers.remove(i); } void MessageHandlerManager::remove(MessageHandlerBase *h) { int i; if ((i = handlers.find(h)) < 0) return; remove(i); } void MessageHandlerManager::removeAll() { while (handlers.size() > 0) remove(handlers.size() - 1); } ////////////////////////////////// void MessageHandlerBase::send(const char *o, const char *m, const char *bl, int w) { if (!isEnabled()) return; int level = manager->find(this); if (level >= 0) manager->send(level - 1, o, m, bl, w); } void MessageHandlerBase::Hprintf(const char *o, const char *m, int w, const char *bl, ...) { if (!isEnabled()) return; string buf; va_list argptr; va_start(argptr, bl); buf = ssprintf_va(bl, argptr); va_end(argptr); send(o, m, buf.c_str(), w); } void MessageHandlerBase::enable() { if (isEnabled()) return; tlsGetRef(message_handler_manager_instance).add(this); } void MessageHandlerBase::disable() { if (!isEnabled()) return; tlsGetRef(message_handler_manager_instance).remove(this); } void MessageHandlerBase::pause() { if (isPaused()) return; options |= Paused; } void MessageHandlerBase::resume() { if (!isPaused()) return; options &= ~Paused; } ///////////////////////////////// void MessageHandlerToMemory::handle(const char *o, const char *m, const char *bl, int w) { if (w > maxlevel) maxlevel = w; if (w >= HMLV_INFO) infocount++; if (w >= HMLV_WARN) warncount++; if (w >= HMLV_ERROR) errcount++; if (w >= minleveltostore) { storedcount++; if (options & (StoreFirstMessage | StoreAllMessages)) { if (!((options&StoreFirstMessage) && (msgs.len() > 0))) { if (msgs.len() > 0) msgs += '\n'; msgs += o; msgs += "::"; msgs += m; msgs += " - "; msgs += bl; } } } }