package ch.cyberduck.core;
/*
* Copyright (c) 2007 David Kocher. All rights reserved.
* http://cyberduck.ch/
*
* 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.
*
* Bug fixes, suggestions and comments should be sent to:
* dkocher@cyberduck.ch
*/
import ch.cyberduck.core.i18n.Locale;
/**
* @version $Id: Speedometer.java 5829 2010-03-03 11:59:00Z dkocher $
*/
public class Speedometer {
//the time to start counting bytes transfered
/**
* @uml.property name="timestamp"
*/
private long timestamp;
//initial data already transfered
/**
* @uml.property name="initialBytesTransfered"
*/
private double initialBytesTransfered;
/**
* @uml.property name="bytesTransferred"
*/
private double bytesTransferred;
/**
* @uml.property name="transfer"
* @uml.associationEnd
*/
private Transfer transfer;
public Speedometer(Transfer transfer) {
this.transfer = transfer;
this.reset();
}
/**
* Returns the data transfer rate. The rate should depend on the transfer
* rate timestamp.
*
* @return The bytes being processed per second
*/
public float getSpeed() {
bytesTransferred = transfer.getTransferred();
if(bytesTransferred > initialBytesTransfered) {
if(0 == initialBytesTransfered) {
initialBytesTransfered = bytesTransferred;
return -1;
}
// number of seconds data was actually transferred
double elapsedSeconds = (System.currentTimeMillis() - timestamp) / 1000;
if(elapsedSeconds > 1) {
// bytes per second
return (float) ((bytesTransferred - initialBytesTransfered) / (elapsedSeconds));
}
}
return -1;
}
/**
* @return Progress information string with bytes transfered
* including a percentage and estimated time remaining
*/
public String getProgress() {
StringBuilder b = new StringBuilder();
b.append(Status.getSizeAsString(transfer.getTransferred()));
b.append(" ");
b.append(Locale.localizedString("of", "1.2MB of 3.4MB"));
b.append(" ");
final double size = transfer.getSize();
b.append(Status.getSizeAsString(size));
final float speed = this.getSpeed();
if(transfer.isRunning()) {
if(size > -1 || speed > 0) {
b.append(" (");
if(size > -1) {
if(0 == size) {
b.append(0);
}
else {
b.append((int) (transfer.getTransferred() / size * 100));
}
b.append("%");
}
if(speed > 0) {
if(size > -1) {
b.append(", ");
}
b.append(Status.getSizeAsString(speed));
b.append("/sec");
if(size > 0) {
b.append(", ");
// remaining time in seconds
double remaining = ((size - this.getBytesTransfered()) / speed);
b.append(Status.getRemainingAsString(remaining));
}
}
b.append(")");
}
}
return b.toString();
}
public double getBytesTransfered() {
return bytesTransferred;
}
/**
* Reset this meter
*/
public void reset() {
this.timestamp = System.currentTimeMillis();
this.initialBytesTransfered = transfer.getTransferred();
this.bytesTransferred = 0;
}
}