1 18 package org.drftpd.slave.async; 19 20 import java.io.IOException ; 21 import java.net.InetAddress ; 22 import java.rmi.RemoteException ; 23 import java.util.Hashtable ; 24 25 import net.sf.drftpd.slave.Transfer; 26 import net.sf.drftpd.slave.TransferStatus; 27 28 import org.apache.log4j.Logger; 29 30 34 public class AsyncTransfer implements Transfer { 35 36 private static final Logger logger = Logger.getLogger(AsyncTransfer.class); 37 38 private long _conn; 39 private String _addr; 40 private int _port; 41 42 private boolean _abort = false; 43 44 private char _direction; 45 private long _started = 0; 46 private long _finished = 0; 47 private long _transfered = 0; 48 private long _checksum = 0; 49 private long _error = 0; 50 private String _status = ""; 51 52 private AsyncSlave _slave; 53 private AsyncCommand _cmd; 54 55 58 public AsyncTransfer(AsyncSlave slave, AsyncCommand cmd) 59 { 60 Hashtable data = cmd._data; 61 _slave = slave; 62 _direction = Transfer.TRANSFER_UNKNOWN; 63 _conn = Long.parseLong((String )data.get("conn")); 64 _port = 0; 65 _addr = ""; 66 if (data.containsKey("addr")) { 67 String tmp = (String )data.get("addr"); 68 String [] items = tmp.split(":"); 69 _addr = items[0]; 70 _port = Integer.parseInt(items[1]); 71 } 72 } 73 74 public long getChecksum() { 75 return _checksum; 76 } 77 78 public char getDirection() { 79 return _direction; 80 } 81 82 public int getLocalPort() throws RemoteException { 83 return _port; 84 } 85 86 public long getID() { 87 return _conn; 88 } 89 90 public long getTransfered() { 91 return _transfered; 92 } 93 94 public long getElapsed() { 95 if (_finished == 0) { 96 return System.currentTimeMillis() - _started; 97 } else { 98 return _finished - _started; 99 } 100 } 101 102 public int getXferSpeed() { 103 long elapsed = getElapsed(); 104 105 if (_transfered == 0) { 106 return 0; 107 } 108 109 if (elapsed == 0) { 110 return 0; 111 } 112 return (int) (_transfered / ((float) elapsed / (float) 1000)); 113 } 114 115 public TransferStatus getStatus() { 116 try { 117 return new TransferStatus(getElapsed(), getTransfered(), getChecksum(), InetAddress.getLocalHost()); 118 } catch (Exception e) { 119 return null; 120 } 121 } 122 123 public boolean isReceivingUploading() { 124 return _direction == TRANSFER_RECEIVING_UPLOAD; 125 } 126 127 public boolean isSendingUploading() { 128 return _direction == Transfer.TRANSFER_SENDING_DOWNLOAD; 129 } 130 131 public TransferStatus sendFile( 132 String path, 133 char type, 134 long resumePosition 135 ) throws IOException { 136 logger.info("Send: path=" + path); 137 138 _direction = TRANSFER_SENDING_DOWNLOAD; 139 _cmd = _slave.sendCommand( 140 "send", "\"" + path + "\" " + resumePosition + " " + _conn 141 ); 142 _started = System.currentTimeMillis(); 143 _slave.addTransfer(this); 144 _cmd.waitForComplete(); 145 _slave.removeTransfer(this); 146 TransferStatus tmp = getStatus(); 147 return tmp; 148 } 149 150 public synchronized TransferStatus receiveFile( 151 String dirname, 152 char mode, 153 String filename, 154 long offset 155 ) throws IOException { 156 logger.info("Recv: path=" + dirname + "/" + filename); 157 158 _direction = TRANSFER_RECEIVING_UPLOAD; 159 String args = "\"" + dirname + "/" + filename + "\" " + offset + " " + _conn; 160 _cmd = _slave.sendCommand("recv", args); 161 _started = System.currentTimeMillis(); 162 _slave.addTransfer(this); 163 _cmd.waitForComplete(); 164 _slave.removeTransfer(this); 165 TransferStatus tmp = getStatus(); 166 return tmp; 167 } 168 169 public void startSend( 170 String path, 171 char type, 172 long resumePosition 173 ) throws IOException { 174 logger.info("Send: path=" + path); 175 176 _direction = TRANSFER_SENDING_DOWNLOAD; 177 _cmd = _slave.sendCommand( 178 "send", "\"" + path + "\" " + resumePosition + " " + _conn 179 ); 180 _started = System.currentTimeMillis(); 181 _slave.addTransfer(this); 182 } 183 public TransferStatus finishSend() 184 { 185 _slave.removeTransfer(this); 186 TransferStatus tmp = getStatus(); 187 return tmp; 188 } 189 190 public void startRecv( 191 String dirname, 192 char mode, 193 String filename, 194 long offset 195 ) throws IOException { 196 logger.info("Recv: path=" + dirname + "/" + filename); 197 198 _direction = TRANSFER_RECEIVING_UPLOAD; 199 String args = "\"" + dirname + "/" + filename + "\" " + offset + " " + _conn; 200 AsyncCommand cmd = _slave.sendCommand("recv", args); 201 _started = System.currentTimeMillis(); 202 _slave.addTransfer(this); 203 } 204 205 public TransferStatus finishRecv() 206 { 207 _slave.removeTransfer(this); 208 TransferStatus tmp = getStatus(); 209 return tmp; 210 } 211 212 public void abort() throws RemoteException { 213 _abort = true; 214 _cmd.abort(); 215 } 216 217 218 public void updateStats(String sta, long byt, long crc, long err, String addr) { 219 _status = sta; 220 _transfered = byt; 221 _checksum = crc; 222 _error = err; 223 _addr = addr; 224 } 225 } 226 | Popular Tags |