/*
* Created on 14-Oct-2004
* Created by Paul Gardner
* Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package org.gudy.azureus2.core3.peer.impl.transport;
/**
* CURRENTLY UNUSED
*
*/
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
public class
PEPeerTransportDebugger
{
protected int piece_length;
protected
PEPeerTransportDebugger(
PEPeerTransportProtocol transport )
{
piece_length = transport.getControl().getPieceLength(0);
}
public int
write(
SocketChannel chan,
ByteBuffer buffer )
throws IOException
{
int pos = buffer.position();
int len = chan.write( buffer );
if ( len > 0 ){
buffer.position( pos );
analyse( buffer, len );
}
return( len );
}
public long
write(
SocketChannel chan,
ByteBuffer[] buffers,
int array_offset,
int array_length )
throws IOException
{
int[] pos = new int[buffers.length];
for (int i=array_offset;i<array_offset+array_length;i++){
pos[i] = buffers[i].position();
}
long len = chan.write( buffers, array_offset, array_length );
for (int i=array_offset;i<array_offset+array_length;i++){
ByteBuffer buffer = buffers[i];
int written = buffer.position() - pos[i];
if ( written > 0 ){
buffer.position( pos[i] );
analyse( buffer, written );
}
}
return( len );
}
protected static final int BT_READING_LENGTH_AND_TYPE = 1234567;
protected int state = -1; //bt handshake
protected byte[] data_read = new byte[68];
protected int data_read_pos;
protected void
analyse(
ByteBuffer buffer,
int length )
{
byte[] data = new byte[length];
buffer.get(data);
for (int i=0;i<data.length;i++){
if ( data_read_pos == data_read.length ){
if ( state == BT_READING_LENGTH_AND_TYPE ){
ByteBuffer bb = ByteBuffer.wrap( data_read );
int len = bb.getInt();
state = bb.get();
//System.out.println( "Header: len = " + len + ", state = " + state );
if ( len == 1 ){
// messages with no body
//System.out.println( "msg:" + state );
state = BT_READING_LENGTH_AND_TYPE;
data_read = new byte[5];
}else{
data_read = new byte[len-1];
}
}else{
// messages with body
//System.out.println( "msg:" + state );
if ( state == 7 ){ //bt piece
ByteBuffer bb = ByteBuffer.wrap( data_read );
int piece_number = bb.getInt();
int piece_offset = bb.getInt();
long overall_offset = ((long)piece_number)*piece_length + piece_offset;
while(bb.hasRemaining()){
byte v = bb.get();
if ((byte)overall_offset != v ){
System.out.println( "piece: write is bad at " + overall_offset +
": expected = " + (byte)overall_offset + ", actual = " + v );
break;
}
overall_offset++;
}
}
state = BT_READING_LENGTH_AND_TYPE;
data_read = new byte[5];
}
data_read_pos = 0;
}
data_read[data_read_pos++] = data[i];
}
}
}