diff options
-rw-r--r-- | app/models/call.rb | 70 | ||||
-rw-r--r-- | lib/freeswitch_event.rb | 20 |
2 files changed, 71 insertions, 19 deletions
diff --git a/app/models/call.rb b/app/models/call.rb index 57961ec..c0f0f08 100644 --- a/app/models/call.rb +++ b/app/models/call.rb @@ -1,36 +1,72 @@ class Call < ActiveRecord::Base - self.table_name = 'channels' + self.table_name = 'detailed_calls' self.primary_key = 'uuid' - # Makes sure that this is a readonly model. def readonly? return true end - - # Prevent objects from being destroyed - def before_destroy - raise ActiveRecord::ReadOnlyRecord - end - # Prevent objects from being deleted - def self.delete_all - raise ActiveRecord::ReadOnlyRecord + def destroy + return self.delete end - # Prevent objects from being deleted def delete - raise ActiveRecord::ReadOnlyRecord + require 'freeswitch_event' + return FreeswitchAPI.execute('uuid_kill', self.uuid, true); end def sip_account - auth_name = self.name.match('^.+[/:](.+)@.+$') - if auth_name && ! auth_name[1].blank? - return SipAccount.where(:auth_name => auth_name[1]).first + result = self.presence_id.match('^(.+)@(.+)$') + + if result && ! result[1].blank? and ! result[2].blank? + domain = SipDomain.where(:host => result[2]).first + if domain + return SipAccount.where(:auth_name => result[1], :sip_domain_id => domain.id).first + end end end - def kill + def sip_account_bleg + result = self.b_presence_id.match('^(.+)@(.+)$') + + if result && ! result[1].blank? and ! result[2].blank? + domain = SipDomain.where(:host => result[2]).first + if domain + return SipAccount.where(:auth_name => result[1], :sip_domain_id => domain.id).first + end + end + end + + def get_variable_from_uuid(channel_uuid, variable_name) + if channel_uuid.blank? + return nil + end + require 'freeswitch_event' - return FreeswitchAPI.execute('uuid_kill', self.uuid, true); + result = FreeswitchAPI.channel_variable_get(channel_uuid, variable_name); + + if result == '_undef_' + return nil + end + + return result + end + + def get_variable(variable_name) + return get_variable_from_uuid(self.uuid, variable_name); + end + + def get_variable_bleg(variable_name) + return get_variable_from_uuid(self.b_uuid, variable_name); + end + + def is_sip + return self.name.match('^sofia') != nil + end + + def is_caller + if (self.uuid == self.call_uuid) || self.call_uuid.blank? + true + end end end diff --git a/lib/freeswitch_event.rb b/lib/freeswitch_event.rb index b6e5cbc..68d9df2 100644 --- a/lib/freeswitch_event.rb +++ b/lib/freeswitch_event.rb @@ -44,8 +44,8 @@ class FreeswitchEventSocket @socket.close end - def read() - return @socket.recv(1024) + def read(read_bytes=1024) + return @socket.recv(read_bytes) end def result() @@ -130,4 +130,20 @@ class FreeswitchAPI return false end + + def self.channel_variable_get(channel_uuid, variable_name) + result = nil + event = FreeswitchEventSocket.new() + if event && event.connect() + event.command( "api uuid_getvar #{channel_uuid} #{variable_name}") + event_result = event.result() + if event_result && event_result["Content-Type"] == 'api/response' && event_result["Content-Length"].to_i > 0 + result = event.read(event_result["Content-Length"].to_i) + end + event.close() + end + + return result + end + end |