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>