/* this function MUST be called with the channel lock held. If waitrq == 1, the channel will be unlocked/locked (never call it with waitrq == 1 with an lock recursivity > 1) */
ftdm_log_chan_ex(ftdmchan,file,func,line,FTDM_LOG_LEVEL_ERROR,"Ignored state change request from %s to %s, the previous state change has not been processed yet\n",
ftdm_log_chan_ex(ftdmchan,file,func,line,FTDM_LOG_LEVEL_WARNING,"Why bother changing state from %s to %s\n",ftdm_channel_state2str(ftdmchan->state),ftdm_channel_state2str(state));
/* basic core state validation (by-passed if the signaling module provides a state_map) */
switch(ftdmchan->state){
caseFTDM_CHANNEL_STATE_HANGUP:
caseFTDM_CHANNEL_STATE_TERMINATING:
{
ok=0;
switch(state){
caseFTDM_CHANNEL_STATE_DOWN:
caseFTDM_CHANNEL_STATE_BUSY:
caseFTDM_CHANNEL_STATE_RESTART:
ok=1;
break;
default:
break;
}
}
break;
caseFTDM_CHANNEL_STATE_UP:
{
ok=1;
switch(state){
caseFTDM_CHANNEL_STATE_PROGRESS:
caseFTDM_CHANNEL_STATE_PROGRESS_MEDIA:
caseFTDM_CHANNEL_STATE_RING:
ok=0;
break;
default:
break;
}
}
break;
caseFTDM_CHANNEL_STATE_DOWN:
{
ok=0;
switch(state){
caseFTDM_CHANNEL_STATE_DIALTONE:
caseFTDM_CHANNEL_STATE_COLLECT:
caseFTDM_CHANNEL_STATE_DIALING:
caseFTDM_CHANNEL_STATE_RING:
caseFTDM_CHANNEL_STATE_PROGRESS_MEDIA:
caseFTDM_CHANNEL_STATE_PROGRESS:
caseFTDM_CHANNEL_STATE_IDLE:
caseFTDM_CHANNEL_STATE_GET_CALLERID:
caseFTDM_CHANNEL_STATE_GENRING:
ok=1;
break;
default:
break;
}
}
break;
caseFTDM_CHANNEL_STATE_BUSY:
{
switch(state){
caseFTDM_CHANNEL_STATE_UP:
ok=0;
break;
default:
break;
}
}
break;
caseFTDM_CHANNEL_STATE_RING:
{
switch(state){
caseFTDM_CHANNEL_STATE_UP:
ok=1;
break;
default:
break;
}
}
break;
default:
break;
}
end:
if(ok){
ftdm_log_chan_ex(ftdmchan,file,func,line,FTDM_LOG_LEVEL_DEBUG,"Changed state from %s to %s\n",ftdm_channel_state2str(ftdmchan->state),ftdm_channel_state2str(state));
ftdm_log_chan_ex(ftdmchan,file,func,line,FTDM_LOG_LEVEL_WARNING,"VETO state change from %s to %s\n",ftdm_channel_state2str(ftdmchan->state),ftdm_channel_state2str(state));