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., 59 Temple Place, Suite 330, 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
.InputStream
;
42 import java
.io
.IOException
;
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");
97 socket
= server
.accept();
98 //System.err.println("Accepted connection from "+socket.getInetAddress()+":"+socket.getPort());
100 catch (IOException e
)
107 * Waits until a client has connected.
109 public void waitFor()
114 acceptThread
.join(connectionTimeout
);
116 catch (InterruptedException e
)
119 if (exception
!= null)
126 throw new IOException("client did not connect before timeout");
132 * Returns an input stream from which a remote file can be read.
134 public InputStream
getInputStream()
139 throw new IOException("Transfer in progress");
141 if (acceptThread
!= null)
145 switch (transferMode
)
147 case FTPConnection
.MODE_STREAM
:
148 in
= new StreamInputStream(this, socket
.getInputStream());
150 case FTPConnection
.MODE_BLOCK
:
151 in
= new BlockInputStream(this, socket
.getInputStream());
153 case FTPConnection
.MODE_COMPRESSED
:
154 in
= new CompressedInputStream(this, socket
.getInputStream());
157 throw new IllegalStateException("invalid transfer mode");
159 in
.setTransferComplete(false);
164 * Returns an output stream to which a local file can be written for
167 public OutputStream
getOutputStream() throws IOException
171 throw new IOException("Transfer in progress");
173 if (acceptThread
!= null)
177 switch (transferMode
)
179 case FTPConnection
.MODE_STREAM
:
180 out
= new StreamOutputStream(this, socket
.getOutputStream());
182 case FTPConnection
.MODE_BLOCK
:
183 out
= new BlockOutputStream(this, socket
.getOutputStream());
185 case FTPConnection
.MODE_COMPRESSED
:
186 out
= new CompressedOutputStream(this, socket
.getOutputStream());
189 throw new IllegalStateException("invalid transfer mode");
191 out
.setTransferComplete(false);
195 public void setTransferMode(int mode
)
200 public void complete()
209 public boolean abort()
216 public void transferComplete()
224 in
.setTransferComplete(true);
228 out
.setTransferComplete(true);
230 completed
= completed
|| (transferMode
== FTPConnection
.MODE_STREAM
);
231 if (completed
&& socket
!= null)
237 catch (IOException e
)
244 catch (IOException e
)