From d2a73cc0e4681e7d1dcf165d372efa936372bf93 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 11 Oct 2012 00:49:33 -0500 Subject: [PATCH] Updated ftmod_pritap.c to send SIGEVENT_UP when the tapped line is answered --- libs/freetdm/src/ftdm_io.c | 2 +- .../src/ftmod/ftmod_pritap/ftmod_pritap.c | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 932ce30aa7..8e6db56af4 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -6093,7 +6093,7 @@ FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t case FTDM_SIGEVENT_START: { - ftdm_assert(!ftdm_test_flag(fchan, FTDM_CHANNEL_CALL_STARTED), "Started call twice!"); + ftdm_assert(!ftdm_test_flag(fchan, FTDM_CHANNEL_CALL_STARTED), "Started call twice!\n"); if (ftdm_test_flag(fchan, FTDM_CHANNEL_OUTBOUND)) { ftdm_log_chan_msg(fchan, FTDM_LOG_WARNING, "Inbound call taking over outbound channel\n"); diff --git a/libs/freetdm/src/ftmod/ftmod_pritap/ftmod_pritap.c b/libs/freetdm/src/ftmod/ftmod_pritap/ftmod_pritap.c index f136d59d9c..343f317944 100644 --- a/libs/freetdm/src/ftmod/ftmod_pritap/ftmod_pritap.c +++ b/libs/freetdm/src/ftmod/ftmod_pritap/ftmod_pritap.c @@ -38,6 +38,8 @@ #define PRI_SPAN(p) (((p) >> 8) & 0xff) #define PRI_CHANNEL(p) ((p) & 0xff) +#define PRITAP_NETWORK_ANSWER 0x1 + typedef enum { PRITAP_RUNNING = (1 << 0), } pritap_flags_t; @@ -279,25 +281,36 @@ static ftdm_status_t state_advance(ftdm_channel_t *ftdmchan) sig.span_id = ftdmchan->span_id; sig.channel = ftdmchan; - ftdm_channel_complete_state(ftdmchan); + ftdm_channel_complete_state(ftdmchan); switch (ftdmchan->state) { case FTDM_CHANNEL_STATE_DOWN: { ftdmchan->call_data = NULL; + ftdmchan->pflags = 0; ftdm_channel_close(&ftdmchan); peerchan->call_data = NULL; + peerchan->pflags = 0; ftdm_channel_close(&peerchan); } break; case FTDM_CHANNEL_STATE_PROGRESS: case FTDM_CHANNEL_STATE_PROGRESS_MEDIA: - case FTDM_CHANNEL_STATE_UP: case FTDM_CHANNEL_STATE_HANGUP: break; + case FTDM_CHANNEL_STATE_UP: + { + if (ftdm_test_pflag(ftdmchan, PRITAP_NETWORK_ANSWER)) { + ftdm_clear_pflag(ftdmchan, PRITAP_NETWORK_ANSWER); + sig.event_id = FTDM_SIGEVENT_UP; + ftdm_span_send_signal(ftdmchan->span, &sig); + } + } + break; + case FTDM_CHANNEL_STATE_RING: { sig.event_id = FTDM_SIGEVENT_START; @@ -625,6 +638,8 @@ static void handle_pri_passive_event(pritap_t *pritap, pri_event *e) break; } ftdm_log_chan(pcall->fchan, FTDM_LOG_NOTICE, "Tapped call was answered in state %s\n", ftdm_channel_state2str(pcall->fchan->state)); + ftdm_set_pflag_locked(pcall->fchan, PRITAP_NETWORK_ANSWER); + ftdm_set_state_locked(pcall->fchan, FTDM_CHANNEL_STATE_UP); break; case PRI_EVENT_HANGUP_REQ: