blob: 80c19ad8c5ed08950db0eb7a25cc0743cc0faf0f [file] [log] [blame]
#ifndef COMPACTDISPLAY_H
#define COMPACTDISPLAY_H
#include <new>
#include <stdexcept>
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdint>
extern "C"
{
#include <unistd.h>
#include <time.h>
}
#include <GenericDisplay.h>
#include <map_types.h>
#include <DrbdResource.h>
#include <DrbdConnection.h>
#include <DrbdVolume.h>
#include <DrbdRole.h>
#include <MessageLog.h>
#include <Configurable.h>
#include <ConfigOption.h>
class CompactDisplay : public GenericDisplay, public Configurable
{
public:
static const std::string OPT_NO_HEADER_KEY;
static const std::string OPT_NO_HOTKEYS_KEY;
static const std::string OPT_ASCII_KEY;
static const std::string HDR_SPACER;
static const std::string NODE_DSP_PREFIX;
static const std::string TRUNC_MARKER;
static const ConfigOption OPT_NO_HEADER;
static const ConfigOption OPT_NO_HOTKEYS;
static const ConfigOption OPT_ASCII;
static const char* F_NORM;
static const char* F_WARN;
static const char* F_ALERT;
static const char* F_RESET;
static const char* F_MARK;
static const char* F_HEADER;
static const char* F_RES_NORM;
static const char* F_RES_NAME_NORM;
static const char* F_RES_NAME_ALERT;
static const char* F_VOL_NORM;
static const char* F_VOL_CLIENT;
static const char* F_VOL_MINOR;
static const char* F_CONN_NORM;
static const char* F_PRIMARY;
static const char* F_SECONDARY;
static const char* F_CONN_PRI_FG;
static const char* F_RES_NAME;
static const char* F_RES_COUNT;
static const char* F_PRB_COUNT;
static const char* F_CURSOR_POS;
static const char* F_HOTKEY;
static const char* F_ALERT_HOTKEY;
static const char* UTF8_PRIMARY;
static const char* UTF8_SECONDARY;
static const char* UTF8_CONN_GOOD;
static const char* UTF8_CONN_BAD;
static const char* UTF8_DISK_GOOD;
static const char* UTF8_DISK_BAD;
static const char* UTF8_MARK_OFF;
static const char* UTF8_MARK_ON;
static const char* ASCII_PRIMARY;
static const char* ASCII_SECONDARY;
static const char* ASCII_CONN_GOOD;
static const char* ASCII_CONN_BAD;
static const char* ASCII_DISK_GOOD;
static const char* ASCII_DISK_BAD;
static const char* ASCII_MARK_OFF;
static const char* ASCII_MARK_ON;
static const char* ANSI_CLEAR;
static const char* ANSI_CLEAR_LINE;
static const char* ANSI_CURSOR_OFF;
static const char* ANSI_CURSOR_ON;
static const char HOTKEY_PGUP;
static const char HOTKEY_PGDN;
static const char HOTKEY_PGZERO;
static const std::string LABEL_MESSAGES;
static const std::string LABEL_MONITOR;
static const std::string LABEL_PROBLEMS;
static const std::string LABEL_STATUS;
static const std::string LABEL_PGUP;
static const std::string LABEL_PGDN;
static const std::string LABEL_PGZERO;
static const uint16_t INDENT_STEP_SIZE;
static const uint16_t OUTPUT_BUFFER_SIZE;
static const uint16_t MIN_SIZE_X;
static const uint16_t MAX_SIZE_X;
static const uint16_t MIN_SIZE_Y;
static const uint16_t MAX_SIZE_Y;
static const int RES_NAME_WIDTH;
static const int ROLE_WIDTH;
static const int VOL_NR_WIDTH;
static const int MINOR_NR_WIDTH;
static const int CONN_NAME_WIDTH;
static const int CONN_STATE_WIDTH;
static const int DISK_STATE_WIDTH;
static const int REPL_STATE_WIDTH;
static const uint16_t MIN_NODENAME_DSP_LENGTH;
static const uint32_t MAX_YIELD_LOOP;
// @throws std::bad_alloc
CompactDisplay(
ResourcesMap& resources_map_ref,
MessageLog& log_ref,
HotkeysMap& hotkeys_info_ref,
const std::string* const node_name_ref
);
CompactDisplay(const CompactDisplay& orig) = delete;
CompactDisplay& operator=(const CompactDisplay& orig) = delete;
CompactDisplay(CompactDisplay&& orig) = delete;
CompactDisplay& operator=(CompactDisplay&& orig) = delete;
virtual ~CompactDisplay() noexcept override;
virtual void clear();
virtual void initial_display() override;
virtual void status_display() override;
virtual void display_header() const override;
virtual void display_hotkeys_info() const;
virtual void display_counts() const;
virtual void set_terminal_size(uint16_t size_x, uint16_t size_y) override;
virtual void set_utf8(bool enable);
// @throws std::bad_alloc
virtual void announce_options(Configurator& collector) override;
virtual void options_help() noexcept override;
// @throws std::bad_alloc
virtual void set_flag(std::string& key) override;
// @throws std::bad_alloc
virtual void set_option(std::string& key, std::string& value) override;
virtual void key_pressed(const char key) override;
private:
ResourcesMap& resources_map;
MessageLog& log;
HotkeysMap& hotkeys_info;
int output_fd {STDOUT_FILENO};
bool dsp_msg_active {false};
bool dsp_problems_active {false};
bool problem_alert {false};
uint64_t problem_count {0};
uint16_t page {0};
uint32_t page_start {0};
uint32_t page_end {0};
uint16_t term_x {80};
uint16_t term_y {25};
uint16_t node_dsp_length {0};
uint16_t current_x {0};
uint32_t current_y {0};
bool show_header {true};
bool show_hotkeys {true};
bool enable_term_size {true};
bool enable_utf8 {true};
const char* pri_icon {UTF8_PRIMARY};
const char* sec_icon {UTF8_SECONDARY};
const char* conn_good {UTF8_CONN_GOOD};
const char* conn_bad {UTF8_CONN_BAD};
const char* disk_good {UTF8_DISK_GOOD};
const char* disk_bad {UTF8_DISK_BAD};
const char* mark_off {UTF8_MARK_OFF};
const char* mark_on {UTF8_MARK_ON};
uint16_t indent_level {0};
char* indent_buffer {nullptr};
std::unique_ptr<char[]> indent_buffer_mgr {nullptr};
char *output_buffer {nullptr};
std::unique_ptr<char[]> output_buffer_mgr {nullptr};
std::unique_ptr<std::string> node_label {nullptr};
const std::string* const node_name;
// 20 ms delay
struct timespec write_retry_delay {0, 20000000};
bool list_resources();
void list_connections(DrbdResource& res);
void list_volumes(DrbdResource& res);
void show_volume(DrbdVolume& vol, bool peer_volume, bool long_format);
void list_peer_volumes(DrbdConnection& conn);
void increase_indent();
void decrease_indent();
void reset_indent();
void reset_positions();
void indent();
bool next_column(uint16_t length);
void next_line();
void prepare_flags();
void write_char(const char ch) const noexcept;
void write_text(const char* text) const noexcept;
void write_fmt(const char* format, ...) const noexcept;
void write_buffer(const char* buffer, size_t length) const noexcept;
};
#endif /* COMPACTDISPLAY_H */