package org.limewire.rudp.messages;
import java.io.IOException;
import java.io.OutputStream;
/** Defines the interface in which all RUDP messages derive. */
public interface RUDPMessage {
/** The main functor of an RUDP message. */
public static final byte F_RUDP_MESSAGE = (byte)0x41;
// The version number of the protocol to allow for future improvements
public static final short PROTOCOL_VERSION_NUMBER = 1;
/** Used to specify a message type (either SYN, ACK, KEEPALIVE, DATA or
* FIN).
*/
public static enum OpCode {
OP_SYN(0x0),
OP_ACK(0x1),
OP_KEEPALIVE(0x2),
OP_DATA(0x3),
OP_FIN(0x4);
private int opcode;
private OpCode(int opcode) {
this.opcode = opcode;
}
public int toByte() {
return opcode;
}
@Override
public String toString() {
return name() + " (" + toByte() + ")";
}
private static OpCode[] OPCODES;
static {
OpCode[] values = values();
OPCODES = new OpCode[values.length];
for (OpCode o : values) {
int index = o.opcode % OPCODES.length;
if (OPCODES[index] != null) {
// Check the enums for duplicate opcodes!
throw new IllegalStateException("OpCode collision: index=" + index
+ ", OPCODES=" + OPCODES[index] + ", o=" + o);
}
OPCODES[index] = o;
}
}
/**
* Returns the OpCode enum for the integer. Throws an
* MessageFormatException if opcode is unknown!
*/
public static OpCode valueOf(int opcode) throws MessageFormatException {
OpCode o = OPCODES[opcode % OPCODES.length];
if (o != null && o.opcode == opcode) {
return o;
}
throw new MessageFormatException("Unknown opcode: " + opcode);
}
}
/** Gets the OpCode for the message. */
public OpCode getOpCode();
/** Writes the message to the OutputStream. */
public void write(OutputStream out) throws IOException;
/** Return the messages connectionID identifier. */
public byte getConnectionID();
/** Return the messages sequence number */
public long getSequenceNumber();
/**
* Extend the sequence number of incoming messages with the full 8 bytes
* of state.
*/
public void extendSequenceNumber(long seqNo);
/** Return the length of data stored in this message. */
public int getDataLength();
/** Returns the length of the message. */
public int getLength();
}