package com.limegroup.gnutella.messages.vendor; import com.limegroup.gnutella.messages.BadPacketException; import com.limegroup.gnutella.util.DataUtils; /** * This message allows leafs to enable or disable proxying for all or specific * versions of the out-of-band protocol. * * * Versions between 1 and 255 are supported. * * The value 0 is reserved to enable proxying for all versions * * A message without payload disables proxying for all versions */ public class OOBProxyControlVendorMessage extends AbstractVendorMessage { public static final int VERSION = 1; public static enum Control { DISABLE_FOR_ALL_VERSIONS(-1), ENABLE_FOR_ALL_VERSIONS(0), DISABLE_VERSION_1(1), DISABLE_VERSION_2(2), DISABLE_VERSION_3(3), // here for testing purposes because of signed bytes DISABLE_VERSION_255(255); private int version; private Control(int version) { if (version > 255) { throw new IllegalArgumentException("version must be smaller than 256"); } this.version = version; } public int getVersion() { return version; } } public OOBProxyControlVendorMessage(byte[] guid, byte ttl, byte hops, int version, byte[] payload, Network network) throws BadPacketException { super(guid, ttl, hops, F_LIME_VENDOR_ID, F_OOB_PROXYING_CONTROL, version, payload, network); if (getVersion() != VERSION) { throw new BadPacketException("Unsupported version or payload length"); } } public OOBProxyControlVendorMessage(Control control) { super(F_LIME_VENDOR_ID, F_OOB_PROXYING_CONTROL, VERSION, derivePayload(control)); } private static byte[] derivePayload(Control control) { if (control == Control.DISABLE_FOR_ALL_VERSIONS) { return DataUtils.EMPTY_BYTE_ARRAY; } else { return new byte[] { (byte)control.getVersion() }; } } public static OOBProxyControlVendorMessage createDoNotProxyMessage() { return new OOBProxyControlVendorMessage(Control.DISABLE_FOR_ALL_VERSIONS); } public static OOBProxyControlVendorMessage createDoProxyMessage() { return new OOBProxyControlVendorMessage(Control.ENABLE_FOR_ALL_VERSIONS); } /** * Returns {@link Integer#MAX_VALUE} when proxying is disabled for all versions, * otherwise the value of the highest protocol version for which proxying * is disabled. */ public int getMaximumDisabledVersion() { byte[] payload = getPayload(); if (payload.length == 0) { return Integer.MAX_VALUE; } else { return payload[0] & 0xFF; } } }