package com.limegroup.gnutella.messages;
import java.util.Set;
import org.limewire.io.IpPort;
import org.limewire.security.SecurityToken;
import com.limegroup.gnutella.Response;
import com.limegroup.gnutella.messages.Message.Network;
public interface QueryReplyFactory {
/**
* Creates a new query reply. The number of responses is responses.length
* The Browse Host GGEP extension is ON by default.
*
* @requires
* 0 < port < 2^16 (i.e., can fit in 2 unsigned bytes),
* ip.length==4 and ip is in <i>BIG-endian</i> byte order, 0 <
* speed < 2^32 (i.e., can fit in 4 unsigned bytes),
* responses.length < 2^8 (i.e., can fit in 1 unsigned byte),
* clientGUID.length==16
*/
public QueryReply createQueryReply(byte[] guid, byte ttl, int port,
byte[] ip, long speed, Response[] responses, byte[] clientGUID,
boolean isMulticastReply);
/**
* Creates a new QueryReply with a BearShare 2.2.0-style QHD. The QHD with
* the LIME vendor code and the given busy and push flags. Note that this
* constructor has no support for undefined push or busy bits. The Browse
* Host GGEP extension is ON by default.
*
* @param needsPush true iff this is firewalled and the downloader should
* attempt a push without trying a normal download.
* @param isBusy true iff this server is busy, i.e., has no more upload
* slots.
* @param finishedUpload true iff this server has successfully finished an
* upload
* @param measuredSpeed true iff speed is measured, not as reported by the
* user
* @param supportsChat true iff the host currently allows chatting.
*/
public QueryReply createQueryReply(byte[] guid, byte ttl, int port,
byte[] ip, long speed, Response[] responses, byte[] clientGUID,
boolean needsPush, boolean isBusy, boolean finishedUpload,
boolean measuredSpeed, boolean supportsChat,
boolean isMulticastReply);
/**
* Creates a new QueryReply with a BearShare 2.2.0-style QHD. The QHD with
* the LIME vendor code and the given busy and push flags. Note that this
* constructor has no support for undefined push or busy bits. The Browse
* Host GGEP extension is ON by default.
*
* @param xmlBytes the (non-null) byte[] containing aggregated and indexed
* information regarding file metadata. In terms of byte-size, this
* should not be bigger than 65535 bytes. Anything larger will result
* in an Exception being throw. This String is assumed to consist of
* compressed data.
* @param needsPush true iff this is firewalled and the downloader should
* attempt a push without trying a normal download.
* @param isBusy true iff this server is busy, i.e., has no more upload
* slots
* @param finishedUpload true iff this server has successfully finished an
* upload
* @param measuredSpeed true iff speed is measured, not as reported by the
* user
* @param supportsChat true iff the host currently allows chatting.
* @exception IllegalArgumentException Thrown if xmlBytes.length >
* XML_MAX_SIZE
*/
public QueryReply createQueryReply(byte[] guid, byte ttl, int port,
byte[] ip, long speed, Response[] responses, byte[] clientGUID,
byte[] xmlBytes, boolean needsPush, boolean isBusy,
boolean finishedUpload, boolean measuredSpeed,
boolean supportsChat, boolean isMulticastReply);
/**
* Creates a new QueryReply with a BearShare 2.2.0-style QHD. The QHD with
* the LIME vendor code and the given busy and push flags. Note that this
* constructor has no support for undefined push or busy bits. The Browse
* Host GGEP extension is ON by default.
*
* @param xmlBytes the (non-null) byte[] containing aggregated and indexed
* information regarding file metadata. In terms of byte-size, this
* should not be bigger than 65535 bytes. Anything larger will result
* in an Exception being throw. This String is assumed to consist of
* compressed data.
* @param needsPush true iff this is firewalled and the downloader should
* attempt a push without trying a normal download.
* @param isBusy true iff this server is busy, i.e., has no more upload
* slots
* @param finishedUpload true iff this server has successfully finished an
* upload
* @param measuredSpeed true iff speed is measured, not as reported by the
* user
* @param supportsChat true iff the host currently allows chatting.
* @param proxies an array of PushProxy interfaces. will be included in the
* replies GGEP extension.
* @exception IllegalArgumentException Thrown if xmlBytes.length >
* XML_MAX_SIZE
*/
public QueryReply createQueryReply(byte[] guid, byte ttl, int port,
byte[] ip, long speed, Response[] responses, byte[] clientGUID,
byte[] xmlBytes, boolean needsPush, boolean isBusy,
boolean finishedUpload, boolean measuredSpeed,
boolean supportsChat, boolean isMulticastReply,
Set<? extends IpPort> proxies);
/**
* Creates a new QueryReply with a BearShare 2.2.0-style QHD. The QHD with
* the LIME vendor code and the given busy and push flags. Note that this
* constructor has no support for undefined push or busy bits. The Browse
* Host GGEP extension is ON by default.
*
* @param xmlBytes the (non-null) byte[] containing aggregated and indexed
* information regarding file metadata. In terms of byte-size, this
* should not be bigger than 65535 bytes. Anything larger will result
* in an Exception being throw. This String is assumed to consist of
* compressed data.
* @param needsPush true iff this is firewalled and the downloader should
* attempt a push without trying a normal download.
* @param isBusy true iff this server is busy, i.e., has no more upload
* slots
* @param finishedUpload true iff this server has successfully finished an
* upload
* @param measuredSpeed true iff speed is measured, not as reported by the
* user
* @param supportsChat true iff the host currently allows chatting.
* @param proxies an array of PushProxy interfaces. will be included in the
* replies GGEP extension.
* @param the security token to echo along with the query reply
* @exception IllegalArgumentException Thrown if xmlBytes.length >
* XML_MAX_SIZE
*/
public QueryReply createQueryReply(byte[] guid, byte ttl, int port,
byte[] ip, long speed, Response[] responses, byte[] clientGUID,
byte[] xmlBytes, boolean needsPush, boolean isBusy,
boolean finishedUpload, boolean measuredSpeed,
boolean supportsChat, boolean isMulticastReply,
Set<? extends IpPort> proxies, SecurityToken securityToken);
/**
* Creates a new QueryReply with a BearShare 2.2.0-style QHD. The QHD with
* the LIME vendor code and the given busy and push flags. Note that this
* constructor has no support for undefined push or busy bits. The Browse
* Host GGEP extension is ON by default.
*
* @param needsPush true iff this is firewalled and the downloader should
* attempt a push without trying a normal download.
* @param isBusy true iff this server is busy, i.e., has no more upload
* slots
* @param finishedUpload true iff this server has successfully finished an
* upload
* @param measuredSpeed true iff speed is measured, not as reported by the
* user
* @param xmlBytes The (non-null) byte[] containing aggregated and indexed
* information regarding file metadata. In terms of byte-size, this
* should not be bigger than 65535 bytes. Anything larger will result
* in an Exception being throw. This String is assumed to consist of
* compressed data.
* @param supportsChat true iff the host currently allows chatting.
* @param proxies an array of PushProxy interfaces. will be included in the
* replies GGEP extension.
* @exception IllegalArgumentException Thrown if xmlBytes.length >
* XML_MAX_SIZE
*/
public QueryReply createQueryReply(byte[] guid, byte ttl, int port,
byte[] ip, long speed, Response[] responses, byte[] clientGUID,
byte[] xmlBytes, boolean needsPush, boolean isBusy,
boolean finishedUpload, boolean measuredSpeed,
boolean supportsChat, boolean isMulticastReply,
boolean supportsFWTransfer, Set<? extends IpPort> proxies);
/**
* Creates a new QueryReply with a BearShare 2.2.0-style QHD. The QHD with
* the LIME vendor code and the given busy and push flags. Note that this
* constructor has no support for undefined push or busy bits. The Browse
* Host GGEP extension is ON by default.
*
* @param xmlBytes the (non-null) byte[] containing aggregated and indexed
* information regarding file metadata. In terms of byte-size, this
* should not be bigger than 65535 bytes. Anything larger will result
* in an Exception being throw. This String is assumed to consist of
* compressed data.
* @param needsPush true iff this is firewalled and the downloader should
* attempt a push without trying a normal download.
* @param isBusy true iff this server is busy, i.e., has no more upload
* slots
* @param finishedUpload true iff this server has successfully finished an
* upload
* @param measuredSpeed true iff speed is measured, not as reported by the
* user
* @param supportsChat true iff the host currently allows chatting.
* @param proxies an array of PushProxy interfaces. will be included in the
* replies GGEP extension.
* @param securityToken might be null
* @exception IllegalArgumentException Thrown if xmlBytes.length >
* XML_MAX_SIZE
*/
public QueryReply createQueryReply(byte[] guid, byte ttl, int port,
byte[] ip, long speed, Response[] responses, byte[] clientGUID,
byte[] xmlBytes, boolean needsPush, boolean isBusy,
boolean finishedUpload, boolean measuredSpeed,
boolean supportsChat, boolean isMulticastReply,
boolean supportsFWTransfer, Set<? extends IpPort> proxies,
SecurityToken securityToken);
/** Creates a new query reply with data read from the network. */
public QueryReply createFromNetwork(byte[] guid, byte ttl, byte hops,
byte[] payload) throws BadPacketException;
/**
* Copy constructor. Creates a new query reply from the passed query Reply.
* The new one is same as the passed one, but with different specified GUID.
* <p>
*
* Note: The payload is not really copied, but the reference in the newly
* constructed query reply, points to the one in the passed reply. But since
* the payload cannot be mutated, it shouldn't make difference if different
* query replies maintain reference to same payload
*
* @param guid the new GUID for the reply
* @param reply the query reply from where to copy the fields into the new
* constructed query reply
*/
public QueryReply createQueryReply(byte[] guid, QueryReply reply);
/**
* Copy constructor, appending information about the return path.
* @param original the original query
* @param me this host.
* @param source the source that the reply came from
* @return original reply with return path info.
*/
public QueryReply createWithReturnPathInfo(QueryReply original, IpPort me, IpPort source);
/**
* Copy constructor.
* @param address 4 byte IP address.
* @return original reply but with the new address.
*/
public QueryReply createWithNewAddress(byte [] address, QueryReply original);
public QueryReply createFromNetwork(byte[] guid, byte ttl, byte hops,
byte[] payload, Network network) throws BadPacketException;
}