From 7d9a842788cc7641a1d03a956d8d4f3d9cf426f6 Mon Sep 17 00:00:00 2001 From: Kaian Date: Mon, 19 Nov 2018 14:00:19 +0100 Subject: [PATCH] ncurses: refactored msg diff win functions --- CMakeLists.txt | 2 +- src/ncurses/call_flow_win.c | 21 +- src/ncurses/call_list_win.c | 4 +- src/ncurses/call_raw_win.c | 2 +- src/ncurses/manager.c | 7 +- src/ncurses/{ui_msg_diff.c => msg_diff_win.c} | 205 ++++++++++-------- src/ncurses/{ui_msg_diff.h => msg_diff_win.h} | 74 ++----- src/ncurses/ui_save.c | 2 +- src/ncurses/ui_settings.c | 2 +- src/ncurses/window.h | 6 +- 10 files changed, 154 insertions(+), 171 deletions(-) rename src/ncurses/{ui_msg_diff.c => msg_diff_win.c} (67%) rename src/ncurses/{ui_msg_diff.h => msg_diff_win.h} (62%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 65118df..cb44e7e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,7 +39,7 @@ set(SOURCES src/ncurses/call_raw_win.c src/ncurses/column_select_win.c src/ncurses/filter_win.c - src/ncurses/ui_msg_diff.c + src/ncurses/msg_diff_win.c src/ncurses/ui_save.c src/ncurses/ui_settings.c src/ncurses/stats_win.c diff --git a/src/ncurses/call_flow_win.c b/src/ncurses/call_flow_win.c index 2571aac..79c3e7a 100644 --- a/src/ncurses/call_flow_win.c +++ b/src/ncurses/call_flow_win.c @@ -35,7 +35,7 @@ #include "ncurses/manager.h" #include "ncurses/call_flow_win.h" #include "ncurses/call_raw_win.h" -#include "ncurses/ui_msg_diff.h" +#include "ncurses/msg_diff_win.h" #include "ncurses/ui_save.h" #include "timeval.h" #include "glib-utils.h" @@ -1367,7 +1367,7 @@ static int call_flow_handle_key(Window *window, int key) { int raw_width; - Window *next_ui, *next_window; + Window *next_window; Call *call = NULL; guint rnpag_steps = (guint) setting_get_intvalue(SETTING_CF_SCROLLSTEP); int action = -1; @@ -1472,10 +1472,9 @@ call_flow_handle_key(Window *window, int key) dialog_run("Saving is not possible when multiple input sources are specified."); break; } - next_ui = ncurses_create_window(PANEL_SAVE); - save_set_group(next_ui, info->group); - save_set_msg(next_ui, - call_flow_arrow_message(g_ptr_array_index(info->darrows, info->cur_idx))); + next_window = ncurses_create_window(WINDOW_SAVE); + save_set_group(next_window, info->group); + save_set_msg(next_window, call_flow_arrow_message(g_ptr_array_index(info->darrows, info->cur_idx))); break; case ACTION_TOGGLE_TIME: info->arrowtime = (info->arrowtime) ? false : true; @@ -1488,10 +1487,10 @@ call_flow_handle_key(Window *window, int key) info->selected = -1; } else { // Show diff panel - next_ui = ncurses_create_window(PANEL_MSG_DIFF); - msg_diff_set_msgs(next_ui, - call_flow_arrow_message(g_ptr_array_index(info->darrows, info->selected)), - call_flow_arrow_message(g_ptr_array_index(info->darrows, info->cur_idx))); + next_window = ncurses_create_window(WINDOW_MSG_DIFF); + msg_diff_win_set_msgs(next_window, + call_flow_arrow_message(g_ptr_array_index(info->darrows, info->selected)), + call_flow_arrow_message(g_ptr_array_index(info->darrows, info->cur_idx))); } } break; @@ -1503,7 +1502,7 @@ call_flow_handle_key(Window *window, int key) next_window = ncurses_create_window(WINDOW_CALL_RAW); call_raw_win_set_group(next_window, info->group); call_raw_win_set_msg(next_window, - call_flow_arrow_message(g_ptr_array_index(info->darrows, info->cur_idx))); + call_flow_arrow_message(g_ptr_array_index(info->darrows, info->cur_idx))); break; case ACTION_CLEAR_CALLS: case ACTION_CLEAR_CALLS_SOFT: diff --git a/src/ncurses/call_list_win.c b/src/ncurses/call_list_win.c index f8a49ab..981e0ea 100644 --- a/src/ncurses/call_list_win.c +++ b/src/ncurses/call_list_win.c @@ -931,7 +931,7 @@ call_list_handle_key(Window *window, int key) dialog_run("Saving is not possible when multiple input sources are specified."); break; } - save_set_group(ncurses_create_window(PANEL_SAVE), info->group); + save_set_group(ncurses_create_window(WINDOW_SAVE), info->group); break; case ACTION_CLEAR: // Clear group calls @@ -953,7 +953,7 @@ call_list_handle_key(Window *window, int key) info->autoscroll = (info->autoscroll) ? 0 : 1; break; case ACTION_SHOW_SETTINGS: - ncurses_create_window(PANEL_SETTINGS); + ncurses_create_window(WINDOW_SETTINGS); break; case ACTION_SELECT: call = g_ptr_array_index(info->dcalls, info->cur_idx); diff --git a/src/ncurses/call_raw_win.c b/src/ncurses/call_raw_win.c index 7ddf04a..35212ad 100644 --- a/src/ncurses/call_raw_win.c +++ b/src/ncurses/call_raw_win.c @@ -282,7 +282,7 @@ call_raw_handle_key(Window *window, int key) } if (info->group) { // KEY_S, Display save panel - next_ui = ncurses_create_window(PANEL_SAVE); + next_ui = ncurses_create_window(WINDOW_SAVE); save_set_group(next_ui, info->group); } break; diff --git a/src/ncurses/manager.c b/src/ncurses/manager.c index 318c8e5..0419149 100644 --- a/src/ncurses/manager.c +++ b/src/ncurses/manager.c @@ -40,7 +40,7 @@ #include "ncurses/call_flow_win.h" #include "ncurses/call_raw_win.h" #include "ncurses/filter_win.h" -#include "ncurses/ui_msg_diff.h" +#include "ncurses/msg_diff_win.h" #include "ncurses/column_select_win.h" #include "ncurses/stats_win.h" #include "ncurses/ui_save.h" @@ -221,6 +221,9 @@ ncurses_find_by_type(enum WindowTypes type) case WINDOW_FILTER: window = filter_win_new(); break; + case WINDOW_MSG_DIFF: + window = msg_diff_win_new(); + break; default: break; } @@ -331,7 +334,7 @@ ncurses_default_keyhandler(Window *window, int key) setting_toggle(SETTING_DISPLAY_ALIAS); break; case ACTION_SHOW_SETTINGS: - ncurses_create_window(PANEL_SETTINGS); + ncurses_create_window(WINDOW_SETTINGS); break; case ACTION_TOGGLE_PAUSE: // Pause/Resume capture diff --git a/src/ncurses/ui_msg_diff.c b/src/ncurses/msg_diff_win.c similarity index 67% rename from src/ncurses/ui_msg_diff.c rename to src/ncurses/msg_diff_win.c index 007bd76..3aba438 100644 --- a/src/ncurses/ui_msg_diff.c +++ b/src/ncurses/msg_diff_win.c @@ -28,7 +28,7 @@ */ #include #include -#include "ui_msg_diff.h" +#include "msg_diff_win.h" #include "option.h" /*** @@ -53,65 +53,24 @@ */ /** - * Ui Structure definition for Message Diff panel + * @brief Get panel information structure + * + * All required information of the panel is stored in the info pointer + * of the panel. + * This function will return the pointer to the info structure of the + * panel. + * + * @param ui UI structure pointer + * @return a pointer to the info structure or NULL if no structure exists */ -Window ui_msg_diff = { - .type = PANEL_MSG_DIFF, - .panel = NULL, - .create = msg_diff_create, - .handle_key = NULL, - .destroy = msg_diff_destroy, - .draw = msg_diff_draw, - .help = NULL -}; - -void -msg_diff_create(Window *ui) -{ - int hwidth; - msg_diff_info_t *info; - - // Create a new panel to fill all the screen - window_init(ui, LINES, COLS); - - // Initialize panel specific data - info = g_malloc0(sizeof(msg_diff_info_t)); - - // Store it into panel userptr - set_panel_userptr(ui->panel, (void*) info); - - // Calculate subwindows width - hwidth = ui->width / 2 - 1; - - // Create 2 subwindows, one for each message - info->one_win = subwin(ui->win, ui->height - 2, hwidth, 1, 0); - info->two_win = subwin(ui->win, ui->height - 2, hwidth, 1, hwidth + 1); // Header - Footer - Address - - // Draw a vertical line to separe both subwindows - mvwvline(ui->win, 0, hwidth, ACS_VLINE, ui->height); - - // Draw title - window_set_title(ui, "sngrep - SIP messages flow viewer"); - - // Draw keybindings - msg_diff_draw_footer(ui); -} - -void -msg_diff_destroy(Window *ui) -{ - g_free(msg_diff_info(ui)); - window_deinit(ui); -} - -msg_diff_info_t * +static MsgDiffWinInfo * msg_diff_info(Window *ui) { - return (msg_diff_info_t*) panel_userptr(ui->panel); + return (MsgDiffWinInfo*) panel_userptr(ui->panel); } -int -msg_diff_line_highlight(const char* payload1, const char* payload2, char *highlight) +static int +msg_diff_line_highlight(const char *payload1, const char *payload2, char *highlight) { char search[MAX_SIP_PAYLOAD]; int len; @@ -140,40 +99,33 @@ msg_diff_line_highlight(const char* payload1, const char* payload2, char *highli return 0; } -void -msg_diff_draw_footer(Window *ui) +/** + * @brief Draw panel footer + * + * Usually panel footer contains useful keybidings. This function + * will draw that footer + * + * @param window UI structure pointer + */ +static void +msg_diff_draw_footer(Window *window) { const char *keybindings[] = { key_action_key_str(ACTION_PREV_SCREEN), "Calls Flow", key_action_key_str(ACTION_SHOW_HELP), "Help" }; - window_draw_bindings(ui, keybindings, 4); + window_draw_bindings(window, keybindings, 4); } -int -msg_diff_draw(Window *ui) -{ - // Get panel information - msg_diff_info_t *info = msg_diff_info(ui); - char highlight[MAX_SIP_PAYLOAD]; - - // Draw first message - memset(highlight, 0, sizeof(highlight)); - msg_diff_line_highlight(msg_get_payload(info->one), msg_get_payload(info->two), highlight); - msg_diff_draw_message(info->one_win, info->one, highlight); - // Draw second message - memset(highlight, 0, sizeof(highlight)); - msg_diff_line_highlight(msg_get_payload(info->two), msg_get_payload(info->one), highlight); - msg_diff_draw_message(info->two_win, info->two, highlight); - - // Redraw footer - msg_diff_draw_footer(ui); - - return 0; -} - -int +/** + * @brief Draw a message into a raw subwindow + * + * This function will be called for each message that wants to be draw + * in the panel. + * + */ +static int msg_diff_draw_message(WINDOW *win, Message *msg, char *highlight) { int height, width, line, column; @@ -222,16 +174,93 @@ msg_diff_draw_message(WINDOW *win, Message *msg, char *highlight) return 0; } -int -msg_diff_set_msgs(Window *ui, Message *one, Message *two) +/** + * @brief Redraw panel data + * + * This function will be called from ui manager logic when the panels + * needs to be redrawn. + * + * @param window UI structure pointer + * @return 0 in all cases + */ +static int +msg_diff_draw(Window *window) { - msg_diff_info_t *info; - // Get panel information - info = msg_diff_info(ui); - info->one = one; - info->two = two; + MsgDiffWinInfo *info = msg_diff_info(window); + g_return_val_if_fail(info != NULL, -1); + + char highlight[MAX_SIP_PAYLOAD]; + + // Draw first message + memset(highlight, 0, sizeof(highlight)); + msg_diff_line_highlight(msg_get_payload(info->one), msg_get_payload(info->two), highlight); + msg_diff_draw_message(info->one_win, info->one, highlight); + + // Draw second message + memset(highlight, 0, sizeof(highlight)); + msg_diff_line_highlight(msg_get_payload(info->two), msg_get_payload(info->one), highlight); + msg_diff_draw_message(info->two_win, info->two, highlight); + + // Redraw footer + msg_diff_draw_footer(window); return 0; } + +void +msg_diff_win_set_msgs(Window *window, Message *one, Message *two) +{ + MsgDiffWinInfo *info = msg_diff_info(window); + g_return_if_fail(info != NULL); + + g_return_if_fail(one != NULL); + g_return_if_fail(two != NULL); + + info->one = one; + info->two = two; +} + +void +msg_diff_win_free(Window *window) +{ + MsgDiffWinInfo *info = msg_diff_info(window); + g_return_if_fail(info != NULL); + + g_free(info); + window_deinit(window); +} + +Window * +msg_diff_win_new() +{ + Window *window = g_malloc0(sizeof(Window)); + window->type = WINDOW_MSG_DIFF; + window->destroy = msg_diff_win_free; + window->draw = msg_diff_draw; + + // Create a new panel to fill all the screen + window_init(window, getmaxy(stdscr), getmaxx(stdscr)); + + // Initialize panel specific data + MsgDiffWinInfo *info = g_malloc0(sizeof(MsgDiffWinInfo)); + + // Store it into panel userptr + set_panel_userptr(window->panel, (void*) info); + + // Calculate subwindows width + gint hwidth = window->width / 2 - 1; + + // Create 2 subwindows, one for each message + info->one_win = subwin(window->win, window->height - 2, hwidth, 1, 0); + info->two_win = subwin(window->win, window->height - 2, hwidth, 1, hwidth + 1); // Header - Footer - Address + + // Draw a vertical line to separe both subwindows + mvwvline(window->win, 0, hwidth, ACS_VLINE, window->height); + + // Draw title + window_set_title(window, "sngrep - SIP messages flow viewer"); + + return window; +} diff --git a/src/ncurses/ui_msg_diff.h b/src/ncurses/msg_diff_win.h similarity index 62% rename from src/ncurses/ui_msg_diff.h rename to src/ncurses/msg_diff_win.h index c5ec461..77d66eb 100644 --- a/src/ncurses/ui_msg_diff.h +++ b/src/ncurses/msg_diff_win.h @@ -20,19 +20,20 @@ ** ****************************************************************************/ /** - * @file ui_msg_diff.h + * @file msg_diff_win.h * @author Ivan Alonso [aka Kaian] * * @brief Functions to manage diff display * */ -#ifndef __UI_MSG_DIFF_H -#define __UI_MSG_DIFF_H +#ifndef __SNGREP_MSG_DIFF_WIN_H +#define __SNGREP_MSG_DIFF_WIN_H + #include "config.h" #include "ncurses/manager.h" //! Sorter declaration of struct msg_diff_info -typedef struct msg_diff_info msg_diff_info_t; +typedef struct _MsgDiffWinInfo MsgDiffWinInfo; /** * @brief Call raw status information @@ -40,7 +41,7 @@ typedef struct msg_diff_info msg_diff_info_t; * This data stores the actual status of the panel. It's stored in the * PANEL user pointer. */ -struct msg_diff_info { +struct _MsgDiffWinInfo { //! First message to compare Message *one; //! Second message to compare @@ -59,11 +60,10 @@ struct msg_diff_info { * It will also create an information structure of the panel status and * store it in the panel's userpointer * - * @param ui UI structure pointer * @return the allocated ncurses panel */ -void -msg_diff_create(Window *ui); +Window * +msg_diff_win_new(); /** * @brief Deallocate panel memory @@ -71,57 +71,10 @@ msg_diff_create(Window *ui); * This function will be called from ui manager logic to free * message diff panel memory * - * @param ui UI structure pointer + * @param window UI structure pointer */ void -msg_diff_destroy(Window *ui); - -/** - * @brief Get panel information structure - * - * All required information of the panel is stored in the info pointer - * of the panel. - * This function will return the pointer to the info structure of the - * panel. - * - * @param ui UI structure pointer - * @return a pointer to the info structure or NULL if no structure exists - */ -msg_diff_info_t * -msg_diff_info(Window *ui); - -/** - * @brief Redraw panel data - * - * This function will be called from ui manager logic when the panels - * needs to be redrawn. - * - * @param ui UI structure pointer - * @return 0 in all cases - */ -int -msg_diff_draw(Window *ui); - -/** - * @brief Draw panel footer - * - * Usually panel footer contains useful keybidings. This function - * will draw that footer - * - * @param ui UI structure pointer - */ -void -msg_diff_draw_footer(Window *ui); - -/** - * @brief Draw a message into a raw subwindow - * - * This function will be called for each message that wants to be draw - * in the panel. - * - */ -int -msg_diff_draw_message(WINDOW *win, Message *msg, char *highlight); +msg_diff_win_free(Window *window); /** * @brief Set the panel working messages @@ -129,12 +82,11 @@ msg_diff_draw_message(WINDOW *win, Message *msg, char *highlight); * This function will access the panel information and will set the * msg pointers to the processed messages. * - * @param ui UI structure pointer + * @param window UI structure pointer * @param one Message pointer to be set in the internal info struct * @param two Message pointer to be set in the internal info struct - * @return 0 in all cases */ -int -msg_diff_set_msgs(Window *ui, Message *one, Message *two); +void +msg_diff_win_set_msgs(Window *window, Message *one, Message *two); #endif diff --git a/src/ncurses/ui_save.c b/src/ncurses/ui_save.c index 069463a..733d958 100644 --- a/src/ncurses/ui_save.c +++ b/src/ncurses/ui_save.c @@ -45,7 +45,7 @@ * Ui Structure definition for Save panel */ Window ui_save = { - .type = PANEL_SAVE, + .type = WINDOW_SAVE, .panel = NULL, .create = save_create, .draw = save_draw, diff --git a/src/ncurses/ui_settings.c b/src/ncurses/ui_settings.c index 91e5e99..669b7aa 100644 --- a/src/ncurses/ui_settings.c +++ b/src/ncurses/ui_settings.c @@ -42,7 +42,7 @@ * Ui Structure definition for Settings panel */ Window ui_settings = { - .type = PANEL_SETTINGS, + .type = WINDOW_SETTINGS, .panel = NULL, .create = settings_create, .draw = settings_draw, diff --git a/src/ncurses/window.h b/src/ncurses/window.h index 9f66d86..62edd0e 100644 --- a/src/ncurses/window.h +++ b/src/ncurses/window.h @@ -63,13 +63,13 @@ enum WindowTypes { //! Filters panel WINDOW_FILTER, //! Save to pcap panel - PANEL_SAVE, + WINDOW_SAVE, //! Message comprare - PANEL_MSG_DIFF, + WINDOW_MSG_DIFF, //! Column selector panel WINDOW_COLUMN_SELECT, //! Settings panel - PANEL_SETTINGS, + WINDOW_SETTINGS, //! Stats panel WINDOW_STATS, //! Panel Counter