package net.i2p.data.i2cp; /* * public domain * */ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import net.i2p.data.DataFormatException; import net.i2p.data.DataHelper; /** * Tell the other side the limits * * @author zzz */ public class BandwidthLimitsMessage extends I2CPMessageImpl { public final static int MESSAGE_TYPE = 23; private static final int LIMITS = 16; private int[] data; public BandwidthLimitsMessage() { super(); data = new int[LIMITS]; } /** * Let's define it this way. * Leave some extra. This is only local and rarely sent so we don't care about waste. * * 0) Client inbound limit (KBps) * 1) Client outbound limit (KBps) * 2) Router inbound limit (KBps) * 3) Router inbound burst limit (KBps) * 4) Router outbound limit (KBps) * 5) Router outbound burst limit (KBps) * 6) Router burst time (seconds) * 7-15) undefined */ public BandwidthLimitsMessage(int in, int out) { this(); data[0] = in; data[1] = out; } public int[] getLimits() { return data; } @Override protected void doReadMessage(InputStream in, int size) throws I2CPMessageException, IOException { try { for (int i = 0; i < LIMITS; i++) { data[i] = (int) DataHelper.readLong(in, 4); } } catch (DataFormatException dfe) { throw new I2CPMessageException("Unable to load the message data", dfe); } } @Override protected byte[] doWriteMessage() throws I2CPMessageException, IOException { ByteArrayOutputStream os = new ByteArrayOutputStream(64); try { for (int i = 0; i < LIMITS; i++) { DataHelper.writeLong(os, 4, data[i]); } } catch (DataFormatException dfe) { throw new I2CPMessageException("Error writing out the message data", dfe); } return os.toByteArray(); } public int getType() { return MESSAGE_TYPE; } @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append("[BandwidthLimitsMessage"); buf.append("\n\tIn: ").append(data[0]); buf.append("\n\tOut: ").append(data[1]); buf.append("]"); return buf.toString(); } }