File: MessageLog.h

package info (click to toggle)
drbd-utils 9.5.0-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 5,388 kB
  • sloc: ansic: 43,698; xml: 15,968; cpp: 7,783; sh: 3,699; makefile: 1,353; perl: 353
file content (101 lines) | stat: -rw-r--r-- 2,574 bytes parent folder | download
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
#ifndef MESSAGELOG_H
#define	MESSAGELOG_H

#include <cstdint>
#include <new>
#include <memory>
#include <stdexcept>

// https://github.com/raltnoeder/cppdsaext
#include <dsaext.h>

extern "C"
{
    #include <sys/time.h>
    #include <time.h>
}

class MessageLog
{
  public:
    static const char* MESSAGES_HEADER;

    static const char* F_ALERT_MARK;
    static const char* F_WARN_MARK;
    static const char* F_INFO_MARK;
    static const char* F_ALERT;
    static const char* F_WARN;
    static const char* F_INFO;
    static const char* F_RESET;

    static const size_t DATE_BUFFER_SIZE;
    static const char*  DATE_FORMAT;
    static const size_t DATE_LENGTH;

    static const std::string CAPACITY_ERROR;

    enum class log_level : uint32_t
    {
        INFO,
        WARN,
        ALERT
    };

    typedef struct entry_s
    {
        log_level    level;
        std::string* message;
    }
    entry;

    class EntriesIterator : dsaext::QIterator<entry>
    {
      public:
        EntriesIterator(const MessageLog& log_ref);
        EntriesIterator(const EntriesIterator& orig) = delete;
        EntriesIterator& operator=(const EntriesIterator& orig) = delete;
        EntriesIterator(EntriesIterator&& orig) = default;
        EntriesIterator& operator=(EntriesIterator&& orig) = default;
        virtual ~EntriesIterator() noexcept override;

        virtual entry* next() override;
        virtual size_t get_size() const override;
        virtual bool has_next() const override;

      private:
        const MessageLog& log_obj;
        size_t iter_index {0};
        bool circular_mode {false};
    };

    // @throws std::bad_alloc, std::out_of_range
    explicit MessageLog(size_t entries);
    MessageLog(const MessageLog& orig) = delete;
    MessageLog& operator=(const MessageLog& orig) = delete;
    MessageLog(MessageLog&& orig) = default;
    MessageLog& operator=(MessageLog&& orig) = delete;
    virtual ~MessageLog() noexcept;

    // @throws std::bad_alloc
    virtual bool has_entries() const;
    virtual void add_entry(log_level level, std::string& message);
    virtual void add_entry(log_level level, const char* message);
    virtual void clear();
    virtual void display_messages(std::FILE* out) const;

  private:
    size_t index    {0};
    bool   filled   {false};
    size_t capacity {0};

    struct timeval utc_time;
    struct tm time_fields;

    std::unique_ptr<entry*[]> log_entries;
    std::unique_ptr<char[]> date_buffer;

    void clear_impl() noexcept;
    bool format_date() noexcept;
};

#endif	/* MESSAGELOG_H */