source: cpp/frams/mhandlers/mhandlers.cpp @ 372

Last change on this file since 372 was 372, checked in by sz, 9 years ago

Renamed some classes and functions to make their purpose more obvious:

All MessageHandlers? must now be given the explicit "Enable" argument if you want them to automatically become active. This makes side effects clearly visible.

  • Property svn:eol-style set to native
File size: 2.8 KB
RevLine 
[286]1// This file is a part of Framsticks SDK.  http://www.framsticks.com/
2// Copyright (C) 1999-2015  Maciej Komosinski and Szymon Ulatowski.
3// See LICENSE.txt for details.
[109]4
[372]5#include "mhandlers.h"
[180]6#include <common/stl-util.h>
[109]7
[372]8void _HmessageSingleLine(const char *o, const char *m, const char *txt, int w)
[109]9{
[372]10        tlsGetRef(message_handler_manager_instance).send(o, m, txt, w);
[109]11}
12
[372]13THREAD_LOCAL_DEF(MessageHandlerManager, message_handler_manager_instance);
[109]14
[372]15void MessageHandlerManager::send(int level, const char *o, const char *m, const char *bl, int w)
[109]16{
[336]17        if (level >= handlers.size()) level = handlers.size() - 1;
18        bool blocked = 0;
19        for (int i = level; i >= 0; i--)
[109]20        {
[372]21                MessageHandlerBase *r = handlers(i);
22                if ((!(r->options & MessageHandlerBase::Paused)) &&
23                        ((!blocked) || (r->options & MessageHandlerBase::CannotBeBlocked)))
[336]24                {
25                        r->handle(o, m, bl, w);
[372]26                        if (!(r->options & MessageHandlerBase::DontBlock)) blocked = 1;
[336]27                }
[109]28        }
29}
30
[372]31int MessageHandlerManager::add(MessageHandlerBase *h)
[109]32{
[336]33        h->mgr = this;
34        handlers += h;
35        return handlers.size() - 1;
[109]36}
37
[372]38void MessageHandlerManager::remove(int i)
[109]39{
[372]40        MessageHandlerBase *h = handlers(i);
[336]41        h->mgr = 0;
42        handlers.remove(i);
[109]43}
44
[372]45void MessageHandlerManager::remove(MessageHandlerBase *h)
[109]46{
[336]47        int i;
48        if ((i = handlers.find(h)) < 0) return;
49        remove(i);
[109]50}
51
[372]52void MessageHandlerManager::removeAll()
[109]53{
[336]54        while (handlers.size() > 0)
55                remove(handlers.size() - 1);
[109]56}
57
58//////////////////////////////////
59
[372]60void MessageHandlerBase::send(const char *o, const char *m, const char *bl, int w)
[109]61{
[336]62        if (!isEnabled()) return;
63        int level = mgr->find(this);
64        if (level >= 0) mgr->send(level - 1, o, m, bl, w);
[109]65}
66
[372]67void MessageHandlerBase::Hprintf(const char *o, const char *m, int w, const char *bl, ...)
[109]68{
[336]69        if (!isEnabled()) return;
70        string buf;
71        va_list argptr;
72        va_start(argptr, bl);
73        buf = ssprintf_va(bl, argptr);
74        va_end(argptr);
75        send(o, m, buf.c_str(), w);
[109]76}
77
78
[372]79void MessageHandlerBase::enable()
[109]80{
[336]81        if (isEnabled()) return;
[372]82        tlsGetRef(message_handler_manager_instance).add(this);
[109]83}
84
[372]85void MessageHandlerBase::disable()
[109]86{
[336]87        if (!isEnabled()) return;
[372]88        tlsGetRef(message_handler_manager_instance).remove(this);
[109]89}
90
[372]91void MessageHandlerBase::pause()
[336]92{
93        if (isPaused()) return;
94        options |= Paused;
95}
96
[372]97void MessageHandlerBase::resume()
[336]98{
99        if (!isPaused()) return;
100        options &= ~Paused;
101}
102
[109]103/////////////////////////////////
104
[372]105void MessageHandlerToMemory::handle(const char *o, const char *m, const char *bl, int w)
[109]106{
[336]107        if (w > maxlevel) maxlevel = w;
[372]108        if (w >= HMLV_INFO) infocount++;
109        if (w >= HMLV_WARN) warncount++;
110        if (w >= HMLV_ERROR) errcount++;
[109]111
[336]112        if (w >= storlevel)
[109]113        {
[336]114                storcount++;
115                if (options & (StoreFirstMessage | StoreAllMessages))
[109]116                {
[336]117                        if (!((options&StoreFirstMessage) && (msgs.len() > 0)))
[109]118                        {
[336]119                                if (msgs.len() > 0) msgs += '\n';
120                                msgs += o; msgs += "::"; msgs += m;
121                                msgs += " - "; msgs += bl;
[109]122                        }
123                }
124        }
125}
Note: See TracBrowser for help on using the repository browser.