Annotation of embedaddon/trafshow/help_page.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  *     Copyright (c) 2004 Rinet Corp., Novosibirsk, Russia
        !             3:  *
        !             4:  * Redistribution and use in source forms, with and without modification,
        !             5:  * are permitted provided that this entire comment appears intact.
        !             6:  *
        !             7:  * THIS SOURCE CODE IS PROVIDED ``AS IS'' WITHOUT ANY WARRANTIES OF ANY KIND.
        !             8:  */
        !             9: 
        !            10: #ifdef HAVE_CONFIG_H
        !            11: #include <config.h>
        !            12: #endif
        !            13: 
        !            14: #ifdef HAVE_SLCURSES
        !            15: #include <slcurses.h>
        !            16: #elif  HAVE_NCURSES
        !            17: #include <ncurses.h>
        !            18: #else
        !            19: #include <curses.h>
        !            20: #endif
        !            21: #include <stdio.h>
        !            22: #include <string.h>
        !            23: 
        !            24: #include "trafshow.h"
        !            25: #include "help_page.h"
        !            26: #include "getkey.h"
        !            27: #include "screen.h"
        !            28: #include "selector.h"
        !            29: 
        !            30: static ShowMode help_mode = HelpPage;
        !            31: 
        !            32: struct help_page_entry {
        !            33:        int key;
        !            34:        const char *name;
        !            35:        const char *descr;
        !            36: };
        !            37: 
        !            38: static struct help_page_entry Interfaces_help[] = {
        !            39:  { 'q',                "   Esc",       "Quit the program"      },
        !            40:  { K_CR,       "  Enter",      "Use Arrow-Keys to select Interface to show" },
        !            41:  { K_CTRL('L'),        "  Ctrl-L",     "Refresh screen from scratch" },
        !            42:  { 'r',                "    R",        "Set the screen refresh-period.." },
        !            43:  { 'p',                "    P",        "Set the expired data purge-period.." },
        !            44:  { 'f',                "    F",        "Set the filter expression (empty to reset).." },
        !            45:  { '/',                "    /",        "To search & follow for string in the list.." },
        !            46:  { K_CTRL('_'),        "  Ctrl-/",     "Turn off search & follow mode" },
        !            47:  { 'a',                "    A",        "To aggregate/summarize flows totally.." },
        !            48:  { K_CTRL('R'),        "  Ctrl-R",     "Reset all flow cache totally" },
        !            49:  { 'n',                "    N",        "Toggle numeric values to names conversion" },
        !            50: 
        !            51:  { 0,0,0 }
        !            52: };
        !            53: 
        !            54: static struct help_page_entry NetStat_help[] = {
        !            55:  { 'q',                "   Esc",       "Return to previous page" },
        !            56:  { K_CR,       "  Enter",      "Use Arrow-Keys to select Flow for detail" },
        !            57:  { K_LEFT,     "   Left",      "Rotate show mode left" },
        !            58:  { K_RIGHT,    "  Right",      "Rotate show mode right" },
        !            59:  { K_TAB,      "   Tab",       "Move cursor to backflow if any" },
        !            60:  { K_CTRL('L'),        "  Ctrl-L",     "Refresh screen from scratch" },
        !            61:  { 'r',                "    R",        "Set the screen refresh-period.." },
        !            62:  { 'p',                "    P",        "Set the expired data purge-period.." },
        !            63:  { 'f',                "    F",        "Set the filter expression (empty to reset).." },
        !            64:  { '/',                "    /",        "To search & follow for string in the list.." },
        !            65:  { K_CTRL('_'),        "  Ctrl-/",     "Turn off search & follow mode" },
        !            66:  { 'a',                "    A",        "To aggregate/summarize flows in the list.." },
        !            67:  { K_CTRL('R'),        "  Ctrl-R",     "Reset flow cache on the Interface" },
        !            68:  { 'n',                "    N",        "Toggle numeric values to names conversion" },
        !            69: 
        !            70:  { 0,0,0 }
        !            71: };
        !            72: 
        !            73: ShowMode
        !            74: help_page_mode()
        !            75: {
        !            76:        return help_mode;
        !            77: }
        !            78: 
        !            79: static void
        !            80: scale_size(name, descr)
        !            81:        int *name, *descr;
        !            82: {
        !            83:        *name   = line_factor * (double)HELP_PAGE_NAME;
        !            84:        *descr  = line_factor * (double)HELP_PAGE_DESCR;
        !            85: }
        !            86: 
        !            87: static int
        !            88: help_page_header(dst, size, unused)
        !            89:        char *dst;
        !            90:        int size;
        !            91:        const void *unused;
        !            92: {
        !            93:        int name_sz, desc_sz;
        !            94: 
        !            95:        /* sanity check */
        !            96:        if (!dst || size < 1 || unused)
        !            97:                return 0;
        !            98: 
        !            99:        scale_size(&name_sz, &desc_sz);
        !           100: 
        !           101:        snprintf(dst, size,
        !           102:                 "%-*.*s %-*.*s",
        !           103:                 name_sz, name_sz,      " KeyPress",
        !           104:                 desc_sz, desc_sz,      "Action");
        !           105:        return 0;
        !           106: }
        !           107: 
        !           108: static int
        !           109: help_page_line(dst, size, hp, idx)
        !           110:        char *dst;
        !           111:        int size;
        !           112:        const struct help_page_entry *hp;
        !           113:        int idx;
        !           114: {
        !           115:        int name_sz, desc_sz;
        !           116: 
        !           117:        /* sanity check */
        !           118:        if (!dst || size < 1 || !hp)
        !           119:                return 0;
        !           120: 
        !           121:        scale_size(&name_sz, &desc_sz);
        !           122:        snprintf(dst, size,
        !           123:                 "%-*.*s %-*.*s",
        !           124:                 name_sz, name_sz,      hp[idx].name,
        !           125:                 desc_sz, desc_sz,      hp[idx].descr);
        !           126:        return 0;
        !           127: }
        !           128: 
        !           129: static int
        !           130: help_page_footer(dst, size, topic)
        !           131:        char *dst;
        !           132:        int size;
        !           133:        const char *topic;
        !           134: {
        !           135:        int i, len;
        !           136:        SELECTOR *sp = help_page_selector();
        !           137: 
        !           138:        /* sanity check */
        !           139:        if (!dst || size < 1 || !topic || !sp)
        !           140:                return 0;
        !           141:        i = 0;
        !           142:        len = strlen(topic);
        !           143:        if (len > 0 && len < sp->COLS) {
        !           144:                len = sp->COLS/2 - len/2;
        !           145:                while (i < len) dst[i++] = ' ';
        !           146:        }
        !           147:        (void)strncpy(dst + i, topic, size - i);
        !           148:        dst[size-1] = '\0';
        !           149:        return 0;
        !           150: }
        !           151: 
        !           152: SELECTOR *
        !           153: help_page_selector()
        !           154: {
        !           155:        static SELECTOR *sp = 0;
        !           156:        if (!sp && (sp = selector_init()) != 0) {
        !           157:                int name_sz, desc_sz;
        !           158:                scale_size(&name_sz, &desc_sz);
        !           159: 
        !           160:                sp->window_color = A_REVERSE;
        !           161:                sp->cursor_color = A_NORMAL;
        !           162:                sp->COLS = MIN(name_sz + desc_sz, COLS);
        !           163:                sp->LINES = MIN(sp->COLS/3, LINES);
        !           164:                sp->COL = COLS/2 - sp->COLS/2;
        !           165:                sp->LINE = LINES/2 - sp->LINES/2;
        !           166:                sp->get_header = help_page_header;
        !           167:                sp->get_line = help_page_line;
        !           168:                sp->get_footer = help_page_footer;
        !           169:        }
        !           170:        return sp;
        !           171: }
        !           172: 
        !           173: int
        !           174: help_page_key(idx)
        !           175:        int idx;
        !           176: {
        !           177:        int i;
        !           178:        SELECTOR *sp;
        !           179:        const struct help_page_entry *hp;
        !           180: 
        !           181:        if ((sp = help_page_selector()) == 0)
        !           182:                return -1;
        !           183:        hp = (const struct help_page_entry *)sp->list;
        !           184:        for (i = 0; hp; hp++) {
        !           185:                if (i++ == idx) break;
        !           186:        }
        !           187:        return (hp ? hp->key : -1);
        !           188: }
        !           189: 
        !           190: SELECTOR *
        !           191: help_page_list(mode)
        !           192:        ShowMode mode;
        !           193: {
        !           194:        struct help_page_entry *hp = 0;
        !           195:        char *topic = 0;
        !           196:        SELECTOR *sp;
        !           197: 
        !           198:        switch (mode) {
        !           199:        case Interfaces:
        !           200:                hp = Interfaces_help;
        !           201:                topic = "Interface selection Help";
        !           202:                break;
        !           203:        case NetStat:
        !           204:                hp = NetStat_help;
        !           205:                topic = "Network Flow selection Help";
        !           206:                break;
        !           207:        case FlowDump:  /* no help available */
        !           208:        case HelpPage:  /* help on help?? */
        !           209:                return 0;
        !           210:        }
        !           211: 
        !           212:        if ((sp = help_page_selector()) != 0) {
        !           213:                help_mode = mode;
        !           214:                sp->header = 0; /* unused */
        !           215:                sp->footer = topic;
        !           216:                sp->list = hp;
        !           217:                sp->items = 0;
        !           218:                for (; hp && hp->name; hp++)
        !           219:                        sp->items++;
        !           220:        }
        !           221:        return sp;
        !           222: }
        !           223: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>