package com.limegroup.gnutella.downloader; import com.limegroup.gnutella.tigertree.HashTree; /** * Simple class that enumerates values for the status of * requesting a file. * * Possible options are: * NoFile (the server is not giving us the file) * Queued (the server queued us) * Connected (we are connected and should download) * NoData (we have no data to request) * PartialData (the server has other data to use) * ThexResponse (the server just gave us a HashTree) */ public class ConnectionStatus { static final int TYPE_NO_FILE = 0; static final int TYPE_QUEUED = 1; static final int TYPE_CONNECTED = 2; static final int TYPE_NO_DATA = 3; static final int TYPE_PARTIAL_DATA = 4; static final int TYPE_THEX_RESPONSE = 5; /** * The status of this connection. */ private final int STATUS; /** * The queue position. Only valid if queued. */ private final int QUEUE_POSITION; /** * The queue poll time. Only valid if queued. */ private final int QUEUE_POLL_TIME; /** * The hash tree. Only valid if thex response. */ private final HashTree HASH_TREE; /** * The sole NO_FILE instance. */ private static final ConnectionStatus NO_FILE = new ConnectionStatus(TYPE_NO_FILE); /** * The sole CONNECTED instance. */ private static final ConnectionStatus CONNECTED = new ConnectionStatus(TYPE_CONNECTED); /** * The sole NO_DATA instance. */ private static final ConnectionStatus NO_DATA = new ConnectionStatus(TYPE_NO_DATA); /** * The sole PARTIAL_DATA instance. */ private static final ConnectionStatus PARTIAL_DATA = new ConnectionStatus(TYPE_PARTIAL_DATA); /** * Constructs a ConnectionStatus of the specified status. */ private ConnectionStatus(int status) { if(status == TYPE_QUEUED || status == TYPE_THEX_RESPONSE) throw new IllegalArgumentException(); STATUS = status; QUEUE_POSITION = -1; QUEUE_POLL_TIME = -1; HASH_TREE = null; } /** * Constructs a ConnectionStatus for being queued. */ private ConnectionStatus(int status, int queuePos, int queuePoll) { if(status != TYPE_QUEUED) throw new IllegalArgumentException(); STATUS = status; QUEUE_POSITION = queuePos; QUEUE_POLL_TIME = queuePoll; HASH_TREE = null; } private ConnectionStatus(int status, HashTree tree) { if(status != TYPE_THEX_RESPONSE) throw new IllegalArgumentException(); if(tree == null) throw new NullPointerException("null tree"); STATUS = status; HASH_TREE = tree; QUEUE_POSITION = -1; QUEUE_POLL_TIME = -1; } /** * Returns a ConnectionStatus for the server not having the file. */ static ConnectionStatus getNoFile() { return NO_FILE; } /** * Returns a ConnectionStatus for being connected. */ static ConnectionStatus getConnected() { return CONNECTED; } /** * Returns a ConnectionStatus for us not having data. */ static ConnectionStatus getNoData() { return NO_DATA; } /** * Returns a ConnectionStatus for the server having other partial data. */ static ConnectionStatus getPartialData() { return PARTIAL_DATA; } /** * Returns a ConnectionStatus for being queued with the specified position * and poll time (in seconds). */ static ConnectionStatus getQueued(int pos, int poll) { // convert to milliseconds & add an extra second. poll *= 1000; poll += 1000; return new ConnectionStatus(TYPE_QUEUED, pos, poll); } /** * Returns a ConnectionStatus for having a THEX tree. */ static ConnectionStatus getThexResponse(HashTree tree) { return new ConnectionStatus(TYPE_THEX_RESPONSE, tree); } /** * Returns the type of this ConnectionStatus. */ int getType() { return STATUS; } /** * Determines if this is a NoFile ConnectionStatus. */ boolean isNoFile() { return STATUS == TYPE_NO_FILE; } /** * Determines if this is a Connected ConnectionStatus. */ boolean isConnected() { return STATUS == TYPE_CONNECTED; } /** * Determines if this is a NoData ConnectionStatus. */ boolean isNoData() { return STATUS == TYPE_NO_DATA; } /** * Determines if this is a PartialData ConnectionStatus. */ boolean isPartialData() { return STATUS == TYPE_PARTIAL_DATA; } /** * Determines if this is a Queued ConnectionStatus. */ boolean isQueued() { return STATUS == TYPE_QUEUED; } /** * Determines if this is a ThexResponse ConnectionStatus. */ public boolean isThexResponse() { return STATUS == TYPE_THEX_RESPONSE; } /** * Determines the queue position. Throws IllegalStateException if called * when the status is not queued. */ int getQueuePosition() { if(!isQueued()) throw new IllegalStateException(); return QUEUE_POSITION; } /** * Determines the queue poll time (in milliseconds). * Throws IllegalStateException if called when the status is not queued. */ int getQueuePollTime() { if(!isQueued()) throw new IllegalStateException(); return QUEUE_POLL_TIME; } /** * Returns the HashTree. * Throws IllegalStateException if called when the status is not ThexResponse. */ public HashTree getHashTree() { if(!isThexResponse()) throw new IllegalStateException(); return HASH_TREE; } public String toString() { return ""+getType(); } }