Author: jmesquita Date: Sun Jun 28 00:29:29 2009 New Revision: 14021 Log: More elegant channel/board lookup and some documentation. Thanks Raul... Modified: freeswitch/trunk/contrib/mod/endpoints/mod_khomp/include/khomp_pvt.h freeswitch/trunk/contrib/mod/endpoints/mod_khomp/src/khomp_pvt.cpp Modified: freeswitch/trunk/contrib/mod/endpoints/mod_khomp/include/khomp_pvt.h ============================================================================== --- freeswitch/trunk/contrib/mod/endpoints/mod_khomp/include/khomp_pvt.h (original) +++ freeswitch/trunk/contrib/mod/endpoints/mod_khomp/include/khomp_pvt.h Sun Jun 28 00:29:29 2009 @@ -47,6 +47,13 @@ } + /*! + \brief Lookup channels and boards when dialed. + \param allocation_string The dialstring as put on Dialplan. [Khomp/[a|A|0-board_high]/[a|A|0-channel_high]/dest]. + \param new_session Session allocated for this call. + \param[out] Cause returned. Returns NULL if suceeded if not, the proper cause. + \return KhompPvt to be used on the call. + */ static KhompPvt * find_channel(char* allocation_string, switch_core_session_t * new_session, switch_call_cause_t * cause); static void initialize(void) Modified: freeswitch/trunk/contrib/mod/endpoints/mod_khomp/src/khomp_pvt.cpp ============================================================================== --- freeswitch/trunk/contrib/mod/endpoints/mod_khomp/src/khomp_pvt.cpp (original) +++ freeswitch/trunk/contrib/mod/endpoints/mod_khomp/src/khomp_pvt.cpp Sun Jun 28 00:29:29 2009 @@ -40,6 +40,7 @@ if(*argv[0] == 'a') { reverse_first_board_available = true; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Doing reverse board lookup!\n"); } } else @@ -55,6 +56,7 @@ if(*argv[1] == 'a') { reverse_first_channel_available = true; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Doing reverse channel lookup!\n"); } } else @@ -75,202 +77,65 @@ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Channel selection: board (%d-%d), channel (%d-%d)!\n", board_low, board_high, channel_low, channel_high); - // TODO: Stop this nonsense of having duplicate code? - if(reverse_first_board_available) + int board = board_low; + for ((reverse_first_board_available == false ? board = board_low : board = board_high-1); + (reverse_first_board_available == false ? board <= board_high : board >= board_low); + (reverse_first_board_available == false ? board++ : board--)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Doing reverse board lookup.\n"); - for (int board = board_high-1 ; board >= board_low; board--) + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Checking board %d\n", board); + + if(pvt != NULL) + break; + + if(first_channel_available) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Checking board %d\n", board); - - if(pvt != NULL) - break; - - if(first_channel_available) - { - channel_low = 0; - channel_high = Globals::_k3lapi.channel_count(board); - } - else - { - if(channel_low < 0 || channel_high > Globals::_k3lapi.channel_count(board)) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid channel selection (%d-%d) !\n", channel_low, channel_high); - switch_mutex_unlock(_pvts_mutex); - return NULL; - } - } - if (reverse_first_channel_available) + channel_low = 0; + channel_high = Globals::_k3lapi.channel_count(board); + } + else + { + if(channel_low < 0 || channel_high > Globals::_k3lapi.channel_count(board)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Doing a reverse free channel lookup\n", board_low, board_high, channel_low, channel_high); - for (int channel = channel_high-1 ; channel >= channel_low ; channel--) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Checking if (%d-%d) is free\n", board, channel); - try - { - K3L_CHANNEL_CONFIG channelConfig; - channelConfig = Globals::_k3lapi.channel_config( board, channel ); - } - catch (...) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception while retrieving channel config for board %d, channel%d!\n", board, channel); - switch_mutex_unlock(_pvts_mutex); - return NULL; - } - K3L_CHANNEL_STATUS status; - if (k3lGetDeviceStatus( board, channel + ksoChannel, &status, sizeof(status) ) != ksSuccess) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "k3lGetDeviceStatus failed to retrieve channel config for board %d, channel%d!\n", board, channel); - switch_mutex_unlock(_pvts_mutex); - return NULL; - } - if(status.CallStatus == kcsFree) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Channel (%d-%d) is free, let's check if the session is available ...\n", board, channel); - pvt = KhompPvt::khompPvt(board, channel); - if(pvt != NULL && pvt->session() == NULL) - { - pvt->session(new_session); - break; - } - pvt = NULL; - } - } - } - else - { - for (int channel = channel_low ; channel <= channel_high ; channel++) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Checking if (%d-%d) is free\n", board, channel); - try - { - K3L_CHANNEL_CONFIG channelConfig; - channelConfig = Globals::_k3lapi.channel_config( board, channel ); - } - catch (...) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception while retrieving channel config for board %d, channel%d!\n", board, channel); - switch_mutex_unlock(_pvts_mutex); - return NULL; - } - K3L_CHANNEL_STATUS status; - if (k3lGetDeviceStatus( board, channel + ksoChannel, &status, sizeof(status) ) != ksSuccess) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "k3lGetDeviceStatus failed to retrieve channel config for board %d, channel%d!\n", board, channel); - switch_mutex_unlock(_pvts_mutex); - return NULL; - } - if(status.CallStatus == kcsFree) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Channel (%d-%d) is free, let's check if the session is available ...\n", board, channel); - pvt = KhompPvt::khompPvt(board, channel); - if(pvt != NULL && pvt->session() == NULL) - { - pvt->session(new_session); - break; - } - pvt = NULL; - } - } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid channel selection (%d-%d) !\n", channel_low, channel_high); + switch_mutex_unlock(_pvts_mutex); + return NULL; } } - } - else - { - - for (int board = board_low ; board <= board_high; board++) + + int channel = channel_low; + for ((reverse_first_channel_available == true ? channel = channel_high-1 : channel = channel_low); + (reverse_first_channel_available == true ? channel >= channel_low : channel <= channel_high); + (reverse_first_channel_available == true ? channel-- : channel++)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Checking board %d\n", board); - - if(pvt != NULL) - break; - - if(first_channel_available) + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Checking if (%d-%d) is free\n", board, channel); + try { - channel_low = 0; - channel_high = Globals::_k3lapi.channel_count(board); + K3L_CHANNEL_CONFIG channelConfig; + channelConfig = Globals::_k3lapi.channel_config( board, channel ); } - else + catch (...) { - if(channel_low < 0 || channel_high > Globals::_k3lapi.channel_count(board)) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid channel selection (%d-%d) !\n", channel_low, channel_high); - switch_mutex_unlock(_pvts_mutex); - return NULL; - } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception while retrieving channel config for board %d, channel%d!\n", board, channel); + switch_mutex_unlock(_pvts_mutex); + return NULL; } - if (reverse_first_channel_available) + K3L_CHANNEL_STATUS status; + if (k3lGetDeviceStatus( board, channel + ksoChannel, &status, sizeof(status) ) != ksSuccess) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Doing a reverse free channel lookup\n", board_low, board_high, channel_low, channel_high); - for (int channel = channel_high-1 ; channel >= channel_low ; channel--) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Checking if (%d-%d) is free\n", board, channel); - try - { - K3L_CHANNEL_CONFIG channelConfig; - channelConfig = Globals::_k3lapi.channel_config( board, channel ); - } - catch (...) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception while retrieving channel config for board %d, channel%d!\n", board, channel); - switch_mutex_unlock(_pvts_mutex); - return NULL; - } - K3L_CHANNEL_STATUS status; - if (k3lGetDeviceStatus( board, channel + ksoChannel, &status, sizeof(status) ) != ksSuccess) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "k3lGetDeviceStatus failed to retrieve channel config for board %d, channel%d!\n", board, channel); - switch_mutex_unlock(_pvts_mutex); - return NULL; - } - if(status.CallStatus == kcsFree) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Channel (%d-%d) is free, let's check if the session is available ...\n", board, channel); - pvt = KhompPvt::khompPvt(board, channel); - if(pvt != NULL && pvt->session() == NULL) - { - pvt->session(new_session); - break; - } - pvt = NULL; - } - } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "k3lGetDeviceStatus failed to retrieve channel config for board %d, channel%d!\n", board, channel); + switch_mutex_unlock(_pvts_mutex); + return NULL; } - else - { - for (int channel = channel_low ; channel <= channel_high ; channel++) + if(status.CallStatus == kcsFree) + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Channel (%d-%d) is free, let's check if the session is available ...\n", board, channel); + pvt = KhompPvt::khompPvt(board, channel); + if(pvt != NULL && pvt->session() == NULL) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Checking if (%d-%d) is free\n", board, channel); - try - { - K3L_CHANNEL_CONFIG channelConfig; - channelConfig = Globals::_k3lapi.channel_config( board, channel ); - } - catch (...) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception while retrieving channel config for board %d, channel%d!\n", board, channel); - switch_mutex_unlock(_pvts_mutex); - return NULL; - } - K3L_CHANNEL_STATUS status; - if (k3lGetDeviceStatus( board, channel + ksoChannel, &status, sizeof(status) ) != ksSuccess) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "k3lGetDeviceStatus failed to retrieve channel config for board %d, channel%d!\n", board, channel); - switch_mutex_unlock(_pvts_mutex); - return NULL; - } - if(status.CallStatus == kcsFree) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Channel (%d-%d) is free, let's check if the session is available ...\n", board, channel); - pvt = KhompPvt::khompPvt(board, channel); - if(pvt != NULL && pvt->session() == NULL) - { - pvt->session(new_session); - break; - } - pvt = NULL; - } + pvt->session(new_session); + break; } + pvt = NULL; } } }