/*
* File : DownloadManagerStatsImpl.java
* Created : 24-Oct-2003
* By : parg
*
* Azureus - a Java Bittorrent client
*
* 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.
*
* 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 ( see the LICENSE file ).
*
* 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
*/
package org.gudy.azureus2.core3.download.impl;
/**
* @author parg
*/
import org.gudy.azureus2.core3.download.*;
import org.gudy.azureus2.core3.peer.*;
import org.gudy.azureus2.core3.torrent.TOTorrent;
import org.gudy.azureus2.core3.util.IndentWriter;
import org.gudy.azureus2.core3.util.SystemTime;
import org.gudy.azureus2.core3.disk.*;
public class
DownloadManagerStatsImpl
implements DownloadManagerStats
{
private DownloadManagerImpl download_manager;
//Completed (used for auto-starting purposes)
private int completed;
private int downloadCompleted;
// saved downloaded and uploaded
private long saved_data_bytes_downloaded;
private long saved_protocol_bytes_downloaded;
private long saved_data_bytes_uploaded;
private long saved_protocol_bytes_uploaded;
private long saved_discarded = 0;
private long saved_hashfails = 0;
private long saved_SecondsDownloading = 0;
private long saved_SecondsOnlySeeding = 0;
private int saved_SecondsSinceDownload = 0;
private int saved_SecondsSinceUpload = 0;
private int max_upload_rate_bps = 0; //0 for unlimited
private int max_download_rate_bps = 0; //0 for unlimited
protected
DownloadManagerStatsImpl(
DownloadManagerImpl dm )
{
download_manager = dm;
}
public long
getDataReceiveRate()
{
PEPeerManager pm = download_manager.getPeerManager();
if (pm != null){
return pm.getStats().getDataReceiveRate();
}
return 0;
}
public long
getProtocolReceiveRate()
{
PEPeerManager pm = download_manager.getPeerManager();
if (pm != null){
return pm.getStats().getProtocolReceiveRate();
}
return 0;
}
public long
getDataSendRate()
{
PEPeerManager pm = download_manager.getPeerManager();
if (pm != null){
return pm.getStats().getDataSendRate();
}
return 0;
}
public long
getProtocolSendRate()
{
PEPeerManager pm = download_manager.getPeerManager();
if (pm != null){
return pm.getStats().getProtocolSendRate();
}
return 0;
}
public long
getETA()
{
PEPeerManager pm = download_manager.getPeerManager();
if (pm != null){
return pm.getETA();
}
return -1; //return exactly -1 if ETA is unknown
}
public int
getCompleted()
{
DiskManager dm = download_manager.getDiskManager();
if (dm == null) {
int state = download_manager.getState();
if (state == DownloadManager.STATE_ALLOCATING ||
state == DownloadManager.STATE_CHECKING ||
state == DownloadManager.STATE_INITIALIZING)
return completed;
else
return downloadCompleted;
}
if (dm.getState() == DiskManager.ALLOCATING ||
dm.getState() == DiskManager.CHECKING ||
dm.getState() == DiskManager.INITIALIZING)
return dm.getPercentDone();
else {
long total = dm.getTotalLength();
return total == 0 ? 0 : (int) ((1000 * (total - dm.getRemaining())) / total);
}
}
public void setCompleted(int _completed) {
completed = _completed;
}
public int
getDownloadCompleted(
boolean bLive )
{
DiskManager dm = download_manager.getDiskManager();
// no disk manager -> not running -> use stored value
if ( dm == null ){
return downloadCompleted;
}
int state = dm.getState();
boolean transient_state =
state == DiskManager.INITIALIZING ||
state == DiskManager.ALLOCATING ||
state == DiskManager.CHECKING;
long total = dm.getTotalLength();
int computed_completion = (total == 0) ? 0 : (int) ((1000 * (total - dm.getRemaining())) / total);
// use non-transient values to update the record of download completion
if ( !transient_state ){
downloadCompleted = computed_completion;
}
if ( bLive ){
// return the transient completion level
return computed_completion;
}else{
// return the non-transient one
return( downloadCompleted );
}
}
public void setDownloadCompleted(int _completed) {
downloadCompleted = _completed;
}
public String getElapsedTime() {
PEPeerManager pm = download_manager.getPeerManager();
if (pm != null){
return pm.getElapsedTime();
}
return "";
}
public long
getTimeStarted()
{
PEPeerManager pm = download_manager.getPeerManager();
if (pm != null){
return pm.getTimeStarted();
}
return -1;
}
public long
getTimeStartedSeeding()
{
PEPeerManager pm = download_manager.getPeerManager();
if (pm != null){
return pm.getTimeStartedSeeding();
}
return -1;
}
public long
getTotalDataBytesReceived()
{
PEPeerManager pm = download_manager.getPeerManager();
if (pm != null) {
return saved_data_bytes_downloaded + pm.getStats().getTotalDataBytesReceived();
}
return(saved_data_bytes_downloaded);
}
public long
getTotalGoodDataBytesReceived()
{
long downloaded = getTotalDataBytesReceived();
downloaded -= ( getHashFailBytes() + getDiscarded());
if ( downloaded < 0 ){
downloaded = 0;
}
return( downloaded );
}
public long
getTotalProtocolBytesReceived()
{
PEPeerManager pm = download_manager.getPeerManager();
if (pm != null) {
return saved_protocol_bytes_downloaded + pm.getStats().getTotalProtocolBytesReceived();
}
return(saved_protocol_bytes_downloaded);
}
public long
getTotalDataBytesSent()
{
PEPeerManager pm = download_manager.getPeerManager();
if (pm != null) {
return saved_data_bytes_uploaded + pm.getStats().getTotalDataBytesSent();
}
return( saved_data_bytes_uploaded );
}
public long
getTotalProtocolBytesSent()
{
PEPeerManager pm = download_manager.getPeerManager();
if (pm != null) {
return saved_protocol_bytes_uploaded + pm.getStats().getTotalProtocolBytesSent();
}
return( saved_protocol_bytes_uploaded );
}
public long
getRemaining()
{
DiskManager disk_manager = download_manager.getDiskManager();
if ( disk_manager == null ){
return download_manager.getSize() -
((long)getCompleted() * download_manager.getSize() / 1000L);
}else{
return disk_manager.getRemainingExcludingDND();
}
}
public long
getDiscarded()
{
PEPeerManager pm = download_manager.getPeerManager();
if (pm != null){
return saved_discarded + pm.getStats().getTotalDiscarded();
}
return( saved_discarded );
}
public long
getHashFailCount()
{
TOTorrent t = download_manager.getTorrent();
if ( t == null ){
return(0);
}
long total = getHashFailBytes();
long res = total / t.getPieceLength();
if ( res == 0 && total > 0 ){
res = 1;
}
return( res );
}
public long
getHashFailBytes()
{
PEPeerManager pm = download_manager.getPeerManager();
if (pm != null){
return saved_hashfails + pm.getStats().getTotalHashFailBytes();
}
return( saved_hashfails );
}
public long
getTotalAverage()
{
PEPeerManager pm = download_manager.getPeerManager();
if (pm != null){
return pm.getStats().getTotalAverage();
}
return( 0 );
}
public long
getTotalAveragePerPeer()
{
int div = download_manager.getNbPeers() + (download_manager.isDownloadComplete(false) ? 0 : 1); //since total speed includes our own speed when downloading
long average = div < 1 ? 0 : getTotalAverage() / div;
return( average );
}
public int
getShareRatio()
{
long downloaded = getTotalGoodDataBytesReceived();
long uploaded = getTotalDataBytesSent();
if ( downloaded <= 0 ){
return( -1 );
}
return (int) ((1000 * uploaded) / downloaded);
}
public long
getSecondsDownloading()
{
long lTimeStartedDL = getTimeStarted();
if (lTimeStartedDL >= 0) {
long lTimeEndedDL = getTimeStartedSeeding();
if (lTimeEndedDL == -1) {
lTimeEndedDL = SystemTime.getCurrentTime();
}
if (lTimeEndedDL > lTimeStartedDL) {
return saved_SecondsDownloading + ((lTimeEndedDL - lTimeStartedDL) / 1000);
}
}
return saved_SecondsDownloading;
}
public long
getSecondsOnlySeeding()
{
long lTimeStarted = getTimeStartedSeeding();
if (lTimeStarted >= 0) {
return saved_SecondsOnlySeeding +
((SystemTime.getCurrentTime() - lTimeStarted) / 1000);
}
return saved_SecondsOnlySeeding;
}
public float
getAvailability()
{
PEPeerManager pm = download_manager.getPeerManager();
if ( pm == null ){
return( -1 );
}
return( pm.getMinAvailability());
}
public int
getUploadRateLimitBytesPerSecond()
{
return max_upload_rate_bps;
}
public void
setUploadRateLimitBytesPerSecond(
int max_rate_bps )
{
max_upload_rate_bps = max_rate_bps;
}
public int
getDownloadRateLimitBytesPerSecond()
{
return max_download_rate_bps;
}
public void
setDownloadRateLimitBytesPerSecond(
int max_rate_bps )
{
max_download_rate_bps = max_rate_bps;
}
public int
getTimeSinceLastDataReceivedInSeconds()
{
PEPeerManager pm = download_manager.getPeerManager();
int res = saved_SecondsSinceDownload;
if ( pm != null ){
int current = pm.getStats().getTimeSinceLastDataReceivedInSeconds();
if ( current >= 0 ){
// activity this session, use this value
res = current;
}else{
// no activity this session. If ever has been activity add in session
// time
if ( res >= 0 ){
long now = SystemTime.getCurrentTime();
long elapsed = now - pm.getTimeStarted();
if ( elapsed < 0 ){
elapsed = 0;
}
res += elapsed/1000;
}
}
}
return( res );
}
public int
getTimeSinceLastDataSentInSeconds()
{
PEPeerManager pm = download_manager.getPeerManager();
int res = saved_SecondsSinceUpload;
if ( pm != null ){
int current = pm.getStats().getTimeSinceLastDataSentInSeconds();
if ( current >= 0 ){
// activity this session, use this value
res = current;
}else{
// no activity this session. If ever has been activity add in session
// time
if ( res >= 0 ){
long now = SystemTime.getCurrentTime();
long elapsed = now - pm.getTimeStarted();
if ( elapsed < 0 ){
elapsed = 0;
}
res += elapsed/1000;
}
}
}
return( res );
}
public long
getAvailWentBadTime()
{
PEPeerManager pm = download_manager.getPeerManager();
if ( pm != null ){
long bad_time = pm.getAvailWentBadTime();
if ( bad_time > 0 ){
// valid last bad time
return( bad_time );
}
if ( pm.getMinAvailability() >= 1.0 ){
// we can believe the fact that it isn't bad (we want to ignore 0 results from
// downloads that never get to a 1.0 availbility)
return( 0 );
}
}
DownloadManagerState state = download_manager.getDownloadState();
return( state.getLongAttribute( DownloadManagerState.AT_AVAIL_BAD_TIME ));
}
protected void
saveSessionTotals()
{
// re-base the totals from current totals and session totals
saved_data_bytes_downloaded = getTotalDataBytesReceived();
saved_data_bytes_uploaded = getTotalDataBytesSent();
saved_discarded = getDiscarded();
saved_hashfails = getHashFailBytes();
saved_SecondsDownloading = getSecondsDownloading();
saved_SecondsOnlySeeding = getSecondsOnlySeeding();
saved_SecondsSinceDownload = getTimeSinceLastDataReceivedInSeconds();
saved_SecondsSinceUpload = getTimeSinceLastDataSentInSeconds();
DownloadManagerState state = download_manager.getDownloadState();
state.setIntAttribute( DownloadManagerState.AT_TIME_SINCE_DOWNLOAD, saved_SecondsSinceDownload );
state.setIntAttribute( DownloadManagerState.AT_TIME_SINCE_UPLOAD, saved_SecondsSinceUpload );
state.setLongAttribute( DownloadManagerState.AT_AVAIL_BAD_TIME, getAvailWentBadTime());
}
protected void
setSavedDownloadedUploaded(
long d,
long u )
{
saved_data_bytes_downloaded = d;
saved_data_bytes_uploaded = u;
}
public void
restoreSessionTotals(
long _saved_data_bytes_downloaded,
long _saved_data_bytes_uploaded,
long _saved_discarded,
long _saved_hashfails,
long _saved_SecondsDownloading,
long _saved_SecondsOnlySeeding )
{
saved_data_bytes_downloaded = _saved_data_bytes_downloaded;
saved_data_bytes_uploaded = _saved_data_bytes_uploaded;
saved_discarded = _saved_discarded;
saved_hashfails = _saved_hashfails;
saved_SecondsDownloading = _saved_SecondsDownloading;
saved_SecondsOnlySeeding = _saved_SecondsOnlySeeding;
DownloadManagerState state = download_manager.getDownloadState();
saved_SecondsSinceDownload = state.getIntAttribute( DownloadManagerState.AT_TIME_SINCE_DOWNLOAD );
saved_SecondsSinceUpload = state.getIntAttribute( DownloadManagerState.AT_TIME_SINCE_UPLOAD );
}
protected void
generateEvidence(
IndentWriter writer)
{
writer.println( "DownloadManagerStats" );
try{
writer.indent();
writer.println(
"recv_d=" + getTotalDataBytesReceived() + ",recv_p=" + getTotalProtocolBytesReceived() + ",recv_g=" + getTotalGoodDataBytesReceived() +
",sent_d=" + getTotalDataBytesSent() + ",sent_p=" + getTotalProtocolBytesSent() +
",discard=" + getDiscarded() + ",hash_fails=" + getHashFailCount() + "/" + getHashFailBytes() +
",comp=" + getCompleted()
+ "[live:" + getDownloadCompleted(true) + "/" + getDownloadCompleted( false)
+ "],dl_comp=" + downloadCompleted
+ ",remaining=" + getRemaining());
}finally{
writer.exdent();
}
}
}
|