forked from I2P_Developers/i2p.i2p
i2psnark: finals for Message class
recognize BiglyBT cleanups
This commit is contained in:
@ -52,26 +52,26 @@ class Message
|
|||||||
|
|
||||||
// Not all fields are used for every message.
|
// Not all fields are used for every message.
|
||||||
// KEEP_ALIVE doesn't have a real wire representation
|
// KEEP_ALIVE doesn't have a real wire representation
|
||||||
byte type;
|
final byte type;
|
||||||
|
|
||||||
// Used for HAVE, REQUEST, PIECE and CANCEL messages.
|
// Used for HAVE, REQUEST, PIECE and CANCEL messages.
|
||||||
// Also SUGGEST, REJECT, ALLOWED_FAST
|
// Also SUGGEST, REJECT, ALLOWED_FAST
|
||||||
// low byte used for EXTENSION message
|
// low byte used for EXTENSION message
|
||||||
// low two bytes used for PORT message
|
// low two bytes used for PORT message
|
||||||
int piece;
|
final int piece;
|
||||||
|
|
||||||
// Used for REQUEST, PIECE and CANCEL messages.
|
// Used for REQUEST, PIECE and CANCEL messages.
|
||||||
// Also REJECT
|
// Also REJECT
|
||||||
int begin;
|
final int begin;
|
||||||
int length;
|
final int length;
|
||||||
|
|
||||||
// Used for PIECE and BITFIELD and EXTENSION messages
|
// Used for PIECE and BITFIELD and EXTENSION messages
|
||||||
byte[] data;
|
byte[] data;
|
||||||
int off;
|
final int off;
|
||||||
int len;
|
final int len;
|
||||||
|
|
||||||
// Used to do deferred fetch of data
|
// Used to do deferred fetch of data
|
||||||
DataLoader dataLoader;
|
private final DataLoader dataLoader;
|
||||||
|
|
||||||
// now unused
|
// now unused
|
||||||
//SimpleTimer.TimedEvent expireEvent;
|
//SimpleTimer.TimedEvent expireEvent;
|
||||||
@ -79,6 +79,79 @@ class Message
|
|||||||
private static final int BUFSIZE = PeerState.PARTSIZE;
|
private static final int BUFSIZE = PeerState.PARTSIZE;
|
||||||
private static final ByteCache _cache = ByteCache.getInstance(16, BUFSIZE);
|
private static final ByteCache _cache = ByteCache.getInstance(16, BUFSIZE);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For types KEEP_ALIVE, CHOKE, UNCHOKE, INTERESTED, UNINTERESTED, HAVE_ALL, HAVE_NONE
|
||||||
|
* @since 0.9.32
|
||||||
|
*/
|
||||||
|
Message(byte type) {
|
||||||
|
this(type, 0, 0, 0, null, 0, 0, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For types HAVE, PORT, SUGGEST, ALLOWED_FAST
|
||||||
|
* @since 0.9.32
|
||||||
|
*/
|
||||||
|
Message(byte type, int piece) {
|
||||||
|
this(type, piece, 0, 0, null, 0, 0, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For types REQUEST, REJECT, CANCEL
|
||||||
|
* @since 0.9.32
|
||||||
|
*/
|
||||||
|
Message(byte type, int piece, int begin, int length) {
|
||||||
|
this(type, piece, begin, length, null, 0, 0, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For type BITFIELD
|
||||||
|
* @since 0.9.32
|
||||||
|
*/
|
||||||
|
Message(byte[] data) {
|
||||||
|
this(BITFIELD, 0, 0, 0, data, 0, data.length, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For type EXTENSION
|
||||||
|
* @since 0.9.32
|
||||||
|
*/
|
||||||
|
Message(int id, byte[] data) {
|
||||||
|
this(EXTENSION, id, 0, 0, data, 0, data.length, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For type PIECE with deferred data
|
||||||
|
* @since 0.9.32
|
||||||
|
*/
|
||||||
|
Message(int piece, int begin, int length, DataLoader loader) {
|
||||||
|
this(PIECE, piece, begin, length, null, 0, length, loader);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For type PIECE with data
|
||||||
|
* We don't use this anymore.
|
||||||
|
* @since 0.9.32
|
||||||
|
*/
|
||||||
|
/****
|
||||||
|
Message(int piece, int begin, int length, byte[] data) {
|
||||||
|
this(PIECE, piece, begin, length, data, 0, length, null);
|
||||||
|
}
|
||||||
|
****/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 0.9.32
|
||||||
|
*/
|
||||||
|
private Message(byte type, int piece, int begin, int length, byte[] data, int off, int len, DataLoader loader) {
|
||||||
|
this.type = type;
|
||||||
|
this.piece = piece;
|
||||||
|
this.begin = begin;
|
||||||
|
this.length = length;
|
||||||
|
this.data = data;
|
||||||
|
this.off = off;
|
||||||
|
this.len = len;
|
||||||
|
dataLoader = loader;
|
||||||
|
}
|
||||||
|
|
||||||
/** Utility method for sending a message through a DataStream. */
|
/** Utility method for sending a message through a DataStream. */
|
||||||
void sendMessage(DataOutputStream dos) throws IOException
|
void sendMessage(DataOutputStream dos) throws IOException
|
||||||
{
|
{
|
||||||
@ -121,10 +194,10 @@ class Message
|
|||||||
datalen += 4;
|
datalen += 4;
|
||||||
|
|
||||||
// msg type is 1 byte
|
// msg type is 1 byte
|
||||||
if (type == EXTENSION)
|
else if (type == EXTENSION)
|
||||||
datalen += 1;
|
datalen += 1;
|
||||||
|
|
||||||
if (type == PORT)
|
else if (type == PORT)
|
||||||
datalen += 2;
|
datalen += 2;
|
||||||
|
|
||||||
// add length of data for piece or bitfield array.
|
// add length of data for piece or bitfield array.
|
||||||
@ -150,10 +223,10 @@ class Message
|
|||||||
type == REJECT)
|
type == REJECT)
|
||||||
dos.writeInt(length);
|
dos.writeInt(length);
|
||||||
|
|
||||||
if (type == EXTENSION)
|
else if (type == EXTENSION)
|
||||||
dos.writeByte((byte) piece & 0xff);
|
dos.writeByte((byte) piece & 0xff);
|
||||||
|
|
||||||
if (type == PORT)
|
else if (type == PORT)
|
||||||
dos.writeShort(piece & 0xffff);
|
dos.writeShort(piece & 0xffff);
|
||||||
|
|
||||||
// Send actual data
|
// Send actual data
|
||||||
|
@ -49,12 +49,11 @@ class PeerConnectionIn implements Runnable
|
|||||||
this.peer = peer;
|
this.peer = peer;
|
||||||
this.din = din;
|
this.din = din;
|
||||||
lastRcvd = System.currentTimeMillis();
|
lastRcvd = System.currentTimeMillis();
|
||||||
quit = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void disconnect()
|
void disconnect()
|
||||||
{
|
{
|
||||||
if (quit == true)
|
if (quit)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
quit = true;
|
quit = true;
|
||||||
|
@ -126,11 +126,7 @@ class PeerConnectionOut implements Runnable
|
|||||||
it.remove();
|
it.remove();
|
||||||
//SimpleTimer.getInstance().removeEvent(nm.expireEvent);
|
//SimpleTimer.getInstance().removeEvent(nm.expireEvent);
|
||||||
if (peer.supportsFast()) {
|
if (peer.supportsFast()) {
|
||||||
Message r = new Message();
|
Message r = new Message(Message.REJECT, nm.piece, nm.begin, nm.length);
|
||||||
r.type = Message.REJECT;
|
|
||||||
r.piece = nm.piece;
|
|
||||||
r.begin = nm.begin;
|
|
||||||
r.length = nm.length;
|
|
||||||
if (_log.shouldLog(Log.DEBUG))
|
if (_log.shouldLog(Log.DEBUG))
|
||||||
_log.debug("Send " + peer + ": " + r);
|
_log.debug("Send " + peer + ": " + r);
|
||||||
r.sendMessage(dout);
|
r.sendMessage(dout);
|
||||||
@ -294,11 +290,7 @@ class PeerConnectionOut implements Runnable
|
|||||||
it.remove();
|
it.remove();
|
||||||
removed = true;
|
removed = true;
|
||||||
if (type == Message.PIECE && peer.supportsFast()) {
|
if (type == Message.PIECE && peer.supportsFast()) {
|
||||||
Message r = new Message();
|
Message r = new Message(Message.REJECT, m.piece, m.begin, m.length);
|
||||||
r.type = Message.REJECT;
|
|
||||||
r.piece = m.piece;
|
|
||||||
r.begin = m.begin;
|
|
||||||
r.length = m.length;
|
|
||||||
if (_log.shouldLog(Log.DEBUG))
|
if (_log.shouldLog(Log.DEBUG))
|
||||||
_log.debug("Send " + peer + ": " + r);
|
_log.debug("Send " + peer + ": " + r);
|
||||||
try {
|
try {
|
||||||
@ -314,13 +306,12 @@ class PeerConnectionOut implements Runnable
|
|||||||
|
|
||||||
void sendAlive()
|
void sendAlive()
|
||||||
{
|
{
|
||||||
Message m = new Message();
|
|
||||||
m.type = Message.KEEP_ALIVE;
|
|
||||||
// addMessage(m);
|
|
||||||
synchronized(sendQueue)
|
synchronized(sendQueue)
|
||||||
{
|
{
|
||||||
if(sendQueue.isEmpty())
|
if(sendQueue.isEmpty()) {
|
||||||
|
Message m = new Message(Message.KEEP_ALIVE);
|
||||||
sendQueue.offer(m);
|
sendQueue.offer(m);
|
||||||
|
}
|
||||||
sendQueue.notifyAll();
|
sendQueue.notifyAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -335,11 +326,7 @@ class PeerConnectionOut implements Runnable
|
|||||||
: Message.CHOKE;
|
: Message.CHOKE;
|
||||||
if (!removeMessage(inverseType))
|
if (!removeMessage(inverseType))
|
||||||
{
|
{
|
||||||
Message m = new Message();
|
Message m = new Message(choke ? Message.CHOKE : Message.UNCHOKE);
|
||||||
if (choke)
|
|
||||||
m.type = Message.CHOKE;
|
|
||||||
else
|
|
||||||
m.type = Message.UNCHOKE;
|
|
||||||
addMessage(m);
|
addMessage(m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -353,11 +340,7 @@ class PeerConnectionOut implements Runnable
|
|||||||
: Message.INTERESTED;
|
: Message.INTERESTED;
|
||||||
if (!removeMessage(inverseType))
|
if (!removeMessage(inverseType))
|
||||||
{
|
{
|
||||||
Message m = new Message();
|
Message m = new Message(interest ? Message.INTERESTED : Message.UNINTERESTED);
|
||||||
if (interest)
|
|
||||||
m.type = Message.INTERESTED;
|
|
||||||
else
|
|
||||||
m.type = Message.UNINTERESTED;
|
|
||||||
addMessage(m);
|
addMessage(m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -365,9 +348,7 @@ class PeerConnectionOut implements Runnable
|
|||||||
|
|
||||||
void sendHave(int piece)
|
void sendHave(int piece)
|
||||||
{
|
{
|
||||||
Message m = new Message();
|
Message m = new Message(Message.HAVE, piece);
|
||||||
m.type = Message.HAVE;
|
|
||||||
m.piece = piece;
|
|
||||||
addMessage(m);
|
addMessage(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -379,11 +360,7 @@ class PeerConnectionOut implements Runnable
|
|||||||
} else if (fast && bitfield.count() <= 0) {
|
} else if (fast && bitfield.count() <= 0) {
|
||||||
sendHaveNone();
|
sendHaveNone();
|
||||||
} else {
|
} else {
|
||||||
Message m = new Message();
|
Message m = new Message(bitfield.getFieldBytes());
|
||||||
m.type = Message.BITFIELD;
|
|
||||||
m.data = bitfield.getFieldBytes();
|
|
||||||
m.off = 0;
|
|
||||||
m.len = m.data.length;
|
|
||||||
addMessage(m);
|
addMessage(m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -434,11 +411,7 @@ class PeerConnectionOut implements Runnable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Message m = new Message();
|
Message m = new Message(Message.REQUEST, req.getPiece(), req.off, req.len);
|
||||||
m.type = Message.REQUEST;
|
|
||||||
m.piece = req.getPiece();
|
|
||||||
m.begin = req.off;
|
|
||||||
m.length = req.len;
|
|
||||||
addMessage(m);
|
addMessage(m);
|
||||||
req.sendTime = System.currentTimeMillis();
|
req.sendTime = System.currentTimeMillis();
|
||||||
}
|
}
|
||||||
@ -482,14 +455,7 @@ class PeerConnectionOut implements Runnable
|
|||||||
|
|
||||||
// queue a fake message... set everything up,
|
// queue a fake message... set everything up,
|
||||||
// except save the PeerState instead of the bytes.
|
// except save the PeerState instead of the bytes.
|
||||||
Message m = new Message();
|
Message m = new Message(piece, begin, length, loader);
|
||||||
m.type = Message.PIECE;
|
|
||||||
m.piece = piece;
|
|
||||||
m.begin = begin;
|
|
||||||
m.length = length;
|
|
||||||
m.dataLoader = loader;
|
|
||||||
m.off = 0;
|
|
||||||
m.len = length;
|
|
||||||
addMessage(m);
|
addMessage(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -498,21 +464,17 @@ class PeerConnectionOut implements Runnable
|
|||||||
* Also add a timeout.
|
* Also add a timeout.
|
||||||
* We don't use this anymore.
|
* We don't use this anymore.
|
||||||
*/
|
*/
|
||||||
|
/****
|
||||||
void sendPiece(int piece, int begin, int length, byte[] bytes)
|
void sendPiece(int piece, int begin, int length, byte[] bytes)
|
||||||
{
|
{
|
||||||
Message m = new Message();
|
Message m = new Message(piece, begin, length, bytes);
|
||||||
m.type = Message.PIECE;
|
|
||||||
m.piece = piece;
|
|
||||||
m.begin = begin;
|
|
||||||
m.length = length;
|
|
||||||
m.data = bytes;
|
|
||||||
m.off = 0;
|
|
||||||
m.len = length;
|
|
||||||
// since we have the data already loaded, queue a timeout to remove it
|
// since we have the data already loaded, queue a timeout to remove it
|
||||||
// no longer prefetched
|
// no longer prefetched
|
||||||
addMessage(m);
|
addMessage(m);
|
||||||
}
|
}
|
||||||
|
****/
|
||||||
|
|
||||||
|
/** send cancel */
|
||||||
void sendCancel(Request req)
|
void sendCancel(Request req)
|
||||||
{
|
{
|
||||||
// See if it is still in our send queue
|
// See if it is still in our send queue
|
||||||
@ -531,11 +493,7 @@ class PeerConnectionOut implements Runnable
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Always send, just to be sure it it is really canceled.
|
// Always send, just to be sure it it is really canceled.
|
||||||
Message m = new Message();
|
Message m = new Message(Message.CANCEL, req.getPiece(), req.off, req.len);
|
||||||
m.type = Message.CANCEL;
|
|
||||||
m.piece = req.getPiece();
|
|
||||||
m.begin = req.off;
|
|
||||||
m.length = req.len;
|
|
||||||
addMessage(m);
|
addMessage(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -578,20 +536,13 @@ class PeerConnectionOut implements Runnable
|
|||||||
|
|
||||||
/** @since 0.8.2 */
|
/** @since 0.8.2 */
|
||||||
void sendExtension(int id, byte[] bytes) {
|
void sendExtension(int id, byte[] bytes) {
|
||||||
Message m = new Message();
|
Message m = new Message(id, bytes);
|
||||||
m.type = Message.EXTENSION;
|
|
||||||
m.piece = id;
|
|
||||||
m.data = bytes;
|
|
||||||
m.off = 0;
|
|
||||||
m.len = bytes.length;
|
|
||||||
addMessage(m);
|
addMessage(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @since 0.8.4 */
|
/** @since 0.8.4 */
|
||||||
void sendPort(int port) {
|
void sendPort(int port) {
|
||||||
Message m = new Message();
|
Message m = new Message(Message.PORT, port);
|
||||||
m.type = Message.PORT;
|
|
||||||
m.piece = port;
|
|
||||||
addMessage(m);
|
addMessage(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -599,34 +550,28 @@ class PeerConnectionOut implements Runnable
|
|||||||
* Unused
|
* Unused
|
||||||
* @since 0.9.21
|
* @since 0.9.21
|
||||||
*/
|
*/
|
||||||
|
/****
|
||||||
void sendSuggest(int piece) {
|
void sendSuggest(int piece) {
|
||||||
Message m = new Message();
|
Message m = new Message(Message.SUGGEST, piece);
|
||||||
m.type = Message.SUGGEST;
|
|
||||||
m.piece = piece;
|
|
||||||
addMessage(m);
|
addMessage(m);
|
||||||
}
|
}
|
||||||
|
****/
|
||||||
|
|
||||||
/** @since 0.9.21 */
|
/** @since 0.9.21 */
|
||||||
private void sendHaveAll() {
|
private void sendHaveAll() {
|
||||||
Message m = new Message();
|
Message m = new Message(Message.HAVE_ALL);
|
||||||
m.type = Message.HAVE_ALL;
|
|
||||||
addMessage(m);
|
addMessage(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @since 0.9.21 */
|
/** @since 0.9.21 */
|
||||||
private void sendHaveNone() {
|
private void sendHaveNone() {
|
||||||
Message m = new Message();
|
Message m = new Message(Message.HAVE_NONE);
|
||||||
m.type = Message.HAVE_NONE;
|
|
||||||
addMessage(m);
|
addMessage(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @since 0.9.21 */
|
/** @since 0.9.21 */
|
||||||
void sendReject(int piece, int begin, int length) {
|
void sendReject(int piece, int begin, int length) {
|
||||||
Message m = new Message();
|
Message m = new Message(Message.REJECT, piece, begin, length);
|
||||||
m.type = Message.REJECT;
|
|
||||||
m.piece = piece;
|
|
||||||
m.begin = begin;
|
|
||||||
m.length = length;
|
|
||||||
addMessage(m);
|
addMessage(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -634,10 +579,10 @@ class PeerConnectionOut implements Runnable
|
|||||||
* Unused
|
* Unused
|
||||||
* @since 0.9.21
|
* @since 0.9.21
|
||||||
*/
|
*/
|
||||||
|
/****
|
||||||
void sendAllowedFast(int piece) {
|
void sendAllowedFast(int piece) {
|
||||||
Message m = new Message();
|
Message m = new Message(Message.ALLOWED_FAST, piece);
|
||||||
m.type = Message.ALLOWED_FAST;
|
|
||||||
m.piece = piece;
|
|
||||||
addMessage(m);
|
addMessage(m);
|
||||||
}
|
}
|
||||||
|
****/
|
||||||
}
|
}
|
||||||
|
@ -1424,6 +1424,11 @@ public class KRPC implements I2PSessionMuxedListener, DHT {
|
|||||||
List<Hash> rv = new ArrayList<Hash>(max);
|
List<Hash> rv = new ArrayList<Hash>(max);
|
||||||
for (BEValue bev : peers) {
|
for (BEValue bev : peers) {
|
||||||
byte[] b = bev.getBytes();
|
byte[] b = bev.getBytes();
|
||||||
|
if (b.length != Hash.HASH_LENGTH) {
|
||||||
|
if (_log.shouldWarn())
|
||||||
|
_log.info("Bad peers entry from: " + nInfo);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
//Hash h = new Hash(b);
|
//Hash h = new Hash(b);
|
||||||
Hash h = Hash.create(b);
|
Hash h = Hash.create(b);
|
||||||
rv.add(h);
|
rv.add(h);
|
||||||
|
@ -1864,14 +1864,10 @@ public class I2PSnarkServlet extends BasicServlet {
|
|||||||
String client;
|
String client;
|
||||||
if ("AwMD".equals(ch))
|
if ("AwMD".equals(ch))
|
||||||
client = _t("I2PSnark");
|
client = _t("I2PSnark");
|
||||||
else if ("BFJT".equals(ch))
|
|
||||||
client = "I2PRufus";
|
|
||||||
else if ("TTMt".equals(ch))
|
|
||||||
client = "I2P-BT";
|
|
||||||
else if ("LUFa".equals(ch))
|
else if ("LUFa".equals(ch))
|
||||||
client = "Vuze" + getAzVersion(pid.getID());
|
client = "Vuze" + getAzVersion(pid.getID());
|
||||||
else if ("CwsL".equals(ch))
|
else if ("LUJJ".equals(ch))
|
||||||
client = "I2PSnarkXL";
|
client = "BiglyBT" + getAzVersion(pid.getID());
|
||||||
else if ("LVhE".equals(ch))
|
else if ("LVhE".equals(ch))
|
||||||
client = "XD" + getAzVersion(pid.getID());
|
client = "XD" + getAzVersion(pid.getID());
|
||||||
else if ("ZV".equals(ch.substring(2,4)) || "VUZP".equals(ch))
|
else if ("ZV".equals(ch.substring(2,4)) || "VUZP".equals(ch))
|
||||||
@ -1880,6 +1876,12 @@ public class I2PSnarkServlet extends BasicServlet {
|
|||||||
client = "Transmission" + getAzVersion(pid.getID());
|
client = "Transmission" + getAzVersion(pid.getID());
|
||||||
else if ("LUtU".equals(ch))
|
else if ("LUtU".equals(ch))
|
||||||
client = "KTorrent" + getAzVersion(pid.getID());
|
client = "KTorrent" + getAzVersion(pid.getID());
|
||||||
|
else if ("CwsL".equals(ch))
|
||||||
|
client = "I2PSnarkXL";
|
||||||
|
else if ("BFJT".equals(ch))
|
||||||
|
client = "I2PRufus";
|
||||||
|
else if ("TTMt".equals(ch))
|
||||||
|
client = "I2P-BT";
|
||||||
else
|
else
|
||||||
client = _t("Unknown") + " (" + ch + ')';
|
client = _t("Unknown") + " (" + ch + ')';
|
||||||
out.write(client + " <tt title=\"");
|
out.write(client + " <tt title=\"");
|
||||||
@ -1981,7 +1983,7 @@ public class I2PSnarkServlet extends BasicServlet {
|
|||||||
private static String getAzVersion(byte[] id) {
|
private static String getAzVersion(byte[] id) {
|
||||||
if (id[7] != '-')
|
if (id[7] != '-')
|
||||||
return "";
|
return "";
|
||||||
StringBuilder buf = new StringBuilder(16);
|
StringBuilder buf = new StringBuilder(8);
|
||||||
buf.append(' ');
|
buf.append(' ');
|
||||||
for (int i = 3; i <= 6; i++) {
|
for (int i = 3; i <= 6; i++) {
|
||||||
int val = id[i] - '0';
|
int val = id[i] - '0';
|
||||||
|
Reference in New Issue
Block a user