def dispatch!(event)
if event.kind_of?(DSL::Dialplan::NoOpEventCommand) && event.on_keypress
return_value = nil
dispatch = lambda do
loop do
Thread.my.call.mgr.get_raw_header
async_event = Thread.my.call.mgr.get_header
if async_event['Event-Name'] == 'DTMF'
key = async_event['DTMF-String']
return_value = event.on_keypress.call(('0'..'9').include?(key) ? key.to_i : key)
end
end
end
if event.timeout
begin
Timeout.timeout event.timeout, &dispatch
rescue Timeout::Error
break!
return_value
end
else dispatch.call
end
else
log "Not a noop. Sending #{event.app}(#{event.args.to_a * " "})"
Thread.my.call.mgr << "SendMsg\ncall-command: execute\nexecute-app-name: " +
"#{event.app}\nexecute-app-arg: #{event.args.to_a * " "}"
if event.kind_of? DSL::Dialplan::ExitingEventCommand
Thread.my.call.io.close
Thread.me.exit
end
lambda do
Thread.my.call.mgr.get_raw_header
redo if Thread.my.call.mgr.get_header['Event-Name'] == "CHANNEL_EXECUTE_COMPLETE"
end.call
execution_header = Thread.my.call.mgr.get_header
execution_uuid = execution_header['Core-UUID']
loop do
log "Waiting for either a DTMF or the app to finish"
hdr = Thread.my.call.mgr.get_raw_header
log "Got head #{hdr}"
if hdr == "Content-Type: api/response\nContent-Length: 0"
break
end
async_event = Thread.my.call.mgr.get_header
event_name = async_event['Event-Name']
if event_name == 'DTMF' && event.on_keypress
key = async_event['DTMF-String']
event.on_keypress.call(('0'..'9') === key ? key.to_i : key)
elsif event_name == 'CHANNEL_EXECUTE_COMPLETE' && async_event['Core-UUID'] == execution_uuid
break async_event
else
end
end
end
rescue DSL::Dialplan::ReturnValue => r
log "Dispatch!: Got a return value with #{r.obj}"
break!
raise r
rescue DSL::Dialplan::Hangup
Thread.my.call.mgr << "SendMsg\ncall-command: hangup"
Thread.my.call.mgr.io.close rescue nil
end