add outgoing call support to testsangomaboost

git-svn-id: http://svn.openzap.org/svn/openzap/branches/sangoma_boost@1012 a93c3328-9c30-0410-af19-c9cd2b2d52af
This commit is contained in:
Moises Silva 2010-01-30 01:57:34 +00:00
parent b7b263e1ce
commit 3e8ee9b3e8
1 changed files with 58 additions and 2 deletions

View File

@ -67,6 +67,9 @@ static dummy_timer_t g_timers[MAX_CALLS];
/* mutex to protect the timers (both, the test thread and the signaling thread may modify them) */
static ftdm_mutex_t *g_schedule_mutex;
/* unique outgoing channel */
static ftdm_channel_t *g_outgoing_channel = NULL;
static void interrupt_requested(int signal)
{
app_running = 0;
@ -174,10 +177,17 @@ static FIO_SIGNAL_CB_FUNCTION(on_signaling_event)
/* This event signals answer in an outgoing call */
case FTDM_SIGEVENT_UP:
ftdm_log(FTDM_LOG_NOTICE, "Answer received in channel %d:%d\n", sigmsg->span_id, sigmsg->chan_id);
/* now the channel is answered and we can use
* ftdm_channel_wait() to wait for input/output in a channel (equivalent to poll() or select())
* ftdm_channel_read() to read available data in a channel
* ftdm_channel_write() to write to the channel */
break;
/* This event signals hangup from the other end */
case FTDM_SIGEVENT_STOP:
ftdm_log(FTDM_LOG_NOTICE, "Hangup received in channel %d:%d\n", sigmsg->span_id, sigmsg->chan_id);
if (g_outgoing_channel == sigmsg->channel) {
g_outgoing_channel = NULL;
}
/* release any timer for this channel */
release_timers(sigmsg->channel);
break;
@ -189,21 +199,62 @@ static FIO_SIGNAL_CB_FUNCTION(on_signaling_event)
return FTDM_SUCCESS;
}
static void place_call(const ftdm_span_t *span, const char *number)
{
ftdm_channel_t *ftdmchan = NULL;
ftdm_caller_data_t caller_data = {{ 0 }};
ftdm_status_t status = FTDM_FAIL;
caller_data.ani.type = FTDM_TON_NATIONAL;
/* set destiny number (FIXME: this should be DNIS member in FreeTDM core and signaling module) */
ftdm_set_string(caller_data.ani.digits, number);
/* set callerid */
ftdm_set_string(caller_data.cid_name, "testsangomaboost");
ftdm_set_string(caller_data.cid_num.digits, "1234");
/* request to search for an outgoing channel top down with the given caller data */
status = ftdm_channel_open_by_span(span->span_id, FTDM_TOP_DOWN, &caller_data, &ftdmchan);
if (status != FTDM_SUCCESS) {
ftdm_log(FTDM_LOG_ERROR, "Failed to originate call\n");
return;
}
status = ftdm_channel_outgoing_call(ftdmchan);
if (status != FTDM_SUCCESS) {
ftdm_log(FTDM_LOG_ERROR, "Failed to originate call\n");
return;
}
ftdm_channel_init(ftdmchan);
}
int main(int argc, char *argv[])
{
ftdm_conf_parameter_t parameters[20];
ftdm_span_t *span;
char *todial = NULL;
int32_t ticks = 0;
if (argc < 2) {
fprintf(stderr, "Usage: %s <span name>\n", argv[0]);
fprintf(stderr, "Usage: %s <span name> [number to dial if any]\n", argv[0]);
exit(-1);
}
/* register a handler to shutdown things properly */
if (signal(SIGINT, interrupt_requested) == SIG_ERR) {
fprintf(stderr, "Could not set the SIGINT signal handler: %s\n", strerror(errno));
exit(-1);
}
if (argc >= 3) {
todial = argv[2];
if (!strlen(todial)) {
todial = NULL;
}
}
/* clear any outstanding timers */
memset(&g_timers, 0, sizeof(g_timers));
@ -282,8 +333,13 @@ int main(int argc, char *argv[])
/* The application thread can go on and do anything else, like waiting for a shutdown signal */
while(ftdm_running() && app_running) {
ftdm_sleep(1 * 1000);
ftdm_sleep(1000);
run_timers();
ticks++;
if (!(ticks % 10) && todial && !g_outgoing_channel) {
ftdm_log(FTDM_LOG_NOTICE, "Originating call to number %s\n", todial);
place_call(span, todial);
}
}
printf("Shutting down FreeTDM ...\n");
done: