Subversion Repositories tpanel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 andreas 1
/*
21 andreas 2
 * Copyright (C) 2020, 2021 by Andreas Theofilu <andreas@theosys.at>
2 andreas 3
 *
4
 * This program is free software; you can redistribute it and/or modify
5
 * it under the terms of the GNU General Public License as published by
6
 * the Free Software Foundation; either version 3 of the License, or
7
 * (at your option) any later version.
8
 *
9
 * This program is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * GNU General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU General Public License
15
 * along with this program; if not, write to the Free Software Foundation,
16
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
17
 */
18
#ifndef __TERROR_H__
19
#define __TERROR_H__
20
 
21
#include <iostream>
22
#include <iomanip>
23
#include <iostream>
24
#include <sstream>
25
#include <string>
35 andreas 26
#include <chrono>
2 andreas 27
 
22 andreas 28
#define LPATH_FILE          1   //!< Creates a log file and protocolls there
29
#define LPATH_SYSLOG        2   //!< Writes to the syslog.
23 andreas 30
#define LOGPATH             LPATH_FILE
22 andreas 31
 
23 andreas 32
#define HLOG_NONE           0x0000
33
#define HLOG_INFO           0x0001
34
#define HLOG_WARNING        0x0002
35
#define HLOG_ERROR          0x0004
36
#define HLOG_TRACE          0x0008
37
#define HLOG_DEBUG          0x0010
59 andreas 38
#define HLOG_PROTOCOL       (HLOG_INFO | HLOG_WARNING | HLOG_ERROR)
39
#define HLOG_ALL            (HLOG_INFO | HLOG_WARNING | HLOG_ERROR | HLOG_TRACE | HLOG_DEBUG)
2 andreas 40
 
14 andreas 41
#define SLOG_NONE           "NONE"
42
#define SLOG_INFO           "INFO"
43
#define SLOG_WARNING        "WARNING"
44
#define SLOG_ERROR          "ERROR"
45
#define SLOG_TRACE          "TRACE"
46
#define SLOG_DEBUG          "DEBUG"
47
#define SLOG_PROTOCOL       "PROTOCOL"
48
#define SLOG_ALL            "ALL"
2 andreas 49
 
50
typedef enum terrtype_t
51
{
14 andreas 52
    TERRNONE,
53
    TERRINFO,
54
    TERRWARNING,
55
    TERRERROR,
56
    TERRTRACE,
57
    TERRDEBUG
2 andreas 58
}terrtype_t;
59
 
60
std::ostream& indent(std::ostream& os);
61
 
62
class TStreamError
63
{
14 andreas 64
    public:
65
        TStreamError(const std::string& logFile, const std::string& logLevel);
66
        ~TStreamError();
2 andreas 67
 
23 andreas 68
        static void setLogFile(const std::string& lf);
69
        static void setLogFileOnly(const std::string& lf) { mLogfile = lf; }
14 andreas 70
        static std::string& getLogFile() { return mLogfile; }
71
        static void setLogLevel(const std::string& slv);
23 andreas 72
        static void setLogLevel(unsigned int ll) { mLogLevel = ll; }
14 andreas 73
        static unsigned int getLogLevel() { return mLogLevel; }
74
        static void logMsg(std::ostream& str);
75
        static bool checkFilter(terrtype_t err);
76
        static bool checkFilter(int lv);
77
        friend std::ostream& indent(std::ostream& os);
78
        static void incIndent() { mIndent++; }
79
        static void decIndent();
80
        static int getIndent() { return mIndent; }
242 andreas 81
        static std::ostream *getStream();
14 andreas 82
        static std::string getTime();
23 andreas 83
        static std::ostream *resetFlags(std::ostream *os);
247 andreas 84
        static void resetFlags();
238 andreas 85
        static bool isStreamValid();
86
        static bool isStreamValid(std::ostream& os);
2 andreas 87
 
250 andreas 88
        static void startTemporaryLogLevel(unsigned int l);
89
        static void endTemporaryLogLevel();
90
 
14 andreas 91
    private:
92
        static unsigned int _getLevel(const std::string& slv);
242 andreas 93
        static void _init(bool reinit=false);
2 andreas 94
 
14 andreas 95
        const TStreamError& operator=(const TStreamError& ref);
2 andreas 96
 
14 andreas 97
        static bool mInitialized;
98
        static std::string mLogfile;
99
        static unsigned int mLogLevel;
250 andreas 100
        static unsigned int mLogLevelOld;
101
        static bool haveTemporaryLogLevel;
14 andreas 102
        static int mIndent;
103
        static std::ostream *mStream;
242 andreas 104
        static std::filebuf mOfStream;
105
        static char *mBuffer;
2 andreas 106
};
107
 
108
class TTracer
109
{
14 andreas 110
    public:
239 andreas 111
        TTracer(const std::string msg, int line, char *file);
14 andreas 112
        ~TTracer();
2 andreas 113
 
14 andreas 114
    private:
115
        std::string mHeadMsg;
35 andreas 116
        int mLine{0};
14 andreas 117
        std::string mFile;
35 andreas 118
        std::chrono::steady_clock::time_point mTimePoint;
2 andreas 119
};
120
 
121
class TError : public std::ostream
122
{
14 andreas 123
    public:
124
        static void setErrorMsg(const std::string& msg);
125
        static void setErrorMsg(terrtype_t t, const std::string& msg);
126
        static void setError() { mHaveError = true; }
127
        static std::string& getErrorMsg() { return msError; }
128
        static bool isError() { return mHaveError; }
23 andreas 129
        static bool haveErrorMsg() { return !msError.empty(); }
14 andreas 130
        static terrtype_t getErrorType() { return mErrType; }
23 andreas 131
        static void setErrorType(terrtype_t et) { mErrType = et; }
14 andreas 132
        static std::ostream& append(int lv, std::ostream& os);
242 andreas 133
        static std::string append(int lv);
14 andreas 134
        static TStreamError* Current();
135
        static void clear() { mHaveError = false; msError.clear(); mErrType = TERRNONE; }
136
        static void logHex(char *str, size_t size);
137
        const TError& operator=(const TError& ref);
242 andreas 138
//        static void lock();
139
//        static void unlock();
22 andreas 140
        static void displayMessage(const std::string& msg);
2 andreas 141
 
21 andreas 142
    protected:
143
        static std::string strToHex(const char *str, size_t size, int width, bool format, int indent);
144
 
14 andreas 145
    private:
21 andreas 146
        static std::string toHex(int num, int width);
14 andreas 147
        TError() {};
148
        ~TError();
2 andreas 149
 
14 andreas 150
        static std::string msError;
151
        static bool mHaveError;
152
        static terrtype_t mErrType;
153
        static TStreamError *mCurrent;
154
        std::string mHeadMsg;
2 andreas 155
};
156
 
247 andreas 157
#define MSG_INFO(msg)       { if (TStreamError::checkFilter(HLOG_INFO)) { *TError::Current()->getStream() << TError::append(HLOG_INFO) << msg << std::endl; TStreamError::resetFlags(); }}
158
#define MSG_WARNING(msg)    { if (TStreamError::checkFilter(HLOG_WARNING)) { *TError::Current()->getStream() << TError::append(HLOG_WARNING) << msg << std::endl; TStreamError::resetFlags(); }}
159
#define MSG_ERROR(msg)      { if (TStreamError::checkFilter(HLOG_ERROR)) { *TError::Current()->getStream() << TError::append(HLOG_ERROR) << msg << std::endl; TStreamError::resetFlags(); }}
160
#define MSG_TRACE(msg)      { if (TStreamError::checkFilter(HLOG_TRACE)) { *TError::Current()->getStream() << TError::append(HLOG_TRACE) << msg << std::endl; TStreamError::resetFlags(); }}
161
#define MSG_DEBUG(msg)      { if (TStreamError::checkFilter(HLOG_DEBUG)) { *TError::Current()->getStream() << TError::append(HLOG_DEBUG) << msg << std::endl; TStreamError::resetFlags(); }}
23 andreas 162
 
247 andreas 163
#define MSG_PROTOCOL(msg)   {if (TStreamError::checkFilter(HLOG_PROTOCOL)) { *TError::Current()->getStream() << TError::append(HLOG_PROTOCOL) << msg << std::endl; TStreamError::resetFlags(); }}
93 andreas 164
 
14 andreas 165
#define DECL_TRACER(msg)    TTracer _hidden_tracer(msg, __LINE__, (char *)__FILE__);
2 andreas 166
 
210 andreas 167
#define IS_LOG_INFO()       TStreamError::checkFilter(HLOG_INFO)
168
#define IS_LOG_WARNING()    TStreamError::checkFilter(HLOG_WARNING)
169
#define IS_LOG_ERROR()      TStreamError::checkFilter(HLOG_ERROR)
170
#define IS_LOG_TRACE()      TStreamError::checkFilter(HLOG_TRACE)
171
#define IS_LOG_DEBUG()      TStreamError::checkFilter(HLOG_DEBUG)
172
#define IS_LOG_PROTOCOL()   TStreamError::checkFilter(HLOG_PROTOCOL)
173
#define IS_LOG_ALL()        TStreamError::checkFilter(HLOG_ALL)
174
 
250 andreas 175
#define START_TEMPORARY_TRACE() TStreamError::startTemporaryLogLevel(HLOG_TRACE)
176
#define START_TEMPORARY_DEBUG() TStreamError::startTemporaryLogLevel(HLOG_DEBUG)
177
#define END_TEMPORARY_LOG()     TStreamError::endTemporaryLogLevel()
178
 
2 andreas 179
#endif