Remove old autovect-branch by moving to "dead" directory.
[official-gcc.git] / old-autovect-branch / libjava / classpath / gnu / java / nio / SocketChannelImpl.java
blobfcddbd6c3510daf6c1f62b96ff53431d0c3893b6
1 /* SocketChannelImpl.java --
2 Copyright (C) 2002, 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., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 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.nio;
41 import gnu.java.net.PlainSocketImpl;
43 import java.io.IOException;
44 import java.io.InputStream;
45 import java.io.OutputStream;
46 import java.net.InetSocketAddress;
47 import java.net.Socket;
48 import java.net.SocketAddress;
49 import java.net.SocketTimeoutException;
50 import java.nio.ByteBuffer;
51 import java.nio.channels.AlreadyConnectedException;
52 import java.nio.channels.ClosedChannelException;
53 import java.nio.channels.ConnectionPendingException;
54 import java.nio.channels.NoConnectionPendingException;
55 import java.nio.channels.NotYetConnectedException;
56 import java.nio.channels.SelectionKey;
57 import java.nio.channels.Selector;
58 import java.nio.channels.SocketChannel;
59 import java.nio.channels.UnresolvedAddressException;
60 import java.nio.channels.UnsupportedAddressTypeException;
61 import java.nio.channels.spi.SelectorProvider;
63 public final class SocketChannelImpl extends SocketChannel
65 private PlainSocketImpl impl;
66 private NIOSocket socket;
67 private boolean connectionPending;
69 SocketChannelImpl (SelectorProvider provider)
70 throws IOException
72 super (provider);
73 impl = new PlainSocketImpl();
74 socket = new NIOSocket (impl, this);
75 configureBlocking(true);
78 SocketChannelImpl (SelectorProvider provider,
79 NIOSocket socket)
80 throws IOException
82 super (provider);
83 this.impl = socket.getPlainSocketImpl();
84 this.socket = socket;
87 public void finalizer()
89 if (isConnected())
91 try
93 close ();
95 catch (Exception e)
101 PlainSocketImpl getPlainSocketImpl()
103 return impl;
106 protected void implCloseSelectableChannel () throws IOException
108 socket.close();
111 protected void implConfigureBlocking (boolean blocking) throws IOException
113 socket.setSoTimeout (blocking ? 0 : NIOConstants.DEFAULT_TIMEOUT);
116 public boolean connect (SocketAddress remote) throws IOException
118 if (!isOpen())
119 throw new ClosedChannelException();
121 if (isConnected())
122 throw new AlreadyConnectedException();
124 if (connectionPending)
125 throw new ConnectionPendingException();
127 if (!(remote instanceof InetSocketAddress))
128 throw new UnsupportedAddressTypeException();
130 if (((InetSocketAddress) remote).isUnresolved())
131 throw new UnresolvedAddressException();
135 socket.getPlainSocketImpl().setInChannelOperation(true);
136 // indicate that a channel is initiating the accept operation
137 // so that the socket ignores the fact that we might be in
138 // non-blocking mode.
140 if (isBlocking())
142 // Do blocking connect.
143 socket.connect (remote);
144 return true;
147 // Do non-blocking connect.
150 socket.connect (remote, NIOConstants.DEFAULT_TIMEOUT);
151 return true;
153 catch (SocketTimeoutException e)
155 connectionPending = true;
156 return false;
159 finally
161 socket.getPlainSocketImpl().setInChannelOperation(false);
165 public boolean finishConnect ()
166 throws IOException
168 if (!isOpen())
169 throw new ClosedChannelException();
171 if (!isConnected() && !connectionPending)
172 throw new NoConnectionPendingException();
174 if (isConnected())
175 return true;
177 // FIXME: Handle blocking/non-blocking mode.
179 Selector selector = provider().openSelector();
180 register(selector, SelectionKey.OP_CONNECT);
182 if (isBlocking())
184 selector.select(); // blocking until channel is connected.
185 connectionPending = false;
186 return true;
189 int ready = selector.selectNow(); // non-blocking
190 if (ready == 1)
192 connectionPending = false;
193 return true;
196 return false;
199 public boolean isConnected ()
201 return socket.isConnected();
204 public boolean isConnectionPending ()
206 return connectionPending;
209 public Socket socket ()
211 return socket;
214 public int read(ByteBuffer dst) throws IOException
216 if (!isConnected())
217 throw new NotYetConnectedException();
219 byte[] data;
220 int offset = 0;
221 InputStream input = socket.getInputStream();
222 int available = input.available();
223 int len = dst.capacity() - dst.position();
225 if ((! isBlocking()) && available == 0)
226 return 0;
228 if (dst.hasArray())
230 offset = dst.arrayOffset() + dst.position();
231 data = dst.array();
233 else
235 data = new byte [len];
238 int readBytes = 0;
239 boolean completed = false;
243 begin();
244 socket.getPlainSocketImpl().setInChannelOperation(true);
245 readBytes = input.read (data, offset, len);
246 completed = true;
248 finally
250 end (completed);
251 socket.getPlainSocketImpl().setInChannelOperation(false);
254 if (readBytes > 0)
255 if (dst.hasArray())
257 dst.position (dst.position() + readBytes);
259 else
261 dst.put (data, offset, readBytes);
264 return readBytes;
267 public long read (ByteBuffer[] dsts, int offset, int length)
268 throws IOException
270 if (!isConnected())
271 throw new NotYetConnectedException();
273 if ((offset < 0)
274 || (offset > dsts.length)
275 || (length < 0)
276 || (length > (dsts.length - offset)))
277 throw new IndexOutOfBoundsException();
279 long readBytes = 0;
281 for (int index = offset; index < length; index++)
282 readBytes += read (dsts [index]);
284 return readBytes;
287 public int write (ByteBuffer src)
288 throws IOException
290 if (!isConnected())
291 throw new NotYetConnectedException();
293 byte[] data;
294 int offset = 0;
295 int len = src.remaining();
297 if (!src.hasArray())
299 data = new byte [len];
300 src.get (data, 0, len);
302 else
304 offset = src.arrayOffset() + src.position();
305 data = src.array();
308 OutputStream output = socket.getOutputStream();
309 boolean completed = false;
313 begin();
314 socket.getPlainSocketImpl().setInChannelOperation(true);
315 output.write (data, offset, len);
316 completed = true;
318 finally
320 end (completed);
321 socket.getPlainSocketImpl().setInChannelOperation(false);
324 if (src.hasArray())
326 src.position (src.position() + len);
329 return len;
332 public long write (ByteBuffer[] srcs, int offset, int length)
333 throws IOException
335 if (!isConnected())
336 throw new NotYetConnectedException();
338 if ((offset < 0)
339 || (offset > srcs.length)
340 || (length < 0)
341 || (length > (srcs.length - offset)))
342 throw new IndexOutOfBoundsException();
344 long writtenBytes = 0;
346 for (int index = offset; index < length; index++)
347 writtenBytes += write (srcs [index]);
349 return writtenBytes;