source: cpp/common/loggers/loggers.h @ 1097

Last change on this file since 1097 was 1082, checked in by Maciej Komosinski, 4 years ago

Added helper functions for script access

  • Property svn:eol-style set to native
File size: 3.6 KB
Line 
1// This file is a part of Framsticks SDK.  http://www.framsticks.com/
2// Copyright (C) 1999-2019  Maciej Komosinski and Szymon Ulatowski.
3// See LICENSE.txt for details.
4
5#ifndef _COMMON_LOGGERS_H_
6#define _COMMON_LOGGERS_H_
7
8#include <common/log.h>
9#include <common/threads.h>
10#include <common/nonstd_stl.h>
11
12class LoggerBase;
13
14class LoggerManager
15{
16        friend class LoggerBase;
17        vector<LoggerBase*> loggers;
18        void send(int position, const char *obj, const char *method, int level, const char *msg);
19public:
20        int find(LoggerBase *logger)
21        {
22                vector<LoggerBase*>::iterator it = std::find(loggers.begin(), loggers.end(), logger);
23                return it == loggers.end() ? -1 : std::distance(loggers.begin(), it);
24        }
25        int add(LoggerBase *logger);
26        void remove(int i);
27        void remove(LoggerBase *logger);
28        void removeAll();
29        void send(const char *obj, const char *method, int level, const char *msg)
30        {
31                send(int(loggers.size())-1, obj, method, level, msg);
32        }
33        ~LoggerManager() { removeAll(); }
34};
35
36extern THREAD_LOCAL_DECL(LoggerManager, message_handler_manager_instance);
37
38////////////////////////////////////////
39
40class LoggerBase
41{
42        friend class LoggerManager;
43protected:
44        LoggerManager* manager;
45        int options;
46
47public:
48
49        enum LoggerOptions
50        {
51                DontBlock = 1, CannotBeBlocked = 2, Enable = 4, Paused = 8
52        };
53
54        void logPrintf(const char *o, const char *m, int w, const char *bl, ...);
55        void send(const char *obj, const char *method, int level, const char *msg);
56
57        int getOptions() { return options; }
58        bool isEnabled() { return manager ? true : false; }
59        void enable();
60        void disable();
61        bool isPaused() { return (options & Paused) != 0; }
62        void pause();
63        void resume();
64
65        LoggerBase(int opts = 0) :manager(NULL), options(opts)
66        {
67                if (options&Enable) enable();
68        }
69        virtual ~LoggerBase()
70        {
71                disable();
72        }
73
74        virtual void handle(const char *obj, const char *method, int level, const char *msg); ///< implemented by loggers accepting multiline messages. if not implemented, the default handle() splits multiline text into single lines and calls handleSingleLine()
75        virtual void handleSingleLine(const char *obj, const char *method, int level, const char *msg) {}  ///< implemented by loggers expecting single line messages
76};
77
78///////////////////////////////////////////
79
80class LoggerToMemory : public LoggerBase
81{
82protected:
83        int maxlevel, minleveltostore, errcount, warncount, infocount, storedcount;
84        string msgs;
85
86public:
87
88        void reset() { maxlevel = LOG_MIN - 1; errcount = warncount = infocount = storedcount = 0; msgs = ""; }
89
90        enum Options2
91        {
92                StoreFirstMessage = 16, StoreAllMessages = 32
93        };
94
95        int getErrorCount() const   { return errcount; }
96        int getWarningCount() const { return warncount; }
97        int getInfoCount() const    { return infocount; }
98        int getStoredCount() const  { return storedcount; }
99        int getErrorLevel() const   { return maxlevel; }
100        string getMessages() const  { return msgs; }
101        string getCountSummary() const; ///< return the standard "... error(s), ... warning(s), ... message(s)" text (or empty string if count==0)
102        void setStoreOptions(int opts) {options=options&(~(StoreFirstMessage|StoreAllMessages))|(opts&(StoreFirstMessage|StoreAllMessages));}
103       
104        LoggerToMemory(int opts = 0, int minimal_level_to_store = LOG_ERROR) :LoggerBase(opts), minleveltostore(minimal_level_to_store)
105        {
106                reset();
107        }
108
109        void handle(const char *obj, const char *method, int level, const char *msg);
110};
111
112class RedirectingLogger : public LoggerBase
113{
114        LoggerManager *other_manager;
115public:
116        RedirectingLogger(LoggerManager *other_mgr, int opts = 0)
117                :LoggerBase(opts), other_manager(other_mgr) {}
118
119        void handle(const char *obj, const char *method, int level, const char *msg)
120        {
121                other_manager->send(obj, method, level, msg);
122        }
123};
124
125#endif
Note: See TracBrowser for help on using the repository browser.