All pastes #398466 Raw Edit

AbortThread Diff!

public text v1 · immutable
·published 2007-03-17 07:02 UTC
rendered paste body
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);
         }
     }