adhearsion 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,9 +1,12 @@
1
+ 1.0.3
2
+ - Fix the play() command regression when passing an array of strings. This was breaking the SimonGame
3
+ - Deprecate ManagerInterface#send_action_asynchronously
4
+
1
5
  1.0.2
2
6
  - Fix rcov Rake task
3
7
  - Add Ben Langfeld as an author (Thanks, Ben!)
4
8
  - Add "rake" as a runtime dependency
5
9
  - Remove usage of BEGIN blocks (for Rubinius; CS)
6
- - Improve component testing generators
7
10
 
8
11
  1.0.1
9
12
  NOTE for Ruby 1.9 users: The behavior of Ruby 1.9 and case statements has changed
@@ -91,7 +91,7 @@ module Adhearsion
91
91
  end
92
92
 
93
93
  def ahn_root=(path)
94
- if Object.constants.include?("AHN_ROOT")
94
+ if Object.constants.map(&:to_sym).include?(:AHN_ROOT)
95
95
  Object.const_get(:AHN_ROOT).base_path = File.expand_path(path)
96
96
  else
97
97
  Object.const_set(:AHN_ROOT, PathString.new(File.expand_path(path)))
@@ -2,7 +2,7 @@ module Adhearsion #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 1 unless defined? MAJOR
4
4
  MINOR = 0 unless defined? MINOR
5
- TINY = 2 unless defined? TINY
5
+ TINY = 3 unless defined? TINY
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.') unless defined? STRING
8
8
  end
@@ -175,7 +175,7 @@ module Adhearsion
175
175
  # Fixnums (e.g. 1000), Strings which are valid Fixnums (e.g "123"), and direct sound files. When playing
176
176
  # numbers, Adhearsion assumes you're saying the number, not the digits. For example, play("100")
177
177
  # is pronounced as "one hundred" instead of "one zero zero". To specify how the Date/Time objects are said
178
- # pass in as an array with the first parameter as the Date/Time/DateTime object along with a hash with the
178
+ # pass in as an array with the first parameter as the Date/Time/DateTime object along with a hash with the
179
179
  # additional options. See play_time for more information.
180
180
  #
181
181
  # Note: it is not necessary to supply a sound file extension; Asterisk will try to find a sound
@@ -196,8 +196,10 @@ module Adhearsion
196
196
  # play "you-sound-cute", "what-are-you-wearing"
197
197
  #
198
198
  def play(*arguments)
199
- arguments.each do |argument|
200
- play_time(argument) || play_numeric(argument) || play_string(argument)
199
+ unless play_time(arguments)
200
+ arguments.flatten.each do |argument|
201
+ play_numeric(argument) || play_string(argument)
202
+ end
201
203
  end
202
204
  end
203
205
 
@@ -347,14 +349,14 @@ module Adhearsion
347
349
  # It's important to understand the differences between these and how they affect the overall outcome:
348
350
  #
349
351
  # |---------------|-------------------|------------------------------------------------------|
350
- # | exact matches | potential matches | result |
352
+ # | exact matches | potential matches | result |
351
353
  # |---------------|-------------------|------------------------------------------------------|
352
- # | 0 | 0 | Fail and start over |
353
- # | 1 | 0 | Match found! |
354
- # | 0 | >0 | Get another digit |
355
- # | >1 | 0 | Go with the first exact match |
356
- # | 1 | >0 | Get another digit. If timeout, use exact match |
357
- # | >1 | >0 | Get another digit. If timeout, use first exact match |
354
+ # | 0 | 0 | Fail and start over |
355
+ # | 1 | 0 | Match found! |
356
+ # | 0 | >0 | Get another digit |
357
+ # | >1 | 0 | Go with the first exact match |
358
+ # | 1 | >0 | Get another digit. If timeout, use exact match |
359
+ # | >1 | >0 | Get another digit. If timeout, use first exact match |
358
360
  # |---------------|-------------------|------------------------------------------------------|
359
361
  #
360
362
  # == Database integration
@@ -450,30 +452,30 @@ module Adhearsion
450
452
  # 1. The number of digits you specify as the first argument is collected
451
453
  # 2. The timeout you specify with the :timeout option elapses.
452
454
  # 3. The "#" key (or the key you specify with :accept_key) is pressed
453
- #
454
- # Usage examples
455
- #
456
- # input # Receives digits until the caller presses the "#" key
457
- # input 3 # Receives three digits. Can be 0-9, * or #
458
- # input 5, :accept_key => "*" # Receive at most 5 digits, stopping if '*' is pressed
459
- # input 1, :timeout => 1.minute # Receive a single digit, returning an empty
460
- # string if the timeout is encountered
461
- # input 9, :timeout => 7, :accept_key => "0" # Receives nine digits, returning
462
- # # when the timeout is encountered
463
- # # or when the "0" key is pressed.
464
- # input 3, :play => "you-sound-cute"
465
- # input :play => ["if-this-is-correct-press", 1, "otherwise-press", 2]
466
- #
467
- # When specifying files to play, the playback of the sequence of files will stop
468
- # immediately when the user presses the first digit.
469
- #
470
- # The :timeout option works like a digit timeout, therefore each digit pressed
471
- # causes the timer to reset. This is a much more user-friendly approach than an
455
+ #
456
+ # Usage examples
457
+ #
458
+ # input # Receives digits until the caller presses the "#" key
459
+ # input 3 # Receives three digits. Can be 0-9, * or #
460
+ # input 5, :accept_key => "*" # Receive at most 5 digits, stopping if '*' is pressed
461
+ # input 1, :timeout => 1.minute # Receive a single digit, returning an empty
462
+ # string if the timeout is encountered
463
+ # input 9, :timeout => 7, :accept_key => "0" # Receives nine digits, returning
464
+ # # when the timeout is encountered
465
+ # # or when the "0" key is pressed.
466
+ # input 3, :play => "you-sound-cute"
467
+ # input :play => ["if-this-is-correct-press", 1, "otherwise-press", 2]
468
+ #
469
+ # When specifying files to play, the playback of the sequence of files will stop
470
+ # immediately when the user presses the first digit.
471
+ #
472
+ # The :timeout option works like a digit timeout, therefore each digit pressed
473
+ # causes the timer to reset. This is a much more user-friendly approach than an
472
474
  # absolute timeout.
473
- #
475
+ #
474
476
  # Note that when the digit limit is not specified the :accept_key becomes "#".
475
477
  # Otherwise there would be no way to end the collection of digits. You can
476
- # obviously override this by passing in a new key with :accept_key.
478
+ # obviously override this by passing in a new key with :accept_key.
477
479
  def input(*args)
478
480
  options = args.last.kind_of?(Hash) ? args.pop : {}
479
481
  number_of_digits = args.shift
@@ -510,7 +512,7 @@ module Adhearsion
510
512
  end
511
513
  key = wait_for_digit(timeout || -1)
512
514
  end
513
- end
515
+ end
514
516
 
515
517
  # Jumps to a context. An alternative to DialplanContextProc#+@. When jumping to a context, it will *not* resume executing
516
518
  # the former context when the jumped-to context has finished executing. Make sure you don't have any
@@ -545,36 +547,36 @@ module Adhearsion
545
547
  raise Adhearsion::VoIP::DSL::Dialplan::ControlPassingException.new(context)
546
548
  end
547
549
 
548
- # Place a call in a queue to be answered by a registered agent. You must then call join!()
549
- #
550
- # @param [String] queue_name the queue name to place the caller in
551
- # @return [Adhearsion::VoIP::Asterisk::Commands::QueueProxy] a queue proxy object
550
+ # Place a call in a queue to be answered by a registered agent. You must then call join!()
551
+ #
552
+ # @param [String] queue_name the queue name to place the caller in
553
+ # @return [Adhearsion::VoIP::Asterisk::Commands::QueueProxy] a queue proxy object
552
554
  #
553
555
  # @see http://www.voip-info.org/wiki-Asterisk+cmd+Queue Full information on the Asterisk Queue
554
556
  # @see Adhearsion::VoIP::Asterisk::Commands::QueueProxy#join! join!() for further details
555
- def queue(queue_name)
556
- queue_name = queue_name.to_s
557
-
558
- @queue_proxy_hash_lock = Mutex.new unless defined? @queue_proxy_hash_lock
559
- @queue_proxy_hash_lock.synchronize do
560
- @queue_proxy_hash ||= {}
561
- if @queue_proxy_hash.has_key? queue_name
562
- return @queue_proxy_hash[queue_name]
563
- else
564
- proxy = @queue_proxy_hash[queue_name] = QueueProxy.new(queue_name, self)
565
- return proxy
566
- end
567
- end
568
- end
569
-
570
- # Get the status of the last dial(). Possible dial statuses include :answer,
557
+ def queue(queue_name)
558
+ queue_name = queue_name.to_s
559
+
560
+ @queue_proxy_hash_lock = Mutex.new unless defined? @queue_proxy_hash_lock
561
+ @queue_proxy_hash_lock.synchronize do
562
+ @queue_proxy_hash ||= {}
563
+ if @queue_proxy_hash.has_key? queue_name
564
+ return @queue_proxy_hash[queue_name]
565
+ else
566
+ proxy = @queue_proxy_hash[queue_name] = QueueProxy.new(queue_name, self)
567
+ return proxy
568
+ end
569
+ end
570
+ end
571
+
572
+ # Get the status of the last dial(). Possible dial statuses include :answer,
571
573
  # :busy, :no_answer, :cancelled, :congested, and :channel_unavailable.
572
574
  # If :cancel is returned, the caller hung up before the callee picked up.
573
575
  # If :congestion is returned, the dialed extension probably doesn't exist.
574
576
  # If :channel_unavailable, the callee phone may not be registered.
575
- def last_dial_status
576
- DIAL_STATUSES[get_dial_status]
577
- end
577
+ def last_dial_status
578
+ DIAL_STATUSES[get_dial_status]
579
+ end
578
580
 
579
581
  # @return [Boolean] true if your last call to dial() finished with the ANSWER state,
580
582
  # as reported by Asterisk. false otherwise
@@ -663,49 +665,49 @@ module Adhearsion
663
665
  # @param [String] variable_name
664
666
  #
665
667
  # @see: http://www.voip-info.org/wiki/view/get+variable Asterisk Get Variable
666
- def get_variable(variable_name)
667
- result = response("GET VARIABLE", variable_name)
668
- case result
669
- when "200 result=0"
670
- return nil
671
- when /^200 result=1 \((.*)\)$/
672
- return $LAST_PAREN_MATCH
673
- end
674
- end
675
-
676
- # Pass information back to the asterisk dial plan.
677
- #
678
- # Keep in mind that the variables are not global variables. These variables only exist for the channel
679
- # related to the call that is being serviced by the particular instance of your adhearsion application.
680
- # You will not be able to pass information back to the asterisk dialplan for other instances of your adhearsion
681
- # application to share. Once the channel is "hungup" then the variables are cleared and their information is gone.
682
- #
683
- # @param [String] variable_name
684
- # @param [String] value
685
- #
686
- # @see http://www.voip-info.org/wiki/view/set+variable Asterisk Set Variable
687
- def set_variable(variable_name, value)
688
- response("SET VARIABLE", variable_name, value) == "200 result=1"
689
- end
690
-
668
+ def get_variable(variable_name)
669
+ result = response("GET VARIABLE", variable_name)
670
+ case result
671
+ when "200 result=0"
672
+ return nil
673
+ when /^200 result=1 \((.*)\)$/
674
+ return $LAST_PAREN_MATCH
675
+ end
676
+ end
677
+
678
+ # Pass information back to the asterisk dial plan.
679
+ #
680
+ # Keep in mind that the variables are not global variables. These variables only exist for the channel
681
+ # related to the call that is being serviced by the particular instance of your adhearsion application.
682
+ # You will not be able to pass information back to the asterisk dialplan for other instances of your adhearsion
683
+ # application to share. Once the channel is "hungup" then the variables are cleared and their information is gone.
684
+ #
685
+ # @param [String] variable_name
686
+ # @param [String] value
687
+ #
688
+ # @see http://www.voip-info.org/wiki/view/set+variable Asterisk Set Variable
689
+ def set_variable(variable_name, value)
690
+ response("SET VARIABLE", variable_name, value) == "200 result=1"
691
+ end
692
+
691
693
  # Issue the command to add a custom SIP header to the current call channel
692
694
  # example use: sip_add_header("x-ahn-test", "rubyrox")
693
695
  #
694
696
  # @param[String] the name of the SIP header
695
697
  # @param[String] the value of the SIP header
696
- #
698
+ #
697
699
  # @return [String] the Asterisk response
698
700
  #
699
701
  # @see http://www.voip-info.org/wiki/index.php?page=Asterisk+cmd+SIPAddHeader Asterisk SIPAddHeader
700
702
  def sip_add_header(header, value)
701
703
  execute("SIPAddHeader", "#{header}: #{value}") == "200 result=1"
702
704
  end
703
-
705
+
704
706
  # Issue the command to fetch a SIP header from the current call channel
705
707
  # example use: sip_get_header("x-ahn-test")
706
708
  #
707
709
  # @param[String] the name of the SIP header to get
708
- #
710
+ #
709
711
  # @return [String] the Asterisk response
710
712
  #
711
713
  # @see http://www.voip-info.org/wiki/index.php?page=Asterisk+cmd+SIPGetHeader Asterisk SIPGetHeader
@@ -713,32 +715,32 @@ module Adhearsion
713
715
  get_variable("SIP_HEADER(#{header})")
714
716
  end
715
717
  alias :sip_header :sip_get_header
716
-
717
- # Allows you to either set or get a channel variable from Asterisk.
718
- # The method takes a hash key/value pair if you would like to set a variable
719
- # Or a single string with the variable to get from Asterisk
720
- def variable(*args)
721
- if args.last.kind_of? Hash
722
- assignments = args.pop
723
- raise ArgumentError, "Can't mix variable setting and fetching!" if args.any?
724
- assignments.each_pair do |key, value|
725
- set_variable(key, value)
726
- end
727
- else
728
- if args.size == 1
729
- get_variable args.first
730
- else
731
- args.map { |var| get_variable(var) }
732
- end
733
- end
734
- end
735
-
736
- # Send a caller to a voicemail box to leave a message.
737
- #
738
- # The method takes the mailbox_number of the user to leave a message for and a
739
- # greeting_option that will determine which message gets played to the caller.
740
- #
741
- # @see http://www.voip-info.org/tiki-index.php?page=Asterisk+cmd+VoiceMail Asterisk Voicemail
718
+
719
+ # Allows you to either set or get a channel variable from Asterisk.
720
+ # The method takes a hash key/value pair if you would like to set a variable
721
+ # Or a single string with the variable to get from Asterisk
722
+ def variable(*args)
723
+ if args.last.kind_of? Hash
724
+ assignments = args.pop
725
+ raise ArgumentError, "Can't mix variable setting and fetching!" if args.any?
726
+ assignments.each_pair do |key, value|
727
+ set_variable(key, value)
728
+ end
729
+ else
730
+ if args.size == 1
731
+ get_variable args.first
732
+ else
733
+ args.map { |var| get_variable(var) }
734
+ end
735
+ end
736
+ end
737
+
738
+ # Send a caller to a voicemail box to leave a message.
739
+ #
740
+ # The method takes the mailbox_number of the user to leave a message for and a
741
+ # greeting_option that will determine which message gets played to the caller.
742
+ #
743
+ # @see http://www.voip-info.org/tiki-index.php?page=Asterisk+cmd+VoiceMail Asterisk Voicemail
742
744
  def voicemail(*args)
743
745
  options_hash = args.last.kind_of?(Hash) ? args.pop : {}
744
746
  mailbox_number = args.shift
@@ -884,20 +886,20 @@ module Adhearsion
884
886
  # end
885
887
 
886
888
 
887
- # Speaks the digits given as an argument. For example, "123" is spoken as "one two three".
888
- #
889
- # @param [String] digits
890
- def say_digits(digits)
891
- execute "saydigits", validate_digits(digits)
892
- end
893
-
894
- # Get the number of seconds the given block takes to execute. This
895
- # is particularly useful in dialplans for tracking billable time. Note that
896
- # if the call is hung up during the block, you will need to rescue the
897
- # exception if you have some mission-critical logic after it with which
898
- # you're recording this return-value.
899
- #
900
- # @return [Float] number of seconds taken for block to execute
889
+ # Speaks the digits given as an argument. For example, "123" is spoken as "one two three".
890
+ #
891
+ # @param [String] digits
892
+ def say_digits(digits)
893
+ execute "saydigits", validate_digits(digits)
894
+ end
895
+
896
+ # Get the number of seconds the given block takes to execute. This
897
+ # is particularly useful in dialplans for tracking billable time. Note that
898
+ # if the call is hung up during the block, you will need to rescue the
899
+ # exception if you have some mission-critical logic after it with which
900
+ # you're recording this return-value.
901
+ #
902
+ # @return [Float] number of seconds taken for block to execute
901
903
  def duration_of
902
904
  start_time = Time.now
903
905
  yield
@@ -918,7 +920,7 @@ module Adhearsion
918
920
  end
919
921
 
920
922
  ##
921
- # Executes the SayPhonetic command. This command will read the text passed in
923
+ # Executes the SayPhonetic command. This command will read the text passed in
922
924
  # out load using the NATO phonetic alphabet.
923
925
  #
924
926
  # @param [String] Passed in as the text to read aloud
@@ -956,21 +958,21 @@ module Adhearsion
956
958
  argument, options = args.flatten
957
959
  options ||= {}
958
960
 
961
+ return false unless options.is_a? Hash
962
+
959
963
  timezone = options.delete(:timezone) || ''
960
964
  format = options.delete(:format) || ''
961
- epoch = case argument.class.to_s
962
- when 'Time' then argument.to_i
963
- when 'DateTime' then argument.to_i
964
- when 'Date'
965
+ epoch = case argument
966
+ when Time || DateTime
967
+ argument.to_i
968
+ when Date
965
969
  format = 'BdY' unless format.present?
966
970
  argument.to_time.to_i
967
- else
968
- nil
969
971
  end
970
972
 
971
973
  return false if epoch.nil?
972
974
 
973
- execute(:sayunixtime, epoch, timezone, format)
975
+ execute :sayunixtime, epoch, timezone, format
974
976
  end
975
977
 
976
978
  protected
@@ -1251,7 +1253,7 @@ module Adhearsion
1251
1253
  # queue('sales').join! :allow_transfer => :agent, :timeout => 30.seconds,
1252
1254
  def join!(options={})
1253
1255
  environment.execute("queue", name, *self.class.format_join_hash_key_arguments(options))
1254
- normalize_queue_status_variable environment.variable("QUEUESTATUS")
1256
+ normalize_queue_status_variable environment.variable("QUEUESTATUS")
1255
1257
  end
1256
1258
 
1257
1259
  # Get the agents associated with a queue
@@ -1310,7 +1312,7 @@ module Adhearsion
1310
1312
  # LEAVEUNAVAIL => :leaveunavail
1311
1313
  # CONTINUE => :continue
1312
1314
  #
1313
- # If the QUEUESTATUS variable is not set the call was successfully connected,
1315
+ # If the QUEUESTATUS variable is not set the call was successfully connected,
1314
1316
  # and Adhearsion will return :completed.
1315
1317
  #
1316
1318
  # @param [String] QUEUESTATUS variable from Asterisk
@@ -285,16 +285,20 @@ module Adhearsion
285
285
  # @param [String, Symbol] action_name The name of the action (e.g. Originate)
286
286
  # @param [Hash] headers Other key/value pairs to send in this action. Note: don't provide an ActionID
287
287
  # @return [FutureResource] Call resource() on this object if you wish to access the response (optional). Note: if the response has not come in yet, your Thread will wait until it does.
288
+ # @deprecated Async AMI is deprecated
288
289
  #
289
290
  def send_action_asynchronously(action_name, headers={})
290
- check_action_name action_name
291
- action = ManagerInterfaceAction.new(action_name, headers)
292
- if action.replies_with_action_id?
293
- @write_queue << action
294
- action
295
- else
296
- raise NotImplementedError
297
- end
291
+ ahn_log.ami.deprecation.warn <<WARN
292
+ \n
293
+ Asterisk only supports one outstanding action ID at a time, making the
294
+ asynchronous AMI interface dangerous to use. This interface is now
295
+ deprecated and will disappear in future versions of Adhearsion. If you need
296
+ to do background processing while Asterisk processes a long-running action
297
+ (such as a synchronous Originate) then you will need to handle this manually
298
+ with Ruby threads. Note that Originate specifically has an :Async header
299
+ which tells Asterisk to process the Originate event asynchronously.
300
+ WARN
301
+ _send_action_asynchronously(action_name, headers)
298
302
  end
299
303
 
300
304
  ##
@@ -307,35 +311,20 @@ module Adhearsion
307
311
  # @return [ManagerInterfaceResponse, ImmediateResponse] Contains the response from Asterisk and all headers
308
312
  #
309
313
  def send_action_synchronously(*args)
310
- send_action_asynchronously(*args).response.tap do |response|
314
+ _send_action_asynchronously(*args).response.tap do |response|
311
315
  raise response if response.kind_of?(ManagerInterfaceError)
312
316
  end
313
317
  end
314
318
 
315
319
  alias send_action send_action_synchronously
316
320
 
317
-
318
- ####### #######
319
- ########### ###########
320
- ################# SOON-DEPRECATED COMMANDS #################
321
- ########### ###########
322
- ####### #######
323
-
324
321
  # ping sends an action to the Asterisk Manager Interface that returns a pong
325
322
  # more details here: http://www.voip-info.org/wiki/index.php?page=Asterisk+Manager+API+Action+Ping
326
323
  def ping
327
- #deprecation_warning
328
324
  send_action "Ping"
329
325
  true
330
326
  end
331
327
 
332
- def deprecation_warning
333
- ahn_log.ami.deprecation.warn "The implementation of the ping, originate, introduce, hangup, call_into_context " +
334
- "and call_and_exec methods will soon be moved from this class to SuperManager. At the moment, the " +
335
- "SuperManager abstractions are not completed. Don't worry. The migration to SuperManager will be very easy."+
336
- " See http://docs.adhearsion.com/AMI for more information."
337
- end
338
-
339
328
  # The originate method launches a call to Asterisk, full details here:
340
329
  # http://www.voip-info.org/tiki-index.php?page=Asterisk+Manager+API+Action+Originate
341
330
  # Takes these arguments as a hash:
@@ -360,7 +349,6 @@ module Adhearsion
360
349
  # :exten => 's',
361
350
  # :priority => '1' }
362
351
  def originate(options={})
363
- #deprecation_warning
364
352
  options = options.clone
365
353
  options[:callerid] = options.delete :caller_id if options.has_key? :caller_id
366
354
  options[:exten] = options.delete :extension if options.has_key? :extension
@@ -382,7 +370,6 @@ module Adhearsion
382
370
  # TODO: Provide an example when this works.
383
371
  #
384
372
  def introduce(caller, callee, opts={})
385
- #deprecation_warning
386
373
  dial_args = callee
387
374
  dial_args += "|#{opts[:options]}" if opts[:options]
388
375
  call_and_exec caller, "Dial", :args => dial_args, :caller_id => opts[:caller_id]
@@ -391,14 +378,12 @@ module Adhearsion
391
378
  # hangup terminates a call accepts a channel as the argument
392
379
  # full details here: http://www.voip-info.org/wiki/index.php?page=Asterisk+Manager+API+Action+Hangup
393
380
  def hangup(channel)
394
- #deprecation_warning
395
381
  send_action "Hangup", :channel => channel
396
382
  end
397
383
 
398
384
  # call_and_exec allows you to make a call to a channel and then execute an Astersik application
399
385
  # on that call
400
386
  def call_and_exec(channel, app, opts={})
401
- #deprecation_warning
402
387
  args = { :channel => channel, :application => app }
403
388
  args[:caller_id] = opts[:caller_id] if opts[:caller_id]
404
389
  args[:data] = opts[:args] if opts[:args]
@@ -411,7 +396,6 @@ module Adhearsion
411
396
  #
412
397
  # call_into_context('SIP/1000@sipnetworks.com', 'my_context', { :variables => { :session_guid => new_guid }})
413
398
  def call_into_context(channel, context, options={})
414
- #deprecation_warning
415
399
  args = {:channel => channel, :context => context}
416
400
  args[:priority] = options[:priority] || 1
417
401
  args[:exten] = options[:extension] if options[:extension]
@@ -420,11 +404,18 @@ module Adhearsion
420
404
  originate args
421
405
  end
422
406
 
423
- ####### #######
424
- ########### ###########
425
- ################# END SOON-DEPRECATED COMMANDS #################
426
- ########### ###########
427
- ####### #######
407
+ private
408
+ def _send_action_asynchronously(action_name, headers={})
409
+ check_action_name action_name
410
+ action = ManagerInterfaceAction.new(action_name, headers)
411
+ if action.replies_with_action_id?
412
+ @write_queue << action
413
+ action
414
+ else
415
+ raise NotImplementedError
416
+ end
417
+ end
418
+
428
419
 
429
420
 
430
421
  protected
@@ -582,25 +573,22 @@ module Adhearsion
582
573
  retry
583
574
  end
584
575
 
585
- def login_actions
586
- action = send_action_asynchronously "Login", "Username" => @username, "Secret" => @password, "Events" => "Off"
587
- response = action.response
588
- if response.kind_of? ManagerInterfaceError
589
- raise AuthenticationFailedException, "Incorrect username and password! #{response.message}"
576
+ def login_actions
577
+ response = send_action "Login", "Username" => @username, "Secret" => @password, "Events" => "Off"
578
+ ahn_log.ami "Successful AMI actions-only connection into #{@username}@#{@host}"
579
+ if @actions_lexer.ami_version < 1.1
580
+ @coreSettings = Hash.new
581
+ @coreSettings["AsteriskVersion"] = "1.4.0"
582
+ @coreSettings["AMIversion"] = "1.0"
583
+ @coreSettings["ArgumentDelimiter"] = "|"
590
584
  else
591
- ahn_log.ami "Successful AMI actions-only connection into #{@username}@#{@host}"
592
- if @actions_lexer.ami_version < 1.1
593
- @coreSettings = Hash.new
594
- @coreSettings["AsteriskVersion"] = "1.4.0"
595
- @coreSettings["AMIversion"] = "1.0"
596
- @coreSettings["ArgumentDelimiter"] = "|"
597
- else
598
- @coreSettings = send_action_synchronously("CoreSettings").headers
599
- @coreSettings["ArgumentDelimiter"] = ","
600
- end
601
- UnsupportedActionName::preinitialize(@coreSettings["AsteriskVersion"].to_f)
602
- response
585
+ @coreSettings = send_action_synchronously("CoreSettings").headers
586
+ @coreSettings["ArgumentDelimiter"] = ","
603
587
  end
588
+ UnsupportedActionName::preinitialize(@coreSettings["AsteriskVersion"].to_f)
589
+ response
590
+ rescue ManagerInterfaceError => e
591
+ raise AuthenticationFailedException, "Incorrect username and password! #{e.message}"
604
592
  end
605
593
 
606
594
  def disconnect_events_connection