151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project 3519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.nio.ch; 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.*; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.*; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.*; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.channels.*; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.AccessController; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.PrivilegedExceptionAction; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// Make a socket channel look like a socket. 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// The only aspects of java.net.Socket-hood that we don't attempt to emulate 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// here are the interrupted-I/O exceptions (which our Solaris implementations 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// attempt to support) and the sending of urgent data. Otherwise an adapted 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// socket should look enough like a real java.net.Socket to fool most of the 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// developers most of the time, right down to the exception message strings. 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// The methods in this class are defined in exactly the same order as in 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// java.net.Socket so as to simplify tracking future changes to that class. 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class SocketAdaptor 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski extends Socket 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{ 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The channel being adapted 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final SocketChannelImpl sc; 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Timeout "option" value for reads 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private volatile int timeout = 0; 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private SocketAdaptor(SocketChannelImpl sc) throws SocketException { 601cb7758226b1bd3c8f39d9adb9068b02a18fcc7cKenny Root super(new FileDescriptorHolderSocketImpl(sc.getFD())); 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.sc = sc; 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static Socket create(SocketChannelImpl sc) { 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new SocketAdaptor(sc); 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (SocketException e) { 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new InternalError("Should not reach here"); 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SocketChannel getChannel() { 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return sc; 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Override this method just to protect against changes in the superclass 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void connect(SocketAddress remote) throws IOException { 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski connect(remote, 0); 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void connect(SocketAddress remote, int timeout) throws IOException { 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (remote == null) 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("connect: The address can't be null"); 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (timeout < 0) 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("connect: timeout can't be negative"); 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski synchronized (sc.blockingLock()) { 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!sc.isBlocking()) 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalBlockingModeException(); 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (timeout == 0) { 952808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath // Android-changed: Be consistent 962808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath try { 972808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath sc.connect(remote); 982808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath } catch (Exception ex) { 992808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath Net.translateException(ex); 1002808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath } 1012808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return; 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sc.configureBlocking(false); 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (sc.connect(remote)) 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return; 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long to = timeout; 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (;;) { 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!sc.isOpen()) 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new ClosedChannelException(); 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long st = System.currentTimeMillis(); 114519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera 115519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera int result = sc.poll(Net.POLLCONN, to); 116519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera if (result > 0 && sc.finishConnect()) 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski to -= System.currentTimeMillis() - st; 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (to <= 0) { 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sc.close(); 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (IOException x) { } 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new SocketTimeoutException(); 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } finally { 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (sc.isOpen()) 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sc.configureBlocking(true); 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (Exception x) { 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Net.translateException(x, true); 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void bind(SocketAddress local) throws IOException { 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sc.bind(local); 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (Exception x) { 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Net.translateException(x); 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public InetAddress getInetAddress() { 147e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak // Use #remoteAddress and do manual isConnected check. #getRemoteAddress() returns 148e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak // non-null result before connection. 149e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak if (!isConnected()) { 150e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak return null; 151e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak } 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski SocketAddress remote = sc.remoteAddress(); 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (remote == null) { 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return ((InetSocketAddress)remote).getAddress(); 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public InetAddress getLocalAddress() { 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (sc.isOpen()) { 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetSocketAddress local = sc.localAddress(); 163519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera if (local != null) { 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return Net.getRevealedLocalAddress(local).getAddress(); 165519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera } 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new InetSocketAddress(0).getAddress(); 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int getPort() { 171e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak // Use #remoteAddress and do manual isConnected check. #getRemoteAddress() returns 172e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak // non-null result before connection. 173e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak if (!isConnected()) { 174e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak return 0; 175e789c59925d49a3a4d43be11d46061eb8879f6b7Przemyslaw Szczepaniak } 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski SocketAddress remote = sc.remoteAddress(); 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (remote == null) { 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return 0; 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return ((InetSocketAddress)remote).getPort(); 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int getLocalPort() { 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski SocketAddress local = sc.localAddress(); 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (local == null) { 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return -1; 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return ((InetSocketAddress)local).getPort(); 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private class SocketInputStream 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski extends ChannelInputStream 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private SocketInputStream() { 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(sc); 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected int read(ByteBuffer bb) 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski synchronized (sc.blockingLock()) { 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!sc.isBlocking()) 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalBlockingModeException(); 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (timeout == 0) 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return sc.read(bb); 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sc.configureBlocking(false); 209519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 211519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera int n; 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((n = sc.read(bb)) != 0) 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return n; 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long to = timeout; 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (;;) { 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!sc.isOpen()) 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new ClosedChannelException(); 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long st = System.currentTimeMillis(); 219519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera int result = sc.poll(Net.POLLIN, to); 220519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera if (result > 0) { 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((n = sc.read(bb)) != 0) 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return n; 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski to -= System.currentTimeMillis() - st; 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (to <= 0) 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new SocketTimeoutException(); 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } finally { 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (sc.isOpen()) 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sc.configureBlocking(true); 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private InputStream socketInputStream = null; 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public InputStream getInputStream() throws IOException { 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!sc.isOpen()) 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new SocketException("Socket is closed"); 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!sc.isConnected()) 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new SocketException("Socket is not connected"); 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!sc.isInputOpen()) 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new SocketException("Socket input is shutdown"); 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (socketInputStream == null) { 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski socketInputStream = AccessController.doPrivileged( 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new PrivilegedExceptionAction<InputStream>() { 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public InputStream run() throws IOException { 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new SocketInputStream(); 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }); 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (java.security.PrivilegedActionException e) { 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw (IOException)e.getException(); 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return socketInputStream; 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public OutputStream getOutputStream() throws IOException { 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!sc.isOpen()) 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new SocketException("Socket is closed"); 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!sc.isConnected()) 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new SocketException("Socket is not connected"); 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!sc.isOutputOpen()) 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new SocketException("Socket output is shutdown"); 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski OutputStream os = null; 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski os = AccessController.doPrivileged( 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new PrivilegedExceptionAction<OutputStream>() { 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public OutputStream run() throws IOException { 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return Channels.newOutputStream(sc); 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }); 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (java.security.PrivilegedActionException e) { 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw (IOException)e.getException(); 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return os; 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private void setBooleanOption(SocketOption<Boolean> name, boolean value) 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws SocketException 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sc.setOption(name, value); 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (IOException x) { 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Net.translateToSocketException(x); 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private void setIntOption(SocketOption<Integer> name, int value) 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws SocketException 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sc.setOption(name, value); 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (IOException x) { 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Net.translateToSocketException(x); 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private boolean getBooleanOption(SocketOption<Boolean> name) throws SocketException { 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return sc.getOption(name).booleanValue(); 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (IOException x) { 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Net.translateToSocketException(x); 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; // keep compiler happy 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private int getIntOption(SocketOption<Integer> name) throws SocketException { 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return sc.getOption(name).intValue(); 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (IOException x) { 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Net.translateToSocketException(x); 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return -1; // keep compiler happy 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void setTcpNoDelay(boolean on) throws SocketException { 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setBooleanOption(StandardSocketOptions.TCP_NODELAY, on); 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean getTcpNoDelay() throws SocketException { 32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getBooleanOption(StandardSocketOptions.TCP_NODELAY); 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void setSoLinger(boolean on, int linger) throws SocketException { 32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!on) 33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski linger = -1; 33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setIntOption(StandardSocketOptions.SO_LINGER, linger); 33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int getSoLinger() throws SocketException { 33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getIntOption(StandardSocketOptions.SO_LINGER); 33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void sendUrgentData(int data) throws IOException { 339519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera int n = sc.sendOutOfBandData((byte) data); 340519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera if (n == 0) 341519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera throw new IOException("Socket buffer full"); 34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void setOOBInline(boolean on) throws SocketException { 34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setBooleanOption(ExtendedSocketOption.SO_OOBINLINE, on); 34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean getOOBInline() throws SocketException { 34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getBooleanOption(ExtendedSocketOption.SO_OOBINLINE); 35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void setSoTimeout(int timeout) throws SocketException { 35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (timeout < 0) 35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("timeout can't be negative"); 35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.timeout = timeout; 35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int getSoTimeout() throws SocketException { 35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return timeout; 36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void setSendBufferSize(int size) throws SocketException { 36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // size 0 valid for SocketChannel, invalid for Socket 36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (size <= 0) 36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("Invalid send size"); 36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setIntOption(StandardSocketOptions.SO_SNDBUF, size); 36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int getSendBufferSize() throws SocketException { 37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getIntOption(StandardSocketOptions.SO_SNDBUF); 37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void setReceiveBufferSize(int size) throws SocketException { 37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // size 0 valid for SocketChannel, invalid for Socket 37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (size <= 0) 37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("Invalid receive size"); 37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setIntOption(StandardSocketOptions.SO_RCVBUF, size); 37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int getReceiveBufferSize() throws SocketException { 38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getIntOption(StandardSocketOptions.SO_RCVBUF); 38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void setKeepAlive(boolean on) throws SocketException { 38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setBooleanOption(StandardSocketOptions.SO_KEEPALIVE, on); 38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean getKeepAlive() throws SocketException { 38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getBooleanOption(StandardSocketOptions.SO_KEEPALIVE); 39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void setTrafficClass(int tc) throws SocketException { 39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setIntOption(StandardSocketOptions.IP_TOS, tc); 39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int getTrafficClass() throws SocketException { 39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getIntOption(StandardSocketOptions.IP_TOS); 39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void setReuseAddress(boolean on) throws SocketException { 40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setBooleanOption(StandardSocketOptions.SO_REUSEADDR, on); 40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean getReuseAddress() throws SocketException { 40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getBooleanOption(StandardSocketOptions.SO_REUSEADDR); 40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void close() throws IOException { 40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sc.close(); 41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void shutdownInput() throws IOException { 41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sc.shutdownInput(); 41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (Exception x) { 41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Net.translateException(x); 41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void shutdownOutput() throws IOException { 42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sc.shutdownOutput(); 42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (Exception x) { 42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Net.translateException(x); 42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String toString() { 42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (sc.isConnected()) 43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return "Socket[addr=" + getInetAddress() + 43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ",port=" + getPort() + 43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ",localport=" + getLocalPort() + "]"; 43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return "Socket[unconnected]"; 43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isConnected() { 43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return sc.isConnected(); 43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isBound() { 44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return sc.localAddress() != null; 44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isClosed() { 44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return !sc.isOpen(); 44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isInputShutdown() { 44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return !sc.isInputOpen(); 45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isOutputShutdown() { 45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return !sc.isOutputOpen(); 45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 45662098900d7201b01db7905a8ff1debea4b639a30Yi Kong /* 45762098900d7201b01db7905a8ff1debea4b639a30Yi Kong * Android-added: for testing and internal use. 45862098900d7201b01db7905a8ff1debea4b639a30Yi Kong */ 45948c1f0e1f3ceb54f5d781f18fa4139b06e00dfdeNarayan Kamath @Override 46048c1f0e1f3ceb54f5d781f18fa4139b06e00dfdeNarayan Kamath public FileDescriptor getFileDescriptor$() { 46148c1f0e1f3ceb54f5d781f18fa4139b06e00dfdeNarayan Kamath return sc.getFD(); 46248c1f0e1f3ceb54f5d781f18fa4139b06e00dfdeNarayan Kamath } 46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 464