/*
 * Created on 26 Jun 2006
 * Created by Paul Gardner
 * Copyright (C) 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.networkmanager.impl.udp;


public class 
UDPPacket 
{
	public static final byte	PROTOCOL_VERSION	= 1;
	
	public static final byte	COMMAND_CRYPTO			= 0;
	public static final byte	COMMAND_DATA			= 1;
	public static final byte	COMMAND_ACK				= 2;
	public static final byte	COMMAND_CLOSE			= 3;
	public static final byte	COMMAND_STAT_REQUEST	= 4;
	public static final byte	COMMAND_STAT_REPLY		= 5;
	
	

	public static final byte	FLAG_NONE		= 0x00;
	public static final byte	FLAG_LAZY_ACK	= 0x01;
	
	private final UDPConnection		connection;
	private final int				sequence;
	private final int				alt_sequence;
	private final byte				command;
	private final byte[]			buffer;
	private final long				unack_in_sequence_count;
	
	private boolean auto_retransmit			= true;
	private short	sent_count;
	private short	resend_count;
	private boolean received;
	private long	send_tick_count;
	
	protected
	UDPPacket(
		UDPConnection	_connection,
		int[]			_sequences,
		byte			_command,
		byte[]			_buffer,
		long			_unack_in_sequence_count )
	{
		connection		= _connection;
		sequence		= _sequences[1];
		alt_sequence	= _sequences[3];
		command			= _command;
		buffer			= _buffer;
		
		unack_in_sequence_count	= _unack_in_sequence_count;
	}
		
	protected UDPConnection
	getConnection()
	{
		return( connection );
	}
	
	protected int
	getSequence()
	{
		return( sequence );
	}
	
	protected int
	getAlternativeSequence()
	{
		return( alt_sequence );
	}
	
	protected byte
	getCommand()
	{
		return( command );
	}
	
	protected byte[]
	getBuffer()
	{
		return( buffer );
	}
	
	protected long
	getUnAckInSequenceCount()
	{
		return( unack_in_sequence_count );
	}
	
	protected boolean
	isAutoRetransmit()
	{
		return( auto_retransmit );
	}
	
	protected void
	setAutoRetransmit(
		boolean	b  )
	{
		auto_retransmit	= b;
	}
	
	protected short
	sent(
		long	tick_count )
	{
		sent_count++;
		
		send_tick_count = tick_count;
		
		return( sent_count );
	}
	
	protected short
	getResendCount()
	{
		return( resend_count );
	}
	
	protected void
	resent()
	{
		resend_count++ ;
	}
	
	protected long
	getSendTickCount()
	{
		return( send_tick_count );
	}
	
	protected void
	setHasBeenReceived()
	{
		received	= true;
	}
	
	protected boolean
	hasBeenReceived()
	{
		return( received );
	}
	
	protected int
	getSentCount()
	{
		return( sent_count );
	}
	
	protected String
	getString()
	{
		return( "seq=" + sequence + ",type=" + command + ",retrans=" + auto_retransmit + ",sent=" + sent_count +",len=" + buffer.length );
	}
}
