source: cpp/frams/mhandlers/mhandlers.h @ 373

Last change on this file since 373 was 373, checked in by Maciej Komosinski, 9 years ago

Less cryptic variable names

  • Property svn:eol-style set to native
File size: 3.0 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#ifndef _MHANDLERS_H_
6#define _MHANDLERS_H_
[109]7
8#include <frams/util/list.h>
9#include <frams/util/sstring.h>
[372]10#include <common/hmessage.h>
[109]11#include <common/threads.h>
12
[372]13class MessageHandlerBase;
[109]14
[372]15class MessageHandlerManager
[109]16{
[372]17        friend class MessageHandlerBase;
18        SListTempl<MessageHandlerBase*> handlers;
[336]19        void send(int level, const char *o, const char *m, const char *bl, int w);
20public:
[372]21        int find(MessageHandlerBase *r) { return handlers.find(r); }
22        int add(MessageHandlerBase *r);
[336]23        void remove(int i);
[372]24        void remove(MessageHandlerBase *r);
[336]25        void removeAll();
26        void send(const char *o, const char *m, const char *bl, int w)
27        {
28                send(handlers.size() - 1, o, m, bl, w);
29        }
[372]30        ~MessageHandlerManager() { removeAll(); }
[109]31};
32
[372]33extern THREAD_LOCAL_DECL(MessageHandlerManager, message_handler_manager_instance);
[109]34
35////////////////////////////////////////
36
[372]37class MessageHandlerBase
[109]38{
[372]39        friend class MessageHandlerManager;
[336]40protected:
[373]41        MessageHandlerManager* manager;
[336]42        int options;
[109]43
[336]44public:
[109]45
[336]46        enum HandlerOptions
47        {
[372]48                DontBlock = 1, CannotBeBlocked = 2, Enable = 4, Paused = 8
[336]49        };
[109]50
[372]51        void Hprintf(const char *o, const char *m, int w, const char *bl, ...);
[336]52        void send(const char *o, const char *m, const char *bl, int w);
[109]53
[373]54        bool isEnabled() { return manager ? true : false; }
[336]55        void enable();
56        void disable();
57        bool isPaused() { return (options & Paused) != 0; }
58        void pause();
59        void resume();
[109]60
[373]61        MessageHandlerBase(int opts = 0) :manager(NULL), options(opts)
[336]62        {
[372]63                if (options&Enable) enable();
[336]64        }
[372]65        virtual ~MessageHandlerBase()
[336]66        {
67                disable();
68        }
[109]69
[336]70        virtual void handle(const char *o, const char *m, const char *bl, int w) {}
[109]71};
72
73///////////////////////////////////////////
74
[372]75class MessageHandlerToMemory : public MessageHandlerBase
[109]76{
[336]77protected:
[373]78        int maxlevel, minleveltostore, errcount, warncount, storedcount, infocount;
[336]79        SString msgs;
[109]80
[336]81public:
[109]82
[373]83        void reset() { maxlevel = HMLV_INFO - 1; errcount = warncount = storedcount = infocount = 0; msgs = 0; }
[109]84
[336]85        enum Options2
86        {
87                StoreFirstMessage = 16, StoreAllMessages = 32
88        };
[109]89
[336]90        int getErrorCount()       { return errcount; }
91        int getWarningCount()     { return warncount; }
92        int getInfoCount()        { return infocount; }
[373]93        int getStoredCount()      { return storedcount; }
[336]94        int getErrorLevel()       { return maxlevel; }
95        const SString& getMessages() { return msgs; }
[109]96
[373]97        MessageHandlerToMemory(int opts = 0, int minimal_level_to_store = HMLV_ERROR) :MessageHandlerBase(opts), minleveltostore(minimal_level_to_store)
[336]98        {
99                reset();
100        }
[109]101
[336]102        void handle(const char *o, const char *m, const char *bl, int w);
[109]103};
104
[372]105class RedirectingMessageHandler : public MessageHandlerBase
[109]106{
[373]107        MessageHandlerManager *other_manager;
[109]108public:
[373]109        RedirectingMessageHandler(MessageHandlerManager *other_mgr,int opts=0)
110                :MessageHandlerBase(opts), other_manager(other_mgr) {}
[109]111
[336]112        void handle(const char *o, const char *m, const char *bl, int w)
113        {
[373]114                other_manager->send(o, m, bl, w);
[336]115        }
[109]116};
117
118#endif
Note: See TracBrowser for help on using the repository browser.