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.
127 lines
3.4 KiB
Go
127 lines
3.4 KiB
Go
package icssessionmanager
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"runtime/debug"
|
|
"sync"
|
|
|
|
"gitlab.com/cinnamon/voiceagent/icsconf"
|
|
"gitlab.com/cinnamon/voiceagent/icserror"
|
|
"gitlab.com/cinnamon/voiceagent/icsevent"
|
|
"gitlab.com/cinnamon/voiceagent/icslog"
|
|
"gitlab.com/cinnamon/voiceagent/icssvc"
|
|
)
|
|
|
|
type SessionManager struct {
|
|
evtSystem []*icsevent.EventSystem
|
|
sessions []*IcsSession
|
|
|
|
event *icsevent.EventH
|
|
}
|
|
|
|
var bigSession []*IcsSession
|
|
|
|
//var bigSession []*IcsSession
|
|
var onceSession sync.Once
|
|
var channelNum int
|
|
|
|
func getSessionInstance() []*IcsSession {
|
|
onceSession.Do(func() {
|
|
l := icslog.GetIcsLog()
|
|
conf := icsconf.GetIcsConfig()
|
|
|
|
bigSession = make([]*IcsSession, channelNum)
|
|
|
|
for iter := 0; iter < channelNum; iter++ {
|
|
bigSession[iter] = new(IcsSession)
|
|
bigSession[iter].m = &sync.Mutex{}
|
|
bigSession[iter].ID = iter
|
|
//bigSession[iter].goroutineID = goid()
|
|
bigSession[iter].isStart = 0
|
|
//bigSession[iter].lastTimestamp = time.Now()
|
|
|
|
bigSession[iter].eventSystem = icsevent.GetMyEventSystem(iter)
|
|
//bigSession[iter].Init(iter)
|
|
|
|
bigSession[iter].isBotStart = false
|
|
bigSession[iter].isSTTStart = false
|
|
|
|
if conf.AgentConfig[iter].Value {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
switch v := err.(type) {
|
|
case error:
|
|
icserror.ICSERRNETNotConnectError.SetError(v)
|
|
l.Printf(icslog.LOG_LEVEL_WARN, iter, "PANIC! %s\n%s", icserror.ICSERRNETNotConnectError.GetError().Error(), string(debug.Stack()))
|
|
fmt.Println(string(debug.Stack()), "\nFailed to initialize Voice Agent. EXIT!")
|
|
os.Exit(1)
|
|
default:
|
|
l.Print(icslog.LOG_LEVEL_WARN, iter, icserror.ICSERRNETNotConnectError.GetMessage())
|
|
}
|
|
}
|
|
}()
|
|
|
|
/*
|
|
//listen call signal port
|
|
if conf.AgentConfig[iter].CSConfig.Port != 0 {
|
|
csladdr := icsnet.NewNetAddrWithIPPort("0.0.0.0", conf.AgentConfig[iter].CSConfig.Port)
|
|
bigSession[iter].CallSignalNeter = icsnet.NewTCP(&csladdr, nil)
|
|
cserr := bigSession[iter].CallSignalNeter.Listen()
|
|
if cserr != nil {
|
|
l.Printf(icslog.LOG_LEVEL_FATAL, iter, "Port[%s] Listen Failure - %s", csladdr, cserr.GetError())
|
|
} else {
|
|
l.Printf(icslog.LOG_LEVEL_INFO, iter, "Call signal port open - %s", csladdr)
|
|
}
|
|
}
|
|
*/
|
|
|
|
/*
|
|
//listen voice port
|
|
vraddr := icsnet.NewNetAddrWithIPPort("0.0.0.0", conf.AgentConfig[iter].Port)
|
|
bigSession[iter].VoiceNeter = icsnet.NewUDP(&vraddr, nil)
|
|
lerr := bigSession[iter].VoiceNeter.Listen()
|
|
if lerr != nil {
|
|
l.Printf(icslog.LOG_LEVEL_FATAL, iter, "Port[%s] Listen Failure - %s", vraddr, lerr.GetError())
|
|
} else {
|
|
l.Printf(icslog.LOG_LEVEL_INFO, iter, "Voice port open - %s", vraddr)
|
|
}
|
|
*/
|
|
}
|
|
}
|
|
})
|
|
|
|
return bigSession
|
|
}
|
|
|
|
func NewSessionManager() *SessionManager {
|
|
svc := icssvc.NewService()
|
|
channelNum = svc.GetIcsConfig().GetChannelNum()
|
|
//icsevent.SetConfig(svc.GetIcsConfig())
|
|
|
|
sm := new(SessionManager)
|
|
icsevent.SetChannelNum(channelNum)
|
|
sm.evtSystem = icsevent.GetEvtSystemInstance()
|
|
sm.sessions = getSessionInstance()
|
|
|
|
//EventH. Create Event Array
|
|
sm.event = icsevent.NewEventH()
|
|
|
|
return sm
|
|
}
|
|
|
|
func (sm *SessionManager) Load() *icserror.IcsError {
|
|
//l := icslog.GetIcsLog()
|
|
|
|
sm.event.Init()
|
|
|
|
//for iter, session := range sm.sessions {
|
|
for _, session := range sm.sessions {
|
|
//l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "333 %d", iter)
|
|
//l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "444 %d", session.ID)
|
|
go session.Run()
|
|
}
|
|
|
|
return nil
|
|
}
|