/** * This static function processes just one input line. * It must be called in a loop to keep messages running. Or else. * @return false if we should exit, true if we should keep running, * or an Yate object instance. Remember to use === and !== operators * when comparing against true and false. */ static function GetEvent() { global $yate_stdin, $yate_socket; if ($yate_socket) { $line = @socket_read($yate_socket, 8192, PHP_NORMAL_READ); // check for error if ($line == false) { return false; } // check for EOF if ($line === "") { return false; } } else { if ($yate_stdin == false) { return false; } // check for EOF if (feof($yate_stdin)) { return false; } $line = fgets($yate_stdin, 8192); // check for async read no data if ($line == false) { return true; } } $line = str_replace("\n", "", $line); if ($line == "") { return true; } $ev = true; $part = explode(":", $line); switch ($part[0]) { case "%%>message": /* incoming message str_id:int_time:str_name:str_retval[:key=value...] */ $ev = new Yate(Yate::Unescape($part[3]), Yate::Unescape($part[4]), Yate::Unescape($part[1])); $ev->type = "incoming"; $ev->origin = 0 + $part[2]; $ev->FillParams($part, 5); break; case "%%<message": /* message answer str_id:bool_handled:str_name:str_retval[:key=value...] */ $ev = new Yate(Yate::Unescape($part[3]), Yate::Unescape($part[4]), Yate::Unescape($part[1])); $ev->type = "answer"; $ev->handled = Yate::Str2bool($part[2]); $ev->FillParams($part, 5); break; case "%%<install": /* install answer num_priority:str_name:bool_success */ $ev = new Yate(Yate::Unescape($part[2]), "", 0 + $part[1]); $ev->type = "installed"; $ev->handled = Yate::Str2bool($part[3]); break; case "%%<uninstall": /* uninstall answer num_priority:str_name:bool_success */ $ev = new Yate(Yate::Unescape($part[2]), "", 0 + $part[1]); $ev->type = "uninstalled"; $ev->handled = Yate::Str2bool($part[3]); break; case "%%<watch": /* watch answer str_name:bool_success */ $ev = new Yate(Yate::Unescape($part[1])); $ev->type = "watched"; $ev->handled = Yate::Str2bool($part[2]); break; case "%%<unwatch": /* unwatch answer str_name:bool_success */ $ev = new Yate(Yate::Unescape($part[1])); $ev->type = "unwatched"; $ev->handled = Yate::Str2bool($part[2]); break; case "%%<connect": /* connect answer str_role:bool_success */ $ev = new Yate(Yate::Unescape($part[1])); $ev->type = "connected"; $ev->handled = Yate::Str2bool($part[2]); break; case "%%<setlocal": /* local parameter answer str_name:str_value:bool_success */ $ev = new Yate(Yate::Unescape($part[1]), Yate::Unescape($part[2])); $ev->type = "setlocal"; $ev->handled = Yate::Str2bool($part[3]); break; case "Error in": /* We are already in error so better stay quiet */ break; default: Yate::Output("PHP parse error: " . $line); } return $ev; }