/*
* Created on 16 juin 2003
* Copyright (C) 2003, 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.io.InputStreamReader;
import java.io.LineNumberReader;
import java.nio.charset.Charset;
import java.security.AccessControlException;
import java.util.Locale;
import java.util.StringTokenizer;
import java.util.TimeZone;
import java.util.regex.Pattern;
/**
*
* @author Olivier
*
*/
public class
Constants
{
public static final String EMPTY_STRING = "";
public static final String SF_WEB_SITE = "http://plugins.vuze.com/";
public static final String AELITIS_TORRENTS = "http://cf1.vuze.com/torrent/torrents/";
public static final String AELITIS_FILES = "http://cf1.vuze.com/torrent/files/";
public static final String AZUREUS_WIKI = "http://wiki.vuze.com/w/";
public static final String VERSION_SERVER_V4 = "version.vuze.com";
public static final String VERSION_SERVER_V6 = "version6.vuze.com";
public static final String DHT_SEED_ADDRESS_V4 = "dht.vuze.com";
public static final String DHT_SEED_ADDRESS_V6 = "dht6.vuze.com";
public static final String DHT_SEED_ADDRESS_V6_TUNNEL = "dht6tunnel.vuze.com";
public static final String NAT_TEST_SERVER = "nettest.vuze.com";
public static final String NAT_TEST_SERVER_HTTP = "http://nettest.vuze.com/";
public static final String SPEED_TEST_SERVER = "speedtest.vuze.com";
public static final String PAIRING_URL = "https://pair.vuze.com/pairing";
public static final String[] AZUREUS_DOMAINS = { "azureusplatform.com", "azureus.com", "aelitis.com", "vuze.com" };
public static final String DEFAULT_ENCODING = "UTF8";
public static final String BYTE_ENCODING = "ISO-8859-1";
public static final Charset BYTE_CHARSET;
public static final Charset DEFAULT_CHARSET;
public static final int DEFAULT_INSTANCE_PORT = 6880;
public static final int INSTANCE_PORT;
static{
String ip_str = System.getProperty( "azureus.instance.port", String.valueOf( DEFAULT_INSTANCE_PORT ));
int ip;
try{
ip = Integer.parseInt( ip_str );
}catch( Throwable e ){
ip = DEFAULT_INSTANCE_PORT;
}
INSTANCE_PORT = ip;
Charset bc = null;
Charset dc = null;
try{
bc = Charset.forName( Constants.BYTE_ENCODING );
dc = Charset.forName( Constants.DEFAULT_ENCODING );
}catch( Throwable e ){
e.printStackTrace();
}
BYTE_CHARSET = bc;
DEFAULT_CHARSET = dc;
}
public static final Locale LOCALE_ENGLISH = new Locale("en", "");
static{
try{
String timezone = System.getProperty( "azureus.timezone", null );
if ( timezone != null ){
TimeZone.setDefault( TimeZone.getTimeZone( timezone ));
}
}catch( Throwable e ){
// can happen in applet
if ( e instanceof AccessControlException ){
}else{
e.printStackTrace();
}
}
}
public static final String INFINITY_STRING = "\u221E"; // "oo";pa
public static final int CRAPPY_INFINITY_AS_INT = 365*24*3600; // seconds (365days)
public static final long CRAPPY_INFINITE_AS_LONG = 10000*365*24*3600; // seconds (10k years)
public static boolean DOWNLOAD_SOURCES_PRETEND_COMPLETE = false;
// keep the CVS style constant coz version checkers depend on it!
// e.g. 2.0.8.3
// 2.0.8.3_CVS
// 2.0.8.3_Bnn // incremental build
public static String APP_NAME = "Vuze";
public static final String AZUREUS_NAME = "Azureus";
public static final String AZUREUS_PROTOCOL_NAME_PRE_4813 = "Azureus";
public static final String AZUREUS_PROTOCOL_NAME = "Vuze";
public static final String AZUREUS_VERSION = "5.3.0.1_B35";
public static final String BUILD_VERSION = "5301-35"; //Ant replace
public static final String AZUREUS_SUBVER = "";
public static final byte[] VERSION_ID = ("-" + "AZ" + "5301" + "-").getBytes(); //MUST be 8 chars long!
private static final boolean FORCE_NON_CVS = System.getProperty( "az.force.noncvs", "0" ).equals( "1" );
public static final boolean IS_CVS_VERSION = isCVSVersion( AZUREUS_VERSION ) && !FORCE_NON_CVS;
public static final String OSName = System.getProperty("os.name");
public static final boolean isOSX = OSName.toLowerCase().startsWith("mac os");
public static final boolean isLinux = OSName.equalsIgnoreCase("Linux");
public static final boolean isSolaris = OSName.equalsIgnoreCase("SunOS");
public static final boolean isFreeBSD = OSName.equalsIgnoreCase("FreeBSD");
public static final boolean isWindowsXP = OSName.equalsIgnoreCase("Windows XP");
public static final boolean isWindows95 = OSName.equalsIgnoreCase("Windows 95");
public static final boolean isWindows98 = OSName.equalsIgnoreCase("Windows 98");
public static final boolean isWindows2000 = OSName.equalsIgnoreCase("Windows 2000");
public static final boolean isWindowsME = OSName.equalsIgnoreCase("Windows ME");
public static final boolean isWindows9598ME = isWindows95 || isWindows98 || isWindowsME;
public static boolean isSafeMode = false;
public static final boolean isWindows = OSName.toLowerCase().startsWith("windows");
// If it isn't windows or osx, it's most likely an unix flavor
public static final boolean isUnix = !isWindows && !isOSX;
public static final boolean isWindowsVista;
public static final boolean isWindowsVistaSP2OrHigher;
public static final boolean isWindowsVistaOrHigher;
public static final boolean isWindows7OrHigher;
public static final boolean isWindows8OrHigher;
// Common Patterns
public static final Pattern PAT_SPLIT_COMMAWORDS = Pattern.compile("\\s*,\\s*");
public static final Pattern PAT_SPLIT_COMMA = Pattern.compile(",");
public static final Pattern PAT_SPLIT_DOT = Pattern.compile("\\.");
public static final Pattern PAT_SPLIT_SPACE = Pattern.compile(" ");
public static final Pattern PAT_SPLIT_SLASH_N = Pattern.compile("\n");
public static final boolean is64Bit;
static{
boolean _is64Bit;
try{
_is64Bit = System.getProperty( "os.arch" ).contains( "64" );
}catch( Throwable e ){
_is64Bit = false;
}
is64Bit = _is64Bit;
if ( isWindows ){
Float ver = null;
try{
ver = new Float( System.getProperty( "os.version" ));
}catch (Throwable e){
}
boolean vista_sp2_or_higher = false;
if ( ver == null ){
isWindowsVista = false;
isWindowsVistaOrHigher = false;
isWindows7OrHigher = false;
isWindows8OrHigher = false;
}else{
float f_ver = ver.floatValue();
isWindowsVista = f_ver == 6;
isWindowsVistaOrHigher = f_ver >= 6;
isWindows7OrHigher = f_ver >= 6.1f;
isWindows8OrHigher = f_ver >= 6.2f;
if ( isWindowsVista ){
LineNumberReader lnr = null;
try{
Process p =
Runtime.getRuntime().exec(
new String[]{
"reg",
"query",
"HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion",
"/v",
"CSDVersion" });
lnr = new LineNumberReader( new InputStreamReader( p.getInputStream()));
while( true ){
String line = lnr.readLine();
if ( line == null ){
break;
}
if ( line.matches( ".*CSDVersion.*" )){
vista_sp2_or_higher = line.matches( ".*Service Pack [2-9]" );
break;
}
}
}catch( Throwable e ){
}finally{
if ( lnr != null ){
try{
lnr.close();
}catch( Throwable e ){
}
}
}
}
}
isWindowsVistaSP2OrHigher = vista_sp2_or_higher;
}else{
isWindowsVista = false;
isWindowsVistaSP2OrHigher = false;
isWindowsVistaOrHigher = false;
isWindows7OrHigher = false;
isWindows8OrHigher = false;
}
}
public static final boolean isOSX_10_5_OrHigher;
public static final boolean isOSX_10_6_OrHigher;
public static final boolean isOSX_10_7_OrHigher;
public static final boolean isOSX_10_8_OrHigher;
static{
if ( isOSX ){
int first_digit = 0;
int second_digit = 0;
try{
String os_version = System.getProperty( "os.version" );
String[] bits = os_version.split( "\\." );
first_digit = Integer.parseInt( bits[0] );
if ( bits.length > 1 ){
second_digit = Integer.parseInt( bits[1] );
}
}catch( Throwable e ){
}
isOSX_10_5_OrHigher = first_digit > 10 || ( first_digit == 10 && second_digit >= 5 );
isOSX_10_6_OrHigher = first_digit > 10 || ( first_digit == 10 && second_digit >= 6 );
isOSX_10_7_OrHigher = first_digit > 10 || ( first_digit == 10 && second_digit >= 7 );
isOSX_10_8_OrHigher = first_digit > 10 || ( first_digit == 10 && second_digit >= 8 );
}else{
isOSX_10_5_OrHigher = false;
isOSX_10_6_OrHigher = false;
isOSX_10_7_OrHigher = false;
isOSX_10_8_OrHigher = false;
}
}
public static final boolean isAndroid;
static{
String vm_name = System.getProperty( "java.vm.name", "" );
isAndroid = vm_name.equalsIgnoreCase( "Dalvik" );
}
// Android is roughly 1.6 (reports as 0 for java.version)
public static final String JAVA_VERSION;
public static final int API_LEVEL;
static{
String java_version = isAndroid?"1.6":System.getProperty("java.version");
int api_level = 0;
if ( isAndroid ){
String sdk_int = System.getProperty( "android.os.build.version.sdk_int", "0" );
try{
api_level = Integer.parseInt( sdk_int );
if ( api_level > 0 && api_level <= 8 ){
java_version = "1.5";
}
}catch( Throwable e ){
}
}
JAVA_VERSION = java_version;
API_LEVEL = api_level;
}
public static final boolean isJava7OrHigher;
static{
// http://www.oracle.com/technetwork/java/javase/versioning-naming-139433.html
// should always start with n.n.
// unless it is Android where it is always 0
boolean _7plus;
try{
String[] bits = JAVA_VERSION.split( "\\." );
int first = Integer.parseInt( bits[0] );
int second = Integer.parseInt( bits[1] );
_7plus = first > 1 || second >= 7;
}catch( Throwable e ){
System.err.println( "Unparsable Java version: " + JAVA_VERSION );
e.printStackTrace();
_7plus = false; // derp
}
isJava7OrHigher = _7plus;
}
public static final String FILE_WILDCARD = isWindows?"*.*":"*";
// use this if you want to prevent the constant getting cached in separately built objects (e.g. plugins)
public static String
getCurrentVersion()
{
return( AZUREUS_VERSION );
}
/**
* Gets the current version, or if a CVS version, the one on which it is based
* @return
*/
public static String
getBaseVersion()
{
return( getBaseVersion( AZUREUS_VERSION ));
}
public static String
getBaseVersion(
String version )
{
int p1 = version.indexOf("_"); // _CVS or _Bnn
if ( p1 == -1 ){
return( version );
}
return( version.substring(0,p1));
}
/**
* is this a formal build or CVS/incremental
* @return
*/
public static boolean
isCVSVersion()
{
return IS_CVS_VERSION;
}
public static boolean
isCVSVersion(
String version )
{
return( version.indexOf("_") != -1 );
}
/**
* For CVS builds this returns the incremental build number. For people running their own
* builds this returns -1
* @return
*/
public static int
getIncrementalBuild()
{
return( getIncrementalBuild( AZUREUS_VERSION ));
}
public static int
getIncrementalBuild(
String version )
{
if ( !isCVSVersion(version)){
return( 0 );
}
int p1 = version.indexOf( "_B" );
if ( p1 == -1 ){
return( -1 );
}
try{
return( Integer.parseInt( version.substring(p1+2)));
}catch( Throwable e ){
System.out.println("can't parse version");
return( -1 );
}
}
public static boolean
isCurrentVersionLT(
String version )
{
return( compareVersions( AZUREUS_VERSION, version ) < 0 );
}
public static boolean
isCurrentVersionGE(
String version )
{
return( compareVersions( AZUREUS_VERSION, version ) >= 0 );
}
/**
* compare two version strings of form n.n.n.n (e.g. 1.2.3.4)
* @param version_1
* @param version_2
* @return -ve -> version_1 lower, 0 = same, +ve -> version_1 higher
*/
public static int
compareVersions(
String version_1,
String version_2 )
{
try{
version_1 = version_1.replaceAll( "_B35", "_B100" );
version_2 = version_2.replaceAll( "_B35", "_B100" );
if ( version_1.startsWith("." )){
version_1 = "0" + version_1;
}
if ( version_2.startsWith("." )){
version_2 = "0" + version_2;
}
version_1 = version_1.replaceAll("[^0-9.]", ".");
version_2 = version_2.replaceAll("[^0-9.]", ".");
StringTokenizer tok1 = new StringTokenizer(version_1,".");
StringTokenizer tok2 = new StringTokenizer(version_2,".");
while( true ){
if ( tok1.hasMoreTokens() && tok2.hasMoreTokens()){
int i1 = Integer.parseInt(tok1.nextToken());
int i2 = Integer.parseInt(tok2.nextToken());
if ( i1 != i2 ){
return( i1 - i2 );
}
}else if ( tok1.hasMoreTokens()){
int i1 = Integer.parseInt(tok1.nextToken());
if ( i1 != 0 ){
return( 1 );
}
}else if ( tok2.hasMoreTokens()){
int i2 = Integer.parseInt(tok2.nextToken());
if ( i2 != 0 ){
return( -1 );
}
}else{
return( 0 );
}
}
}catch( Throwable e ){
e.printStackTrace();
return( 0 );
}
}
public static boolean
isValidVersionFormat(
String version )
{
if ( version == null || version.length() == 0 ){
return( false );
}
for (int i=0;i<version.length();i++){
char c = version.charAt(i);
if ( !( Character.isDigit( c ) || c == '.' )){
return( false) ;
}
}
if ( version.startsWith( "." ) || version.endsWith( "." ) || version.indexOf( ".." ) != -1 ){
return( false );
}
return( true );
}
public static boolean
isAzureusDomain(
String host )
{
host = host.toLowerCase();
for (int i=0; i<AZUREUS_DOMAINS.length; i++) {
String domain = (String) AZUREUS_DOMAINS[i];
if ( domain.equals( host )){
return( true );
}
if ( host.endsWith("." + domain)){
return( true );
}
}
return( false );
}
public static void main(String[] args) {
System.out.println(compareVersions("3.0.0.1", "3.0.0.0"));
System.out.println(compareVersions("3.0.0.0_B1", "3.0.0.0"));
System.out.println(compareVersions("3.0.0.0", "3.0.0.0_B1"));
System.out.println(compareVersions("3.0.0.0_B1", "3.0.0.0_B4"));
System.out.println(compareVersions("3.0.0.0..B1", "3.0.0.0_B4"));
}
}