summaryrefslogtreecommitdiffstats
path: root/client/log.c
blob: 86b6e4a1cc3298301966d0f4f79c70570c2d31b9 (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
#include "mainwin.h"
#include "support.h"

#include "log.h"

static GtkListStore *log_list_store = NULL;
enum { COLUMN_TIME, COLUMN_TYPE, COLUMN_SOURCE, COLUMN_DESTINATION, COLUMN_DECISION, N_COLUMNS };

void log_widget_init() {
    GtkTreeView *tv = GTK_TREE_VIEW(lookup_widget(get_main_window(), "log_view"));

    log_list_store = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
    gtk_tree_view_set_model(tv, GTK_TREE_MODEL(log_list_store));

    gtk_tree_view_append_column(tv, gtk_tree_view_column_new_with_attributes("Time", gtk_cell_renderer_text_new(), "text", COLUMN_TIME, NULL));
    gtk_tree_view_append_column(tv, gtk_tree_view_column_new_with_attributes("Type", gtk_cell_renderer_text_new(), "text", COLUMN_TYPE, NULL));
    gtk_tree_view_append_column(tv, gtk_tree_view_column_new_with_attributes("Source", gtk_cell_renderer_text_new(), "text", COLUMN_SOURCE, NULL));
    gtk_tree_view_append_column(tv, gtk_tree_view_column_new_with_attributes("Destination", gtk_cell_renderer_text_new(), "text", COLUMN_DESTINATION, NULL));
    gtk_tree_view_append_column(tv, gtk_tree_view_column_new_with_attributes("Decision", gtk_cell_renderer_text_new(), "text", COLUMN_DECISION, NULL));
}


void log_widget_append(conn_info_t *ci) {
    gtk_list_store_append(log_list_store, &ci->iter);
    gtk_list_store_set(log_list_store, &ci->iter,
                       COLUMN_TIME, ci->timestamp_string,
                       COLUMN_TYPE, ci->type_string, 
                       COLUMN_SOURCE, ci->from_string,
                       COLUMN_DESTINATION, ci->to_string,
                       COLUMN_DECISION, "outstanding...",
                       -1);

    log_widget_cut();
    
    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(get_main_window(), "autoscroll_button")))) {
        GtkTreeView *tv = GTK_TREE_VIEW(lookup_widget(get_main_window(), "log_view"));
        GtkTreePath *path;

        path = gtk_tree_model_get_path(gtk_tree_view_get_model(tv), &ci->iter);
        gtk_tree_view_set_cursor(tv, path, NULL, FALSE);
        gtk_tree_view_scroll_to_cell(tv, path, NULL, TRUE, .5, 0);
        gtk_tree_path_free(path);
    }
}

void log_widget_verdict(conn_info_t *ci, verdict_t v) {
    gtk_list_store_set(log_list_store, &ci->iter,
                       COLUMN_DECISION, v == VERDICT_REJECT ? "REJECTED" : (v == VERDICT_DROP ? "DROPPPED" : "ACCEPTED"),
                       -1);
}

void log_widget_clear() {
    gtk_list_store_clear(log_list_store);
}


void log_widget_cut() {
    gfloat m = gtk_spin_button_get_value(GTK_SPIN_BUTTON(lookup_widget(get_main_window(), "log_spinbutton")));

    if (m < 10)
        m = 10;

    while (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(log_list_store), NULL) > m) {
        GtkTreeIter iter;
        if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(log_list_store), &iter))
            return;
        
        gtk_list_store_remove(log_list_store, &iter);
    }
    
}