You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
4.3 KiB
Go

/*
Call Signal Processor
*/
package icssessionmanager
import (
"time"
"strings"
"gitlab.com/ics_cinnamon/voicegateway/icsconf"
"gitlab.com/ics_cinnamon/voicegateway/icserror"
"gitlab.com/ics_cinnamon/voicegateway/icslog"
parser "gitlab.com/ics_cinnamon/voicegateway/icspacketparser"
)
func (s *IcsSession) Processing(sip *parser.SIP) *icserror.IcsError {
if sip == nil {
return icserror.ICSERRInvalidParam
}
l := icslog.GetIcsLog()
conf := icsconf.GetIcsConfig()
switch sip.Method {
case parser.ICS_SIP_METHOD_REGISTER:
return s.ProcRegister(sip)
case parser.ICS_SIP_METHOD_INVITE:
l.Printf(icslog.LOG_LEVEL_DEBUG2, s.ID, "INVITE")
//time.Sleep(3000 * time.Millisecond)
//return nil
return s.ProcInvite(sip)
case parser.ICS_SIP_METHOD_PUBLISH:
case parser.ICS_SIP_METHOD_OPTIONS:
case parser.ICS_SIP_METHOD_INFO:
case parser.ICS_SIP_METHOD_UPDATE:
case parser.ICS_SIP_METHOD_REFER:
case parser.ICS_SIP_METHOD_SUBSCRIBE:
case parser.ICS_SIP_METHOD_MESSAGE:
case parser.ICS_SIP_METHOD_NOTIFY:
s.ProcReferNotify200ok(sip)
case parser.ICS_SIP_METHOD_PRACK:
case parser.ICS_SIP_METHOD_ACK:
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "ACK - %+v", sip)
s.InviteSIP = sip
if s.GetAgentStatus() == STATUS_AGENT_CALLING {
s.SetAgentStatus(STATUS_AGENT_BUSY)
//s.RTPSenderCallBackTimer.Start()
//l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Started [%s]RTP callback timer", conf.AgentConfig[s.ID].Name)
} else if s.GetAgentStatus() == STATUS_AGENT_ERROR {
s.RequestBYE(s.InviteSIP)
s.SetAgentStatus(STATUS_AGENT_READY)
}
/*else {
l.Print(icslog.LOG_LEVEL_INFO, s.ID, "ACK")
}
*/
case parser.ICS_SIP_METHOD_BYE:
l.Printf(icslog.LOG_LEVEL_DEBUG2, s.ID, "BYE")
status := s.GetAgentStatus()
if status == STATUS_AGENT_BUSY {
s.RTPSenderCallBackTimer.Stop()
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Stoped [%s] RTP callback timer", conf.AgentConfig[s.ID].Name)
}
err := s.ProcBye(sip)
if err != nil {
l.Printf(icslog.LOG_LEVEL_ERROR, s.ID, "Could not process BYE method - %s", err.GetMessage())
}
s.RemoveSession()
//////////////////////////////////
//////// for simul //////////////
//////////////////////////////////
// send 83 to reg200
l.Printf(icslog.LOG_LEVEL_ERROR, s.ID, "Start Sim!!!")
time.Sleep(time.Second)
s.SendRequestInvite()
//////////////////////////////////
//////////////////////////////////
//////////////////////////////////
case parser.ICS_SIP_METHOD_CANCEL:
s.RTPSenderCallBackTimer.Stop()
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Stoped [%s] RTP callback timer", conf.AgentConfig[s.ID].Name)
err := s.ProcCancel(sip)
if err != nil {
l.Printf(icslog.LOG_LEVEL_ERROR, s.ID, "Could not process CANCEL method - %s", err.GetMessage())
}
case parser.ICS_SIP_METHOD_SIP20: //recved response proc
switch GetJobType(sip) {
case ICS_SIP_JOB_TYPE_REGISTER:
//check status code
code := sip.Source
if strings.Compare(code, "200") == 0 {
s.SetRegisterStatus(STATUS_REGISTER_REGISTERED)
s.SetAgentStatus(STATUS_AGENT_READY)
//s.INVITECallBackTimer.Start()
//defer s.INVITECallBackTimer.Stop()
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Agent [%s] registered [%s]", s.AgentName, s.callID)
s.RemoveSession()
}
case ICS_SIP_JOB_TYPE_INVITE:
//l.Printf(icslog.LOG_LEVEL_DEBUG2, s.ID, "sip20 invite - %s", sip.Source)
code := sip.Source
switch code {
case "100":
case "180":
case "183":
case "200":
//response ACK
s.ProcACKInvite(sip)
default:
//response ACK
s.ProcACKInvite(sip)
}
case ICS_SIP_JOB_TYPE_PUBLISH:
case ICS_SIP_JOB_TYPE_OPTIONS:
s.RequestInvite("01024342788")
case ICS_SIP_JOB_TYPE_INFO:
case ICS_SIP_JOB_TYPE_UPDATE:
case ICS_SIP_JOB_TYPE_REFER:
case ICS_SIP_JOB_TYPE_SUBSCRIBE:
case ICS_SIP_JOB_TYPE_MESSAGE:
case ICS_SIP_JOB_TYPE_NOTIFY:
case ICS_SIP_JOB_TYPE_PRACK:
case ICS_SIP_JOB_TYPE_ACK:
case ICS_SIP_JOB_TYPE_BYE:
if s.GetAgentStatus() == STATUS_AGENT_BUSY || s.GetAgentStatus() == STATUS_AGENT_BYEING {
s.ProcSIP20Bye(sip)
}
case ICS_SIP_JOB_TYPE_CANCEL:
/*
//check status code
code := sip.Source
if strings.Compare(code, "200") == 0 {
s.SetAgentStatus(STATUS_AGENT_READY)
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Agent [%s] CANCELed", s.AgentName)
}
*/
default:
}
case parser.ICS_SIP_METHOD_NOT_FOUND:
default:
}
return nil
}