def self.from_wire_form(idnum, argstr)
type = WIRE_IDS[idnum]
case type
when :choke, :unchoke, :interested, :uninterested
raise ProtocolError, "invalid length #{argstr.length} for #{type} message" unless argstr.nil? or (argstr.length == 0)
Message.new(type)
when :have
raise ProtocolError, "invalid length #{str.length} for #{type} message" unless argstr.length == 4
Message.new(type, {:index => argstr[0,4].from_fbbe})
when :bitfield
Message.new(type, {:bitfield => argstr})
when :request, :cancel
raise ProtocolError, "invalid length #{argstr.length} for #{type} message" unless argstr.length == 12
Message.new(type, {:index => argstr[0,4].from_fbbe,
:begin => argstr[4,4].from_fbbe,
:length => argstr[8,4].from_fbbe})
when :piece
raise ProtocolError, "invalid length #{argstr.length} for #{type} message" unless argstr.length == 8
Message.new(type, {:index => argstr[0,4].from_fbbe,
:begin => argstr[4,4].from_fbbe})
else
raise "unknown message #{type.inspect}"
end
end