package com.limegroup.gnutella.messages.vendor;
import java.io.IOException;
import java.io.OutputStream;
import com.limegroup.gnutella.messages.BadPacketException;
import com.limegroup.gnutella.statistics.SentMessageStatHandler;
/**
* VendorMessage for sending a LimeWire node a request for statistics.
* The requester sends
*/
public class GiveStatsVendorMessage extends VendorMessage {
public static final int VERSION = 1;
/**
* The opcode in this Vendor message to ask the other end to give us the
* various statistics.
*/
public static final byte GNUTELLA_INCOMING_TRAFFIC = (byte)0;
public static final byte GNUTELLA_OUTGOING_TRAFFIC = (byte)1;
public static final byte HTTP_DOWNLOAD_TRAFFIC_STATS = (byte)2;
public static final byte HTTP_UPLOAD_TRAFFIC_STATS = (byte)3;
public static final byte PER_CONNECTION_STATS = (byte)0;
public static final byte ALL_CONNECTIONS_STATS = (byte)1;
public static final byte LEAF_CONNECTIONS_STATS = (byte)2;
public static final byte UP_CONNECTIONS_STATS = (byte)3;
/**
* A vendor message read off the network. Package access
*/
GiveStatsVendorMessage(byte[] guid, byte ttl, byte hops, int version,
byte[] payload, int network) throws BadPacketException {
super(guid, ttl, hops, F_LIME_VENDOR_ID, F_GIVE_STATS, version,payload,
network);
if(getPayload().length < 2)
throw new BadPacketException("INVALID PAYLOAD LENGTH: "+
payload.length);
if(version == 1 && getPayload().length != 2)
throw new BadPacketException("UNSUPPORTED PAYLOAD LENGTH: "+
payload.length);
}
/**
* Constructs a new GiveStatsMessage to be sent out.
* @param statsControl the byte the receiver will look at to decide the
* ganularity of the desired stats (this connection, all connections, UPs
* only, leaves only etc.)
* @param statType the byte the receiver of this message will look at to
* decide what kind of statistics are desired -- upload, download, gnutella
* etc.
* @param network to decide whether this message should go out via TCP, UDP,
* multicast, etc.
*/
public GiveStatsVendorMessage(byte statsControl,
byte statType,
int network) {
super(F_LIME_VENDOR_ID, F_GIVE_STATS, VERSION,
derivePayload(statsControl, statType),network);
}
/**
* Constructs the payload of the message, given the desired control & type.
*/
private static byte[] derivePayload(byte control, byte type) {
if(control < (byte)0 || control > (byte)3)
throw new IllegalArgumentException(" invalid control byte ");
if(type < (byte)0 || type > (byte)3)
throw new IllegalArgumentException(" invalid stat type ");
byte[] ret = {control, type};
return ret;
}
protected void writePayload(OutputStream out) throws IOException {
super.writePayload(out);
if(isTCP())
SentMessageStatHandler.TCP_GIVE_STATS.addMessage(this);
else if(isUDP())
SentMessageStatHandler.UDP_GIVE_STATS.addMessage(this);
}
/** Overridden purely for stats handling.
*/
public void recordDrop() {
super.recordDrop();
}
protected byte getStatControl() {
byte[] payload = getPayload();
return payload[0];
}
protected byte getStatType() {
byte[] payload = getPayload();
return payload[1];
}
}