class Net::TNS::Packet
Constants
- MAX_PAYLOAD_SIZE
- SESSION_DATA_UNIT_SIZE
Public Class Methods
from_socket( socket )
click to toggle source
# File lib/net/tns/packet.rb, line 36 def self.from_socket( socket ) Net::TNS.logger.debug("Attempting to read header") # TODO: allow sockets to implement their own timeout behavior require "timeout" begin header_raw = Timeout::timeout(5) do socket.read(Header::LENGTH) end rescue Timeout::Error raise Exceptions::ReceiveTimeoutExceeded end if header_raw.nil? || header_raw.length != Header::LENGTH header_length = header_raw.length unless header_raw.nil? raise Exceptions::ProtocolException.new("Failed to read complete header. Read #{header_length.to_i} bytes.") end header = Header.new() header.read( header_raw ) Net::TNS.logger.debug("Read header. Reported packet length is #{header.packet_length} bytes") if header.packet_length > SESSION_DATA_UNIT_SIZE raise Exceptions::ProtocolException.new("Packet length in header (#{header.packet_length}) is longer than SDU size.") end payload_raw = socket.read( header.packet_length - Header::LENGTH ) packet_raw = header_raw + payload_raw unless payload_class = @@tns_packet_classes[ header.packet_type ] raise Net::TNS::Exceptions::TNSException.new( "Unknown TNS packet type: #{header.packet_type}" ) end unless packet_raw.length == header.packet_length raise Net::TNS::Exceptions::ProtocolException.new("Failed to read entire packet (read #{packet_raw.length} of #{header.packet_length} bytes).") end new_packet = payload_class.read( packet_raw ) return new_packet end
register_tns_type(tns_type)
click to toggle source
# File lib/net/tns/packet.rb, line 23 def self.register_tns_type(tns_type) @@tns_packet_classes ||= {} @@tns_packet_types ||= {} if @@tns_packet_classes.has_key?(tns_type) existing_class = @@tns_packet_classes[tns_type] raise ArgumentError.new("Duplicate TNS Types Defined: #{existing_class} and #{self} both have a type of #{tns_type}") end @@tns_packet_classes[tns_type] = self @@tns_packet_types[self] = tns_type return nil end
Public Instance Methods
to_binary_s()
click to toggle source
Calls superclass method
# File lib/net/tns/packet.rb, line 80 def to_binary_s() update_header() return super end
update_header()
click to toggle source
# File lib/net/tns/packet.rb, line 75 def update_header() self.header.packet_type = @@tns_packet_types[self.class] self.header.packet_length = self.num_bytes end