/*
* Created on 21-Jan-2005
* 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 com.aelitis.azureus.core.dht.transport.udp.impl;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import com.aelitis.azureus.core.dht.impl.DHTLog;
import com.aelitis.azureus.core.dht.transport.udp.DHTTransportUDP;
import com.aelitis.azureus.core.dht.transport.udp.impl.packethandler.DHTUDPPacketNetworkHandler;
/**
* @author parg
*
*/
public class
DHTUDPPacketData
extends DHTUDPPacketRequest
{
protected static final byte PT_READ_REQUEST = 0x00;
protected static final byte PT_READ_REPLY = 0x01;
protected static final byte PT_WRITE_REQUEST = 0x02;
protected static final byte PT_WRITE_REPLY = 0x03;
private byte packet_type;
private byte[] transfer_key;
private byte[] key;
private byte[] data;
private int start_position;
private int length;
private int total_length;
// assume keys are 20 bytes + 1 len, data len is 2 bytes
public static int MAX_DATA_SIZE = DHTUDPPacketHelper.PACKET_MAX_BYTES - DHTUDPPacketReply.DHT_HEADER_SIZE -
1- 21 - 21 - 14;
public
DHTUDPPacketData(
DHTTransportUDPImpl _transport,
long _connection_id,
DHTTransportUDPContactImpl _local_contact,
DHTTransportUDPContactImpl _remote_contact )
{
super( _transport, DHTUDPPacketHelper.ACT_DATA, _connection_id, _local_contact, _remote_contact );
}
protected
DHTUDPPacketData(
DHTUDPPacketNetworkHandler network_handler,
DataInputStream is,
long con_id,
int trans_id )
throws IOException
{
super( network_handler, is, DHTUDPPacketHelper.ACT_DATA, con_id, trans_id );
packet_type = is.readByte();
transfer_key = DHTUDPUtils.deserialiseByteArray( is, 64 );
int max_key_size;
if ( getProtocolVersion() >= DHTTransportUDP.PROTOCOL_VERSION_REPLICATION_CONTROL ){
max_key_size = 255;
}else{
max_key_size = 64;
}
key = DHTUDPUtils.deserialiseByteArray( is, max_key_size );
start_position = is.readInt();
length = is.readInt();
total_length = is.readInt();
data = DHTUDPUtils.deserialiseByteArray( is, 65535 );
super.postDeserialise(is);
}
public void
serialise(
DataOutputStream os )
throws IOException
{
super.serialise(os);
os.writeByte( packet_type );
DHTUDPUtils.serialiseByteArray( os, transfer_key, 64 );
int max_key_size;
if ( getProtocolVersion() >= DHTTransportUDP.PROTOCOL_VERSION_REPLICATION_CONTROL ){
max_key_size = 255;
}else{
max_key_size = 64;
}
DHTUDPUtils.serialiseByteArray( os, key, max_key_size );
os.writeInt( start_position );
os.writeInt( length );
os.writeInt( total_length );
if ( data.length > 0 ){
DHTUDPUtils.serialiseByteArray( os, data, start_position, length, 65535 );
}else{
DHTUDPUtils.serialiseByteArray( os, data, 65535 );
}
super.postSerialise( os );
}
public void
setDetails(
byte _packet_type,
byte[] _transfer_key,
byte[] _key,
byte[] _data,
int _start_pos,
int _length,
int _total_length )
{
packet_type = _packet_type;
transfer_key = _transfer_key;
key = _key;
data = _data;
start_position = _start_pos;
length = _length;
total_length = _total_length;
}
public byte
getPacketType()
{
return( packet_type );
}
public byte[]
getTransferKey()
{
return( transfer_key );
}
public byte[]
getRequestKey()
{
return( key );
}
public byte[]
getData()
{
return( data );
}
public int
getStartPosition()
{
return( start_position );
}
public int
getLength()
{
return( length );
}
public int
getTotalLength()
{
return( total_length );
}
public String
getString()
{
return( super.getString() + "tk=" + DHTLog.getString2( transfer_key ) + ",rk=" +
DHTLog.getString2( key ) + ",data=" + data.length +
",st=" + start_position + ",len=" + length + ",tot=" + total_length );
}
}