/*
* Created on 14-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 org.gudy.azureus2.core3.util;
import java.net.URL;
import java.util.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.torrent.*;
/**
* @author parg
*
*/
public class
AENetworkClassifier
{
// DON'T change these constants as they get serialised!!!!
// (obviously you can add new networks to them).
// If you add to them remember to update the configuration item default for
// "Network Selection Default.<name>" and
// "Tracker Network Selection Default.<name>
public static final String AT_PUBLIC = "Public";
public static final String AT_I2P = "I2P";
public static final String AT_TOR = "Tor";
public static final String[] AT_NETWORKS =
{ AT_PUBLIC, AT_I2P, AT_TOR };
private static List listeners = new ArrayList();
public static String
categoriseAddress(
String str )
{
int last_dot = str.lastIndexOf('.');
if ( last_dot == -1 ){
return( AT_PUBLIC ); // no idea really, treat as normal
}
String dom = str.substring(last_dot+1).toLowerCase();
if ( dom.equals( "i2p" )){
return( AT_I2P );
}else if ( dom.equals( "onion" )){
return( AT_TOR );
}
return( AT_PUBLIC );
}
public static String[]
getNetworks(
TOTorrent torrent,
String display_name )
{
// go through all the announce URL and find all networks
List urls = new ArrayList();
urls.add( torrent.getAnnounceURL());
TOTorrentAnnounceURLSet[] sets = torrent.getAnnounceURLGroup().getAnnounceURLSets();
for (int i=0;i<sets.length;i++){
URL[] u = sets[i].getAnnounceURLs();
for (int j=0;j<u.length;j++){
urls.add( u[j] );
}
}
List available_networks = new ArrayList();
for (int i=0;i<urls.size();i++){
URL u = (URL)urls.get(i);
String network = categoriseAddress( u.getHost());
if ( !available_networks.contains( network )){
available_networks.add( network );
}
}
if ( available_networks.size() == 1 && available_networks.get(0) == AT_PUBLIC ){
return( new String[]{ AT_PUBLIC });
}
boolean prompt = COConfigurationManager.getBooleanParameter( "Network Selection Prompt" );
List res = new ArrayList();
if ( prompt && listeners.size() > 0 ){
String[] t_nets = new String[available_networks.size()];
available_networks.toArray( t_nets );
for (int i=0;i<listeners.size();i++){
try{
String[] selected = ((AENetworkClassifierListener)listeners.get(i)).selectNetworks(
display_name,
t_nets );
if ( selected != null ){
for (int j=0;j<selected.length;j++){
res.add( selected[j] );
}
}
}catch( Throwable e ){
// Debug.printStackTrace(e);
}
}
}else{
// use enabled defaults to proceed
for (int i=0;i<available_networks.size();i++){
if ( COConfigurationManager.getBooleanParameter( "Network Selection Default." + available_networks.get(i))){
res.add( available_networks.get(i));
}
}
}
String[] x = new String[res.size()];
res.toArray( x );
return( x );
}
public static void
addListener(
AENetworkClassifierListener l )
{
listeners.add(l);
}
public static void
removeListener(
AENetworkClassifierListener l )
{
listeners.remove(l);
}
}