package rhogenwizard.sdk.task;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.core.runtime.IProgressMonitor;
import rhogenwizard.HttpDownload;
public class DownloadTask extends RunTask
{
private final URL m_url;
private final String m_fileName;
private int m_restToWork;
private long m_restToDownload;
private boolean m_ok;
public DownloadTask(String url, String fileName, int toWork) throws MalformedURLException
{
m_url = new URL(url);
m_fileName = fileName;
m_restToWork = toWork;
m_restToDownload = -1;
m_ok = false;
}
@Override
public boolean isOk()
{
return m_ok;
}
@Override
public void run(IProgressMonitor monitor)
{
if (monitor.isCanceled())
{
throw new StoppedException();
}
OutputStream stream;
try
{
stream = new FileOutputStream(m_fileName);
}
catch (FileNotFoundException e)
{
throw new StoppedException(e);
}
try
{
HttpDownload download = new HttpDownload(m_url, stream);
while (download.isAlive())
{
try
{
download.join(100);
}
catch (InterruptedException e)
{
throw new StoppedException(e);
}
if (monitor.isCanceled())
{
download.stop();
throw new StoppedException();
}
long size = download.getSize();
if (size >= 0)
{
if (m_restToDownload == -1)
{
m_restToDownload = size;
}
if (m_restToDownload > 0)
{
long restToDownload = size - download.getDownloaded();
long downloaded = m_restToDownload - restToDownload;
long round = m_restToDownload / 2;
int worked = (int) ((m_restToWork * downloaded + round) / m_restToDownload);
m_restToDownload -= downloaded;
m_restToWork -= worked;
monitor.worked(worked);
}
}
}
monitor.worked(m_restToWork);
}
catch (RuntimeException e)
{
try
{
stream.close();
}
catch (IOException e1)
{
}
new File(m_fileName).delete();
throw e;
}
try
{
stream.close();
}
catch (IOException e)
{
throw new StoppedException(e);
}
m_ok = true;
}
}