Class | IB::IncomingMessages::AbstractMessage |
In: |
messages.rb
|
Parent: | Object |
This is just a basic generic message from the server.
Class variables: @@message_id - integer message id.
Instance attributes: :data - Hash of actual data read from a stream.
Override the load(socket) method in your subclass to do actual reading into @data.
data | [RW] |
# File messages.rb, line 704 704: def AbstractMessage.inherited(by) 705: super(by) 706: Classes.push(by) 707: end
# File messages.rb, line 683 683: def self.message_id 684: raise Exception("AbstractMessage.message_id called - you need to override this in a subclass.") 685: end
# File messages.rb, line 688 688: def initialize(socket, server_version) 689: raise Exception.new("Don't use AbstractMessage directly; use the subclass for your specific message type") if self.class.name == "AbstractMessage" 690: IBLogger.debug(" * loading #{self.class.name}") 691: 692: @data = Hash.new 693: @socket = socket 694: @server_version = server_version 695: 696: self.load() 697: 698: @socket = nil 699: 700: 701: IBLogger.debug(" * New #{self.class.name}: #{ @data.inspect }") 702: end
# File messages.rb, line 709 709: def load 710: raise Exception.new("Don't use AbstractMessage; override load() in a subclass.") 711: end
map is a series of Arrays in the format [ [ :name, :type ] ], e.g. autoload([:version, :int ], [:ticker_id, :int]) type identifiers must have a corresponding read_type method on socket.
# File messages.rb, line 717 717: def autoload(*map) 718: map.each { |spec| 719: @data[spec[0]] = @socket.__send__(("read_" + spec[1].to_s).to_sym) 720: } 721: end
version_load loads map only if @data[:version] is >= required_version.
# File messages.rb, line 724 724: def version_load(required_version, *map) 725: autoload(map) if @data[:version] >= required_version 726: end