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.

145 lines
5.0 KiB
Go

3 years ago
package icssessionmanager
import (
"strings"
"gitlab.com/ics_cinnamon/voicegateway/icspacketparser"
)
const (
ICS_SIP_AUTOMATA_REGISTER = 32767
//ICS_SIP_AUTOMATA_REGISTER = 2
ICS_SIP_AUTOMATA_INVITE = 32767
ICS_SIP_AUTOMATA_ACK = 32767
ICS_SIP_AUTOMATA_CANCEL = 14336
ICS_SIP_AUTOMATA_BYE = 32767
ICS_SIP_AUTOMATA_NOTIFY = 32767
ICS_SIP_AUTOMATA_OPTIONS = 32767
/*
ICS_SIP_AUTOMATA_INVITE = 11266
ICS_SIP_AUTOMATA_ACK = 32767
ICS_SIP_AUTOMATA_CANCEL = 14336
ICS_SIP_AUTOMATA_BYE = 32767
*/
//ICS_SIP_AUTOMATA_BYE = 0
)
const (
ICS_SIP_JOB_TYPE_REGISTER = 1 << iota
ICS_SIP_JOB_TYPE_INVITE
ICS_SIP_JOB_TYPE_PUBLISH
ICS_SIP_JOB_TYPE_OPTIONS
ICS_SIP_JOB_TYPE_INFO
ICS_SIP_JOB_TYPE_UPDATE
ICS_SIP_JOB_TYPE_REFER
ICS_SIP_JOB_TYPE_SUBSCRIBE
ICS_SIP_JOB_TYPE_MESSAGE
ICS_SIP_JOB_TYPE_NOTIFY
ICS_SIP_JOB_TYPE_PRACK
ICS_SIP_JOB_TYPE_ACK
ICS_SIP_JOB_TYPE_BYE
ICS_SIP_JOB_TYPE_CANCEL
)
func SessionAvailableSipMethod(sip *icspacketparser.SIP) bool {
if sip.Method == icspacketparser.ICS_SIP_METHOD_INVITE || sip.Method == icspacketparser.ICS_SIP_METHOD_CANCEL || sip.Method == icspacketparser.ICS_SIP_METHOD_BYE || sip.Method == icspacketparser.ICS_SIP_METHOD_ACK || sip.Method == icspacketparser.ICS_SIP_METHOD_NOTIFY {
return true
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_SIP20 {
if strings.Contains(sip.Cseq, " INVITE") || strings.Contains(sip.Cseq, " CANCEL") || strings.Contains(sip.Cseq, " BYE") || strings.Contains(sip.Cseq, " ACK") || strings.Contains(sip.Cseq, " REGISTER") || strings.Contains(sip.Cseq, " OPTIONS") {
return true
/*
if sip.ResType == "183" || sip.ResType == "200" {
return true
}
*/
}
}
return false
}
func (s *IcsSession) CheckAutomataWithType(methodType int) bool {
return (s.MethodAutomata & methodType) == methodType
}
func (s *IcsSession) CheckAutomata(sip *icspacketparser.SIP) bool {
jobType := GetJobType(sip)
return (s.MethodAutomata & jobType) == jobType
/*
// fmt.Println("^^^^^", "s.MethodAutomata,jobType,sip.Method", s.MethodAutomata, jobType, sip.Method)
if (s.MethodAutomata&jobType) == jobType || jobType == ICS_SIP_JOB_TYPE_BYE {
// fmt.Println("^^^^^", "automata find ok")
return true
}
// fmt.Println("^^^^^", "not allow automata sip.Cseq", sip.Cseq)
return false
*/
}
func GetJobType(sip *icspacketparser.SIP) int {
if sip.Method == icspacketparser.ICS_SIP_METHOD_SIP20 {
if strings.Contains(sip.Cseq, " INVITE") {
return ICS_SIP_JOB_TYPE_INVITE
} else if strings.Contains(sip.Cseq, " ACK") {
return ICS_SIP_JOB_TYPE_ACK
} else if strings.Contains(sip.Cseq, " BYE") {
return ICS_SIP_JOB_TYPE_BYE
} else if strings.Contains(sip.Cseq, " REGISTER") {
return ICS_SIP_JOB_TYPE_REGISTER
} else if strings.Contains(sip.Cseq, " CANCEL") {
return ICS_SIP_JOB_TYPE_CANCEL
} else if strings.Contains(sip.Cseq, " OPTIONS") {
return ICS_SIP_JOB_TYPE_OPTIONS
}
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_REGISTER {
return ICS_SIP_JOB_TYPE_REGISTER
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_INVITE {
return ICS_SIP_JOB_TYPE_INVITE
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_CANCEL {
return ICS_SIP_JOB_TYPE_CANCEL
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_BYE {
return ICS_SIP_JOB_TYPE_BYE
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_ACK {
return ICS_SIP_JOB_TYPE_ACK
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_NOTIFY {
return ICS_SIP_JOB_TYPE_NOTIFY
}
return -1
}
func (s *IcsSession) SetSessionMethodWithType(methodType int) {
s.MethodAutomata = methodType
}
func (s *IcsSession) SetSessionMethod(sip icspacketparser.SIP) {
if sip.Method == icspacketparser.ICS_SIP_METHOD_SIP20 {
if strings.Contains(sip.Cseq, " REGISTER") {
s.MethodAutomata = ICS_SIP_AUTOMATA_REGISTER
//fmt.Println(">>>>>>>>>>", s.MethodAutomata, ICS_SIP_AUTOMATA_REGISTER)
} else if strings.Contains(sip.Cseq, " INVITE") {
s.MethodAutomata = ICS_SIP_AUTOMATA_INVITE
} else if strings.Contains(sip.Cseq, " CANCEL") {
s.MethodAutomata = ICS_SIP_AUTOMATA_CANCEL
} else if strings.Contains(sip.Cseq, " BYE") {
s.MethodAutomata = ICS_SIP_AUTOMATA_BYE
} else if strings.Contains(sip.Cseq, " ACK") {
s.MethodAutomata = ICS_SIP_AUTOMATA_ACK
} else if strings.Contains(sip.Cseq, " OPTIONS") {
s.MethodAutomata = ICS_SIP_AUTOMATA_OPTIONS
}
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_REGISTER {
s.MethodAutomata = ICS_SIP_AUTOMATA_REGISTER
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_INVITE {
s.MethodAutomata = ICS_SIP_AUTOMATA_INVITE
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_CANCEL {
s.MethodAutomata = ICS_SIP_AUTOMATA_CANCEL
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_BYE {
s.MethodAutomata = ICS_SIP_AUTOMATA_BYE
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_ACK {
s.MethodAutomata = ICS_SIP_AUTOMATA_ACK
} else if sip.Method == icspacketparser.ICS_SIP_METHOD_NOTIFY {
s.MethodAutomata = ICS_SIP_AUTOMATA_NOTIFY
}
}