adhearsion 0.8.6 → 1.0.0

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.
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