package org.limewire.rudp.messages.impl; import java.nio.ByteBuffer; import java.nio.ByteOrder; import org.limewire.rudp.messages.AckMessage; import org.limewire.rudp.messages.MessageFormatException; /** The ack message is used to acknowledge all non-ack packets in the protocol. */ class AckMessageImpl extends RUDPMessageImpl implements AckMessage { private long _windowStart; private int _windowSpace; /** * Construct a new AckMessage with the specified settings and data */ AckMessageImpl(byte connectionID, long sequenceNumber, long windowStart, int windowSpace) { super(connectionID, OpCode.OP_ACK, sequenceNumber, (short)(windowStart & 0xFFFF), (short)(windowSpace < 0 ? 0 : windowSpace & 0xFFFF)); _windowStart = windowStart; _windowSpace = windowSpace; } /** * Construct a new AckMessage from the network */ AckMessageImpl(byte connectionId, long sequenceNumber, ByteBuffer data1, ByteBuffer data2) throws MessageFormatException { super(OpCode.OP_ACK, connectionId, sequenceNumber, data1, data2); if (data1.remaining() < 4) { throw new MessageFormatException("Message not long enough, message length " + data1.remaining() + " < 4"); } data1.order(ByteOrder.BIG_ENDIAN); _windowStart = data1.getShort(); _windowSpace = data1.getShort(); data1.rewind(); } /* (non-Javadoc) * @see org.limewire.rudp.messages.impl.AckMessage#getWindowStart() */ public long getWindowStart() { return _windowStart; } /* (non-Javadoc) * @see org.limewire.rudp.messages.impl.AckMessage#extendWindowStart(long) */ public void extendWindowStart(long wStart) { _windowStart = wStart; } /* (non-Javadoc) * @see org.limewire.rudp.messages.impl.AckMessage#getWindowSpace() */ public int getWindowSpace() { return _windowSpace; } @Override public String toString() { return "AckMessage DestID:"+getConnectionID()+ " start:"+_windowStart+" space:"+_windowSpace+ " seq:"+getSequenceNumber(); } }