File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / trafshow / help_page.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 16:55:18 2012 UTC (12 years, 3 months ago) by misho
Branches: trafshow, MAIN
CVS tags: v5_2_3p0, v5_2_3, HEAD
trafshow

    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>