adhearsion 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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