package com.limegroup.gnutella.routing; import java.io.IOException; import java.io.OutputStream; import com.limegroup.gnutella.ByteOrder; import com.limegroup.gnutella.messages.BadPacketException; import com.limegroup.gnutella.statistics.DroppedSentMessageStatHandler; import com.limegroup.gnutella.statistics.SentMessageStatHandler; /** * The RESET route table update message. */ public class ResetTableMessage extends RouteTableMessage { private int tableSize; private byte infinity; /////////////////////////////// Encoding ////////////////////////////// /** * Creates a new ResetTableMessage from scratch, with TTL 1. The * receiver should initialize its routing table to a tableSize array * with values of infinity. Throws IllegalArgumentException if * either value is less than 1. * * @param tableSize the size of the table * @param infinity the smallest value in the route table for infinity, * i.e., one more than the max TTL * @see RouteTableMessage */ public ResetTableMessage(int tableSize, byte infinity) { //Payload length includes variant super((byte)1, 1+4+1, RouteTableMessage.RESET_VARIANT); if (tableSize<1 || infinity<1) throw new IllegalArgumentException("Argument too small: " +tableSize+", "+infinity); this.tableSize=tableSize; this.infinity=infinity; } protected void writePayloadData(OutputStream out) throws IOException { byte[] buf=new byte[5]; ByteOrder.int2leb(tableSize, buf, 0); buf[4]=infinity; out.write(buf); SentMessageStatHandler.TCP_RESET_ROUTE_TABLE_MESSAGES.addMessage(this); } /////////////////////////////// Decoding /////////////////////////////// /** * Creates a new ResetTableMessage with data read from the network. The * payload argument is the complete payload of the message. The first byte * is guaranteed to be RESET_VARIANT. * * @exception BadPacketException the remaining values in payload are not * well-formed, e.g., because it's the wrong length. */ protected ResetTableMessage(byte[] guid, byte ttl, byte hops, byte[] payload) throws BadPacketException { super(guid, ttl, hops, payload.length, RouteTableMessage.RESET_VARIANT); //TODO: maybe we shouldn't enforce this //if (payload.length!=(2+4)) // throw new BadPacketException("Extra arguments in reset message."); tableSize=ByteOrder.leb2int(payload, 1); infinity=payload[5]; } /////////////////////////////// Accessors /////////////////////////////// /** Returns the smallest value in the route table for infinity, * i.e., one more than the max TTL. */ public byte getInfinity() { return infinity; } /** Returns the new size of the route table. */ public int getTableSize() { return tableSize; } // inherit doc comment public void recordDrop() { DroppedSentMessageStatHandler.TCP_RESET_ROUTE_TABLE_MESSAGES.addMessage(this); } public String toString() { return "{RESET, tableSize: "+getTableSize() +", Infinity: "+getInfinity()+"}"; } }