This commit was manufactured by cvs2svn to create branch
[official-gcc.git] / libjava / gnu / java / net / protocol / ftp / ActiveModeDTP.java
blobab387e4a96fb12f027bd4cef19f791ac92298461
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)
9 any later version.
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
19 02111-1307 USA.
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
24 combination.
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;
48 /**
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
59 ServerSocket server;
60 Socket socket;
61 DTPInputStream in;
62 DTPOutputStream out;
63 boolean completed;
64 boolean inProgress;
65 int transferMode;
66 IOException exception;
67 Thread acceptThread;
68 int connectionTimeout;
70 ActiveModeDTP(InetAddress localhost, int port,
71 int connectionTimeout, int timeout)
72 throws IOException
74 completed = false;
75 inProgress = false;
76 server = new ServerSocket(port, 1, localhost);
77 if (timeout > 0)
79 server.setSoTimeout(timeout);
81 if (connectionTimeout <= 0)
83 connectionTimeout = 20000;
85 this.connectionTimeout = connectionTimeout;
86 acceptThread = new Thread(this, "ActiveModeDTP");
87 acceptThread.start();
90 /**
91 * Start listening.
93 public void run()
95 try
97 socket = server.accept();
98 //System.err.println("Accepted connection from "+socket.getInetAddress()+":"+socket.getPort());
100 catch (IOException e)
102 exception = e;
107 * Waits until a client has connected.
109 public void waitFor()
110 throws IOException
114 acceptThread.join(connectionTimeout);
116 catch (InterruptedException e)
119 if (exception != null)
121 throw exception;
123 if (socket == null)
125 server.close();
126 throw new IOException("client did not connect before timeout");
128 acceptThread = null;
132 * Returns an input stream from which a remote file can be read.
134 public InputStream getInputStream()
135 throws IOException
137 if (inProgress)
139 throw new IOException("Transfer in progress");
141 if (acceptThread != null)
143 waitFor();
145 switch (transferMode)
147 case FTPConnection.MODE_STREAM:
148 in = new StreamInputStream(this, socket.getInputStream());
149 break;
150 case FTPConnection.MODE_BLOCK:
151 in = new BlockInputStream(this, socket.getInputStream());
152 break;
153 case FTPConnection.MODE_COMPRESSED:
154 in = new CompressedInputStream(this, socket.getInputStream());
155 break;
156 default:
157 throw new IllegalStateException("invalid transfer mode");
159 in.setTransferComplete(false);
160 return in;
164 * Returns an output stream to which a local file can be written for
165 * upload.
167 public OutputStream getOutputStream() throws IOException
169 if (inProgress)
171 throw new IOException("Transfer in progress");
173 if (acceptThread != null)
175 waitFor();
177 switch (transferMode)
179 case FTPConnection.MODE_STREAM:
180 out = new StreamOutputStream(this, socket.getOutputStream());
181 break;
182 case FTPConnection.MODE_BLOCK:
183 out = new BlockOutputStream(this, socket.getOutputStream());
184 break;
185 case FTPConnection.MODE_COMPRESSED:
186 out = new CompressedOutputStream(this, socket.getOutputStream());
187 break;
188 default:
189 throw new IllegalStateException("invalid transfer mode");
191 out.setTransferComplete(false);
192 return out;
195 public void setTransferMode(int mode)
197 transferMode = mode;
200 public void complete()
202 completed = true;
203 if (!inProgress)
205 transferComplete();
209 public boolean abort()
211 completed = true;
212 transferComplete();
213 return inProgress;
216 public void transferComplete()
218 if (socket == null)
220 return;
222 if (in != null)
224 in.setTransferComplete(true);
226 if (out != null)
228 out.setTransferComplete(true);
230 completed = completed || (transferMode == FTPConnection.MODE_STREAM);
231 if (completed && socket != null)
235 socket.close();
237 catch (IOException e)
242 server.close();
244 catch (IOException e)