package org.gudy.azureus2.core3.config.impl; /* * Created on 13-Feb-2005 * Created by James Yeh * 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. * */ import org.gudy.azureus2.core3.config.*; import org.gudy.azureus2.core3.global.GlobalManager; import com.aelitis.azureus.core.AzureusCore; import com.aelitis.azureus.core.speedmanager.SpeedManager; /** * Provides validation for transfer speed settings * @version 1.0 * @since 1.4 * @author James Yeh */ public final class TransferSpeedValidator { public static final String AUTO_UPLOAD_ENABLED_CONFIGKEY = "Auto Upload Speed Enabled"; public static final String AUTO_UPLOAD_SEEDING_ENABLED_CONFIGKEY = "Auto Upload Speed Seeding Enabled"; public static final String UPLOAD_CONFIGKEY = "Max Upload Speed KBs"; public static final String UPLOAD_SEEDING_CONFIGKEY = "Max Upload Speed Seeding KBs"; public static final String DOWNLOAD_CONFIGKEY = "Max Download Speed KBs"; public static final String UPLOAD_SEEDING_ENABLED_CONFIGKEY = "enable.seedingonly.upload.rate"; public static final String[] CONFIG_PARAMS = { AUTO_UPLOAD_ENABLED_CONFIGKEY, AUTO_UPLOAD_SEEDING_ENABLED_CONFIGKEY, UPLOAD_CONFIGKEY, UPLOAD_SEEDING_CONFIGKEY, DOWNLOAD_CONFIGKEY, UPLOAD_SEEDING_ENABLED_CONFIGKEY, }; private final String configKey; private final Number configValue; private static boolean auto_upload_enabled; private static boolean auto_upload_seeding_enabled; private static boolean seeding_upload_enabled; static{ COConfigurationManager.addAndFireParameterListeners( new String[] { UPLOAD_SEEDING_ENABLED_CONFIGKEY, AUTO_UPLOAD_ENABLED_CONFIGKEY, AUTO_UPLOAD_SEEDING_ENABLED_CONFIGKEY }, new PriorityParameterListener() { public void parameterChanged( String parameterName) { if (parameterName == null || parameterName.equals(UPLOAD_SEEDING_ENABLED_CONFIGKEY)) { seeding_upload_enabled = COConfigurationManager.getBooleanParameter( UPLOAD_SEEDING_ENABLED_CONFIGKEY ); } if (parameterName == null || parameterName.equals(AUTO_UPLOAD_ENABLED_CONFIGKEY)) { auto_upload_enabled = COConfigurationManager.getBooleanParameter(AUTO_UPLOAD_ENABLED_CONFIGKEY); } if (parameterName == null || parameterName.equals(AUTO_UPLOAD_SEEDING_ENABLED_CONFIGKEY)) { auto_upload_seeding_enabled = COConfigurationManager.getBooleanParameter(AUTO_UPLOAD_SEEDING_ENABLED_CONFIGKEY); } } }); } /** * Creates a TransferSpeedValidator with the given configuration key and value * @param configKey Configuration key; must be "Max Upload Speed KBs" or "Max Download Speed KBs" * @param value Configuration value to be validated */ public TransferSpeedValidator(final String configKey, final Number value) { this.configKey = configKey; configValue = value; } /** * Gets the transformed value as an Integer */ private static Object validate(final String configKey, final Number value) { //assert value instanceof Number; int newValue = value.intValue(); if(newValue < 0) { newValue = 0; } if(configKey == UPLOAD_CONFIGKEY) { final int downValue = COConfigurationManager.getIntParameter(DOWNLOAD_CONFIGKEY); if( newValue != 0 && newValue < COConfigurationManager.CONFIG_DEFAULT_MIN_MAX_UPLOAD_SPEED && (downValue == 0 || downValue > newValue*2) ) { newValue = (downValue + 1)/2; //COConfigurationManager.setParameter(DOWNLOAD_CONFIGKEY, newValue * 2); } } else if(configKey == DOWNLOAD_CONFIGKEY) { final int upValue = COConfigurationManager.getIntParameter(UPLOAD_CONFIGKEY); if( upValue != 0 && upValue < COConfigurationManager.CONFIG_DEFAULT_MIN_MAX_UPLOAD_SPEED ) { if(newValue > upValue*2) { newValue = upValue*2; //COConfigurationManager.setParameter(UPLOAD_CONFIGKEY, (newValue+1)/2); } else if(newValue == 0) { newValue = upValue*2; //COConfigurationManager.setParameter(UPLOAD_CONFIGKEY, 0); } } }else if ( configKey == UPLOAD_SEEDING_CONFIGKEY ){ // nothing to do as this is active only when were not downloading // so we don't really care }else { throw new IllegalArgumentException("Invalid Configuation Key; use key for max upload and max download"); } return new Integer(newValue); //return value; } /** * Validates the given configuration key/value pair and returns the validated value * @return Modified configuration value that conforms to validation as an Integer */ public Object getValue() { return validate(configKey, configValue); } public static String getActiveUploadParameter( GlobalManager gm ) { if ( seeding_upload_enabled && gm.isSeedingOnly()){ return( TransferSpeedValidator.UPLOAD_SEEDING_CONFIGKEY ); }else{ return( TransferSpeedValidator.UPLOAD_CONFIGKEY ); } } public static String getDownloadParameter() { return( DOWNLOAD_CONFIGKEY ); } public static int getGlobalDownloadRateLimitBytesPerSecond() { return( COConfigurationManager.getIntParameter( getDownloadParameter()) * 1024 ); } public static void setGlobalDownloadRateLimitBytesPerSecond( int bytes_per_second ) { COConfigurationManager.setParameter( getDownloadParameter(), (bytes_per_second+1023)/1024 ); } public static boolean isAutoUploadAvailable( AzureusCore core ) { SpeedManager speedManager = core.getSpeedManager(); return speedManager == null ? false : speedManager.isAvailable(); } public static boolean isAutoSpeedActive( GlobalManager gm ) { // if downloading+seeding is set then we always use this regardless of // only seeding status if (auto_upload_enabled) { return auto_upload_enabled; } if ( gm.isSeedingOnly()){ return auto_upload_seeding_enabled; }else{ return auto_upload_enabled; } } public static String getActiveAutoUploadParameter( GlobalManager gm) { if (!auto_upload_enabled && gm.isSeedingOnly()) { return AUTO_UPLOAD_SEEDING_ENABLED_CONFIGKEY; } return AUTO_UPLOAD_ENABLED_CONFIGKEY; } }