/*
* Project: xdccBee
* Copyright (C) 2009 snert@snert-lab.de,
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.snertlab.xdccBee.irc;
import de.snertlab.xdccBee.ui.TableItemDownload;
/**
* @author holgi
*
*/
public class DccDownload {
public static String STATE_DOWNLOAD_FINISHED = "finished";
public static String STATE_DOWNLOAD_WAITING = "waiting";
public static String STATE_DOWNLOAD_DOWNLOAD = "downloading";
public static String STATE_DOWNLOAD_ABORT = "abort";
private DccPacket dccPacket;
private DccFileTransfer dccFileTransfer;
private String downloadDirFilename;
private TableItemDownload tableItemDownload;
private MyTableItemDownloadThread downloadThread;
private String state;
public DccDownload(DccPacket dccPacket, String downloadDirFilename) {
this.dccPacket = dccPacket;
this.downloadDirFilename = downloadDirFilename;
setState(STATE_DOWNLOAD_WAITING);
}
public String getKey() {
return dccPacket.toString();
}
public void setDccFileTransfer(DccFileTransfer dccFileTransfer) {
this.dccFileTransfer = dccFileTransfer;
}
public DccFileTransfer getDccFileTransfer() {
return dccFileTransfer;
}
public boolean matchDccFileTransfer(DccFileTransfer dccFileTransfer) {
// assumes that package comes from sender in order, so when you request
// 2 packages 1 comes first and 2 comes second else packages will be
// saved under wrong name
if (dccPacket.getSender().equals(dccFileTransfer.getNick())
&& state.equals(STATE_DOWNLOAD_WAITING)) {
return true;
}
return false;
}
public DccPacket getDccPacket() {
return dccPacket;
}
public String getDownloadDirFilename() {
return downloadDirFilename;
}
public void setTableItemDownload(TableItemDownload tableItemDownload) {
this.tableItemDownload = tableItemDownload;
}
public void start() {
downloadThread = new MyTableItemDownloadThread(this);
downloadThread.start();
}
/**
*
*/
public void stop() {
if (downloadThread == null) {
setState(STATE_DOWNLOAD_ABORT);
} else {
downloadThread.stopMe();
}
}
private class MyTableItemDownloadThread extends Thread {
private boolean stop;
private String state;
private DccDownload dccDownload;
public MyTableItemDownloadThread(DccDownload dccDownload) {
this.dccDownload = dccDownload;
}
@Override
public void run() {
while (dccFileTransfer.getProgress() < dccFileTransfer.getSize()) {
if (stop)
break;
tableItemDownload.getDisplay().asyncExec(new Runnable() {
public void run() {
if (stop)
return;
dccDownload.setState(STATE_DOWNLOAD_DOWNLOAD);
tableItemDownload
.updateFileTransferDisplay(dccFileTransfer);
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
state = STATE_DOWNLOAD_FINISHED;
if (stop) {
state = STATE_DOWNLOAD_ABORT;
}
tableItemDownload.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
dccDownload.setState(state);
dccFileTransfer.close();
}
});
}
public void stopMe() {
stop = true;
}
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
if (tableItemDownload != null) {
tableItemDownload.refreshState();
}
}
}