[Freeswitch-svn] [commit] r14020 - in freeswitch/trunk/contrib/mod/endpoints/mod_khomp: include src
FreeSWITCH SVN
jmesquita at freeswitch.org
Sat Jun 27 21:58:26 PDT 2009
Author: jmesquita
Date: Sat Jun 27 23:58:26 2009
New Revision: 14020
Log:
Reverse board lookup and channel lookup using a.
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 Sat Jun 27 23:58:26 2009
@@ -46,6 +46,7 @@
return _pvts[target.device][target.object];
}
+
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 Sat Jun 27 23:58:26 2009
@@ -5,7 +5,6 @@
KhompPvt * KhompPvt::find_channel(char* allocation_string, switch_core_session_t * new_session, switch_call_cause_t * cause)
{
- /* For now we support only the 'first-free' mode */
char *argv[3] = { 0 };
int argc = 0;
@@ -17,6 +16,8 @@
int channel_high = 0;
bool first_channel_available = true;
+ bool reverse_first_board_available = false;
+ bool reverse_first_channel_available = false;
*cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
@@ -35,6 +36,11 @@
{
board_low = 0;
board_high = Globals::_k3lapi.device_count();
+ // Lets make it reverse...
+ if(*argv[0] == 'a')
+ {
+ reverse_first_board_available = true;
+ }
}
else
{
@@ -45,6 +51,11 @@
if(*argv[1] == 'A' || *argv[1] == 'a')
{
first_channel_available = true;
+ // Lets make it reverse...
+ if(*argv[1] == 'a')
+ {
+ reverse_first_channel_available = true;
+ }
}
else
{
@@ -64,60 +75,202 @@
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);
- for (int board = board_low ; board <= board_high; board++)
+ // TODO: Stop this nonsense of having duplicate code?
+ if(reverse_first_board_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);
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Just to check we are getting on the first_channel\n", board_low, board_high, channel_low, channel_high);
- }
- else
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Doing reverse board lookup.\n");
+ for (int board = board_high-1 ; board >= board_low; board--)
{
- if(channel_low < 0 || channel_high > Globals::_k3lapi.channel_count(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_ERROR, "Invalid channel selection (%d-%d) !\n", channel_low, channel_high);
- switch_mutex_unlock(_pvts_mutex);
- return NULL;
+ 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)
+ {
+ 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;
+ }
+ }
}
}
+ }
+ else
+ {
- for (int channel = channel_low ; channel <= channel_high ; channel++)
+ for (int board = board_low ; board <= board_high; board++)
{
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Checking if (%d-%d) is free\n", board, channel);
- try
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Checking board %d\n", board);
+
+ if(pvt != NULL)
+ break;
+
+ if(first_channel_available)
{
- K3L_CHANNEL_CONFIG channelConfig;
- channelConfig = Globals::_k3lapi.channel_config( board, channel );
+ channel_low = 0;
+ channel_high = Globals::_k3lapi.channel_count(board);
}
- catch (...)
+ else
{
- 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(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;
+ }
}
- K3L_CHANNEL_STATUS status;
- if (k3lGetDeviceStatus( board, channel + ksoChannel, &status, sizeof(status) ) != ksSuccess)
+ if (reverse_first_channel_available)
{
- 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;
+ 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;
+ }
+ }
}
- 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)
+ else
+ {
+ for (int channel = channel_low ; channel <= channel_high ; channel++)
{
- pvt->session(new_session);
- break;
+ 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 = NULL;
}
}
}
More information about the Freeswitch-svn
mailing list