wanpipe/util/wancfg/menu_atm_basic_cfg.cpp

391 lines
12 KiB
C++

/***************************************************************************
menu_atm_basic_cfg.cpp - description
-------------------
begin : Tue Oct 11 2005
copyright : (C) 2005 by David Rokhvarg
email : davidr@sangoma.com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "wancfg.h"
#include "text_box.h"
#include "input_box.h"
#include "menu_atm_basic_cfg.h"
#include "list_element_atm_interface.h"
#include "menu_atm_interface_configuration.h"
#define DBG_MENU_ATM_BASIC_CFG 1
typedef struct atm_check_struct{
int vpi;
int vci;
}atm_check_struct_t;
static atm_check_struct_t vpi_vci_check_table[MAX_NUMBER_OF_NET_INTERFACES_PER_WANPIPE];
enum ATM_BASIC_CFG_OPTIONS{
//number large enough not to interfere with interface number
SET_NUMBER_OF_INTERFACES=MAX_NUMBER_OF_NET_INTERFACES_PER_WANPIPE,
EMPTY_LINE
};
//it is just a reasonably big number, which should be enough
#define MAX_NUMBER_OF_INTERFACES SET_NUMBER_OF_INTERFACES
char* atm_number_of_interfaces_help_str =
"Number of ATM interfaces\n"
"------------------------\n"
"\n"
"Number of DLCIs supported by this ATM\n"
"connection.\n"
"\n"
"For each ATM interface, a network\n"
"interface will be created.\n"
"Minimum number is 1, maximum is 100.\n"
"\n"
"Each network interface must be configured with\n"
"an IP address.\n";
menu_atm_basic_cfg::menu_atm_basic_cfg(IN char *lxdialog_path,
IN list_element_chan_def* parent_element_logical_ch)
{
Debug(DBG_MENU_ATM_BASIC_CFG, ("menu_atm_basic_cfg::menu_atm_basic_cfg()\n"));
Debug(DBG_MENU_ATM_BASIC_CFG, ("parent_element_logical_ch->data.name: %s\n",
parent_element_logical_ch->data.name));
snprintf(this->lxdialog_path, MAX_PATH_LENGTH, "%s", lxdialog_path);
this->parent_list_element_logical_ch = parent_element_logical_ch;
name_of_parent_layer = parent_element_logical_ch->data.name;
init_vpi_vci_check_table();
}
menu_atm_basic_cfg::~menu_atm_basic_cfg()
{
Debug(DBG_MENU_ATM_BASIC_CFG,("menu_atm_basic_cfg::~menu_atm_basic_cfg()\n"));
}
void menu_atm_basic_cfg::init_vpi_vci_check_table()
{
for(int i = 0; i < MAX_NUMBER_OF_NET_INTERFACES_PER_WANPIPE; i++){
vpi_vci_check_table[i].vpi = -1;
vpi_vci_check_table[i].vci = -1;
}
}
int menu_atm_basic_cfg::run(OUT int * selection_index)
{
string menu_str;
int rc, old_number_of_atm_interfaces, new_number_of_atm_interfaces, num_of_visible_items;
char tmp_buff[MAX_PATH_LENGTH];
char exit_dialog;
list_element_atm_interface *tmp_atm_if_ptr = NULL;
objects_list* obj_list;
//help text box
text_box tb;
Debug(DBG_MENU_ATM_BASIC_CFG, ("menu_atm_basic_cfg::run()\n"));
again:
rc = YES;
exit_dialog = NO;
menu_str = " ";
obj_list = (objects_list*)parent_list_element_logical_ch->next_objects_list;
if(obj_list == NULL){
ERR_DBG_OUT(("Invalid 'obj_list' pointer!!\n"));
return NO;
}
//number of interface, plus one menu item for "number of interfaces", plus
//two to make it more readable
num_of_visible_items = obj_list->get_size() + 1 + 2;
if(num_of_visible_items > 8){
num_of_visible_items = 8;
}else{
;//do nothing
}
//////////////////////////////////////////////////////////////////////////////////////
create_logical_channels_list_str(menu_str);
//////////////////////////////////////////////////////////////////////////////////////
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", EMPTY_LINE);
menu_str += tmp_buff;
snprintf(tmp_buff, MAX_PATH_LENGTH, " \" \" ");
menu_str += tmp_buff;
//////////////////////////////////////////////////////////////////////////////////////
//create the explanation text for the menu
snprintf(tmp_buff, MAX_PATH_LENGTH,
"\n------------------------------------------\
\n ATM configuration options for\
\nWan Device: %s", name_of_parent_layer);
//list_element_logical_ch->data.name);
if(set_configuration( YES,//indicates to call V2 of the function
MENU_BOX_BACK,//MENU_BOX_SELECT,
lxdialog_path,
"ATM (BASIC) CONFIGURATION",
WANCFG_PROGRAM_NAME,
tmp_buff,
MENU_HEIGTH, MENU_WIDTH,
num_of_visible_items,
(char*)menu_str.c_str()
) == NO){
rc = NO;
goto cleanup;
}
if(show(selection_index) == NO){
rc = NO;
goto cleanup;
}
//////////////////////////////////////////////////////////////////////////////////////
exit_dialog = NO;
switch(*selection_index)
{
case MENU_BOX_BUTTON_SELECT:
Debug(DBG_MENU_ATM_BASIC_CFG, ("option selected for editing: %s\n",
get_lxdialog_output_string()));
switch(atoi(get_lxdialog_output_string()))
{
case SET_NUMBER_OF_INTERFACES:
//intialize to be the same
old_number_of_atm_interfaces = new_number_of_atm_interfaces = obj_list->get_size();
get_new_number_of_interfaces(&old_number_of_atm_interfaces, &new_number_of_atm_interfaces);
if(old_number_of_atm_interfaces != new_number_of_atm_interfaces){
if(adjust_number_of_logical_channels_in_list(WANCONFIG_LIP_ATM, obj_list,
parent_list_element_logical_ch->data.name,
new_number_of_atm_interfaces) == NO){
rc = NO;
goto cleanup;
}
}
break;
case EMPTY_LINE:
//do nothing
break;
default:
//one of the DLCIs was selected for configuration
Debug(DBG_MENU_ATM_BASIC_CFG, ("default case selection: %d\n", *selection_index));
tmp_atm_if_ptr = (list_element_atm_interface*)obj_list->find_element(
remove_spaces_in_int_string(get_lxdialog_output_string()));
if(tmp_atm_if_ptr != NULL){
menu_atm_interface_configuration per_atm_if_cfg( lxdialog_path,
obj_list,
tmp_atm_if_ptr);
rc = per_atm_if_cfg.run(selection_index, name_of_parent_layer);
if(rc == YES){
goto again;
}
}else{
ERR_DBG_OUT(("Failed to find ATM inteface in the list! (%s)\n", get_lxdialog_output_string()));
rc = NO;
}
}
break;
case MENU_BOX_BUTTON_HELP:
switch(atoi(get_lxdialog_output_string()))
{
default:
tb.show_help_message(lxdialog_path, NO_PROTOCOL_NEEDED, option_not_implemented_yet_help_str);
break;
}
break;
case MENU_BOX_BUTTON_EXIT:
//check there is NO duplicate VPI/VCI in any of the interfaces
init_vpi_vci_check_table();
if(check_duplicate_vpi_vci_combination(obj_list) == NO){
break;
}
exit_dialog = YES;
break;
}//switch(*selection_index)
if(exit_dialog == NO){
goto again;
}
cleanup:
return rc;
}
int menu_atm_basic_cfg::check_duplicate_vpi_vci_combination(objects_list* obj_list)
{
text_box tb;
list_element_atm_interface *atm_if = NULL;
wan_atm_conf_if_t *atm_if_cfg;
atm_if = (list_element_atm_interface*)obj_list->get_first();
while(atm_if != NULL){
atm_if_cfg = (wan_atm_conf_if_t*)&atm_if->data.chanconf->u;
if(find_vpi_vci_in_check_table(atm_if_cfg->vpi, atm_if_cfg->vci) == YES){
tb.show_error_message(lxdialog_path, NO_PROTOCOL_NEEDED,
"Error: Found duplicate VPI/VCI (%d/%d) pair!", atm_if_cfg->vpi, atm_if_cfg->vci);
return NO;
}
//pair was not found, add it to the table
if(add_vpi_vci_to_check_table(atm_if_cfg->vpi, atm_if_cfg->vci) == NO){
tb.show_error_message(lxdialog_path, NO_PROTOCOL_NEEDED,
"Failed to check for duplicate VPI/VCI pairs! (%d/%d)", atm_if_cfg->vpi, atm_if_cfg->vci);
return YES;
}
//go to next
atm_if = (list_element_atm_interface*)obj_list->get_next_element(atm_if);
}//while()
return YES;
}
int menu_atm_basic_cfg::find_vpi_vci_in_check_table(int vpi, int vci)
{
for(int i = 0; i < MAX_NUMBER_OF_NET_INTERFACES_PER_WANPIPE; i++){
if(vpi_vci_check_table[i].vpi == vpi && vpi_vci_check_table[i].vci == vci ){
return YES;
}
}
return NO;
}
int menu_atm_basic_cfg::add_vpi_vci_to_check_table(int vpi, int vci)
{
for(int i = 0; i < MAX_NUMBER_OF_NET_INTERFACES_PER_WANPIPE; i++){
if(vpi_vci_check_table[i].vpi == -1 && vpi_vci_check_table[i].vci == -1 ){
vpi_vci_check_table[i].vpi = vpi;
vpi_vci_check_table[i].vci = vci;
return YES;
}
}
return NO;
}
int menu_atm_basic_cfg::create_logical_channels_list_str(string& menu_str)
{
char tmp_buff[MAX_PATH_LENGTH];
objects_list *obj_list = (objects_list *)parent_list_element_logical_ch->next_objects_list;
list_element_atm_interface *list_el_chan_def = NULL;
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%d\" ", SET_NUMBER_OF_INTERFACES);
menu_str += tmp_buff;
if(obj_list->get_size() > 0 && obj_list->get_size() <= MAX_NUMBER_OF_INTERFACES){
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Number of interfaces ---> %u\" ", obj_list->get_size());
menu_str += tmp_buff;
list_el_chan_def = (list_element_atm_interface*)obj_list->get_first();
while(list_el_chan_def != NULL){
//set the tag
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"%s\" ", list_el_chan_def->data.addr);
menu_str += tmp_buff;
Debug(DBG_MENU_ATM_BASIC_CFG,
("list_el_chan_def->data.name: %s\n", list_el_chan_def->data.name));
//create the displayed part
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Interface number %s\" ", list_el_chan_def->data.addr);
menu_str += tmp_buff;
//go to next
list_el_chan_def = (list_element_atm_interface*)obj_list->get_next_element(list_el_chan_def);
}//while()
}else if(obj_list->get_size() == 0){
snprintf(tmp_buff, MAX_PATH_LENGTH, " \"Number of interfaces ---> Undefined\" ");
menu_str += tmp_buff;
}else{
ERR_DBG_OUT(("Invalid number of ATM interfaces: %d!!\n", obj_list->get_size()));
return NO;
}
return YES;
}
int menu_atm_basic_cfg::get_new_number_of_interfaces(
int *current_number_of_interfaces,
int *new_number_of_interfaces)
{
int tmp, selection_index;
input_box inb;
char backtitle[MAX_PATH_LENGTH];
char explanation_text[MAX_PATH_LENGTH];
char initial_text[MAX_PATH_LENGTH];
text_box tb;
snprintf(backtitle, MAX_PATH_LENGTH, "WANPIPE Configuration Utility: ");
snprintf(&backtitle[strlen(backtitle)], MAX_PATH_LENGTH,
"%s Setup", get_protocol_string(WANCONFIG_LIP_ATM));
again:
snprintf(explanation_text, MAX_PATH_LENGTH, "Please specify number of ATM interfaces");
snprintf(initial_text, MAX_PATH_LENGTH, "%d", *current_number_of_interfaces);
inb.set_configuration( lxdialog_path,
backtitle,
explanation_text,
INPUT_BOX_HIGTH,
INPUT_BOX_WIDTH,
initial_text);
inb.show(&selection_index);
switch(selection_index)
{
case INPUT_BOX_BUTTON_OK:
Debug(DBG_MENU_ATM_BASIC_CFG, ("num of atm interfaces str: %s\n",
inb.get_lxdialog_output_string()));
tmp = atoi(remove_spaces_in_int_string(inb.get_lxdialog_output_string()));
if(tmp < 0 || tmp > SET_NUMBER_OF_INTERFACES){
tb.show_error_message(lxdialog_path, WANCONFIG_LIP_ATM,
"Invalid number of ATM interfaces!\n\n%s\n", atm_number_of_interfaces_help_str);
goto again;
}else{
*new_number_of_interfaces = tmp;
}
break;
case INPUT_BOX_BUTTON_HELP:
tb.show_help_message(lxdialog_path, WANCONFIG_LIP_ATM, atm_number_of_interfaces_help_str);
goto again;
}//switch(selection_index)
return 0;
}