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.

136 lines
4.3 KiB
Go

3 years ago
package simprocnew
import (
"fmt"
"strings"
"gitlab.com/ics_cinnamon/voicegateway/icserror"
"gitlab.com/ics_cinnamon/voicegateway/icslog"
"gitlab.com/ics_cinnamon/voicegateway/icsnet"
"gitlab.com/ics_cinnamon/voicegateway/sim/simproc"
"gitlab.com/ics_cinnamon/voicegateway/sim/siptemplate"
)
type SipCallFunc func(*SimCall)
type SimCall struct {
sipType string
cbFunc SipCallFunc
}
// s.Id = sessionid, id = sim agent id
func NewSIPSignal(sipType string, sessionId int, id string, toid string, ra icsnet.IcsNetAddr, callid string, ip string, rTPTxPort int, laddr *icsnet.IcsNetAddr, rsaddr *icsnet.IcsNetAddr, lsaddr *icsnet.IcsNetAddr, localSIPUDP *icsnet.IcsUDPNet, buf []byte, rlen int) *icserror.IcsError {
var sendTmpl string
var bye200 *icserror.IcsError
var sendMsg string
tmpl := siptemplate.GetTemplate()
l := icslog.GetIcsLog()
if strings.ToUpper(sipType) == "REGI" {
2 years ago
// fmt.Println("#### Received REGI ")
3 years ago
p := simproc.NewSIPProc(buf[:rlen])
from := p.SIPHeader.From
id = strings.Split(strings.Split(from, "@")[0], ":")[1]
sendTmpl = tmpl.String(siptemplate.REGI_ID)
sendMsg = fmt.Sprintf(sendTmpl,
id, //start line
id, //from
callid,
id, //content
)
WriteSIP(sipType, sessionId, ra, callid, ip, rTPTxPort, laddr, rsaddr, lsaddr, sendMsg, localSIPUDP)
} else {
switch strings.ToUpper(sipType) {
case "INVITE":
sendTmpl = tmpl.String(siptemplate.INVITETMPL_ID)
sendMsg = fmt.Sprintf(sendTmpl,
id, //start line
id, // from
id, // to
callid, //call id
id, //contact
227, //content-length
ip, //c=
rTPTxPort, //o=
)
case "INVITE200":
case "ACK":
sendTmpl = tmpl.String(siptemplate.ACKTMPL_ID)
sendMsg = fmt.Sprintf(sendTmpl,
id, //start line
id, //from
id, //to
callid, //callid
id, //conatact
)
case "BYE":
sendTmpl = tmpl.String(siptemplate.BYETMPL_ID)
sendMsg = fmt.Sprintf(sendTmpl,
id, //start line
id, //from
id, //to
callid, //call id
)
case "BYE200":
sendTmpl = tmpl.String(siptemplate.OK200BYETMPL_ID)
sendMsg = fmt.Sprintf(sendTmpl,
id, //from
id, //to
callid, //callid
id, //contact
)
case "REFER":
case "NOTIFY":
case "NOTIFY200":
}
l.Printf(icslog.LOG_LEVEL_INFO, sessionId, "Call ID [%s]", callid)
WriteSIP(sipType, sessionId, ra, callid, ip, rTPTxPort, laddr, rsaddr, lsaddr, sendMsg, localSIPUDP)
if strings.ToUpper(sipType) != "ACK" && strings.ToUpper(sipType) != "BYE" {
_, _, err := NewReadSIP(sessionId, callid, ip, rTPTxPort, ra, laddr, rsaddr, lsaddr, localSIPUDP)
if err != nil {
l.Printf(icslog.LOG_LEVEL_ERROR, sessionId, "Failed to recv SIP - %v", err)
return err
}
}
}
if bye200 != nil {
return bye200
}
return nil
}
func NewReadSIP(sessionId int, callid string, ip string, rTPTxPort int, ra icsnet.IcsNetAddr, laddr *icsnet.IcsNetAddr, rsaddr *icsnet.IcsNetAddr, lsaddr *icsnet.IcsNetAddr, localSIPUDP *icsnet.IcsUDPNet) ([]byte, int, *icserror.IcsError) {
l := icslog.GetIcsLog()
buf, remAddr, rlen, siperr := localSIPUDP.ReadSIP()
if siperr != nil {
l.Printf(icslog.LOG_LEVEL_ERROR, sessionId, "Failed to recv SIP - %v", siperr)
localSIPUDP.Close()
return nil, 0, siperr
} else {
2 years ago
// fmt.Printf("####### Receved SIP Packet > \r\n%s \r\n", buf[:rlen])
3 years ago
l.Printf(icslog.LOG_LEVEL_INFO, sessionId, "Recved SIP Packet [%s:%d]->[%s:%d]>\n%s\n===================",
remAddr.IP.String(), remAddr.Port, rsaddr.IPv4String, rsaddr.Port, buf[:rlen])
}
return buf, rlen, nil
}
func WriteSIP(sipType string, sessionId int, ra icsnet.IcsNetAddr, callid string, ip string, rTPTxPort int, laddr *icsnet.IcsNetAddr, rsaddr *icsnet.IcsNetAddr, lsaddr *icsnet.IcsNetAddr, sendMsg string, localSIPUDP *icsnet.IcsUDPNet) *icserror.IcsError {
l := icslog.GetIcsLog()
l.Printf(icslog.LOG_LEVEL_INFO, sessionId, "Call ID [%s]", callid)
2 years ago
// fmt.Println("send msg", sendMsg)
3 years ago
_, werr := localSIPUDP.Write([]byte(sendMsg))
if werr != nil {
l.Printf(icslog.LOG_LEVEL_ERROR, sessionId, "Failed to send SIP - %v", werr)
localSIPUDP.Close()
return werr
} else {
l.Printf(icslog.LOG_LEVEL_INFO, sessionId, "Send SIP Packet [%s:%d]->[%s:%d]>\n%s\n===================",
ip, lsaddr.Port, rsaddr.IPv4String, rsaddr.Port, sendMsg)
return nil
}
}