diff --git a/src/java/org/jivesoftware/sparkimpl/plugin/filetransfer/transfer/ui/ReceiveMessage.java b/src/java/org/jivesoftware/sparkimpl/plugin/filetransfer/transfer/ui/ReceiveMessage.java index f79b35bf..30f5f2c9 100644 --- a/src/java/org/jivesoftware/sparkimpl/plugin/filetransfer/transfer/ui/ReceiveMessage.java +++ b/src/java/org/jivesoftware/sparkimpl/plugin/filetransfer/transfer/ui/ReceiveMessage.java @@ -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); } }); diff --git a/src/java/org/jivesoftware/sparkimpl/plugin/filetransfer/transfer/ui/SendMessage.java b/src/java/org/jivesoftware/sparkimpl/plugin/filetransfer/transfer/ui/SendMessage.java index 0e40a4ec..3b7d5f67 100644 --- a/src/java/org/jivesoftware/sparkimpl/plugin/filetransfer/transfer/ui/SendMessage.java +++ b/src/java/org/jivesoftware/sparkimpl/plugin/filetransfer/transfer/ui/SendMessage.java @@ -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; - } - } + } diff --git a/src/java/org/jivesoftware/sparkimpl/plugin/filetransfer/transfer/ui/TransferUtils.java b/src/java/org/jivesoftware/sparkimpl/plugin/filetransfer/transfer/ui/TransferUtils.java new file mode 100644 index 00000000..67907b38 --- /dev/null +++ b/src/java/org/jivesoftware/sparkimpl/plugin/filetransfer/transfer/ui/TransferUtils.java @@ -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 xx,x kB/s or xx,x MB/s + */ + 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 + ")"; + + } + +} diff --git a/src/resources/i18n/spark_i18n.properties b/src/resources/i18n/spark_i18n.properties index de519f72..68f0d2dc 100644 --- a/src/resources/i18n/spark_i18n.properties +++ b/src/resources/i18n/spark_i18n.properties @@ -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 diff --git a/src/resources/i18n/spark_i18n_de.properties b/src/resources/i18n/spark_i18n_de.properties index feb7fb7d..c0fb1e48 100644 --- a/src/resources/i18n/spark_i18n_de.properties +++ b/src/resources/i18n/spark_i18n_de.properties @@ -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 = Öffnen message.error.during.file.transfer = Wä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. Überschreiben? message.transfer.waiting.on.user = {0} muss den Dateitransfer akzeptieren. Bitte warten... message.negotiation.file.transfer = Dateitransfer mit {0} wird initialisiert. Bitte warten...