/** * This software is GPLv2. * Take a look at the LICENSE file for more info. */ package de.tu.dresden.dud.dc.WorkCycle; import java.util.ArrayList; import org.apache.log4j.Logger; import de.tu.dresden.dud.dc.Util; public class WorkCycleReservationPayload { // Logging private static Logger log = Logger.getLogger(WorkCycleReservationPayload.class); public static final int RESERVATION_PAYLOAD_SIZE = 12; private int desiredPayloadLength = 0; private int participants = 0; private byte[] payload = null; private long rand = 0; /** * @param payloadlength Which length shall the payload during the sending phase have? * @param rand the random number * * @return */ public WorkCycleReservationPayload(int payloadlength, short rand){ ArrayList<byte[]> b = new ArrayList<byte[]>(); byte r[] = new byte[0]; byte[] participate = Util.stuffIntIntoInt(1); byte[] pllength = Util.stuffIntIntoInt(payloadlength); byte[] randomnumber = Util.stuffIntIntoInt(rand); b.add(participate ); b.add(pllength ); b.add(randomnumber ); for (int i = 0; i < b.size(); i++) { r = Util.concatenate(r, b.get(i)); } payload = r; } public WorkCycleReservationPayload(byte[] payload) { this.payload = payload; if (payload.length != RESERVATION_PAYLOAD_SIZE) { log.warn("Payload length != minimal expected payload Length! Dropping packet!"); } this.participants = Util.stuffBytesIntoUInt(Util.getBytesByOffset(payload, 0, 4)); this.desiredPayloadLength = Util.stuffBytesIntoUInt(Util.getBytesByOffset( payload, 4, 4)); this.rand = Util.stuffBytesIntoLongUnsigned(Util.getBytesByOffset(payload, 8, 4)); } public long getAverage(){ if (participants == 0) return 0; else return rand / participants; } public Integer getDesiredPayloadLength(){ return Integer.valueOf(desiredPayloadLength); } public int getParticipantCount(){ return participants; } public byte[] getPayload(){ return payload; } public long getRandom(){ return rand; } }