nIndex: src/master/src/org/drftpd/master/BaseFtpConnection.java =================================================================== --- src/master/src/org/drftpd/master/BaseFtpConnection.java (revision 1689) +++ src/master/src/org/drftpd/master/BaseFtpConnection.java (working copy) @@ -30,11 +30,9 @@ import java.net.SocketException; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Properties; import java.util.ResourceBundle; import javax.net.ssl.SSLSocket; Index: src/plugins/org.drftpd.commands.dataconnection/src/org/drftpd/commands/dataconnection/AbortThread.java =================================================================== --- src/plugins/org.drftpd.commands.dataconnection/src/org/drftpd/commands/dataconnection/AbortThread.java (revision 0) +++ src/plugins/org.drftpd.commands.dataconnection/src/org/drftpd/commands/dataconnection/AbortThread.java (revision 0) @@ -0,0 +1,54 @@ +package org.drftpd.commands.dataconnection; + +import java.io.BufferedReader; +import java.io.IOException; +import java.net.SocketTimeoutException; + +import org.apache.log4j.Logger; +import org.drftpd.master.BaseFtpConnection; + +public class AbortThread extends Thread { + + private static final Logger logger = Logger.getLogger(AbortThread.class); + private static int count = 0; + + private BaseFtpConnection _conn; + + private boolean _isAborted = false; + + public AbortThread(String name, BaseFtpConnection conn) { + super(name+"-"+count++); + _conn = conn; + } + + @Override + public void run() { + BufferedReader in = null; + logger.debug("AbortThread is now running."); + while (!interrupted()) { + try { + in = _conn.getControlReader(); + String cmd = in.readLine(); + if (cmd != null && cmd.equalsIgnoreCase("ABOR")) { + logger.debug("ABOR command issued! Aborting Transfer!"); + _conn.getTransferState().getTransfer().abort("Transfer aborted."); + abort(); + interrupt(); + } + } catch (SocketTimeoutException e) { + // simply continue the loop. + } catch (IOException e) { + logger.debug(e); + } + } + logger.debug("AbortThread exiting."); + } + + public boolean isAborted() { + return _isAborted; + } + + public void abort() { + _isAborted = true; + } +} Index: src/plugins/org.drftpd.commands.dataconnection/src/org/drftpd/commands/dataconnection/DataConnectionHandler.java =================================================================== --- src/plugins/org.drftpd.commands.dataconnection/src/org/drftpd/commands/dataconnection/DataConnectionHandler.java (revision 1689) +++ src/plugins/org.drftpd.commands.dataconnection/src/org/drftpd/commands/dataconnection/DataConnectionHandler.java (working copy) @@ -67,8 +67,9 @@ private static final Logger logger = Logger.getLogger(DataConnectionHandler.class); public static final Key CHECKSUM = new Key(DataConnectionHandler.class, "checksum", Long.class); - public static final Key TRANSFER_FILE = new Key(DataConnectionHandler.class, "transfer_file", FileHandle.class); + + public static final Key ABORT = new Key(DataConnectionHandler.class, "abort_thread", AbortThread.class); private ResourceBundle _bundle; @@ -1136,10 +1137,15 @@ } TransferStatus status = null; - + + conn.setObject(ABORT, new AbortThread("AbortThread", conn)); + AbortThread abort = (AbortThread) conn.getObject(ABORT, null); + //transfer try { //TODO ABORtable transfers + abort.start(); + if (isRetr) { ts.getTransfer().sendFile(ts.getTransferFile().getPath(), ts.getType(), ts.getResumePosition()); @@ -1148,7 +1154,7 @@ status = ts.getTransfer().getTransferStatus(); if (status.isFinished()) { - break; + break; } try { @@ -1164,7 +1170,7 @@ status = ts.getTransfer().getTransferStatus(); ts.getTransferFile().setSize(status.getTransfered()); if (status.isFinished()) { - break; + break; } try { Thread.sleep(100); @@ -1175,7 +1181,6 @@ throw new RuntimeException(); } } catch (IOException ex) { - logger.debug("", ex); if (ex instanceof TransferFailedException) { // the below chunk makes no sense, we don't process it anywhere /* status = ((TransferFailedException) ex).getStatus(); @@ -1196,19 +1201,21 @@ } catch (FileNotFoundException e) { // ahh, great! :) } - logger.error("IOException during transfer, deleting file", - ex); + logger.error("IOException during transfer, deleting file", ex); response = new CommandResponse(426, "Transfer failed, deleting file"); } else { logger.error("IOException during transfer", ex); response = new CommandResponse(426, ex.getMessage()); } + if (abort.isAborted()) { + response = StandardCommandManager.genericResponse("RESPONSE_226_CLOSING_DATA_CONNECTION"); + } + response.addComment(ex.getMessage()); // reset(); already done in finally block return response; } catch (SlaveUnavailableException e) { - logger.debug("", e); CommandResponse response = null; if (isStor) { @@ -1227,11 +1234,11 @@ "Slave went offline during transfer"); } - response.addComment(e.getLocalizedMessage()); + response.addComment(e.getMessage()); // reset(); already done in finally block return response; } - + // TransferThread transferThread = new TransferThread(rslave, // transfer); // System.err.println("Calling interruptibleSleepUntilFinished"); @@ -1241,14 +1248,17 @@ // e1.printStackTrace(); // } // System.err.println("Finished"); + + logger.debug("Stoping AbortThread."); + abort.interrupt(); + env = new ReplacerEnvironment(); env.add("bytes", Bytes.formatBytes(status.getTransfered())); env.add("speed", Bytes.formatBytes(status.getXferSpeed()) + "/s"); - env.add("seconds", "" + ((float)status.getElapsed() / 1000F)); + env.add("seconds", "" + (status.getElapsed() / 1000F)); env.add("checksum", Checksum.formatChecksum(status.getChecksum())); - CommandResponse response = new CommandResponse(226, conn.jprintf(_bundle, - "transfer.complete", env, request.getUser())); + CommandResponse response = new CommandResponse(226, conn.jprintf(_bundle, "transfer.complete", env, request.getUser())); request.getSession().setObject(CHECKSUM,status.getChecksum()); request.getSession().setObject(TRANSFER_FILE,ts.getTransferFile()); @@ -1272,9 +1282,6 @@ } } -/* boolean zipscript = zipscript(isRetr, isStor, status - .getChecksum(), response, targetFileName, targetDir);*/ - // transferstatistics if (isRetr) { @@ -1326,6 +1333,8 @@ .getAddress().getAddress(), ts.getType())); return response; } finally { + ((AbortThread) conn.getObject(ABORT, null)).interrupt(); //stoping the AbortThread. + reset(conn); } }