package com.limegroup.gnutella.udpconnect;
import com.limegroup.gnutella.messages.BadPacketException;
/** The ack message is used to acknowledge all non-ack packets in the protocol.
*/
public class AckMessage extends UDPConnectionMessage {
private long _windowStart;
private int _windowSpace;
/**
* Construct a new AckMessage with the specified settings and data
*/
public AckMessage(byte connectionID, long sequenceNumber,
long windowStart, int windowSpace)
throws BadPacketException {
super(
/* his connectionID */ connectionID,
/* opcode */ OP_ACK,
/* sequenceNumber */ sequenceNumber,
/* window Start and Space */
buildByteArray((int) windowStart & 0xffff,
(windowSpace < 0 ? 0 : windowSpace)),
/* 2 short ints => 4 bytes */ 4
);
_windowStart = windowStart;
_windowSpace = windowSpace;
}
/**
* Construct a new AckMessage from the network
*/
public AckMessage(
byte[] guid, byte ttl, byte hops, byte[] payload)
throws BadPacketException {
super(guid, ttl, hops, payload);
// Parse the added windowStart and windowSpace information
_windowStart = (long)
getShortInt(guid[GUID_DATA_START],guid[GUID_DATA_START+1]);
_windowSpace =
getShortInt(guid[GUID_DATA_START+2],guid[GUID_DATA_START+3]);
}
/**
* The windowStart is equivalent to the lowest unreceived sequenceNumber
* coming from the receiving end of the connection. It is saying, I have
* received everything up to one minus this. (Note: it rolls)
*/
public long getWindowStart() {
return _windowStart;
}
/**
* Extend the windowStart of incoming messages with the full 8 bytes
* of state
*/
public void extendWindowStart(long wStart) {
_windowStart = wStart;
}
/**
* The windowSpace is a measure of how much more data the receiver can
* receive within its buffer. This number will go to zero if the
* application on the receiving side is reading data slowly. If it goes
* to zero then the sender should stop sending.
*/
public int getWindowSpace() {
return _windowSpace;
}
public String toString() {
return "AckMessage DestID:"+getConnectionID()+
" start:"+_windowStart+" space:"+_windowSpace+
" seq:"+getSequenceNumber();
}
}