SPARK-1330, filetransfer now displays current speed and estimated time of arrivel

new strings:
message.transfer.complete = The file transfer was complete ({0}))
// 0 = filename
message.transfer.progressbar.text.received = {0} received   @ {1}    {2}
// 0 = amount received
// 1 = current speed
// 2 = estimated time of arrival (eta)
message.transfer.progressbar.text.sent = {0} sent   @ {1}    {2}
// 0 = amount sent
// 1 = current speed
// 2 = eta

>>note that there are more than 1 whitespaces between some letters<<

git-svn-id: http://svn.igniterealtime.org/svn/repos/spark/trunk@12424 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
Wolf Posdorfer
2011-05-25 09:09:10 +00:00
committed by wolf.posdorfer
parent 89d820c654
commit 6c68cf020d
5 changed files with 370 additions and 215 deletions

View File

@ -19,26 +19,6 @@
*/
package org.jivesoftware.sparkimpl.plugin.filetransfer.transfer.ui;
import org.jivesoftware.Spark;
import org.jivesoftware.resource.Res;
import org.jivesoftware.resource.SparkRes;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smackx.filetransfer.FileTransfer;
import org.jivesoftware.smackx.filetransfer.FileTransferRequest;
import org.jivesoftware.smackx.filetransfer.IncomingFileTransfer;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.component.FileDragLabel;
import org.jivesoftware.spark.ui.ContactItem;
import org.jivesoftware.spark.ui.ContactList;
import org.jivesoftware.spark.util.ByteFormat;
import org.jivesoftware.spark.util.GraphicUtils;
import org.jivesoftware.spark.util.ResourceUtils;
import org.jivesoftware.spark.util.SwingWorker;
import org.jivesoftware.spark.util.URLFileSystem;
import org.jivesoftware.spark.util.log.Log;
import org.jivesoftware.sparkimpl.plugin.filetransfer.transfer.Downloads;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Desktop;
@ -58,6 +38,8 @@ import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.AbstractAction;
import javax.swing.Action;
@ -71,12 +53,30 @@ import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import org.jivesoftware.Spark;
import org.jivesoftware.resource.Res;
import org.jivesoftware.resource.SparkRes;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smackx.filetransfer.FileTransfer;
import org.jivesoftware.smackx.filetransfer.FileTransferRequest;
import org.jivesoftware.smackx.filetransfer.IncomingFileTransfer;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.component.FileDragLabel;
import org.jivesoftware.spark.ui.ContactItem;
import org.jivesoftware.spark.ui.ContactList;
import org.jivesoftware.spark.util.ByteFormat;
import org.jivesoftware.spark.util.GraphicUtils;
import org.jivesoftware.spark.util.ResourceUtils;
import org.jivesoftware.spark.util.URLFileSystem;
import org.jivesoftware.spark.util.log.Log;
import org.jivesoftware.sparkimpl.plugin.filetransfer.transfer.Downloads;
public class ReceiveMessage extends JPanel {
private static final long serialVersionUID = -2974192409566650923L;
private FileDragLabel imageLabel = new FileDragLabel();
private static final long serialVersionUID = -2974192409566650923L;
private FileDragLabel imageLabel = new FileDragLabel();
private JLabel titleLabel = new JLabel();
private JLabel fileLabel = new JLabel();
@ -85,7 +85,10 @@ public class ReceiveMessage extends JPanel {
private JProgressBar progressBar = new JProgressBar();
private IncomingFileTransfer transfer;
private TransferButton cancelButton = new TransferButton();
private JLabel progressLabel = new JLabel();
private long bytesRead;
private long _starttime;
private long _endtime;
public ReceiveMessage() {
setLayout(new GridBagLayout());
@ -102,9 +105,6 @@ public class ReceiveMessage extends JPanel {
add(declineButton, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
// ResourceUtils.resButton(acceptLabel, Res.getString("accept"));
// ResourceUtils.resButton(declineLabel, Res.getString("reject"));
// Decorate Cancel Button
decorateCancelButton();
@ -211,168 +211,195 @@ public class ReceiveMessage extends JPanel {
}
private void acceptRequest(final FileTransferRequest request) {
String requestor = request.getRequestor();
String bareJID = StringUtils.parseBareAddress(requestor);
String requestor = request.getRequestor();
String bareJID = StringUtils.parseBareAddress(requestor);
ContactList contactList = SparkManager.getWorkspace().getContactList();
final ContactItem contactItem = contactList.getContactItemByJID(bareJID);
ContactList contactList = SparkManager.getWorkspace().getContactList();
final ContactItem contactItem = contactList
.getContactItemByJID(bareJID);
setBackground(new Color(239, 245, 250));
acceptButton.setVisible(false);
declineButton.setVisible(false);
titleLabel.setText(Res.getString("message.negotiate.file.transfer"));
titleLabel.setForeground(new Color(65, 139, 179));
add(progressBar, new GridBagConstraints(1, 2, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 150, 0));
add(cancelButton, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
cancelButton.setVisible(true);
transfer = request.accept();
try {
final File downloadedFile = new File(Downloads.getDownloadDirectory(), request.getFileName());
progressBar.setMaximum((int)(request.getFileSize()/SendMessage.getDivisorForByte(request.getFileSize())));
progressBar.setStringPainted(true);
SwingWorker worker = new SwingWorker() {
public Object construct() {
try {
transfer.recieveFile(downloadedFile);
}
catch (XMPPException e) {
Log.error(e);
}
while (true) {
try {
Thread.sleep(10);
}
catch (InterruptedException e) {
Log.error(e);
}
bytesRead = transfer.getAmountWritten();
if (bytesRead == -1) {
bytesRead = 0;
}
ByteFormat format = new ByteFormat();
String text = format.format(bytesRead);
progressBar.setString(text + " received");
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
progressBar.setValue((int)(bytesRead/SendMessage.getDivisorForByte(transfer.getFileSize())));
}
});
}
catch (Exception e) {
Log.error(e);
}
FileTransfer.Status status = transfer.getStatus();
if (status == FileTransfer.Status.error ||
status == FileTransfer.Status.complete || status == FileTransfer.Status.cancelled ||
status == FileTransfer.Status.refused) {
break;
}
else if (status == FileTransfer.Status.negotiating_stream) {
titleLabel.setText(Res.getString("message.negotiate.stream"));
}
else if (status == FileTransfer.Status.in_progress) {
titleLabel.setText(Res.getString("message.receiving.file", contactItem.getDisplayName()));
}
}
return "ok";
}
public void finished() {
if (transfer.getAmountWritten() >= request.getFileSize()) {
transferDone(request, transfer);
imageLabel.setFile(downloadedFile);
imageLabel.setToolTipText(Res.getString("message.click.to.open"));
titleLabel.setToolTipText(Res.getString("message.click.to.open"));
imageLabel.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
launchFile(downloadedFile);
}
}
});
imageLabel.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
imageLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
}
public void mouseExited(MouseEvent e) {
imageLabel.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
});
titleLabel.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
launchFile(downloadedFile);
}
}
});
titleLabel.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
titleLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
}
public void mouseExited(MouseEvent e) {
titleLabel.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
});
invalidate();
validate();
repaint();
return;
}
String transferMessage = "";
if (transfer.getStatus() == FileTransfer.Status.error) {
if (transfer.getException() != null) {
Log.error("There was an error during file transfer.", transfer.getException());
}
transferMessage = Res.getString("message.error.during.file.transfer");
}
else if (transfer.getStatus() == FileTransfer.Status.refused) {
transferMessage = Res.getString("message.transfer.refused");
}
else if (transfer.getStatus() == FileTransfer.Status.cancelled ||
transfer.getAmountWritten() < request.getFileSize()) {
transferMessage = Res.getString("message.transfer.cancelled");
}
setFinishedText(transferMessage);
showAlert(true);
}
};
worker.start();
setBackground(new Color(239, 245, 250));
acceptButton.setVisible(false);
declineButton.setVisible(false);
titleLabel.setText(Res.getString("message.negotiate.file.transfer"));
titleLabel.setForeground(new Color(65, 139, 179));
add(progressBar, new GridBagConstraints(1, 2, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 150, 0));
add(progressLabel, new GridBagConstraints(1, 3, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 150, 0));
add(cancelButton, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
cancelButton.setVisible(true);
transfer = request.accept();
final File downloadedFile = new File(Downloads.getDownloadDirectory(), request.getFileName());
try {
_starttime = System.currentTimeMillis();
transfer.recieveFile(downloadedFile);
}
catch (Exception e) {
catch (XMPPException e) {
Log.error(e);
}
progressBar.setMaximum(100); // setting it to percent
progressBar.setStringPainted(true);
TimerTask updateProgessBar = new TimerTask() {
@Override
public void run() {
if (transfer.getAmountWritten() >= request.getFileSize()
|| transfer.getStatus() == FileTransfer.Status.error
|| transfer.getStatus() == FileTransfer.Status.refused
|| transfer.getStatus() == FileTransfer.Status.cancelled)
{
this.cancel();
_endtime = System.currentTimeMillis();
updateonFinished(request, downloadedFile);
}else
{
// 100 % = Filesize
// x % = Currentsize
long p = (transfer.getAmountWritten() * 100 / transfer.getFileSize() );
progressBar.setValue(Math.round(p));
}
}
};
TimerTask updatePrograssBarText = new TimerTask() {
long timenow;
long timeearlier;
long bytesnow;
long bytesearlier;
@Override
public void run() {
if (transfer.getAmountWritten() >= request.getFileSize()
|| transfer.getStatus() == FileTransfer.Status.error
|| transfer.getStatus() == FileTransfer.Status.refused
|| transfer.getStatus() == FileTransfer.Status.cancelled)
{
this.cancel();
}
else{
timenow = System.currentTimeMillis();
bytesnow = transfer.getAmountWritten();
bytesRead = transfer.getAmountWritten();
if (bytesRead == -1) {
bytesRead = 0;
}
ByteFormat format = new ByteFormat();
String text = format.format(bytesRead);
FileTransfer.Status status = transfer.getStatus();
if (status == FileTransfer.Status.in_progress)
{
titleLabel.setText(Res.getString("message.receiving.file", contactItem.getDisplayName()));
String speed =TransferUtils.calculateSpeed(bytesnow-bytesearlier, timenow-timeearlier);
String est = TransferUtils.calculateEstimate(bytesnow, transfer.getFileSize(), _starttime, System.currentTimeMillis());
progressLabel.setText(Res.getString("message.transfer.progressbar.text.received", text, speed, est));
}
else if (status == FileTransfer.Status.negotiating_stream) {
titleLabel.setText(Res.getString("message.negotiate.stream"));
}
bytesearlier = bytesnow;
timeearlier = timenow;
}
}
};
Timer timer = new Timer();
timer.scheduleAtFixedRate(updateProgessBar, 10, 10);
Timer timer2 = new Timer();
timer2.scheduleAtFixedRate(updatePrograssBarText, 10, 500);
}
private void updateonFinished(final FileTransferRequest request,
final File downloadedFile) {
if (transfer.getAmountWritten() >= request.getFileSize()) {
transferDone(request, transfer);
imageLabel.setFile(downloadedFile);
imageLabel.setToolTipText(Res.getString("message.click.to.open"));
titleLabel.setToolTipText(Res.getString("message.click.to.open"));
String fin = TransferUtils.convertSecondstoHHMMSS(Math.round(_endtime-_starttime)/1000);
progressLabel.setText(Res.getString("label.time", fin));
imageLabel.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
launchFile(downloadedFile);
}
}
});
imageLabel.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
imageLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
}
public void mouseExited(MouseEvent e) {
imageLabel.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
});
titleLabel.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
launchFile(downloadedFile);
}
}
});
titleLabel.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
titleLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
}
public void mouseExited(MouseEvent e) {
titleLabel.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
});
invalidate();
validate();
repaint();
}
String transferMessage = "";
if (transfer.getStatus() == FileTransfer.Status.error) {
if (transfer.getException() != null) {
Log.error("There was an error during file transfer.", transfer.getException());
}
transferMessage = Res.getString("message.error.during.file.transfer");
}
else if (transfer.getStatus() == FileTransfer.Status.refused) {
transferMessage = Res.getString("message.transfer.refused");
}
else if (transfer.getStatus() == FileTransfer.Status.cancelled ||
transfer.getAmountWritten() < request.getFileSize()) {
transferMessage = Res.getString("message.transfer.cancelled");
}
else if(transfer.getAmountWritten() >= request.getFileSize())
{
transferMessage = Res.getString("message.transfer.complete", transfer.getFileName());
}
setFinishedText(transferMessage);
showAlert(true);
}
private void setFinishedText(String text) {
acceptButton.setVisible(false);
declineButton.setVisible(false);
@ -568,6 +595,7 @@ public class ReceiveMessage extends JPanel {
cancelTransfer();
acceptButton.setVisible(false);
declineButton.setVisible(false);
cancelButton.setVisible(false);
}
});

View File

@ -48,9 +48,9 @@ import org.jivesoftware.resource.Res;
import org.jivesoftware.resource.SparkRes;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smackx.filetransfer.FileTransfer;
import org.jivesoftware.smackx.filetransfer.FileTransfer.Status;
import org.jivesoftware.smackx.filetransfer.FileTransferManager;
import org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer;
import org.jivesoftware.smackx.filetransfer.FileTransfer.Status;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.component.FileDragLabel;
import org.jivesoftware.spark.ui.ContactItem;
@ -78,6 +78,8 @@ public class SendMessage extends JPanel {
private FileTransferManager transferManager;
private String fullJID;
private String nickname;
private JLabel progressLabel = new JLabel();
private long _starttime;
public SendMessage() {
setLayout(new GridBagLayout());
@ -95,8 +97,8 @@ public class SendMessage extends JPanel {
cancelButton.setIcon(SparkRes.getImageIcon(SparkRes.CANCEL_IMAGE));
retryButton.setIcon(SparkRes.getImageIcon(SparkRes.REFRESH_IMAGE));
add(cancelButton, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
add(retryButton, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
add(cancelButton, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
add(retryButton, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
retryButton.setVisible(false);
retryButton.addActionListener(new ActionListener() {
@ -185,24 +187,39 @@ public class SendMessage extends JPanel {
});
progressBar.setMaximum((int) (fileSize / getDivisorForByte(fileSize)));
progressBar.setMaximum(100);
progressBar.setVisible(false);
progressBar.setStringPainted(true);
add(progressBar, new GridBagConstraints(1, 2, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 150, 0));
add(progressLabel, new GridBagConstraints(1, 3, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 150, 0));
SwingWorker worker = new SwingWorker() {
public Object construct() {
while (true) {
try {
Thread.sleep(10);
if(transfer.getBytesSent() >0 && _starttime==0){
_starttime = System.currentTimeMillis();
}
long starttime = System.currentTimeMillis();
long startbyte = transfer.getBytesSent();
Thread.sleep(500);
FileTransfer.Status status = transfer.getStatus();
if (status == Status.error ||
status == Status.complete || status == Status.cancelled ||
status == Status.refused) {
break;
}
updateBar(transfer, nickname);
long endtime = System.currentTimeMillis();
long endbyte = transfer.getBytesSent();
long timediff = endtime-starttime;
long bytediff = endbyte-startbyte;
updateBar(transfer, nickname, TransferUtils.calculateSpeed(bytediff, timediff) );
}
catch (InterruptedException e) {
Log.error("Unable to sleep thread.", e);
@ -213,7 +230,7 @@ public class SendMessage extends JPanel {
}
public void finished() {
updateBar(transfer, nickname);
updateBar(transfer, nickname, "??MB/s");
}
};
@ -250,7 +267,7 @@ public class SendMessage extends JPanel {
}
}
private void updateBar(final OutgoingFileTransfer transfer, String nickname) {
private void updateBar(final OutgoingFileTransfer transfer, String nickname, String kBperSecond) {
FileTransfer.Status status = transfer.getStatus();
if (status == Status.negotiating_stream) {
titleLabel.setText(Res.getString("message.negotiation.file.transfer", nickname));
@ -260,6 +277,7 @@ public class SendMessage extends JPanel {
Log.error("Error occured during file transfer.", transfer.getException());
}
progressBar.setVisible(false);
progressLabel.setVisible(false);
titleLabel.setText(Res.getString("message.unable.to.send.file", nickname));
cancelButton.setVisible(false);
retryButton.setVisible(true);
@ -270,12 +288,16 @@ public class SendMessage extends JPanel {
showAlert(false);
if (!progressBar.isVisible()) {
progressBar.setVisible(true);
progressLabel.setVisible(true);
}
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
progressBar.setValue((int)(transfer.getBytesSent()/getDivisorForByte(transfer.getFileSize())));
// 100 % = Filesize
// x % = Currentsize
long p = (transfer.getBytesSent() * 100 / transfer.getFileSize() );
progressBar.setValue(Math.round(p));
}
});
}
@ -285,16 +307,22 @@ public class SendMessage extends JPanel {
ByteFormat format = new ByteFormat();
String bytesSent = format.format(transfer.getBytesSent());
progressBar.setString(bytesSent + " sent");
String est = TransferUtils.calculateEstimate(transfer.getBytesSent(), transfer.getFileSize(), _starttime, System.currentTimeMillis());
progressLabel.setText(Res.getString("message.transfer.progressbar.text.sent", bytesSent, kBperSecond, est));
}
else if (status == Status.complete) {
progressBar.setVisible(false);
String fin = TransferUtils.convertSecondstoHHMMSS(Math.round(System.currentTimeMillis()-_starttime)/1000);
progressLabel.setText(Res.getString("label.time", fin));
titleLabel.setText(Res.getString("message.you.have.sent", nickname));
cancelButton.setVisible(false);
showAlert(true);
}
else if (status == Status.cancelled) {
progressBar.setVisible(false);
progressLabel.setVisible(false);
titleLabel.setText(Res.getString("message.file.transfer.canceled"));
cancelButton.setVisible(false);
retryButton.setVisible(true);
@ -302,6 +330,7 @@ public class SendMessage extends JPanel {
}
else if (status == Status.refused) {
progressBar.setVisible(false);
progressLabel.setVisible(false);
titleLabel.setText(Res.getString("message.file.transfer.rejected", nickname));
cancelButton.setVisible(false);
retryButton.setVisible(true);
@ -312,22 +341,22 @@ public class SendMessage extends JPanel {
private class TransferButton extends JButton {
private static final long serialVersionUID = 8807434179541503654L;
private static final long serialVersionUID = 8807434179541503654L;
public TransferButton() {
decorate();
}
public TransferButton() {
decorate();
}
/**
* Decorates the button with the approriate UI configurations.
*/
private void decorate() {
setBorderPainted(false);
setOpaque(true);
/**
* Decorates the button with the approriate UI configurations.
*/
private void decorate() {
setBorderPainted(false);
setOpaque(true);
setContentAreaFilled(false);
setMargin(new Insets(1, 1, 1, 1));
}
setContentAreaFilled(false);
setMargin(new Insets(1, 1, 1, 1));
}
}
@ -361,18 +390,6 @@ public class SendMessage extends JPanel {
transfer.cancel();
}
}
public static int getDivisorForByte(long filezise) {
if (filezise >= 1073741824) // giga
{
return 1024;
} else if (filezise >= 1099511627776L) // tera
{
return 1048576;
} else {
return 1;
}
}
}

View File

@ -0,0 +1,104 @@
package org.jivesoftware.sparkimpl.plugin.filetransfer.transfer.ui;
/**
* Provides static access to often used Time and Byte functions
*
* @author wolf.posdorfer
*
*/
public class TransferUtils {
/**
* Calculates the speed when given a timedifference and bytedifference
*
* @param bytediff
* in bytes
* @param timediff
* in milliseconds
* @return <b>xx,x kB/s</b> or <b>xx,x MB/s</b>
*/
public static String calculateSpeed(long bytediff, long timediff) {
double kB = calculateSpeedLong(bytediff, timediff);
if (bytediff == 0 && timediff == 0) {
return "";
}
if (kB < 1024) {
String KB = Double.toString(kB);
// Convert 3.1415926535897932384626433832795 to 3.1
KB = KB.contains(".") ? KB.substring(0, KB.indexOf(".") + 2) : KB;
return KB + "kB/s";
} else {
String MB = Double.toString((kB / 1024.0));
// Convert 3.1415926535897932384626433832795 to 3.1
MB = MB.contains(".") ? MB.substring(0, MB.indexOf(".") + 2) : MB;
return MB + "MB/s";
}
}
/**
* Calculates the speed and returns a long in kB/s
*
* @param bytediff
* @param timediff
* @return kB/s
*/
public static double calculateSpeedLong(long bytediff, long timediff) {
timediff = timediff == 0 ? 1 : timediff;
double kB = ((bytediff / timediff) * 1000.0) / 1024.0;
return kB;
}
/**
* Calculate the estimated time of arrival
*
* @param currentsize
* in byte
* @param totalsize
* in byte
* @param timestart
* in milliseconds
* @param timenow
* in milliseconds
* @return time in (HH:MM:SS)
*/
public static String calculateEstimate(long currentsize, long totalsize,
long timestart, long timenow) {
long timediff = timenow - timestart;
long sizeleft = totalsize - currentsize;
// currentsize = timediff
// sizeleft = x
long x = sizeleft * timediff / currentsize;
// Make it seconds
x = x / 1000;
return convertSecondstoHHMMSS(Math.round(x));
}
/**
* Converts given Seconds to HH:MM:SS
*
* @param second
* in seconds
* @return (HH:MM:SS)
*/
public static String convertSecondstoHHMMSS(int second) {
int hours = Math.round(second / 3600);
int minutes = Math.round((second / 60) % 60);
int seconds = Math.round(second % 60);
String hh = hours < 10 ? "0" + hours : "" + hours;
String mm = minutes < 10 ? "0" + minutes : "" + minutes;
String ss = seconds < 10 ? "0" + seconds : "" + seconds;
return "(" + hh + ":" + mm + ":" + ss + ")";
}
}

View File

@ -777,6 +777,9 @@ message.supply.valid.timeout = Supply a valid time out value
message.timeout.error = The timeout must be 5 seconds or greater
message.total.downloaded = Total downloaded
message.transfer.cancelled = The file transfer was canceled
message.transfer.complete = The file transfer was complete ({0}))
message.transfer.progressbar.text.received = {0} received @ {1} {2}
message.transfer.progressbar.text.sent = {0} sent @ {1} {2}
message.transfer.rate = Transfer rate
message.transfer.refused = The file transfer was refused
message.transfer.waiting.on.user = Waiting for {0} to accept file transfer

View File

@ -463,11 +463,14 @@ message.file.transfer.canceled = Sie haben den Dateitransfer abgebrochen.
message.negotiate.file.transfer = Dateitransfer wird vorbereitet. Bitte warten...
message.negotiate.stream = Verbindungsdaten werden vorbereitet. Bitte warten...
message.receiving.file = Sie haben eine Datei von {0} erhalten
message.received.file = Sie haben eine Datei von {0} erhalten.
message.click.to.open = <EFBFBD>ffnen
message.error.during.file.transfer = W<EFBFBD>hrend des Dateitransfers ist ein Fehler aufgetreten.
message.transfer.refused = Der Dateitransfer wurde verweigert.
message.transfer.cancelled = Der Dateitransfer wurde abgebrochen.
message.received.file = Sie haben eine Datei von {0} erhalten.
message.transfer.complete = Der Dateitransfer war erfolgreich ({0}))
message.transfer.progressbar.text.received = {0} empfangen @ {1} {2}
message.transfer.progressbar.text.sent = {0} gesendet @ {1} {2}
message.file.exists.question = Die Datei existiert bereits. <20>berschreiben?
message.transfer.waiting.on.user = {0} muss den Dateitransfer akzeptieren. Bitte warten...
message.negotiation.file.transfer = Dateitransfer mit {0} wird initialisiert. Bitte warten...