ZAP_CHANNEL_STATE_DOWN,
ZAP_CHANNEL_STATE_HANGUP,
ZAP_CHANNEL_STATE_HOLD,
+ ZAP_CHANNEL_STATE_SUSPENDED,
ZAP_CHANNEL_STATE_DIALTONE,
ZAP_CHANNEL_STATE_COLLECT,
ZAP_CHANNEL_STATE_RING,
ZAP_CHANNEL_STATE_UP,
ZAP_CHANNEL_STATE_INVALID
} zap_channel_state_t;
-#define CHANNEL_STATE_STRINGS "DOWN", "HANGUP", "HOLD", "DIALTONE", "COLLECT", \
+#define CHANNEL_STATE_STRINGS "DOWN", "HANGUP", "HOLD", "SUSPENDED", "DIALTONE", "COLLECT", \
"RING", "BUSY", "ATTN", "GENRING", "DIALING", "GET_CALLERID", "CALLWAITING", \
"TERMINATING", "RESTART", "PROGRESS_MEDIA", "PROGRESS", "IDLE", "UP", "INVALID"
ZAP_STR2ENUM_P(zap_str2zap_channel_state, zap_channel_state2str, zap_channel_state_t)
check = &span->channels[i];
- if (zap_test_flag(check, ZAP_CHANNEL_READY) && !zap_test_flag(check, ZAP_CHANNEL_INUSE)) {
+ if (zap_test_flag(check, ZAP_CHANNEL_READY) && !zap_test_flag(check, ZAP_CHANNEL_INUSE) && !zap_test_flag(check, ZAP_CHANNEL_SUSPENDED)) {
status = check->zio->open(check);
assert(zchan != NULL);
+ if (zap_test_flag(zchan, ZAP_CHANNEL_SUSPENDED)) {
+ return ZAP_FAIL;
+ }
+
if (!zap_test_flag(zchan, ZAP_CHANNEL_READY) || (status = zap_mutex_trylock(zchan->mutex)) != ZAP_SUCCESS) {
return status;
}
check = &globals.spans[span_id].channels[chan_id];
- if (!zap_test_flag(check, ZAP_CHANNEL_READY) || (status = zap_mutex_trylock(check->mutex)) != ZAP_SUCCESS) {
+ if (zap_test_flag(check, ZAP_CHANNEL_SUSPENDED) ||
+ !zap_test_flag(check, ZAP_CHANNEL_READY) || (status = zap_mutex_trylock(check->mutex)) != ZAP_SUCCESS) {
goto done;
}
case Q931mes_SERVICE:
{
Q931ie_ChangeStatus *changestatus = Q931GetIEPtr(gen->ChangeStatus, gen->buf);
- /* TODO: Handle this properly */
if (zchan) {
switch (changestatus->NewStatus) {
case 0: /* change status to "in service" */
- //zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_RESTART);
- break;
+ zap_clear_flag_locked(zchan, ZAP_CHANNEL_SUSPENDED);
+ zap_log(ZAP_LOG_DEBUG, "Channel %d:%d in service\n", zchan->span_id, zchan->chan_id);
+ switch(zchan->state) {
+ case ZAP_CHANNEL_STATE_UP:
+ case ZAP_CHANNEL_STATE_IDLE:
+ zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_TERMINATING);
+ break;
+ case ZAP_CHANNEL_STATE_DOWN:
+ break;
+ default:
+ zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_DOWN);
+ break;
+ }
case 1: /* change status to "maintenance" */
- //zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_RESTART);
+ zap_set_flag_locked(zchan, ZAP_CHANNEL_SUSPENDED);
+ zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_SUSPENDED);
break;
case 2: /* change status to "out of service" */
- //zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_RESTART);
+ zap_set_flag_locked(zchan, ZAP_CHANNEL_SUSPENDED);
+ zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_SUSPENDED);
break;
default: /* unknown */
break;