1 /* ActiveModeDTP.java --
2 Copyright (C) 2003, 2004 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
39 package gnu
.java
.net
.protocol
.ftp
;
41 import java
.io
.IOException
;
42 import java
.io
.InputStream
;
43 import java
.io
.OutputStream
;
44 import java
.net
.InetAddress
;
45 import java
.net
.ServerSocket
;
46 import java
.net
.Socket
;
49 * An active mode FTP data transfer process.
50 * This starts a server on the specified port listening for a data
51 * connection. It converts the socket input into a file stream for reading.
53 * @author Chris Burdess (dog@gnu.org)
55 final class ActiveModeDTP
56 implements DTP
, Runnable
66 IOException exception
;
68 int connectionTimeout
;
70 ActiveModeDTP(InetAddress localhost
, int port
,
71 int connectionTimeout
, int timeout
)
76 server
= new ServerSocket(port
, 1, localhost
);
79 server
.setSoTimeout(timeout
);
81 if (connectionTimeout
<= 0)
83 connectionTimeout
= 20000;
85 this.connectionTimeout
= connectionTimeout
;
86 acceptThread
= new Thread(this, "ActiveModeDTP");
87 acceptThread
.setDaemon(true);
98 socket
= server
.accept();
99 //System.err.println("Accepted connection from "+socket.getInetAddress()+":"+socket.getPort());
101 catch (IOException e
)
108 * Waits until a client has connected.
110 public void waitFor()
115 acceptThread
.join(connectionTimeout
);
117 catch (InterruptedException e
)
120 if (exception
!= null)
127 throw new IOException("client did not connect before timeout");
133 * Returns an input stream from which a remote file can be read.
135 public InputStream
getInputStream()
140 throw new IOException("Transfer in progress");
142 if (acceptThread
!= null)
146 switch (transferMode
)
148 case FTPConnection
.MODE_STREAM
:
149 in
= new StreamInputStream(this, socket
.getInputStream());
151 case FTPConnection
.MODE_BLOCK
:
152 in
= new BlockInputStream(this, socket
.getInputStream());
154 case FTPConnection
.MODE_COMPRESSED
:
155 in
= new CompressedInputStream(this, socket
.getInputStream());
158 throw new IllegalStateException("invalid transfer mode");
160 in
.setTransferComplete(false);
165 * Returns an output stream to which a local file can be written for
168 public OutputStream
getOutputStream() throws IOException
172 throw new IOException("Transfer in progress");
174 if (acceptThread
!= null)
178 switch (transferMode
)
180 case FTPConnection
.MODE_STREAM
:
181 out
= new StreamOutputStream(this, socket
.getOutputStream());
183 case FTPConnection
.MODE_BLOCK
:
184 out
= new BlockOutputStream(this, socket
.getOutputStream());
186 case FTPConnection
.MODE_COMPRESSED
:
187 out
= new CompressedOutputStream(this, socket
.getOutputStream());
190 throw new IllegalStateException("invalid transfer mode");
192 out
.setTransferComplete(false);
196 public void setTransferMode(int mode
)
201 public void complete()
210 public boolean abort()
217 public void transferComplete()
225 in
.setTransferComplete(true);
229 out
.setTransferComplete(true);
231 completed
= completed
|| (transferMode
== FTPConnection
.MODE_STREAM
);
232 if (completed
&& socket
!= null)
238 catch (IOException e
)
245 catch (IOException e
)