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" { // fmt.Println("#### Received REGI ") 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 { // fmt.Printf("####### Receved SIP Packet > \r\n%s \r\n", buf[:rlen]) 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) // fmt.Println("send msg", sendMsg) _, 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 } }