package org.emdev.ui.progress;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.emdev.utils.FileUtils;
import org.emdev.utils.MathUtils;
import org.emdev.utils.FileUtils.CopingProgress;
public class UIFileCopying implements CopingProgress {
private final int stringId;
private final IProgressIndicator delegate;
private long interval;
private long contentLength;
private long copied;
private long indicated;
private int bufsize;
public UIFileCopying(final int stringId, final int bufsize, final IProgressIndicator delegate) {
this.stringId = stringId;
this.delegate = delegate;
this.bufsize = bufsize;
this.interval = Math.min(64 * 1024, bufsize);
}
public void copy(final File source, final File target) throws IOException {
this.contentLength = source.length();
this.copied = 0;
this.indicated = 0;
this.bufsize = MathUtils.adjust((int) contentLength, 1024, 512 * 1024);
final BufferedInputStream ins = new BufferedInputStream(new FileInputStream(source), bufsize);
final BufferedOutputStream outs = new BufferedOutputStream(new FileOutputStream(target), bufsize);
FileUtils.copy(ins, outs, bufsize, this);
final String fileSize = FileUtils.getFileSize(contentLength);
delegate.setProgressDialogMessage(stringId, fileSize, fileSize);
}
public void copy(final long contentLength, final InputStream source, final OutputStream target) throws IOException {
this.contentLength = contentLength;
this.copied = 0;
this.indicated = 0;
FileUtils.copy(source, target, bufsize, this);
final String fileSize = FileUtils.getFileSize(contentLength);
delegate.setProgressDialogMessage(stringId, fileSize, fileSize);
}
@Override
public void progress(final long bytes) {
copied = bytes;
if (copied - indicated >= interval) {
indicated = copied;
if (contentLength > -1) {
final String val1 = FileUtils.getFileSize(Math.min(indicated, contentLength));
final String val2 = FileUtils.getFileSize(contentLength);
delegate.setProgressDialogMessage(stringId, val1, val2);
} else {
final String val1 = FileUtils.getFileSize(indicated);
delegate.setProgressDialogMessage(stringId, val1, "");
}
}
}
}