// AddEvent parses a FreeSWITCH EventSocket event and merges contained information into the FaxResult
func (f *FaxResult) AddEvent(ev *eventsocket.Event) {
switch ev.Get("Event-Name") {
case "CHANNEL_CALLSTATE":
// Call state has changed
callstate := ev.Get("Channel-Call-State")
f.sessionlog.Log("Call state change:", callstate)
if callstate == "ACTIVE" {
f.StartTs = time.Now()
}
if callstate == "HANGUP" {
f.EndTs = time.Now()
f.Hangupcause = ev.Get("Hangup-Cause")
}
case "CUSTOM":
// Fax results have changed
action := ""
switch ev.Get("Event-Subclass") {
case "spandsp::rxfaxnegociateresult":
fallthrough
case "spandsp::txfaxnegociateresult":
f.NegotiateCount++
if ecm := ev.Get("Fax-Ecm-Used"); ecm == "on" {
f.Ecm = true
}
f.RemoteID = ev.Get("Fax-Remote-Station-Id")
if rate, err := strconv.ParseUint(ev.Get("Fax-Transfer-Rate"), 10, 0); err == nil {
f.TransferRate = uint(rate)
}
f.sessionlog.Log(fmt.Sprintf("Remote ID: \"%v\", Transfer Rate: %v, ECM=%v", f.RemoteID, f.TransferRate, f.Ecm))
case "spandsp::rxfaxpageresult":
action = "received"
fallthrough
case "spandsp::txfaxpageresult":
if action == "" {
action = "sent"
}
// A page was transferred
if pages, err := strconv.ParseUint(ev.Get("Fax-Document-Transferred-Pages"), 10, 0); err == nil {
f.TransferredPages = uint(pages)
}
pr := new(PageResult)
pr.Page = f.TransferredPages
if badrows, err := strconv.ParseUint(ev.Get("Fax-Bad-Rows"), 10, 0); err == nil {
pr.BadRows = uint(badrows)
}
pr.EncodingName = ev.Get("Fax-Encoding-Name")
if imgsize, err := parseResolution(ev.Get("Fax-Image-Pixel-Size")); err == nil {
pr.ImagePixelSize = *imgsize
}
if filesize, err := parseResolution(ev.Get("Fax-File-Image-Pixel-Size")); err == nil {
pr.FilePixelSize = *filesize
}
if imgres, err := parseResolution(ev.Get("Fax-Image-Resolution")); err == nil {
pr.ImageResolution = *imgres
}
if fileres, err := parseResolution(ev.Get("Fax-File-Image-Resolution")); err == nil {
pr.FileResolution = *fileres
}
if size, err := strconv.ParseUint(ev.Get("Fax-Image-Size"), 10, 0); err == nil {
pr.ImageSize = uint(size)
}
if badrowrun, err := strconv.ParseUint(ev.Get("Fax-Longest-Bad-Row-Run"), 10, 0); err == nil {
pr.LongestBadRowRun = uint(badrowrun)
}
f.PageResults = append(f.PageResults, *pr)
f.sessionlog.Log(fmt.Sprintf("Page %d %v: %v", f.TransferredPages, action, *pr))
case "spandsp::rxfaxresult":
fallthrough
case "spandsp::txfaxresult":
if totalpages, err := strconv.ParseUint(ev.Get("Fax-Document-Total-Pages"), 10, 0); err == nil {
f.TotalPages = uint(totalpages)
}
if transferredpages, err := strconv.ParseUint(ev.Get("Fax-Document-Transferred-Pages"), 10, 0); err == nil {
f.TransferredPages = uint(transferredpages)
}
if ecm := ev.Get("Fax-Ecm-Used"); ecm == "on" {
f.Ecm = true
}
f.RemoteID = ev.Get("Fax-Remote-Station-Id")
if resultcode, err := strconv.Atoi(ev.Get("Fax-Result-Code")); err == nil {
f.ResultCode = resultcode
}
f.ResultText = ev.Get("Fax-Result-Text")
if ev.Get("Fax-Success") == "1" {
f.Success = true
}
if rate, err := strconv.ParseUint(ev.Get("Fax-Transfer-Rate"), 10, 0); err == nil {
f.TransferRate = uint(rate)
}
}
}
//.........这里部分代码省略.........
请发表评论