/* * File : PRUDPPacketReplyConnect.java * Created : 20-Jan-2004 * By : parg * * Azureus - a Java Bittorrent client * * 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. * * 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 ( see the LICENSE file ). * * 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 */ package com.aelitis.azureus.core.dht.transport.udp.impl; /** * @author parg * */ import java.util.*; import java.io.*; import java.net.InetSocketAddress; import com.aelitis.azureus.core.dht.transport.DHTTransportContact; import com.aelitis.azureus.core.dht.transport.udp.impl.packethandler.DHTUDPPacketNetworkHandler; public class DHTUDPPacketReplyQueryStorage extends DHTUDPPacketReply { private int random_id; private int header_length; private List<byte[]> response; public DHTUDPPacketReplyQueryStorage( DHTTransportUDPImpl transport, int trans_id, long conn_id, DHTTransportContact local_contact, DHTTransportContact remote_contact ) { super( transport, DHTUDPPacketHelper.ACT_REPLY_QUERY_STORE, trans_id, conn_id, local_contact, remote_contact ); } protected DHTUDPPacketReplyQueryStorage( DHTUDPPacketNetworkHandler network_handler, InetSocketAddress originator, DataInputStream is, int trans_id ) throws IOException { super( network_handler, originator, is, DHTUDPPacketHelper.ACT_REPLY_QUERY_STORE, trans_id ); short size = is.readShort(); response = new ArrayList<byte[]>( size ); if ( size > 0 ){ header_length = is.readByte()&0xff; byte[] bitmap = new byte[size+7/8]; is.read( bitmap ); int pos = 0; int current = 0; for (int i=0;i<size;i++){ if ( i % 8 == 0 ){ current = bitmap[pos++]&0xff; } if (( current&0x80)!=0 ){ byte[] x = new byte[header_length]; is.read( x ); response.add( x ); }else{ response.add( null ); } current <<= 1; } } } public void serialise( DataOutputStream os ) throws IOException { super.serialise(os); int size = response.size(); os.writeShort( size ); if ( size > 0 ){ os.writeByte( header_length ); byte[] bitmap = new byte[size+7/8]; int bitmap_pos = 0; int current_byte = 0; int pos = 0; for ( byte[] x: response ){ current_byte = current_byte << 1; if ( x != null){ current_byte += 1; } if (( pos %8 ) == 7 ){ bitmap[bitmap_pos++] = (byte)current_byte; current_byte = 0; } pos++; } if (( pos % 8 ) != 0 ){ bitmap[bitmap_pos++] = (byte)(current_byte << (8 - (pos % 8))); } os.write( bitmap ); for ( byte[] x: response ){ if ( x != null ){ os.write( x ); } } } } protected void setRandomID( int id ) { random_id = id; } protected int getRandomID() { return( random_id ); } protected void setResponse( int _header_length, List<byte[]> _response ) { header_length = _header_length; response = _response; } protected List<byte[]> getResponse() { return( response ); } }