package com.aelitis.azureus.core.speedmanager.impl.v2; import org.gudy.azureus2.core3.util.SystemTime; /** * Created on Jun 1, 2007 * Created by Alan Snyder * Copyright (C) 2007 Aelitis, All Rights Reserved. * <p/> * 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. * <p/> * AELITIS, SAS au capital de 63.529,40 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. */ /** * Is the application in a "download" mode? Or is it in a "seeding" mode? This is * used to determine up we cut back on upload bandwidth limit. * * Here is how to determine the mode. If the download rate is LOW compared to the capacity * for five minutes continously then it will be considered in a SEEDING mode. * * If the download bandwidth ever goes into the MED range then it switches to DOWNLOADING * mode immediately. * * The application will favor DOWNLOADING mode to SEEDING mode. * */ public class TransferMode { private State mode = State.DOWNLOADING; private long lastTimeDownloadDetected = SystemTime.getCurrentTime(); private static final long WAIT_TIME_FOR_SEEDING_MODE = 1000 * 60; public TransferMode() { } /** * If the download bandwidth is ever in MED or above switch immediately to DOWNLOADING mode. * If th download bandwidth is LOW or less for more then 5 min, switch to SEEDING mode. * @param downloadBandwidth - current download status. */ public void updateStatus(SaturatedMode downloadBandwidth){ //this setting have no effect while testing the limits. if( isConfTestingLimits() ){ if( mode==State.DOWNLOAD_LIMIT_SEARCH ){ lastTimeDownloadDetected = SystemTime.getCurrentTime(); } return; } if( downloadBandwidth.compareTo(SaturatedMode.LOW)<=0 ){ //we don't seem to be downloading at the moment. //see if this state has persisted for more then five minutes. long time = SystemTime.getCurrentTime(); if( time > lastTimeDownloadDetected+WAIT_TIME_FOR_SEEDING_MODE ){ mode = State.SEEDING; } }else{ //Some downloading is happening. Remove from SEEDING mode. mode = State.DOWNLOADING; lastTimeDownloadDetected = SystemTime.getCurrentTime(); } } public String getString(){ return mode.getString(); } public State getMode(){ return mode; } public void setMode( State newMode ){ SpeedManagerLogger.trace( " setting transfer mode to: "+newMode.getString() ); mode = newMode; } /** * Are we in downloading mode? * @return - boolean - true if in downloading mode. Otherwise false. */ public boolean isDownloadMode(){ return ( mode==State.DOWNLOADING ); }//isDownloadMode /** * We have two types of limit testing. If we are doing a "confidence test" for the limits then * return true. This mode is putting one value at the min setting and the other at unlimited. * @return - true if doing a "conf test of the limits" */ public boolean isConfTestingLimits(){ return ( mode==State.DOWNLOAD_LIMIT_SEARCH || mode==State.UPLOAD_LIMIT_SEARCH ); } /** * Java 1.4 enumeration. - Seeding mode or Downloading mode. */ static class State{ public static final State DOWNLOADING = new State("downloading"); public static final State SEEDING = new State("seeding"); public static final State DOWNLOAD_LIMIT_SEARCH = new State("download limit search"); public static final State UPLOAD_LIMIT_SEARCH = new State("upload limit search"); String mode; private State(String _mode){ mode = _mode; } public String getString(){ return mode; } }//class State }