package com.limegroup.gnutella.messages.vendor;
import org.limewire.io.BadGGEPPropertyException;
import org.limewire.io.GGEP;
import com.limegroup.gnutella.messages.BadPacketException;
/**
* Vendor message that toggles collecting of advanced stats on or off.
*/
public class AdvancedStatsToggle extends RoutableGGEPMessage {
private static final int VERSION = 1;
/** key for the block containing how long to keep stats on */
static final String TIME_KEY = "T";
/** key for the block instructing immediate turn off */
static final String OFF_KEY = "OFF";
/**
* How long to keep advanced stats on. Negative if they should
* be turned off immediately.
*/
private final int time;
/**
* Network constructor.. this message will not be sent from nodes.
*/
public AdvancedStatsToggle(byte[] guid, byte ttl, byte hops,
int version, byte[] payload, Network network)
throws BadPacketException {
super(guid, ttl, hops, F_LIME_VENDOR_ID, F_ADVANCED_TOGGLE, version, payload, network);
try {
// check for shut off key first
if (ggep.hasKey(OFF_KEY))
time = -1;
else
this.time = ggep.getInt(TIME_KEY);
} catch (BadGGEPPropertyException bad) {
throw new BadPacketException();
}
}
public AdvancedStatsToggle(RoutableGGEPMessage.GGEPSigner signer, long version, int time) {
super(F_LIME_VENDOR_ID, F_ADVANCED_TOGGLE, VERSION, signer, deriveGGEP(version, time));
this.time = time;
}
private static GGEP deriveGGEP(long version, int time) {
// ggep does not support negative integers, so if this is a
// shut off just put the shut off key.
GGEP g = new GGEP();
if (time >= 0)
g.put(TIME_KEY, time);
else
g.put(OFF_KEY);
if (version >= 0)
g.put(VERSION_KEY, version);
return g;
}
/**
* @return if the advanced stats should be shut off immediately
*/
public boolean shutOffNow() {
return time < 0;
}
/**
* @return the amount of time in milliseconds to keep advanced
* stats on.
*/
public int getTime() {
return time;
}
}