/* * File : PRUDPPacketHandlerRequest.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.net.udp.uc.impl; /** * @author parg * */ import java.net.InetSocketAddress; import org.gudy.azureus2.core3.util.*; import com.aelitis.net.udp.uc.PRUDPPacket; import com.aelitis.net.udp.uc.PRUDPPacketHandlerException; import com.aelitis.net.udp.uc.PRUDPPacketHandlerRequest; import com.aelitis.net.udp.uc.PRUDPPacketReceiver; public class PRUDPPacketHandlerRequestImpl implements PRUDPPacketHandlerRequest { private AESemaphore sem = new AESemaphore("PRUDPPacketHandlerRequest"); private long timeout; private PRUDPPacketReceiver receiver; private PRUDPPacketHandlerException exception; private PRUDPPacket reply; private long send_time; private long reply_time; protected PRUDPPacketHandlerRequestImpl( PRUDPPacketReceiver _receiver, long _timeout ) { receiver = _receiver; timeout = _timeout; } protected void sent() { send_time = SystemTime.getCurrentTime(); } protected long getSendTime() { return( send_time ); } protected long getTimeout() { return( timeout ); } public long getElapsedTime() { if ( send_time == 0 || reply_time == 0 ){ return( -1 ); } long res = reply_time - send_time; if ( res < 0 ){ res = 0; } // do something sensible with 0 time! if ( res == 0 ){ res = SystemTime.TIME_GRANULARITY_MILLIS / 2; } return( res ); } protected void setReply( PRUDPPacket packet, InetSocketAddress originator, long receive_time ) { if ( reply == null ){ reply_time = receive_time; reply = packet; }else{ packet.setPreviousPacket( reply ); reply = packet; } if( !packet.hasContinuation()){ sem.release(); } if ( receiver != null ){ receiver.packetReceived( this, packet, originator ); } } protected void setException( PRUDPPacketHandlerException e ) { // don't override existing reply for synchronous callers as they can // do what they want with it if ( reply == null ){ reply_time = SystemTime.getCurrentTime(); exception = e; } sem.release(); // still report errors to asyn clients (even when a reply has been received) // as they need something to indicate that a continuation packet wasn't received // and that the request has timed-out. ie. a multi-packet reply must terminate // either with the reception of a non-continuation (i.e. last) packet *or* a // timeout/error if ( receiver != null ){ receiver.error( e ); } } protected PRUDPPacket getReply() throws PRUDPPacketHandlerException { sem.reserve(); if ( exception != null ){ throw( exception ); } return( reply ); } }