package de.tum.in.www1.jReto.routing.packets;
import java.nio.ByteBuffer;
import java.util.UUID;
import de.tum.in.www1.jReto.packet.Constants;
import de.tum.in.www1.jReto.packet.DataChecker;
import de.tum.in.www1.jReto.packet.DataReader;
import de.tum.in.www1.jReto.packet.DataWriter;
import de.tum.in.www1.jReto.packet.Packet;
import de.tum.in.www1.jReto.packet.PacketType;
/**
* A FloodingPacket is a packet that floods any other packet through the network.
* The pair of sequenceNumber and originIdentifier are required to ensure that packets are not flooded indefinitely. See the FloodingPacketManager for more information.
*/
public class FloodingPacket implements Packet {
public final static PacketType TYPE = PacketType.FLOODED_PACKET;
public final static int MINIMUM_LENGTH = Constants.PACKET_TYPE_SIZE + Constants.INT_SIZE + Constants.UUID_SIZE;
public final UUID originIdentifier;
public final int sequenceNumber;
public final ByteBuffer payload;
public FloodingPacket(UUID originIdentifier, int sequenceNumber, ByteBuffer payload) {
if (payload.remaining() == 0) {
System.err.println("Warning: Created FloodingPacket with 0 length payload.");
}
this.originIdentifier = originIdentifier;
this.sequenceNumber = sequenceNumber;
this.payload = payload;
}
public static FloodingPacket deserialize(ByteBuffer data) {
DataReader reader = new DataReader(data);
if (!DataChecker.check(reader, TYPE, MINIMUM_LENGTH)) return null;
return new FloodingPacket(reader.getUUID(), reader.getInt(), reader.getRemainingData());
}
public ByteBuffer serialize() {
this.payload.rewind(); // Maybe someone from outside accessed the buffer and didn't rewind it
DataWriter data = new DataWriter(MINIMUM_LENGTH + this.payload.remaining());
data.add(TYPE);
data.add(this.originIdentifier);
data.add(this.sequenceNumber);
data.add(this.payload);
this.payload.rewind(); // Make sure someone from outside can use the buffer without rewinding first
return data.getData();
}
}