# File lib/rubytorrent/message.rb, line 89
  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