adhearsion 0.8.6 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/CHANGELOG +24 -0
  2. data/Rakefile +3 -1
  3. data/adhearsion.gemspec +21 -4
  4. data/app_generators/ahn/templates/components/disabled/restful_rpc/restful_rpc.rb +6 -2
  5. data/app_generators/ahn/templates/config/startup.rb +11 -2
  6. data/lib/adhearsion.rb +7 -1
  7. data/lib/adhearsion/component_manager.rb +67 -2
  8. data/lib/adhearsion/foundation/all.rb +7 -1
  9. data/lib/adhearsion/foundation/blank_slate.rb +1 -3
  10. data/lib/adhearsion/initializer.rb +1 -2
  11. data/lib/adhearsion/initializer/asterisk.rb +2 -2
  12. data/lib/adhearsion/initializer/configuration.rb +16 -5
  13. data/lib/adhearsion/tasks.rb +1 -0
  14. data/lib/adhearsion/tasks/components.rb +32 -0
  15. data/lib/adhearsion/version.rb +3 -3
  16. data/lib/adhearsion/voip/asterisk/commands.rb +44 -16
  17. data/lib/adhearsion/voip/asterisk/config_generators/voicemail.conf.rb +2 -2
  18. data/lib/adhearsion/voip/asterisk/manager_interface.rb +14 -13
  19. data/lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb +134 -134
  20. data/lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb +63 -10
  21. data/lib/adhearsion/voip/asterisk/manager_interface/ami_messages.rb +1 -1
  22. data/lib/adhearsion/voip/asterisk/special_dial_plan_managers.rb +2 -2
  23. data/lib/adhearsion/voip/call.rb +11 -11
  24. data/lib/adhearsion/voip/call_routing.rb +1 -1
  25. data/lib/adhearsion/voip/dial_plan.rb +15 -6
  26. data/lib/adhearsion/voip/dsl/dialing_dsl.rb +1 -1
  27. data/lib/adhearsion/voip/dsl/dialing_dsl/dialing_dsl_monkey_patches.rb +1 -1
  28. data/lib/adhearsion/voip/dsl/dialplan/dispatcher.rb +1 -1
  29. data/lib/adhearsion/voip/dsl/dialplan/parser.rb +4 -6
  30. data/lib/adhearsion/voip/dsl/numerical_string.rb +1 -3
  31. data/lib/adhearsion/voip/freeswitch/basic_connection_manager.rb +2 -2
  32. data/lib/adhearsion/voip/freeswitch/freeswitch_dialplan_command_factory.rb +2 -2
  33. data/lib/adhearsion/voip/freeswitch/oes_server.rb +1 -1
  34. data/lib/adhearsion/voip/menu_state_machine/matchers.rb +1 -1
  35. data/lib/adhearsion/voip/menu_state_machine/menu_builder.rb +1 -1
  36. data/lib/theatre/callback_definition_loader.rb +1 -1
  37. metadata +78 -19
@@ -50,26 +50,28 @@ module Adhearsion
50
50
 
51
51
  # Utility method to read from pbx. Hangup if nil.
52
52
  def read
53
- returning from_pbx.gets do |message|
53
+ from_pbx.gets.tap do |message|
54
54
  # AGI has many conditions that might indicate a hangup
55
55
  raise Hangup if message.nil?
56
56
 
57
57
  ahn_log.agi.debug "<<< #{message}"
58
58
 
59
59
  code, rest = *message.split(' ', 2)
60
-
61
- if code == "511"
62
- # '511' Command Not Permitted on a dead channel
63
- ahn_log.agi.debug "AGI 500 error. Raising hangup"
64
- raise Hangup
65
- end
66
60
 
67
- if (500..599) === code.to_i
68
- # 500 AGI protocol error. Catches (at least):
69
- # 520 Invalid command syntax.
70
- # 510 Invalid or unknown command
71
- # If we have hit this then something bad has happened.
72
- ahn_log.agi.warn "AGI 500 error encountered. This may be a bug in Adhearsion. Please report it at http://adhearsion.lighthouseapp.com"
61
+ case code.to_i
62
+ when 510
63
+ # This error is non-fatal for the call
64
+ ahn_log.agi.warn "510: Invalid or unknown AGI command"
65
+ when 511
66
+ # 511 Command Not Permitted on a dead channel
67
+ ahn_log.agi.debug "511: Dead channel. Raising Hangup"
68
+ raise Hangup
69
+ when 520
70
+ # This error is non-fatal for the call
71
+ ahn_log.agi.warn "520: Invalid command syntax"
72
+ when (500..599)
73
+ # Assume this error is non-fatal for the call and try to keep running
74
+ ahn_log.agi.warn "#{code}: Unknown AGI protocol error."
73
75
  end
74
76
 
75
77
  # If the message starts with HANGUP it's a silly 1.6 OOB message
@@ -679,7 +681,33 @@ module Adhearsion
679
681
  def set_variable(variable_name, value)
680
682
  response("SET VARIABLE", variable_name, value) == "200 result=1"
681
683
  end
682
-
684
+
685
+ # Issue the command to add a custom SIP header to the current call channel
686
+ # example use: sip_add_header("x-ahn-test", "rubyrox")
687
+ #
688
+ # @param[String] the name of the SIP header
689
+ # @param[String] the value of the SIP header
690
+ #
691
+ # @return [String] the Asterisk response
692
+ #
693
+ # @see http://www.voip-info.org/wiki/index.php?page=Asterisk+cmd+SIPAddHeader Asterisk SIPAddHeader
694
+ def sip_add_header(header, value)
695
+ execute("SIPAddHeader", "#{header}: #{value}") == "200 result=1"
696
+ end
697
+
698
+ # Issue the command to fetch a SIP header from the current call channel
699
+ # example use: sip_get_header("x-ahn-test")
700
+ #
701
+ # @param[String] the name of the SIP header to get
702
+ #
703
+ # @return [String] the Asterisk response
704
+ #
705
+ # @see http://www.voip-info.org/wiki/index.php?page=Asterisk+cmd+SIPGetHeader Asterisk SIPGetHeader
706
+ def sip_get_header(header)
707
+ get_variable("SIP_HEADER(#{header})")
708
+ end
709
+ alias :sip_header :sip_get_header
710
+
683
711
  # Allows you to either set or get a channel variable from Asterisk.
684
712
  # The method takes a hash key/value pair if you would like to set a variable
685
713
  # Or a single string with the variable to get from Asterisk
@@ -1048,7 +1076,7 @@ module Adhearsion
1048
1076
  end
1049
1077
 
1050
1078
  def validate_digits(digits)
1051
- returning digits.to_s do |digits_as_string|
1079
+ digits.to_s.tap do |digits_as_string|
1052
1080
  raise ArgumentError, "Can only be called with valid digits!" unless digits_as_string =~ /^[0-9*#-]+$/
1053
1081
  end
1054
1082
  end
@@ -1226,7 +1254,7 @@ module Adhearsion
1226
1254
  # @raise QueueDoesNotExistError
1227
1255
  def normalize_queue_status_variable(variable)
1228
1256
  variable = "UNKNOWN" if variable.nil?
1229
- returning variable.downcase.to_sym do |queue_status|
1257
+ variable.downcase.to_sym.tap do |queue_status|
1230
1258
  raise QueueDoesNotExistError.new(name) if queue_status == :unknown
1231
1259
  end
1232
1260
  end
@@ -32,7 +32,7 @@ module Adhearsion
32
32
  raise ArgumentError, "Name cannot be 'general'!" if name.to_s.downcase == 'general'
33
33
  raise ArgumentError, "A name can only be characters, numbers, and underscores!" if name.to_s !~ /^[\w_]+$/
34
34
 
35
- returning ContextDefinition.new(name) do |context_definition|
35
+ ContextDefinition.new(name).tap do |context_definition|
36
36
  yield context_definition
37
37
  context_definitions << context_definition
38
38
  end
@@ -96,7 +96,7 @@ module Adhearsion
96
96
  private
97
97
 
98
98
  def mailbox_entry(options)
99
- returning MailboxDefinition.new do |mailbox|
99
+ MailboxDefinition.new.tap do |mailbox|
100
100
  yield mailbox if block_given?
101
101
  mailboxes << definition
102
102
  end
@@ -38,7 +38,7 @@ module Adhearsion
38
38
  class << self
39
39
 
40
40
  def connect(*args)
41
- returning new(*args) do |connection|
41
+ new(*args).tap do |connection|
42
42
  connection.connect!
43
43
  end
44
44
  end
@@ -109,7 +109,6 @@ module Adhearsion
109
109
  #
110
110
  def initialize(options={})
111
111
  options = parse_options options
112
-
113
112
  @host = options[:host]
114
113
  @username = options[:username]
115
114
  @password = options[:password]
@@ -308,7 +307,7 @@ module Adhearsion
308
307
  # @return [ManagerInterfaceResponse, ImmediateResponse] Contains the response from Asterisk and all headers
309
308
  #
310
309
  def send_action_synchronously(*args)
311
- returning send_action_asynchronously(*args).response do |response|
310
+ send_action_asynchronously(*args).response.tap do |response|
312
311
  raise response if response.kind_of?(ManagerInterfaceError)
313
312
  end
314
313
  end
@@ -325,7 +324,7 @@ module Adhearsion
325
324
  # ping sends an action to the Asterisk Manager Interface that returns a pong
326
325
  # more details here: http://www.voip-info.org/wiki/index.php?page=Asterisk+Manager+API+Action+Ping
327
326
  def ping
328
- deprecation_warning
327
+ #deprecation_warning
329
328
  send_action "Ping"
330
329
  true
331
330
  end
@@ -361,10 +360,13 @@ module Adhearsion
361
360
  # :exten => 's',
362
361
  # :priority => '1' }
363
362
  def originate(options={})
364
- deprecation_warning
363
+ #deprecation_warning
365
364
  options = options.clone
366
365
  options[:callerid] = options.delete :caller_id if options.has_key? :caller_id
367
366
  options[:exten] = options.delete :extension if options.has_key? :extension
367
+ if options[:variables] && options[:variables].kind_of?(Hash)
368
+ options[:variable] = options[:variables].map {|pair| pair.join('=')}.join(@coreSettings["ArgumentDelimiter"])
369
+ end
368
370
  send_action "Originate", options
369
371
  end
370
372
 
@@ -380,7 +382,7 @@ module Adhearsion
380
382
  # TODO: Provide an example when this works.
381
383
  #
382
384
  def introduce(caller, callee, opts={})
383
- deprecation_warning
385
+ #deprecation_warning
384
386
  dial_args = callee
385
387
  dial_args += "|#{opts[:options]}" if opts[:options]
386
388
  call_and_exec caller, "Dial", :args => dial_args, :caller_id => opts[:caller_id]
@@ -389,33 +391,32 @@ module Adhearsion
389
391
  # hangup terminates a call accepts a channel as the argument
390
392
  # full details here: http://www.voip-info.org/wiki/index.php?page=Asterisk+Manager+API+Action+Hangup
391
393
  def hangup(channel)
392
- deprecation_warning
394
+ #deprecation_warning
393
395
  send_action "Hangup", :channel => channel
394
396
  end
395
397
 
396
398
  # call_and_exec allows you to make a call to a channel and then execute an Astersik application
397
399
  # on that call
398
400
  def call_and_exec(channel, app, opts={})
399
- deprecation_warning
401
+ #deprecation_warning
400
402
  args = { :channel => channel, :application => app }
401
403
  args[:caller_id] = opts[:caller_id] if opts[:caller_id]
402
404
  args[:data] = opts[:args] if opts[:args]
405
+ args[:variables] = opts[:variables] if opts[:variables]
403
406
  originate args
404
407
  end
405
408
 
406
409
  # call_into_context is syntactic sugar for the Asterisk originate command that allows you to
407
- # lanuch a call into a particular context. For example:
410
+ # launch a call into a particular context. For example:
408
411
  #
409
412
  # call_into_context('SIP/1000@sipnetworks.com', 'my_context', { :variables => { :session_guid => new_guid }})
410
413
  def call_into_context(channel, context, options={})
411
- deprecation_warning
414
+ #deprecation_warning
412
415
  args = {:channel => channel, :context => context}
413
416
  args[:priority] = options[:priority] || 1
414
417
  args[:exten] = options[:extension] if options[:extension]
415
418
  args[:caller_id] = options[:caller_id] if options[:caller_id]
416
- if options[:variables] && options[:variables].kind_of?(Hash)
417
- args[:variable] = options[:variables].map {|pair| pair.join('=')}.join(@coreSettings["ArgumentDelimiter"])
418
- end
419
+ args[:variables] = options[:variables] if options[:variables]
419
420
  originate args
420
421
  end
421
422
 
@@ -1,3 +1,4 @@
1
+
1
2
  # line 1 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
2
3
  require File.join(File.dirname(__FILE__), 'ami_messages.rb')
3
4
 
@@ -7,9 +8,30 @@ module Adhearsion
7
8
  module Manager
8
9
  class AbstractAsteriskManagerInterfaceStreamLexer
9
10
 
10
- BUFFER_SIZE = 8.kilobytes unless defined? BUFFER_SIZE
11
+ BUFFER_SIZE = 128.kilobytes unless defined? BUFFER_SIZE
11
12
 
12
- # line 52 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
13
+ ##
14
+ # IMPORTANT! See method documentation for adjust_pointers!
15
+ #
16
+ # @see adjust_pointers
17
+ #
18
+ POINTERS = [
19
+ :@current_pointer,
20
+ :@token_start,
21
+ :@token_end,
22
+ :@version_start,
23
+ :@event_name_start,
24
+ :@current_key_position,
25
+ :@current_value_position,
26
+ :@last_seen_value_end,
27
+ :@error_reason_start,
28
+ :@follows_text_start,
29
+ :@current_syntax_error_start,
30
+ :@immediate_response_start
31
+ ]
32
+
33
+
34
+ # line 72 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
13
35
  ##
14
36
 
15
37
  attr_accessor(:ami_version)
@@ -20,7 +42,7 @@ module Adhearsion
20
42
  @ragel_stack = []
21
43
 
22
44
 
23
- # line 24 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb"
45
+ # line 46 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb"
24
46
  class << self
25
47
  attr_accessor :_ami_protocol_parser_actions
26
48
  private :_ami_protocol_parser_actions, :_ami_protocol_parser_actions=
@@ -837,7 +859,7 @@ end
837
859
  self.ami_protocol_parser_en_response_follows = 268;
838
860
 
839
861
 
840
- # line 841 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb"
862
+ # line 863 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb"
841
863
  begin
842
864
  @current_pointer ||= 0
843
865
  @data_ending_pointer ||= @data.length
@@ -847,7 +869,8 @@ begin
847
869
  @token_end = nil
848
870
  @ragel_act = 0
849
871
  end
850
- # line 79 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
872
+
873
+ # line 98 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
851
874
  ##
852
875
 
853
876
  end
@@ -859,7 +882,7 @@ end
859
882
 
860
883
  def resume!
861
884
 
862
- # line 863 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb"
885
+ # line 886 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb"
863
886
  begin
864
887
  _klen, _trans, _keys, _acts, _nacts = nil
865
888
  _goto_level = 0
@@ -889,12 +912,11 @@ begin
889
912
  _acts += 1
890
913
  case _ami_protocol_parser_actions[_acts - 1]
891
914
  when 30 then
892
- # line 1 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
915
+ # line 1 "NONE"
893
916
  begin
894
917
  @token_start = @current_pointer
895
918
  end
896
- # line 1 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
897
- # line 898 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb"
919
+ # line 920 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb"
898
920
  end # from state action switch
899
921
  end
900
922
  if _trigger_goto
@@ -962,112 +984,91 @@ begin
962
984
  _acts += 1
963
985
  case _ami_protocol_parser_actions[_acts - 1]
964
986
  when 0 then
965
- # line 17 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
987
+ # line 37 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
966
988
  begin
967
989
  init_success end
968
- # line 17 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
969
990
  when 1 then
970
- # line 19 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
991
+ # line 39 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
971
992
  begin
972
993
  init_response_follows end
973
- # line 19 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
974
994
  when 2 then
975
- # line 21 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
995
+ # line 41 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
976
996
  begin
977
997
  init_error end
978
- # line 21 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
979
998
  when 3 then
980
- # line 23 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
999
+ # line 43 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
981
1000
  begin
982
1001
  message_received @current_message end
983
- # line 23 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
984
1002
  when 4 then
985
- # line 24 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1003
+ # line 44 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
986
1004
  begin
987
1005
  error_received @current_message end
988
- # line 24 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
989
1006
  when 5 then
990
- # line 26 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1007
+ # line 46 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
991
1008
  begin
992
1009
  version_starts end
993
- # line 26 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
994
1010
  when 6 then
995
- # line 27 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1011
+ # line 47 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
996
1012
  begin
997
1013
  version_stops end
998
- # line 27 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
999
1014
  when 7 then
1000
- # line 29 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1015
+ # line 49 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1001
1016
  begin
1002
1017
  key_starts end
1003
- # line 29 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1004
1018
  when 8 then
1005
- # line 30 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1019
+ # line 50 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1006
1020
  begin
1007
1021
  key_stops end
1008
- # line 30 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1009
1022
  when 9 then
1010
- # line 32 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1023
+ # line 52 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1011
1024
  begin
1012
1025
  value_starts end
1013
- # line 32 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1014
1026
  when 10 then
1015
- # line 33 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1027
+ # line 53 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1016
1028
  begin
1017
1029
  value_stops end
1018
- # line 33 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1019
1030
  when 11 then
1020
- # line 35 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1031
+ # line 55 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1021
1032
  begin
1022
1033
  error_reason_starts end
1023
- # line 35 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1024
1034
  when 12 then
1025
- # line 36 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1035
+ # line 56 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1026
1036
  begin
1027
1037
  error_reason_stops end
1028
- # line 36 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1029
1038
  when 13 then
1030
- # line 38 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1039
+ # line 58 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1031
1040
  begin
1032
1041
  syntax_error_starts end
1033
- # line 38 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1034
1042
  when 14 then
1035
- # line 39 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1043
+ # line 59 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1036
1044
  begin
1037
1045
  syntax_error_stops end
1038
- # line 39 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1039
1046
  when 15 then
1040
- # line 41 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1047
+ # line 61 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1041
1048
  begin
1042
1049
  immediate_response_starts end
1043
- # line 41 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1044
1050
  when 16 then
1045
- # line 42 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1051
+ # line 62 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1046
1052
  begin
1047
1053
  immediate_response_stops end
1048
- # line 42 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1049
1054
  when 17 then
1050
- # line 44 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1055
+ # line 64 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1051
1056
  begin
1052
1057
  follows_text_starts end
1053
- # line 44 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1054
1058
  when 18 then
1055
- # line 45 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1059
+ # line 65 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1056
1060
  begin
1057
1061
  follows_text_stops end
1058
- # line 45 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1059
1062
  when 19 then
1060
- # line 47 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1063
+ # line 67 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1061
1064
  begin
1062
1065
  event_name_starts end
1063
- # line 47 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1064
1066
  when 20 then
1065
- # line 48 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1067
+ # line 68 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1066
1068
  begin
1067
1069
  event_name_stops end
1068
- # line 48 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1069
1070
  when 21 then
1070
- # line 34 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1071
+ # line 34 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1071
1072
  begin
1072
1073
  begin
1073
1074
  @current_state = 152
@@ -1076,9 +1077,8 @@ when 21 then
1076
1077
  break
1077
1078
  end
1078
1079
  end
1079
- # line 34 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1080
1080
  when 22 then
1081
- # line 35 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1081
+ # line 35 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1082
1082
  begin
1083
1083
  begin
1084
1084
  @current_state = 152
@@ -1087,9 +1087,8 @@ when 22 then
1087
1087
  break
1088
1088
  end
1089
1089
  end
1090
- # line 35 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1091
1090
  when 23 then
1092
- # line 36 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1091
+ # line 36 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1093
1092
  begin
1094
1093
  begin
1095
1094
  @current_state = 152
@@ -1098,9 +1097,8 @@ when 23 then
1098
1097
  break
1099
1098
  end
1100
1099
  end
1101
- # line 36 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1102
1100
  when 24 then
1103
- # line 38 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1101
+ # line 38 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1104
1102
  begin
1105
1103
  begin
1106
1104
  @current_state = 268
@@ -1109,9 +1107,8 @@ when 24 then
1109
1107
  break
1110
1108
  end
1111
1109
  end
1112
- # line 38 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1113
1110
  when 25 then
1114
- # line 43 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1111
+ # line 43 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1115
1112
  begin
1116
1113
  begin
1117
1114
  @ragel_stack_top -= 1
@@ -1121,9 +1118,8 @@ when 25 then
1121
1118
  break
1122
1119
  end
1123
1120
  end
1124
- # line 43 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1125
1121
  when 26 then
1126
- # line 78 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1122
+ # line 78 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1127
1123
  begin
1128
1124
  begin
1129
1125
  @current_state = 262
@@ -1132,9 +1128,8 @@ when 26 then
1132
1128
  break
1133
1129
  end
1134
1130
  end
1135
- # line 78 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1136
1131
  when 27 then
1137
- # line 84 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1132
+ # line 84 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1138
1133
  begin
1139
1134
  message_received @current_message; begin
1140
1135
  @current_state = 262
@@ -1143,26 +1138,22 @@ when 27 then
1143
1138
  break
1144
1139
  end
1145
1140
  end
1146
- # line 84 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1147
1141
  when 31 then
1148
- # line 1 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1142
+ # line 1 "NONE"
1149
1143
  begin
1150
1144
  @token_end = @current_pointer+1
1151
1145
  end
1152
- # line 1 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1153
1146
  when 32 then
1154
- # line 47 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1147
+ # line 47 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1155
1148
  begin
1156
1149
  @ragel_act = 1; end
1157
- # line 47 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1158
1150
  when 33 then
1159
- # line 47 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1151
+ # line 47 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1160
1152
  begin
1161
1153
  @token_end = @current_pointer+1
1162
1154
  end
1163
- # line 47 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1164
1155
  when 34 then
1165
- # line 48 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1156
+ # line 48 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1166
1157
  begin
1167
1158
  @token_end = @current_pointer+1
1168
1159
  begin begin
@@ -1174,15 +1165,13 @@ when 34 then
1174
1165
  end
1175
1166
  end
1176
1167
  end
1177
- # line 48 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1178
1168
  when 35 then
1179
- # line 47 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1169
+ # line 47 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1180
1170
  begin
1181
1171
  @token_end = @current_pointer
1182
1172
  @current_pointer = @current_pointer - 1; end
1183
- # line 47 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1184
1173
  when 36 then
1185
- # line 1 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1174
+ # line 1 "NONE"
1186
1175
  begin
1187
1176
  case @ragel_act
1188
1177
  when 0 then
@@ -1198,9 +1187,8 @@ end
1198
1187
  end
1199
1188
  end
1200
1189
  end
1201
- # line 1 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1202
1190
  when 37 then
1203
- # line 55 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1191
+ # line 55 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1204
1192
  begin
1205
1193
  @token_end = @current_pointer+1
1206
1194
  begin begin
@@ -1211,9 +1199,8 @@ when 37 then
1211
1199
  end
1212
1200
  end
1213
1201
  end
1214
- # line 55 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1215
1202
  when 38 then
1216
- # line 56 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1203
+ # line 56 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1217
1204
  begin
1218
1205
  @token_end = @current_pointer+1
1219
1206
  begin
@@ -1228,9 +1215,8 @@ when 38 then
1228
1215
 
1229
1216
  end
1230
1217
  end
1231
- # line 56 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1232
1218
  when 39 then
1233
- # line 56 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1219
+ # line 56 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1234
1220
  begin
1235
1221
  @token_end = @current_pointer
1236
1222
  @current_pointer = @current_pointer - 1; begin
@@ -1245,9 +1231,8 @@ when 39 then
1245
1231
 
1246
1232
  end
1247
1233
  end
1248
- # line 56 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1249
1234
  when 40 then
1250
- # line 56 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1235
+ # line 56 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1251
1236
  begin
1252
1237
  begin @current_pointer = (( @token_end))-1; end
1253
1238
  begin
@@ -1262,45 +1247,38 @@ when 40 then
1262
1247
 
1263
1248
  end
1264
1249
  end
1265
- # line 56 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1266
1250
  when 41 then
1267
- # line 64 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1251
+ # line 64 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1268
1252
  begin
1269
1253
  @token_end = @current_pointer+1
1270
1254
  end
1271
- # line 64 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1272
1255
  when 42 then
1273
- # line 65 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1256
+ # line 65 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1274
1257
  begin
1275
1258
  @token_end = @current_pointer+1
1276
1259
  end
1277
- # line 65 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1278
1260
  when 43 then
1279
- # line 66 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1261
+ # line 66 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1280
1262
  begin
1281
1263
  @token_end = @current_pointer+1
1282
1264
  end
1283
- # line 66 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1284
1265
  when 44 then
1285
- # line 67 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1266
+ # line 67 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1286
1267
  begin
1287
1268
  @token_end = @current_pointer+1
1288
1269
  end
1289
- # line 67 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1290
1270
  when 45 then
1291
- # line 68 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1271
+ # line 68 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1292
1272
  begin
1293
1273
  @token_end = @current_pointer+1
1294
1274
  end
1295
- # line 68 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1296
1275
  when 46 then
1297
- # line 69 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1276
+ # line 69 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1298
1277
  begin
1299
1278
  @token_end = @current_pointer+1
1300
1279
  end
1301
- # line 69 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1302
1280
  when 47 then
1303
- # line 70 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1281
+ # line 70 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1304
1282
  begin
1305
1283
  @token_end = @current_pointer+1
1306
1284
  begin begin
@@ -1311,9 +1289,8 @@ when 47 then
1311
1289
  end
1312
1290
  end
1313
1291
  end
1314
- # line 70 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1315
1292
  when 48 then
1316
- # line 71 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1293
+ # line 71 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1317
1294
  begin
1318
1295
  @token_end = @current_pointer+1
1319
1296
  begin
@@ -1330,9 +1307,8 @@ when 48 then
1330
1307
 
1331
1308
  end
1332
1309
  end
1333
- # line 71 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1334
1310
  when 49 then
1335
- # line 71 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1311
+ # line 71 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1336
1312
  begin
1337
1313
  @token_end = @current_pointer
1338
1314
  @current_pointer = @current_pointer - 1; begin
@@ -1349,9 +1325,8 @@ when 49 then
1349
1325
 
1350
1326
  end
1351
1327
  end
1352
- # line 71 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1353
1328
  when 50 then
1354
- # line 71 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1329
+ # line 71 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1355
1330
  begin
1356
1331
  begin @current_pointer = (( @token_end))-1; end
1357
1332
  begin
@@ -1368,43 +1343,36 @@ when 50 then
1368
1343
 
1369
1344
  end
1370
1345
  end
1371
- # line 71 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1372
1346
  when 51 then
1373
- # line 82 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1347
+ # line 82 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1374
1348
  begin
1375
1349
  @ragel_act = 13; end
1376
- # line 82 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1377
1350
  when 52 then
1378
- # line 84 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1351
+ # line 84 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1379
1352
  begin
1380
1353
  @ragel_act = 15; end
1381
- # line 84 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1382
1354
  when 53 then
1383
- # line 83 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1355
+ # line 83 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1384
1356
  begin
1385
1357
  @token_end = @current_pointer+1
1386
1358
  end
1387
- # line 83 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1388
1359
  when 54 then
1389
- # line 82 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1360
+ # line 82 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1390
1361
  begin
1391
1362
  @token_end = @current_pointer
1392
1363
  @current_pointer = @current_pointer - 1; end
1393
- # line 82 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1394
1364
  when 55 then
1395
- # line 84 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1365
+ # line 84 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1396
1366
  begin
1397
1367
  @token_end = @current_pointer
1398
1368
  @current_pointer = @current_pointer - 1; end
1399
- # line 84 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1400
1369
  when 56 then
1401
- # line 82 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1370
+ # line 82 "lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl"
1402
1371
  begin
1403
1372
  begin @current_pointer = (( @token_end))-1; end
1404
1373
  end
1405
- # line 82 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1406
1374
  when 57 then
1407
- # line 1 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1375
+ # line 1 "NONE"
1408
1376
  begin
1409
1377
  case @ragel_act
1410
1378
  when 0 then
@@ -1420,8 +1388,7 @@ end
1420
1388
  end
1421
1389
  end
1422
1390
  end
1423
- # line 1 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1424
- # line 1425 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb"
1391
+ # line 1392 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb"
1425
1392
  end # action switch
1426
1393
  end
1427
1394
  end
@@ -1438,17 +1405,15 @@ end
1438
1405
  _acts += 1
1439
1406
  case _ami_protocol_parser_actions[_acts - 1]
1440
1407
  when 28 then
1441
- # line 1 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1408
+ # line 1 "NONE"
1442
1409
  begin
1443
1410
  @token_start = nil; end
1444
- # line 1 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1445
1411
  when 29 then
1446
- # line 1 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1412
+ # line 1 "NONE"
1447
1413
  begin
1448
1414
  @ragel_act = 0
1449
1415
  end
1450
- # line 1 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1451
- # line 1452 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb"
1416
+ # line 1417 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb"
1452
1417
  end # to state action switch
1453
1418
  end
1454
1419
  if _trigger_goto
@@ -1478,15 +1443,29 @@ end
1478
1443
  end
1479
1444
  end
1480
1445
  end
1481
- # line 89 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1446
+
1447
+ # line 108 "lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb"
1482
1448
  ##
1483
1449
  end
1484
1450
 
1485
1451
  def extend_buffer_with(new_data)
1486
- if new_data.size + @data.size > BUFFER_SIZE
1487
- @data.slice! 0...new_data.size
1488
- # TODO: What if the current_pointer wasn't at the end of the data for some reason?
1489
- @current_pointer = @data.size
1452
+ length = new_data.size
1453
+
1454
+ if length > BUFFER_SIZE
1455
+ raise Exception, "ERROR: Buffer overrun! Input size (#{new_data.size}) larger than buffer (#{BUFFER_SIZE})"
1456
+ end
1457
+
1458
+ if length + @data.size > BUFFER_SIZE
1459
+ if @data.size != @current_pointer
1460
+ if @current_pointer < length
1461
+ # We are about to shift more bytes off the array than we have
1462
+ # parsed. This will cause the parser to lose state so
1463
+ # integrity cannot be guaranteed.
1464
+ raise Exception, "ERROR: Buffer overrun! AMI parser cannot guarantee sanity. New data size: #{new_data.size}; Current pointer at #{@current_pointer}; Data size: #{@data.size}"
1465
+ end
1466
+ end
1467
+ @data.slice! 0...length
1468
+ adjust_pointers -length
1490
1469
  end
1491
1470
  @data << new_data
1492
1471
  @data_ending_pointer = @data.size
@@ -1494,6 +1473,27 @@ end
1494
1473
 
1495
1474
  protected
1496
1475
 
1476
+ ##
1477
+ # This method will adjust all pointers into the buffer according
1478
+ # to the supplied offset. This is necessary any time the buffer
1479
+ # changes, for example when the sliding window is incremented forward
1480
+ # after new data is received.
1481
+ #
1482
+ # It is VERY IMPORTANT that when any additional pointers are defined
1483
+ # that they are added to this method. Unpredictable results may
1484
+ # otherwise occur!
1485
+ #
1486
+ # @see https://adhearsion.lighthouseapp.com/projects/5871-adhearsion/tickets/72-ami-lexer-buffer-offset#ticket-72-26
1487
+ #
1488
+ # @param offset Adjust pointers by offset. May be negative.
1489
+ #
1490
+ def adjust_pointers(offset)
1491
+ POINTERS.each do |ptr|
1492
+ value = instance_variable_get(ptr)
1493
+ instance_variable_set(ptr, value + offset) if !value.nil?
1494
+ end
1495
+ end
1496
+
1497
1497
  ##
1498
1498
  # Called after a response or event has been successfully parsed.
1499
1499
  #
@@ -1533,16 +1533,16 @@ end
1533
1533
  end
1534
1534
 
1535
1535
  def init_error
1536
- @current_message = ManagerInterfaceError.new
1536
+ @current_message = ManagerInterfaceError.new()
1537
1537
  end
1538
1538
 
1539
1539
  def version_starts
1540
- @start_of_version = @current_pointer
1540
+ @version_start = @current_pointer
1541
1541
  end
1542
1542
 
1543
1543
  def version_stops
1544
- self.ami_version = @data[@start_of_version...@current_pointer].to_f
1545
- @start_of_version = nil
1544
+ self.ami_version = @data[@version_start...@current_pointer].to_f
1545
+ @version_start = nil
1546
1546
  end
1547
1547
 
1548
1548
  def event_name_starts