/*
* Created on 12-Jun-2005
* Created by Paul Gardner
* Copyright (C) 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.packethandler;
import java.io.IOException;
import java.util.*;
import org.gudy.azureus2.core3.util.AEMonitor;
import org.gudy.azureus2.core3.util.Debug;
import com.aelitis.azureus.core.dht.transport.udp.impl.DHTTransportUDPImpl;
import com.aelitis.azureus.core.dht.transport.udp.impl.DHTUDPPacketRequest;
import com.aelitis.net.udp.uc.PRUDPPacketHandler;
import com.aelitis.net.udp.uc.PRUDPPacketHandlerFactory;
public class
DHTUDPPacketHandlerFactory
{
private static DHTUDPPacketHandlerFactory singleton = new DHTUDPPacketHandlerFactory();
private Map port_map = new HashMap();
protected AEMonitor this_mon = new AEMonitor("DHTUDPPacketHandlerFactory" );
public static DHTUDPPacketHandler
getHandler(
DHTTransportUDPImpl transport,
DHTUDPRequestHandler request_handler )
throws DHTUDPPacketHandlerException
{
return( singleton.getHandlerSupport( transport, request_handler ));
}
protected DHTUDPPacketHandler
getHandlerSupport(
DHTTransportUDPImpl transport,
DHTUDPRequestHandler request_handler )
throws DHTUDPPacketHandlerException
{
try{
this_mon.enter();
int port = transport.getPort();
int network = transport.getNetwork();
Object[] port_details = (Object[])port_map.get( new Integer( port ));
if ( port_details == null ){
PRUDPPacketHandler packet_handler =
PRUDPPacketHandlerFactory.getHandler(
port,
new DHTUDPPacketNetworkHandler( this, port ));
port_details = new Object[]{ packet_handler, new HashMap()};
port_map.put( new Integer( port ), port_details );
}
Map network_map = (Map)port_details[1];
Object[] network_details = (Object[])network_map.get( new Integer( network ));
if ( network_details != null ){
throw( new DHTUDPPacketHandlerException( "Network already added" ));
}
DHTUDPPacketHandler ph = new DHTUDPPacketHandler( this, network, (PRUDPPacketHandler)port_details[0], request_handler );
network_map.put( new Integer( network ), new Object[]{ transport, ph });
return( ph );
}finally{
this_mon.exit();
}
}
protected void
destroy(
DHTUDPPacketHandler handler )
{
PRUDPPacketHandler packet_handler = handler.getPacketHandler();
int port = packet_handler.getPort();
int network = handler.getNetwork();
try{
this_mon.enter();
Object[] port_details = (Object[])port_map.get( new Integer( port ));
if ( port_details == null ){
return;
}
Map network_map = (Map)port_details[1];
network_map.remove( new Integer( network ));
if ( network_map.size() == 0 ){
port_map.remove( new Integer( port ));
try{
packet_handler.setRequestHandler(null);
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}finally{
this_mon.exit();
}
}
protected void
process(
int port,
DHTUDPPacketRequest request )
{
try{
int network = request.getNetwork();
/*
if ( network != 0 ){
System.out.println( "process:" + network + ":" + request.getString());
}
*/
Object[] port_details = (Object[])port_map.get( new Integer( port ));
if ( port_details == null ){
throw( new IOException( "Port '" + port + "' not registered" ));
}
Map network_map = (Map)port_details[1];
Object[] network_details = (Object[])network_map.get( new Integer( network ));
if ( network_details == null ){
throw( new IOException( "Network '" + network + "' not registered" ));
}
DHTUDPPacketHandler res = (DHTUDPPacketHandler)network_details[1];
res.receive( request );
}catch( IOException e ){
Debug.printStackTrace( e );
}
}
public DHTTransportUDPImpl
getTransport(
int port,
int network )
throws IOException
{
Object[] port_details = (Object[])port_map.get( new Integer( port ));
if ( port_details == null ){
throw( new IOException( "Port '" + port + "' not registered" ));
}
Map network_map = (Map)port_details[1];
Object[] network_details = (Object[])network_map.get( new Integer( network ));
if ( network_details == null ){
throw( new IOException( "Network '" + network + "' not registered" ));
}
return((DHTTransportUDPImpl)network_details[0]);
}
}