package com.limegroup.gnutella.messages; import java.io.IOException; import java.io.OutputStream; /** * Defines the interface for a Gnutella message (packet). See * <a href="http://rfc-gnutella.sourceforge.net/developer/testing/messageArchitecture.html"> * Gnutella message architecture</a> for more information. * */ public interface Message extends Comparable<Message> { /** The network a message came from or will travel through. */ public static enum Network { UNKNOWN, TCP, UDP, MULTICAST; } // Functional IDs defined by Gnutella protocol. public static final byte F_PING = (byte) 0x0; public static final byte F_PING_REPLY = (byte) 0x1; public static final byte F_PUSH = (byte) 0x40; public static final byte F_QUERY = (byte) 0x80; public static final byte F_QUERY_REPLY = (byte) 0x81; public static final byte F_ROUTE_TABLE_UPDATE = (byte) 0x30; public static final byte F_VENDOR_MESSAGE = (byte) 0x31; public static final byte F_VENDOR_MESSAGE_STABLE = (byte) 0x32; public static final byte F_UDP_CONNECTION = (byte) 0x41; /** * Writes a message quickly, without using temporary buffers or crap. */ public void writeQuickly(OutputStream out) throws IOException; /** * Writes a message out, using the buffer as the temporary header. */ public void write(OutputStream out, byte[] buf) throws IOException; /** * @modifies out * @effects Writes an encoding of this to out. Does NOT flush out. */ public void write(OutputStream out) throws IOException; //////////////////////////////////////////////////////////////////// public Network getNetwork(); public boolean isMulticast(); public boolean isUDP(); public boolean isTCP(); public boolean isUnknownNetwork(); public byte[] getGUID(); public byte getFunc(); public byte getTTL(); /** * If Time To Live (TTL) is less than zero, throws IllegalArgumentException. * Otherwise sets this TTL to the given value. This is useful when you * want certain messages to travel less than others. * @modifies this' TTL */ public void setTTL(byte ttl) throws IllegalArgumentException; /** * If the hops is less than zero, throws IllegalArgumentException. * Otherwise sets this hops to the given value. This is useful when you * want certain messages to look as if they've travelled further. * @modifies this' hops */ public void setHops(byte hops) throws IllegalArgumentException; public byte getHops(); /** Returns the length of this' payload, in bytes. */ public int getLength(); /** Returns the total length of this, in bytes. */ public int getTotalLength(); /** @modifies this * @effects increments hops, decrements TTL if > 0, and returns the * OLD value of TTL. */ public byte hop(); /** * Returns the system time (i.e., the result of System.currentTimeMillis()) * this was instantiated. */ public long getCreationTime(); /** Returns this user-defined priority. Lower values are higher priority. */ public int getPriority(); /** Set this user-defined priority for flow-control purposes. Lower values * are higher priority. */ public void setPriority(int priority); /** * Returns the class that message handlers for it should register upon, i.e. * the interface class that it implements. */ public Class<? extends Message> getHandlerClass(); }