summaryrefslogtreecommitdiff
path: root/lib/error_log.cpp
blob: a71e72e1c712c898f84ce9ec6c30d8387998b8c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// **************************************************************************
// * This file is part of the FreeFileSync project. It is distributed under *
// * GNU General Public License: http://www.gnu.org/licenses/gpl.html       *
// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved    *
// **************************************************************************

#include "error_log.h"
#include <zen/time.h>
#include <zen/i18n.h>
#include <algorithm>

using namespace zen;


void ErrorLogging::logMsg(const wxString& message, zen::MessageType type)
{
    Entry newEntry;
    newEntry.type    = type;
    newEntry.time    = std::time(NULL);
    newEntry.message = message;

    messages.push_back(newEntry);

    ++statistics[type];
}


int ErrorLogging::typeCount(int typeFilter) const
{
    int count = 0;

    if (typeFilter & TYPE_INFO)
        count += statistics[TYPE_INFO];
    if (typeFilter & TYPE_WARNING)
        count += statistics[TYPE_WARNING];
    if (typeFilter & TYPE_ERROR)
        count += statistics[TYPE_ERROR];
    if (typeFilter & TYPE_FATAL_ERROR)
        count += statistics[TYPE_FATAL_ERROR];

    return count;
}


std::vector<wxString> ErrorLogging::getFormattedMessages(int typeFilter) const
{
    std::vector<wxString> output;

    std::for_each(messages.begin(), messages.end(),
                  [&](const Entry& entry)
    {
        if (entry.type & typeFilter)
            output.push_back(formatMessage(entry));
    });

    return output;
}


wxString ErrorLogging::formatMessage(const Entry& msg)
{
    wxString typeName;
    switch (msg.type)
    {
        case TYPE_INFO:
            typeName = _("Info");
            break;
        case TYPE_WARNING:
            typeName = _("Warning");
            break;
        case TYPE_ERROR:
            typeName = _("Error");
            break;
        case TYPE_FATAL_ERROR:
            typeName = _("Fatal Error");
            break;
    }

    const wxString prefix = L"[" + formatTime<wxString>(FORMAT_TIME, localTime(msg.time)) + L"] " + typeName + L": ";

    wxString formattedText = prefix;
    for (auto iter = msg.message.begin(); iter != msg.message.end(); )
        if (*iter == L'\n')
        {
            formattedText += L'\n';

            wxString blanks;
            blanks.resize(prefix.size(), L' ');
            formattedText += blanks;

            do //remove duplicate newlines
            {
                ++iter;
            }
            while (iter != msg.message.end() && *iter == L'\n');
        }
        else
            formattedText += *iter++;

    return formattedText;
}
bgstack15