Class: QuartzTorrent::PeerWireMessageSerializer

Inherits:
Object
  • Object
show all
Defined in:
lib/quartz_torrent/peermsgserialization.rb

Constant Summary collapse

@@classForMessage =
nil
@@classForExtendedMessage =

The mapping of our extended message ids to extensions. This is different than @extendedMessageIdToClass which is the mapping of peer message ids to extensions, which is different for every peer.

nil

Instance Method Summary collapse

Constructor Details

#initializePeerWireMessageSerializer

Returns a new instance of PeerWireMessageSerializer.



12
13
14
15
16
# File 'lib/quartz_torrent/peermsgserialization.rb', line 12

def initialize
  # extendedMessageIdToClass is the mapping of extended message ids that the peer has sent to extensions.
  @extendedMessageIdToClass = [ExtendedHandshake]
  @logger = LogManager.getLogger("peermsg_serializer")
end

Instance Method Details

#serializeTo(msg, io) ⇒ Object



41
42
43
44
45
46
47
48
49
# File 'lib/quartz_torrent/peermsgserialization.rb', line 41

def serializeTo(msg, io)
  if msg.is_a?(Extended)
    # Set the extended message id
    extendedMsgId = @extendedMessageIdToClass.index msg.class
    raise "Unsupported extended peer message #{msg.class}" if ! extendedMsgId
    msg.extendedMessageId = extendedMsgId
  end
  msg.serializeTo(io)
end

#unserializeFrom(io) ⇒ Object

Raises:

  • (EOFError)


18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/quartz_torrent/peermsgserialization.rb', line 18

def unserializeFrom(io)
  packedLength = io.read(4)
  raise EOFError.new if packedLength.length == 0

  length = packedLength.unpack("N")[0]
  @logger.debug "unserializeFrom: read that length of message is #{length}"
  raise "Received peer message with length #{length}. All messages must have length >= 0" if length < 0
  return KeepAlive.new if length == 0
  
  id = io.read(1).unpack("C")[0]
  @logger.debug "unserializeFrom: read message id #{id}"
  payload = io.read(length-1)

  #raise "Unsupported peer message id #{id}" if id >= self.classForMessage.length
  clazz = classForMessage(id, payload)
  raise "Unsupported peer message id #{id}" if ! clazz

  result = clazz.new
  result.unserialize(payload)
  updateExtendedMessageIdsFromHandshake(result)
  result
end