rendered paste bodynIndex: 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);
}
}