if ($untrusted) { $collect_user = $mailbox; setState("pass"); } else { initUser(); } } break; case "chan.notify": gotNotify($ev->GetValue("reason")); $ev->handled = true; break; case "chan.dtmf": $text = $ev->GetValue("text"); for ($i = 0; $i < strlen($text); $i++) { gotDTMF($text[$i]); } $ev->handled = true; break; } /* This is extremely important. We MUST let messages return, handled or not */ if ($ev) { $ev->Acknowledge(); } break; case "answer": // Yate::Debug("PHP Answered: " . $ev->name . " id: " . $ev->id); if ($ev->name == "user.auth") { checkAuth($ev->retval); }
function endRoute($callto, $ok, $err, $params) { global $partycallid; global $collect; global $final; global $queue; global $routeOnly; global $state; if ($ok && $callto != "-" && $callto != "error") { Yate::Output("Overlapped got route: '{$callto}' for '{$collect}'"); $m = new Yate("chan.masquerade"); $m->params = $params; $m->params["message"] = "call.execute"; $m->params["complete_minimal"] = true; $m->params["id"] = $partycallid; $m->params["callto"] = $callto; $m->Dispatch(); if (strlen($queue)) { // Masquerade the remaining digits // TODO: wait for call.execute to be processed to do that? $d = new Yate("chan.masquerade"); $d->params["message"] = "chan.dtmf"; $d->params["id"] = $partycallid; $d->params["tone"] = $queue; $d->Dispatch(); } return; } if ($final) { Yate::Output("Overlapped got final error '{$err}' for '{$collect}'"); Yate::SetLocal("reason", $err); setState(""); } else { if ($err != "incomplete") { Yate::Output("Overlapped got error '{$err}' for '{$collect}'"); Yate::SetLocal("reason", $err); setState(""); $final = true; } else { Yate::Debug("Overlapped still incomplete: '{$collect}'"); if ($routeOnly) { setState("noroute"); } else { // Don't use setState: we don't want to change the prompt $state = "prompt"; } // Check if got some other digits if ($queue != "") { gotDTMF(""); } } } }
$m->params["id"] = $ourcallid; $m->params["targetid"] = $partycallid; $m->Dispatch(); setState("prompt"); break; case "chan.notify": if ($ev->GetValue("targetid") == $ourcallid) { gotNotify(); $ev->handled = true; } break; case "chan.dtmf": if ($ev->GetValue("targetid") == $ourcallid) { $dtmfs = $ev->GetValue("text"); for ($i = 0; $i < strlen($dtmfs); $i++) { gotDTMF($dtmfs[$i]); } $ev->handled = true; } break; } /* This is extremely important. We MUST let messages return, handled or not */ if ($ev) { $ev->Acknowledge(); } break; case "answer": if ($ev->name == "call.route") { endRoute($ev->retval, $ev->handled, $ev->GetValue("error")); }
// No need to track us, this is an utility channel $m->SetParam("cdrtrack", false); // Active DTMF detector on outgoing call leg $m->SetParam("tonedetect_out", true); $m->Dispatch(); break; case "call.answered": callAnswered(); $ev->handled = true; break; case "chan.notify": callFailed("noanswer"); $ev->handled = true; break; case "chan.dtmf": gotDTMF($ev->GetValue("text")); $ev->handled = true; break; case "chan.disconnected": callFailed($ev->GetValue("reason")); /* Put it back running to avoid double destruction... */ $running = true; $ev->handled = true; break; } /* This is extremely important. We MUST let messages return, handled or not */ if ($ev) { $ev->Acknowledge(); } break;