diff --git a/sessionmanager/session.go b/sessionmanager/session.go index 4dd3704c8..91c1518af 100644 --- a/sessionmanager/session.go +++ b/sessionmanager/session.go @@ -32,10 +32,11 @@ const ( type Session struct { uuid, cstmId, subject, destination string startTime time.Time // destination: startTime + sessionDelegate SessionDelegate stopDebit chan byte } -func NewSession(ev *Event) (s *Session) { +func NewSession(ev *Event, ed SessionDelegate) (s *Session) { startTime, err := time.Parse(time.RFC1123, ev.Fields[START_TIME]) if err != nil { log.Print("Error parsing answer event start time, using time.Now!") @@ -47,6 +48,7 @@ func NewSession(ev *Event) (s *Session) { destination: ev.Fields[DESTINATION], startTime: startTime, stopDebit: make(chan byte)} + s.sessionDelegate = ed go s.StartDebitLoop() return } @@ -55,11 +57,10 @@ func (s *Session) StartDebitLoop() { for { select { case <-s.stopDebit: - log.Print("Put back!") return default: } - log.Print("Debit") + s.sessionDelegate.LoopAction() time.Sleep(DEBIT_PERIOD) } } diff --git a/sessionmanager/session_test.go b/sessionmanager/session_test.go index 61399ca5b..572ff0c72 100644 --- a/sessionmanager/session_test.go +++ b/sessionmanager/session_test.go @@ -52,7 +52,7 @@ var ( ) func TestSessionDurationSingle(t *testing.T) { - s := NewSession(newEvent) + s := NewSession(newEvent, new(DirectSessionDelegate)) defer s.Close() twoSeconds, _ := time.ParseDuration("2s") if d := s.GetSessionDurationFrom(s.startTime.Add(twoSeconds)); d.Seconds() < 2 || d.Seconds() > 3 { @@ -61,7 +61,7 @@ func TestSessionDurationSingle(t *testing.T) { } func TestSessionCostSingle(t *testing.T) { - s := NewSession(newEvent) + s := NewSession(newEvent, new(DirectSessionDelegate)) defer s.Close() twoSeconds, _ := time.ParseDuration("60s") if cc, err := s.GetSessionCostFrom(s.startTime.Add(twoSeconds)); err != nil { diff --git a/sessionmanager/eventdelegate.go b/sessionmanager/sessiondelegate.go similarity index 55% rename from sessionmanager/eventdelegate.go rename to sessionmanager/sessiondelegate.go index 40e51bba5..308ee560b 100644 --- a/sessionmanager/eventdelegate.go +++ b/sessionmanager/sessiondelegate.go @@ -22,22 +22,46 @@ import ( "log" ) -type EventDelegate interface { +type SessionDelegate interface { OnHeartBeat(*Event) OnChannelAnswer(*Event, *Session) OnChannelHangupComplete(*Event, *Session) + LoopAction() } -type DirectEventDelegate byte +type DirectSessionDelegate byte -func (ded *DirectEventDelegate) OnHeartBeat(ev *Event) { +func (dsd *DirectSessionDelegate) OnHeartBeat(ev *Event) { log.Print("direct hearbeat") } -func (ded *DirectEventDelegate) OnChannelAnswer(ev *Event, s *Session) { +func (dsd *DirectSessionDelegate) OnChannelAnswer(ev *Event, s *Session) { log.Print("direct answer") } -func (ded *DirectEventDelegate) OnChannelHangupComplete(ev *Event, s *Session) { +func (dsd *DirectSessionDelegate) OnChannelHangupComplete(ev *Event, s *Session) { log.Print("direct hangup") } + +func (dsd *DirectSessionDelegate) LoopAction() { + log.Print("Direct debit") +} + +// +type RPCSessionDelegate byte + +func (rsd *RPCSessionDelegate) OnHeartBeat(ev *Event) { + log.Print("rpc hearbeat") +} + +func (rsd *RPCSessionDelegate) OnChannelAnswer(ev *Event, s *Session) { + log.Print("rpc answer") +} + +func (rsd *RPCSessionDelegate) OnChannelHangupComplete(ev *Event, s *Session) { + log.Print("rpc hangup") +} + +func (rsd *RPCSessionDelegate) LoopAction() { + log.Print("Rpc debit") +} diff --git a/sessionmanager/sessionmanager.go b/sessionmanager/sessionmanager.go index 1c5535b63..b79e73668 100644 --- a/sessionmanager/sessionmanager.go +++ b/sessionmanager/sessionmanager.go @@ -31,9 +31,9 @@ var ( ) type SessionManager struct { - buf *bufio.Reader - sessions []*Session - eventDelegate EventDelegate + buf *bufio.Reader + sessions []*Session + sessionDelegate SessionDelegate } func (sm *SessionManager) Connect(address, pass string) { @@ -46,8 +46,8 @@ func (sm *SessionManager) Connect(address, pass string) { fmt.Fprint(conn, "event json all\n\n") } -func (sm *SessionManager) AddEventDelegate(ed EventDelegate) { - sm.eventDelegate = ed +func (sm *SessionManager) SetSessionDelegate(ed SessionDelegate) { + sm.sessionDelegate = ed } func (sm *SessionManager) ReadNextEvent() (ev *Event) { @@ -79,17 +79,17 @@ func (sm *SessionManager) GetSession(uuid string) *Session { } func (sm *SessionManager) OnHeartBeat(ev *Event) { - if sm.eventDelegate != nil { - sm.eventDelegate.OnHeartBeat(ev) + if sm.sessionDelegate != nil { + sm.sessionDelegate.OnHeartBeat(ev) } else { log.Print("heartbeat") } } func (sm *SessionManager) OnChannelAnswer(ev *Event) { - s := NewSession(ev) - if sm.eventDelegate != nil { - sm.eventDelegate.OnChannelAnswer(ev, s) + if sm.sessionDelegate != nil { + s := NewSession(ev, sm.sessionDelegate) + sm.sessionDelegate.OnChannelAnswer(ev, s) } else { log.Print("answer") } @@ -97,8 +97,8 @@ func (sm *SessionManager) OnChannelAnswer(ev *Event) { func (sm *SessionManager) OnChannelHangupComplete(ev *Event) { s := sm.GetSession(ev.Fields[UUID]) - if sm.eventDelegate != nil { - sm.eventDelegate.OnChannelHangupComplete(ev, s) + if sm.sessionDelegate != nil { + sm.sessionDelegate.OnChannelHangupComplete(ev, s) } else { log.Print("HangupComplete") } diff --git a/sessionmanager/sessionmanager_test.go b/sessionmanager/sessionmanager_test.go index f6f433197..1b598c985 100644 --- a/sessionmanager/sessionmanager_test.go +++ b/sessionmanager/sessionmanager_test.go @@ -26,7 +26,7 @@ import ( func TestConnect(t *testing.T) { sm := &SessionManager{} sm.Connect("localhost:8021", "ClueCon") - sm.AddEventDelegate(new(DirectEventDelegate)) + sm.SetSessionDelegate(new(DirectSessionDelegate)) //for { ev := sm.ReadNextEvent() if ev == nil {