mirror of
https://github.com/igniterealtime/Spark.git
synced 2025-12-01 12:27:58 +00:00
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:
committed by
wolf.posdorfer
parent
89d820c654
commit
6c68cf020d
@ -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);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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 + ")";
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -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
|
||||
|
||||
@ -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...
|
||||
|
||||
Reference in New Issue
Block a user