return SWITCH_STATUS_FALSE;
}
- zap_mutex_lock(tech_pvt->zchan->mutex);
if (tech_pvt->zchan->state == ZAP_CHANNEL_STATE_TERMINATING) {
zap_mutex_unlock(tech_pvt->zchan->mutex);
return SWITCH_STATUS_SUCCESS;
break;
}
- zap_mutex_unlock(tech_pvt->zchan->mutex);
return SWITCH_STATUS_SUCCESS;
}
switch_status_t status;
switch_channel_t *channel;
const char *var;
+ zap_channel_t *zchan = NULL;
tech_pvt = (private_t *) switch_core_session_get_private(session);
assert(tech_pvt != NULL);
channel = switch_core_session_get_channel(session);
+ if (!(zchan = tech_pvt->zchan)) {
+ switch_channel_hangup(channel, SWITCH_CAUSE_LOSE_RACE);
+ return SWITCH_STATUS_FALSE;
+ }
+
+ zap_mutex_lock(zchan->mutex);
+
+ if (!tech_pvt->zchan) {
+ switch_channel_hangup(channel, SWITCH_CAUSE_LOSE_RACE);
+ status = SWITCH_STATUS_FALSE;
+ goto end;
+ }
+
switch (msg->message_id) {
case SWITCH_MESSAGE_INDICATE_PROGRESS:
case SWITCH_MESSAGE_INDICATE_ANSWER:
break;
}
+ end:
+
+ zap_mutex_unlock(zchan->mutex);
+
return status;
}
zap_analog_start_type_t start_type;
zap_signal_type_t signal_type;
void *signal_data;
+ zio_signal_cb_t signal_cb;
zap_event_t event_header;
char last_error[256];
char tone_map[ZAP_TONEMAP_INVALID+1][ZAP_TONEMAP_LEN];
OZ_DECLARE(zap_status_t) zap_configure_span(const char *type, zap_span_t *span, zio_signal_cb_t sig_cb, ...);
OZ_DECLARE(zap_status_t) zap_span_start(zap_span_t *span);
OZ_DECLARE(zap_status_t) zap_span_stop(zap_span_t *span);
+OZ_DECLARE(zap_status_t) zap_span_send_signal(zap_span_t *span, zap_sigmsg_t *sigmsg);
OZ_DECLARE(int) zap_load_module(const char *name);
OZ_DECLARE(int) zap_load_module_assume(const char *name);
OZ_DECLARE(zap_status_t) zap_span_find_by_name(const char *name, zap_span_t **span);
analog_data->flags = flags;
analog_data->digit_timeout = digit_timeout;
analog_data->max_dialstr = max_dialstr;
- analog_data->sig_cb = sig_cb;
+ span->signal_cb = sig_cb;
strncpy(analog_data->hotline, hotline, sizeof(analog_data->hotline));
span->signal_type = ZAP_SIGTYPE_ANALOG;
span->signal_data = analog_data;
sig.event_id = ZAP_SIGEVENT_UP;
}
- analog_data->sig_cb(&sig);
+ zap_span_send_signal(zchan->span, &sig);
continue;
}
break;
zap_set_string(zchan->caller_data.dnis.digits, dtmf);
}
- analog_data->sig_cb(&sig);
+ zap_span_send_signal(zchan->span, &sig);
continue;
}
break;
case ZAP_CHANNEL_STATE_DOWN:
{
sig.event_id = ZAP_SIGEVENT_STOP;
- analog_data->sig_cb(&sig);
+ zap_span_send_signal(zchan->span, &sig);
goto done;
}
break;
sig.span_id = zchan->span_id;
sig.channel = zchan;
sig.event_id = ZAP_SIGEVENT_PROGRESS;
- analog_data->sig_cb(&sig);
+ zap_span_send_signal(zchan->span, &sig);
}
break;
last_digit = elapsed;
sig.event_id = ZAP_SIGEVENT_COLLECTED_DIGIT;
sig.raw_data = dtmf;
- if (analog_data->sig_cb(&sig) == ZAP_BREAK) {
+ if (zap_span_send_signal(zchan->span, &sig) == ZAP_BREAK) {
collecting = 0;
}
}
if (zchan->detected_tones[i]) {
zap_log(ZAP_LOG_DEBUG, "Detected tone %s on %d:%d\n", zap_tonemap2str(i), zchan->span_id, zchan->chan_id);
sig.raw_data = &i;
- if (analog_data->sig_cb) {
- analog_data->sig_cb(&sig);
- }
+ zap_span_send_signal(zchan->span, &sig);
}
}
zap_set_state_locked(event->channel, ZAP_CHANNEL_STATE_UP);
} else {
sig.event_id = ZAP_SIGEVENT_FLASH;
- analog_data->sig_cb(&sig);
+ zap_span_send_signal(span, &sig);
}
}
break;
uint32_t max_dialstr;
uint32_t digit_timeout;
char hotline[ZAP_MAX_HOTLINE_STR];
- zio_signal_cb_t sig_cb;
};
span->start = zap_analog_em_start;
analog_data->digit_timeout = digit_timeout;
analog_data->max_dialstr = max_dialstr;
- analog_data->sig_cb = sig_cb;
+ span->signal_cb = sig_cb;
span->signal_type = ZAP_SIGTYPE_ANALOG;
span->signal_data = analog_data;
span->outgoing_call = analog_em_outgoing_call;
sig.event_id = ZAP_SIGEVENT_UP;
- analog_data->sig_cb(&sig);
+ zap_span_send_signal(zchan->span, &sig);
continue;
}
break;
sig.event_id = ZAP_SIGEVENT_START;
- analog_data->sig_cb(&sig);
+ zap_span_send_signal(zchan->span, &sig);
continue;
}
break;
case ZAP_CHANNEL_STATE_DOWN:
{
sig.event_id = ZAP_SIGEVENT_STOP;
- analog_data->sig_cb(&sig);
+ zap_span_send_signal(zchan->span, &sig);
goto done;
}
break;
last_digit = elapsed;
sig.event_id = ZAP_SIGEVENT_COLLECTED_DIGIT;
sig.raw_data = dtmf;
- if (analog_data->sig_cb(&sig) == ZAP_BREAK) {
+ if (zap_span_send_signal(zchan->span, &sig) == ZAP_BREAK) {
collecting = 0;
}
}
if (zchan->detected_tones[i]) {
zap_log(ZAP_LOG_DEBUG, "Detected tone %s on %d:%d\n", zap_tonemap2str(i), zchan->span_id, zchan->chan_id);
sig.raw_data = &i;
- if (analog_data->sig_cb) {
- analog_data->sig_cb(&sig);
- }
+ zap_span_send_signal(zchan->span, &sig);
}
}
uint32_t flags;
uint32_t max_dialstr;
uint32_t digit_timeout;
- zio_signal_cb_t sig_cb;
};
static void *zap_analog_em_run(zap_thread_t *me, void *obj);
sig.channel->caller_data.hangup_cause = (cause) ? cause->Value : ZAP_CAUSE_NORMAL_UNSPECIFIED;
sig.event_id = ZAP_SIGEVENT_STOP;
- status = isdn_data->sig_cb(&sig);
+ status = zap_span_send_signal(zchan->span, &sig);
zap_log(ZAP_LOG_DEBUG, "Received %s in state %s, requested hangup for channel %d:%d\n", what, zap_channel_state2str(zchan->state), zchan->span_id, chan_id);
}
{
if (zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
sig.event_id = ZAP_SIGEVENT_PROGRESS;
- if ((status = isdn_data->sig_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = zap_span_send_signal(zchan->span, &sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
} else {
{
if (!zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
sig.event_id = ZAP_SIGEVENT_START;
- if ((status = isdn_data->sig_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = zap_span_send_signal(zchan->span, &sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
}
{
zchan->caller_data.hangup_cause = ZAP_CAUSE_NORMAL_UNSPECIFIED;
sig.event_id = ZAP_SIGEVENT_RESTART;
- status = isdn_data->sig_cb(&sig);
+ status = zap_span_send_signal(zchan->span, &sig);
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_DOWN);
}
break;
{
if (zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
sig.event_id = ZAP_SIGEVENT_PROGRESS_MEDIA;
- if ((status = isdn_data->sig_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = zap_span_send_signal(zchan->span, &sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
} else {
{
if (zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
sig.event_id = ZAP_SIGEVENT_UP;
- if ((status = isdn_data->sig_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = zap_span_send_signal(zchan->span, &sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
} else {
zap_log(ZAP_LOG_DEBUG, "Terminating: Direction %s\n", zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND) ? "Outbound" : "Inbound");
sig.event_id = ZAP_SIGEVENT_STOP;
- status = isdn_data->sig_cb(&sig);
+ status = zap_span_send_signal(zchan->span, &sig);
gen->MesType = Q931mes_RELEASE;
gen->CRVFlag = zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND) ? 0 : 1;
Q931Rx43(&isdn_data->q931, (void *)gen, gen->Size);
static __inline__ zap_status_t process_event(zap_span_t *span, zap_event_t *event)
{
zap_sigmsg_t sig;
- zap_isdn_data_t *isdn_data = span->signal_data;
memset(&sig, 0, sizeof(sig));
sig.chan_id = event->channel->chan_id;
zap_channel_get_alarms(event->channel);
- isdn_data->sig_cb(&sig);
+ zap_span_send_signal(span, &sig);
zap_log(ZAP_LOG_WARNING, "channel %d:%d (%d:%d) has alarms! [%s]\n",
event->channel->span_id, event->channel->chan_id,
event->channel->physical_span_id, event->channel->physical_chan_id,
sig.event_id = ZAP_OOB_ALARM_CLEAR;
zap_clear_flag(event->channel, ZAP_CHANNEL_SUSPENDED);
zap_channel_get_alarms(event->channel);
- isdn_data->sig_cb(&sig);
+ zap_span_send_signal(span, &sig);
}
break;
}
span->start = zap_isdn_start;
span->stop = zap_isdn_stop;
- isdn_data->sig_cb = sig_cb;
+ span->signal_cb = sig_cb;
isdn_data->dchans[0] = dchans[0];
isdn_data->dchans[1] = dchans[1];
isdn_data->dchan = isdn_data->dchans[0];
zap_channel_t *dchan;
zap_channel_t *dchans[2];
struct zap_sigmsg sigmsg;
- zio_signal_cb_t sig_cb;
uint32_t flags;
int32_t mode;
int32_t digit_timeout;
{
if (zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
sig.event_id = ZAP_SIGEVENT_PROGRESS;
- if ((status = isdn_data->sig_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = zap_span_send_signal(zchan->span, &sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
} else if (call) {
{
if (zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
sig.event_id = ZAP_SIGEVENT_PROGRESS_MEDIA;
- if ((status = isdn_data->sig_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = zap_span_send_signal(zchan->span, &sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
} else if (call) {
if (call) {
pri_acknowledge(isdn_data->spri.pri, call, zchan->chan_id, 0);
sig.event_id = ZAP_SIGEVENT_START;
- if ((status = isdn_data->sig_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = zap_span_send_signal(zchan->span, &sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
} else {
{
zchan->caller_data.hangup_cause = ZAP_CAUSE_NORMAL_UNSPECIFIED;
sig.event_id = ZAP_SIGEVENT_RESTART;
- status = isdn_data->sig_cb(&sig);
+ status = zap_span_send_signal(zchan->span, &sig);
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_DOWN);
}
break;
{
if (zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
sig.event_id = ZAP_SIGEVENT_UP;
- if ((status = isdn_data->sig_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = zap_span_send_signal(zchan->span, &sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
} else if (call) {
case ZAP_CHANNEL_STATE_TERMINATING:
{
sig.event_id = ZAP_SIGEVENT_STOP;
- status = isdn_data->sig_cb(&sig);
+ status = zap_span_send_signal(zchan->span, &sig);
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_DOWN);
}
static __inline__ zap_status_t process_event(zap_span_t *span, zap_event_t *event)
{
zap_sigmsg_t sig;
- zap_libpri_data_t *isdn_data = span->signal_data;
memset(&sig, 0, sizeof(sig));
sig.chan_id = event->channel->chan_id;
zap_channel_get_alarms(event->channel);
- isdn_data->sig_cb(&sig);
+ zap_span_send_signal(span, &sig);
zap_log(ZAP_LOG_WARNING, "channel %d:%d (%d:%d) has alarms! [%s]\n",
event->channel->span_id, event->channel->chan_id,
event->channel->physical_span_id, event->channel->physical_chan_id,
sig.event_id = ZAP_OOB_ALARM_CLEAR;
zap_clear_flag(event->channel, ZAP_CHANNEL_SUSPENDED);
zap_channel_get_alarms(event->channel);
- isdn_data->sig_cb(&sig);
+ zap_span_send_signal(span, &sig);
}
break;
}
span->start = zap_libpri_start;
span->stop = zap_libpri_stop;
- isdn_data->sig_cb = sig_cb;
+ span->signal_cb = sig_cb;
//isdn_data->dchans[0] = dchans[0];
//isdn_data->dchans[1] = dchans[1];
//isdn_data->dchan = isdn_data->dchans[0];
zap_channel_t *dchan;
zap_channel_t *dchans[2];
struct zap_sigmsg sigmsg;
- zio_signal_cb_t sig_cb;
uint32_t flags;
int32_t mode;
zap_isdn_opts_t opts;
/* r2 configuration stored in span->signal_data */
typedef struct zap_r2_data_s {
- /* signaling callback */
- zio_signal_cb_t sig_cb;
/* span flags */
zap_r2_flag_t flags;
/* openr2 handle for the R2 variant context */
sigev.channel = zchan;
sigev.event_id = ZAP_SIGEVENT_START;
- if (r2data->sig_cb(&sigev) != ZAP_SUCCESS) {
+ if (zap_span_send_signal(zchan->span, &sigev) != ZAP_SUCCESS) {
zap_log(ZAP_LOG_NOTICE, "Failed to handle call offered on chan %d\n", openr2_chan_get_number(r2chan));
openr2_chan_disconnect_call(r2chan, OR2_CAUSE_OUT_OF_ORDER);
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_CANCEL);
sigev.event_id = ZAP_SIGEVENT_STOP;
r2data = zchan->span->signal_data;
- r2data->sig_cb(&sigev);
+ zap_span_send_signal(zchan->span, &sigev);
}
static void zap_r2_on_call_end(openr2_chan_t *r2chan)
sigev.event_id = ZAP_SIGEVENT_STOP;
r2data = zchan->span->signal_data;
- r2data->sig_cb(&sigev);
+ zap_span_send_signal(zchan->span, &sigev);
}
static void zap_r2_on_line_blocked(openr2_chan_t *r2chan)
sigev.channel = zchan;
sigev.event_id = ZAP_SIGEVENT_COLLECTED_DIGIT;
r2data = zchan->span->signal_data;
- if (r2data->sig_cb(&sigev) == ZAP_BREAK) {
+ if (zap_span_send_signal(zchan->span, &sigev) == ZAP_BREAK) {
zap_log(ZAP_LOG_NOTICE, "Requested to stop getting DNIS. Current DNIS = %s on chan %d\n", zchan->caller_data.dnis.digits, openr2_chan_get_number(r2chan));
return OR2_STOP_DNIS_REQUEST;
}
span->start = zap_r2_start;
r2data->flags = 0;
- r2data->sig_cb = sig_cb;
+ span->signal_cb = sig_cb;
span->signal_type = ZAP_SIGTYPE_R2;
span->signal_data = r2data;
span->outgoing_call = r2_outgoing_call;
} else {
zap_log(ZAP_LOG_DEBUG, "PROGRESS: Notifying progress in channel %d\n", zchan->physical_chan_id);
sigev.event_id = ZAP_SIGEVENT_PROGRESS;
- if (r2data->sig_cb(&sigev) != ZAP_SUCCESS) {
+ if (zap_span_send_signal(zchan->span, &sigev) != ZAP_SUCCESS) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
}
} else {
zap_log(ZAP_LOG_DEBUG, "UP: Notifying of call answered in channel %d\n", zchan->physical_chan_id);
sigev.event_id = ZAP_SIGEVENT_UP;
- if (r2data->sig_cb(&sigev) != ZAP_SUCCESS) {
+ if (zap_span_send_signal(zchan->span, &sigev) != ZAP_SUCCESS) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
}
{
if (zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
sig.event_id = ZAP_SIGEVENT_PROGRESS_MEDIA;
- if ((status = sangoma_boost_data->signal_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = zap_span_send_signal(zchan->span, &sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
} else {
{
if (zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
sig.event_id = ZAP_SIGEVENT_PROGRESS;
- if ((status = sangoma_boost_data->signal_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = zap_span_send_signal(zchan->span, &sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
} else {
{
if (!zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
sig.event_id = ZAP_SIGEVENT_START;
- if ((status = sangoma_boost_data->signal_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = zap_span_send_signal(zchan->span, &sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
}
case ZAP_CHANNEL_STATE_RESTART:
{
sig.event_id = ZAP_SIGEVENT_RESTART;
- status = sangoma_boost_data->signal_cb(&sig);
+ status = zap_span_send_signal(zchan->span, &sig);
zap_set_sflag_locked(zchan, SFLAG_SENT_FINAL_MSG);
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_DOWN);
}
{
if (zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
sig.event_id = ZAP_SIGEVENT_UP;
- if ((status = sangoma_boost_data->signal_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = zap_span_send_signal(zchan->span, &sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
} else {
{
zap_set_sflag_locked(zchan, SFLAG_TERMINATING);
sig.event_id = ZAP_SIGEVENT_STOP;
- status = sangoma_boost_data->signal_cb(&sig);
+ status = zap_span_send_signal(zchan->span, &sig);
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP_COMPLETE);
}
break;
sangoma_boost_data->mcon.cfg.local_port = local_port;
zap_set_string(sangoma_boost_data->mcon.cfg.remote_ip, remote_ip);
sangoma_boost_data->mcon.cfg.remote_port = remote_port;
- sangoma_boost_data->signal_cb = sig_cb;
+ span->signal_cb = sig_cb;
span->start = zap_sangoma_boost_start;
span->signal_data = sangoma_boost_data;
span->signal_type = ZAP_SIGTYPE_SANGOMABOOST;
typedef struct zap_sangoma_boost_data {
sangomabc_connection_t mcon;
sangomabc_connection_t pcon;
- zio_signal_cb_t signal_cb;
uint32_t flags;
} zap_sangoma_boost_data_t;
return ZAP_FAIL;
}
+OZ_DECLARE(zap_status_t) zap_span_send_signal(zap_span_t *span, zap_sigmsg_t *sigmsg)
+{
+ zap_status_t status = ZAP_FAIL;
+
+ if (span->signal_cb) {
+
+ if (sigmsg->channel) {
+ zap_mutex_lock(sigmsg->channel->mutex);
+ }
+
+ status = span->signal_cb(sigmsg);
+
+ if (sigmsg->channel) {
+ zap_mutex_unlock(sigmsg->channel->mutex);
+ }
+ }
+
+ return status;
+}
+
OZ_DECLARE(zap_status_t) zap_global_init(void)
{