diff --git a/sessionmanager/sessionmanager.go b/sessionmanager/sessionmanager.go new file mode 100644 index 000000000..2346c3984 --- /dev/null +++ b/sessionmanager/sessionmanager.go @@ -0,0 +1,55 @@ +package sessionmanager + +import ( + "bufio" + "fmt" + "log" + "net" + "regexp" +) + +type Event struct { + body string +} + +func (ev *Event) GetField(field string) (result string, err error) { + if re, err := regexp.Compile(fmt.Sprintf(`"%s":\s+"(.*?)"`, field)); err == nil { + results := re.FindStringSubmatch(ev.body) + if len(results) > 1 { + result = results[1] + } + } + return +} + +type SessionManager struct { + conn net.Conn +} + +func (sm *SessionManager) Connect(address string) { + conn, err := net.Dial("tcp", address) + if err != nil { + log.Fatal("Could not connect to freeswitch server!") + } + sm.conn = conn + fmt.Fprint(sm.conn, "auth ClueCon\n\n") + fmt.Fprint(sm.conn, "event json all\n\n") +} + +func (sm *SessionManager) Close() { + sm.conn.Close() +} + +func (sm *SessionManager) ReadNextEvent() (ev *Event) { + body, err := bufio.NewReader(sm.conn).ReadString('}') + if err != nil { + log.Print("Could not read from freeswitch connection!") + } + ev = &Event{} + ev.body = body + return +} + +func (ssm *SessionManager) onHeartBeat(event string) { + log.Printf("hear beat event: %s", event) +} diff --git a/sessionmanager/sessionmanager_test.go b/sessionmanager/sessionmanager_test.go new file mode 100644 index 000000000..018a22ab8 --- /dev/null +++ b/sessionmanager/sessionmanager_test.go @@ -0,0 +1,37 @@ +/* +Rating system designed to be used in VoIP Carriers World +Copyright (C) 2012 Radu Ioan Fericean + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +package sessionmanager + +import ( + "log" + "testing" +) + +func TestConnect(t *testing.T) { + sm := &SessionManager{} + sm.Connect("localhost:8021") + for { + ev := sm.ReadNextEvent() + if name, err := ev.GetField("Event-Name"); err == nil { + log.Println(name) + } else { + log.Print("cannot get requested field!", err) + } + } +}