Socket.java revision 1f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.net;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.OutputStream;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.channels.SocketChannel;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.AccessController;
251f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti// BEGIN android-added
261f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colittiimport java.util.logging.Logger;
271f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colittiimport java.util.logging.Level;
281f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti// END android-added
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.net.NetUtil;
31f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilsonimport org.apache.harmony.luni.net.PlainSocketImpl;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.Platform;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.util.Msg;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.util.PriviAction;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Provides a client-side TCP socket.
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Socket {
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    SocketImpl impl;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static SocketImplFactory factory;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private volatile boolean isCreated = false;
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean isBound = false;
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean isConnected = false;
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean isClosed = false;
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean isInputShutdown = false;
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean isOutputShutdown = false;
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static class ConnectLock {
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Object connectLock = new ConnectLock();
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Proxy proxy;
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int MULTICAST_IF = 1;
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int MULTICAST_TTL = 2;
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int TCP_NODELAY = 4;
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int FLAG_SHUTDOWN = 8;
71f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
721f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti    static private Logger logger;
731f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti
741f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti    static private Logger getLogger() {
751f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        if (logger == null) {
761f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti            logger = Logger.getLogger(Socket.class.getName());
771f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        }
781f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        return logger;
791f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti    }
801f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static {
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Platform.getNetworkSystem().oneTimeInitialization(true);
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new unconnected socket. When a SocketImplFactory is defined it
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * creates the internal socket implementation, otherwise the default socket
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation will be used for this socket.
89f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketImplFactory
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketImpl
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Socket() {
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl = factory != null ? factory.createSocketImpl()
95f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                : new PlainSocketImpl();
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new unconnected socket using the given proxy type. When a
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code SocketImplFactory} is defined it creates the internal socket
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation, otherwise the default socket implementation will be used
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * for this socket.
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Example that will create a socket connection through a {@code SOCKS}
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * proxy server: <br>
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Socket sock = new Socket(new Proxy(Proxy.Type.SOCKS, new
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * InetSocketAddress("test.domain.org", 2130)));}
108f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param proxy
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the specified proxy for this socket.
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the argument {@code proxy} is {@code null} or of an
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             invalid type.
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SecurityException
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a security manager exists and it denies the permission to
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connect to the given proxy.
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketImplFactory
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketImpl
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Socket(Proxy proxy) {
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (null == proxy || Proxy.Type.HTTP == proxy.type()) {
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // KA023=Proxy is null or invalid type
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Msg.getString("KA023")); //$NON-NLS-1$
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InetSocketAddress address = (InetSocketAddress) proxy.address();
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (null != address) {
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InetAddress addr = address.getAddress();
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String host;
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (null != addr) {
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                host = addr.getHostAddress();
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                host = address.getHostName();
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int port = address.getPort();
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            checkConnectPermission(host, port);
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl = factory != null ? factory.createSocketImpl()
138f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                : new PlainSocketImpl(proxy);
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.proxy = proxy;
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1421f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti    // BEGIN android-added
1431f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti    /**
1441f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * Tries to connect a socket to all IP addresses of the given hostname.
1451f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     *
1461f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * @param dstName
1471f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     *            the target host name or IP address to connect to.
1481f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * @param dstPort
1491f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     *            the port on the target host to connect to.
1501f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * @param localAddress
1511f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     *            the address on the local host to bind to.
1521f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * @param localPort
1531f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     *            the port on the local host to bind to.
1541f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * @param streaming
1551f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     *            if {@code true} a streaming socket is returned, a datagram
1561f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     *            socket otherwise.
1571f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * @throws UnknownHostException
1581f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     *             if the host name could not be resolved into an IP address.
1591f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * @throws IOException
1601f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     *             if an error occurs while creating the socket.
1611f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * @throws SecurityException
1621f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     *             if a security manager exists and it denies the permission to
1631f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     *             connect to the given address and port.
1641f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     */
1651f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti    private void tryAllAddresses(String dstName, int dstPort, InetAddress
1661f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti            localAddress, int localPort, boolean streaming) throws IOException {
1671f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        InetAddress[] dstAddresses = InetAddress.getAllByName(dstName);
1681f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        // Loop through all the destination addresses except the last, trying to
1691f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        // connect to each one and ignoring errors. There must be at least one
1701f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        // address, or getAllByName would have thrown UnknownHostException.
1711f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        InetAddress dstAddress;
1721f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        for (int i = 0; i < dstAddresses.length - 1; i++) {
1731f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti            dstAddress = dstAddresses[i];
1741f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti            try {
1751f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti                checkDestination(dstAddress, dstPort);
1761f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti                startupSocket(dstAddress, dstPort, localAddress, localPort,
1771f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti                        streaming);
1781f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti                return;
1791f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti            } catch(SecurityException e1) {
1801f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti                getLogger().log(Level.INFO, dstAddress + "(" + dstPort + "): " +
1811f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti                        e1.getClass().getName() + ": " + e1.getMessage());
1821f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti            } catch(IOException e2) {
1831f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti                getLogger().log(Level.INFO, dstAddress + "(" + dstPort + "): " +
1841f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti                        e2.getClass().getName() + ": " + e2.getMessage());
1851f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti            }
1861f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        }
1871f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti
1881f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        // Now try to connect to the last address in the array, handing back to
1891f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        // the caller any exceptions that are thrown.
1901f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        dstAddress = dstAddresses[dstAddresses.length - 1];
1911f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        checkDestination(dstAddress, dstPort);
1921f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        startupSocket(dstAddress, dstPort, localAddress, localPort, streaming);
1931f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti    }
1941f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti    // END android-added
1951f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new streaming socket connected to the target host specified by
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the parameters {@code dstName} and {@code dstPort}. The socket is bound
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to any available port on the local host.
2001f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * <p><strong>Implementation note:</strong> this implementation tries each
2011f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * IP address for the given hostname until it either connects successfully
2021f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * or it exhausts the set. It will try both IPv4 and IPv6 addresses in the
2031f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * order specified by {@code preferIPv6Addresses}.
204f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param dstName
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target host name or IP address to connect to.
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param dstPort
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port on the target host to connect to.
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnknownHostException
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the host name could not be resolved into an IP address.
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while creating the socket.
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SecurityException
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a security manager exists and it denies the permission to
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connect to the given address and port.
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Socket(String dstName, int dstPort) throws UnknownHostException,
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IOException {
2191f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        // BEGIN android-changed
2201f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        this(dstName, dstPort, null, 0);
2211f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        // END android-changed
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new streaming socket connected to the target host specified by
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the parameters {@code dstName} and {@code dstPort}. On the local endpoint
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the socket is bound to the given address {@code localAddress} on port
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code localPort}.
229f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If {@code host} is {@code null} a loopback address is used to connect to.
2311f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * <p><strong>Implementation note:</strong> this implementation tries each
2321f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * IP address for the given hostname until it either connects successfully
2331f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * or it exhausts the set. It will try both IPv4 and IPv6 addresses in the
2341f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * order specified by {@code preferIPv6Addresses}.
235f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param dstName
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target host name or IP address to connect to.
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param dstPort
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port on the target host to connect to.
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param localAddress
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the address on the local host to bind to.
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param localPort
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port on the local host to bind to.
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnknownHostException
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the host name could not be resolved into an IP address.
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while creating the socket.
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SecurityException
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a security manager exists and it denies the permission to
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connect to the given address and port.
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Socket(String dstName, int dstPort, InetAddress localAddress,
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int localPort) throws IOException {
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this();
2551f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        // BEGIN android-changed
2561f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        tryAllAddresses(dstName, dstPort, localAddress, localPort, true);
2571f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        // END android-changed
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new streaming or datagram socket connected to the target host
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified by the parameters {@code hostName} and {@code port}. The socket
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is bound to any available port on the local host.
2641f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * <p><strong>Implementation note:</strong> this implementation tries each
2651f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * IP address for the given hostname until it either connects successfully
2661f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * or it exhausts the set. It will try both IPv4 and IPv6 addresses in the
2671f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti     * order specified by {@code preferIPv6Addresses}.
268f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param hostName
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target host name or IP address to connect to.
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param port
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port on the target host to connect to.
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param streaming
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            if {@code true} a streaming socket is returned, a datagram
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            socket otherwise.
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnknownHostException
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the host name could not be resolved into an IP address.
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while creating the socket.
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SecurityException
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a security manager exists and it denies the permission to
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connect to the given address and port.
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @deprecated Use {@code Socket(String, int)} instead of this for streaming
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             sockets or an appropriate constructor of {@code
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             DatagramSocket} for UDP transport.
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Deprecated
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Socket(String hostName, int port, boolean streaming)
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException {
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this();
2911f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        // BEGIN android-changed
2921f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        tryAllAddresses(hostName, port, null, 0, streaming);
2931f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti        // END android-changed
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new streaming socket connected to the target host specified by
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the parameters {@code dstAddress} and {@code dstPort}. The socket is
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * bound to any available port on the local host.
300f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param dstAddress
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target host address to connect to.
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param dstPort
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port on the target host to connect to.
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while creating the socket.
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SecurityException
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a security manager exists and it denies the permission to
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connect to the given address and port.
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Socket(InetAddress dstAddress, int dstPort) throws IOException {
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this();
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkDestination(dstAddress, dstPort);
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        startupSocket(dstAddress, dstPort, null, 0, true);
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new streaming socket connected to the target host specified by
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the parameters {@code dstAddress} and {@code dstPort}. On the local
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * endpoint the socket is bound to the given address {@code localAddress} on
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * port {@code localPort}.
322f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param dstAddress
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target host address to connect to.
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param dstPort
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port on the target host to connect to.
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param localAddress
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the address on the local host to bind to.
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param localPort
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port on the local host to bind to.
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while creating the socket.
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SecurityException
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a security manager exists and it denies the permission to
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connect to the given address and port.
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Socket(InetAddress dstAddress, int dstPort,
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InetAddress localAddress, int localPort) throws IOException {
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this();
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkDestination(dstAddress, dstPort);
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        startupSocket(dstAddress, dstPort, localAddress, localPort, true);
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new streaming or datagram socket connected to the target host
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified by the parameters {@code addr} and {@code port}. The socket is
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * bound to any available port on the local host.
348f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param addr
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the Internet address to connect to.
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param port
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port on the target host to connect to.
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param streaming
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            if {@code true} a streaming socket is returned, a datagram
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            socket otherwise.
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while creating the socket.
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SecurityException
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a security manager exists and it denies the permission to
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connect to the given address and port.
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @deprecated Use {@code Socket(InetAddress, int)} instead of this for
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             streaming sockets or an appropriate constructor of {@code
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             DatagramSocket} for UDP transport.
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Deprecated
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Socket(InetAddress addr, int port, boolean streaming)
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException {
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this();
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkDestination(addr, port);
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        startupSocket(addr, port, null, 0, streaming);
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an unconnected socket with the given socket implementation.
375f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param anImpl
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the socket implementation to be used.
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while creating the socket.
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Socket(SocketImpl anImpl) throws SocketException {
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl = anImpl;
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Checks whether the connection destination satisfies the security policy
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and the validity of the port range.
388f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param destAddr
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the destination host address.
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param dstPort
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port on the destination host.
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    void checkDestination(InetAddress destAddr, int dstPort) {
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (dstPort < 0 || dstPort > 65535) {
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Msg.getString("K0032")); //$NON-NLS-1$
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-changed
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkConnectPermission(destAddr.getHostAddress(), dstPort);
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-changed
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Checks whether the connection destination satisfies the security policy.
405f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param hostname
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the destination hostname.
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param dstPort
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port on the destination host.
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void checkConnectPermission(String hostname, int dstPort) {
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SecurityManager security = System.getSecurityManager();
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (security != null) {
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            security.checkConnect(hostname, dstPort);
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Closes the socket. It is not possible to reconnect or rebind to this
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * socket thereafter which means a new socket instance has to be created.
421f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while closing the socket.
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void close() throws IOException {
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isClosed = true;
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.close();
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the IP address of the target host this socket is connected to.
432f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the IP address of the connected target host or {@code null} if
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         this socket is not yet connected.
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public InetAddress getInetAddress() {
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isConnected()) {
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return impl.getInetAddress();
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets an input stream to read data from this socket.
445f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the byte-oriented input stream.
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while creating the input stream or the
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             socket is in an invalid state.
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public InputStream getInputStream() throws IOException {
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(false);
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isInputShutdown()) {
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SocketException(Msg.getString("K0321")); //$NON-NLS-1$
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return impl.getInputStream();
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the setting of the socket option {@code SocketOptions.SO_KEEPALIVE}.
461f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the {@code SocketOptions.SO_KEEPALIVE} is
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         enabled, {@code false} otherwise.
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while reading the socket option.
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#SO_KEEPALIVE
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getKeepAlive() throws SocketException {
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((Boolean) impl.getOption(SocketOptions.SO_KEEPALIVE))
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .booleanValue();
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the local IP address this socket is bound to.
476f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the local IP address of this socket or {@code InetAddress.ANY} if
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         the socket is unbound.
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public InetAddress getLocalAddress() {
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isBound()) {
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return InetAddress.ANY;
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Platform.getNetworkSystem().getSocketLocalAddress(impl.fd,
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                InetAddress.preferIPv6Addresses());
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the local port this socket is bound to.
490f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the local port of this socket or {@code -1} if the socket is
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         unbound.
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getLocalPort() {
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isBound()) {
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return -1;
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return impl.getLocalPort();
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets an output stream to write data into this socket.
503f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the byte-oriented output stream.
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while creating the output stream or the
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             socket is in an invalid state.
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public OutputStream getOutputStream() throws IOException {
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(false);
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isOutputShutdown()) {
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SocketException(Msg.getString("KA00f")); //$NON-NLS-1$
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return impl.getOutputStream();
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the port number of the target host this socket is connected to.
519f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the port number of the connected target host or {@code 0} if this
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         socket is not yet connected.
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getPort() {
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isConnected()) {
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return impl.getPort();
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the value of the socket option {@code SocketOptions.SO_LINGER}.
532f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the current value of the option {@code SocketOptions.SO_LINGER}
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         or {@code -1} if this option is disabled.
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while reading the socket option.
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#SO_LINGER
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getSoLinger() throws SocketException {
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((Integer) impl.getOption(SocketOptions.SO_LINGER)).intValue();
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the receive buffer size of this socket.
546f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the current value of the option {@code SocketOptions.SO_RCVBUF}.
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while reading the socket option.
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#SO_RCVBUF
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized int getReceiveBufferSize() throws SocketException {
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((Integer) impl.getOption(SocketOptions.SO_RCVBUF)).intValue();
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the send buffer size of this socket.
559f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the current value of the option {@code SocketOptions.SO_SNDBUF}.
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while reading the socket option.
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#SO_SNDBUF
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized int getSendBufferSize() throws SocketException {
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((Integer) impl.getOption(SocketOptions.SO_SNDBUF)).intValue();
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the timeout for this socket during which a reading operation shall
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * block while waiting for data.
573f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the current value of the option {@code SocketOptions.SO_TIMEOUT}
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         or {@code 0} which represents an infinite timeout.
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while reading the socket option.
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#SO_TIMEOUT
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized int getSoTimeout() throws SocketException {
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((Integer) impl.getOption(SocketOptions.SO_TIMEOUT)).intValue();
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the setting of the socket option {@code SocketOptions.TCP_NODELAY}.
587f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the {@code SocketOptions.TCP_NODELAY} is enabled,
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} otherwise.
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while reading the socket option.
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#TCP_NODELAY
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getTcpNoDelay() throws SocketException {
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((Boolean) impl.getOption(SocketOptions.TCP_NODELAY))
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .booleanValue();
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the state of the {@code SocketOptions.SO_KEEPALIVE} for this socket.
602f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the state whether this option is enabled or not.
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while setting the option.
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#SO_KEEPALIVE
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setKeepAlive(boolean value) throws SocketException {
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (impl != null) {
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            checkClosedAndCreate(true);
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            impl.setOption(SocketOptions.SO_KEEPALIVE, value ? Boolean.TRUE
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    : Boolean.FALSE);
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the internal factory for creating socket implementations. This may
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * only be executed once during the lifetime of the application.
620f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param fac
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the socket implementation factory to be set.
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the factory has been already set.
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static synchronized void setSocketImplFactory(SocketImplFactory fac)
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException {
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SecurityManager security = System.getSecurityManager();
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (security != null) {
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            security.checkSetFactory();
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (factory != null) {
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SocketException(Msg.getString("K0044")); //$NON-NLS-1$
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        factory = fac;
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the send buffer size of this socket.
640f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param size
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the buffer size in bytes. This value must be a positive number
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            greater than {@code 0}.
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while setting the size or the given value
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             is an invalid size.
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#SO_SNDBUF
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void setSendBufferSize(int size) throws SocketException {
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (size < 1) {
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Msg.getString("K0035")); //$NON-NLS-1$
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.setOption(SocketOptions.SO_SNDBUF, Integer.valueOf(size));
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the receive buffer size of this socket.
659f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param size
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the buffer size in bytes. This value must be a positive number
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            greater than {@code 0}.
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while setting the size or the given value
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             is an invalid size.
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#SO_RCVBUF
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void setReceiveBufferSize(int size)
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws SocketException {
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (size < 1) {
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Msg.getString("K0035")); //$NON-NLS-1$
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.setOption(SocketOptions.SO_RCVBUF, Integer.valueOf(size));
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the state of the {@code SocketOptions.SO_LINGER} with the given
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * timeout in seconds. The timeout value for this option is silently limited
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the maximum of {@code 65535}.
681f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param on
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the state whether this option is enabled or not.
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param timeout
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the linger timeout value in seconds.
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while setting the option.
688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#SO_LINGER
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setSoLinger(boolean on, int timeout) throws SocketException {
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (on && timeout < 0) {
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Msg.getString("K0045")); //$NON-NLS-1$
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-changed
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /*
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The spec indicates that the right way to turn off an option
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * is to pass Boolean.FALSE, so that's what we do here.
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (on) {
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (timeout > 65535) {
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                timeout = 65535;
703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            impl.setOption(SocketOptions.SO_LINGER, Integer.valueOf(timeout));
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            impl.setOption(SocketOptions.SO_LINGER, Boolean.FALSE);
707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-changed
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the reading timeout in milliseconds for this socket. The read
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * operation will block indefinitely if this option value is set to {@code
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 0}. The timeout must be set before calling the read operation. A
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code SocketTimeoutException} is thrown when this timeout expires.
716f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param timeout
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the reading timeout value as number greater than {@code 0} or
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code 0} for an infinite timeout.
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while setting the option.
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#SO_TIMEOUT
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void setSoTimeout(int timeout) throws SocketException {
725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (timeout < 0) {
727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Msg.getString("K0036")); //$NON-NLS-1$
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.setOption(SocketOptions.SO_TIMEOUT, Integer.valueOf(timeout));
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the state of the {@code SocketOptions.TCP_NODELAY} for this socket.
734f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param on
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the state whether this option is enabled or not.
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while setting the option.
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#TCP_NODELAY
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setTcpNoDelay(boolean on) throws SocketException {
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.setOption(SocketOptions.TCP_NODELAY, Boolean.valueOf(on));
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a stream socket, binds it to the nominated local address/port,
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * then connects it to the nominated destination address/port.
749f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param dstAddress
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the destination host address.
752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param dstPort
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port on the destination host.
754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param localAddress
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the address on the local machine to bind.
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param localPort
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port on the local machine to bind.
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             thrown if an error occurs during the bind or connect
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             operations.
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    void startupSocket(InetAddress dstAddress, int dstPort,
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InetAddress localAddress, int localPort, boolean streaming)
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException {
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (localPort < 0 || localPort > 65535) {
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Msg.getString("K0046")); //$NON-NLS-1$
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InetAddress addr = localAddress == null ? InetAddress.ANY
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                : localAddress;
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (this) {
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            impl.create(streaming);
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            isCreated = true;
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (!streaming || !NetUtil.usingSocks(proxy)) {
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    impl.bind(addr, localPort);
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                isBound = true;
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                impl.connect(dstAddress, dstPort);
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                isConnected = true;
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException e) {
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                impl.close();
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw e;
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code String} containing a concise, human-readable description of the
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * socket.
792f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the textual representation of this socket.
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isConnected()) {
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return "Socket[unconnected]"; //$NON-NLS-1$
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return impl.toString();
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Closes the input stream of this socket. Any further data sent to this
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * socket will be discarded. Reading from this socket after this method has
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * been called will return the value {@code EOF}.
807f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while closing the socket input stream.
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the input stream is already closed.
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void shutdownInput() throws IOException {
814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isInputShutdown()) {
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SocketException(Msg.getString("K0321")); //$NON-NLS-1$
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(false);
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.shutdownInput();
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isInputShutdown = true;
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Closes the output stream of this socket. All buffered data will be sent
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * followed by the termination sequence. Writing to the closed output stream
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will cause an {@code IOException}.
826f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while closing the socket output stream.
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the output stream is already closed.
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void shutdownOutput() throws IOException {
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isOutputShutdown()) {
834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SocketException(Msg.getString("KA00f")); //$NON-NLS-1$
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(false);
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.shutdownOutput();
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isOutputShutdown = true;
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Checks whether the socket is closed, and throws an exception. Otherwise
843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * creates the underlying SocketImpl.
844f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the socket is closed.
847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void checkClosedAndCreate(boolean create) throws SocketException {
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isClosed()) {
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SocketException(Msg.getString("K003d")); //$NON-NLS-1$
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!create) {
853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!isConnected()) {
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new SocketException(Msg.getString("K0320")); //$NON-NLS-1$
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // a connected socket must be created
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            /*
859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * return directly to fix a possible bug, if !create, should return
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * here
861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             */
862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return;
863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isCreated) {
865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return;
866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (this) {
868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (isCreated) {
869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return;
870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                impl.create(true);
873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (SocketException e) {
874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw e;
875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException e) {
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new SocketException(e.toString());
877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            isCreated = true;
879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the local address and port of this socket as a SocketAddress or
884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null} if the socket is unbound. This is useful on multihomed
885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * hosts.
886f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the bound local socket address and port.
888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public SocketAddress getLocalSocketAddress() {
890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isBound()) {
891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new InetSocketAddress(getLocalAddress(), getLocalPort());
894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the remote address and port of this socket as a {@code
898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * SocketAddress} or {@code null} if the socket is not connected.
899f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the remote socket address and port.
901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public SocketAddress getRemoteSocketAddress() {
903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isConnected()) {
904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new InetSocketAddress(getInetAddress(), getPort());
907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns whether this socket is bound to a local address and port.
911f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the socket is bound to a local address, {@code
913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         false} otherwise.
914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isBound() {
916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isBound;
917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns whether this socket is connected to a remote host.
921f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the socket is connected, {@code false} otherwise.
923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isConnected() {
925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isConnected;
926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns whether this socket is closed.
930f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the socket is closed, {@code false} otherwise.
932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isClosed() {
934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isClosed;
935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Binds this socket to the given local host address and port specified by
939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the SocketAddress {@code localAddr}. If {@code localAddr} is set to
940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null}, this socket will be bound to an available local address on
941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * any free port.
942f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param localAddr
944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the specific address and port on the local machine to bind to.
945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the given SocketAddress is invalid or not supported.
947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the socket is already bound or an error occurs while
949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             binding.
950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void bind(SocketAddress localAddr) throws IOException {
952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isBound()) {
954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BindException(Msg.getString("K0315")); //$NON-NLS-1$
955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 0;
958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InetAddress addr = InetAddress.ANY;
959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (localAddr != null) {
960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!(localAddr instanceof InetSocketAddress)) {
961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IllegalArgumentException(Msg.getString(
962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        "K0316", localAddr.getClass())); //$NON-NLS-1$
963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InetSocketAddress inetAddr = (InetSocketAddress) localAddr;
965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((addr = inetAddr.getAddress()) == null) {
966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new SocketException(Msg.getString(
967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        "K0317", inetAddr.getHostName())); //$NON-NLS-1$
968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
969adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            port = inetAddr.getPort();
970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (this) {
973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                impl.bind(addr, port);
975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                isBound = true;
976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException e) {
977adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                impl.close();
978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw e;
979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Connects this socket to the given remote host address and port specified
985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * by the SocketAddress {@code remoteAddr}.
986f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
987adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param remoteAddr
988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the address and port of the remote host to connect to.
989adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the given SocketAddress is invalid or not supported.
991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the socket is already connected or an error occurs while
993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connecting.
994adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void connect(SocketAddress remoteAddr) throws IOException {
996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        connect(remoteAddr, 0);
997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Connects this socket to the given remote host address and port specified
1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * by the SocketAddress {@code remoteAddr} with the specified timeout. The
1002adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * connecting method will block until the connection is established or an
1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * error occurred.
1004f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param remoteAddr
1006adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the address and port of the remote host to connect to.
1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param timeout
1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the timeout value in milliseconds or {@code 0} for an infinite
1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            timeout.
1010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
1011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the given SocketAddress is invalid or not supported or the
1012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             timeout value is negative.
1013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
1014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the socket is already connected or an error occurs while
1015adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connecting.
1016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void connect(SocketAddress remoteAddr, int timeout)
1018adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException {
1019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
1020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (timeout < 0) {
1021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Msg.getString("K0036")); //$NON-NLS-1$
1022adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1023adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isConnected()) {
1024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SocketException(Msg.getString("K0079")); //$NON-NLS-1$
1025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (remoteAddr == null) {
1027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Msg.getString("K0318")); //$NON-NLS-1$
1028adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1029adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1030adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(remoteAddr instanceof InetSocketAddress)) {
1031adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Msg.getString(
1032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    "K0316", remoteAddr.getClass())); //$NON-NLS-1$
1033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InetSocketAddress inetAddr = (InetSocketAddress) remoteAddr;
1035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InetAddress addr;
1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((addr = inetAddr.getAddress()) == null) {
1037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new UnknownHostException(Msg.getString("K0317", remoteAddr));//$NON-NLS-1$
1038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = inetAddr.getPort();
1040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkDestination(addr, port);
1042adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (connectLock) {
1043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
1044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (!isBound()) {
1045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // socket allready created at this point by earlier call or
1046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // checkClosedAndCreate this caused us to lose socket
1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // options on create
1048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // impl.create(true);
1049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (!NetUtil.usingSocks(proxy)) {
1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        impl.bind(InetAddress.ANY, 0);
1051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
1052adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    isBound = true;
1053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
1054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                impl.connect(remoteAddr, timeout);
1055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                isConnected = true;
1056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException e) {
1057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                impl.close();
1058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw e;
1059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1061adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1062adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns whether the incoming channel of the socket has already been
1065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * closed.
1066f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1067adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if reading from this socket is not possible anymore,
1068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} otherwise.
1069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isInputShutdown() {
1071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isInputShutdown;
1072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1073adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1075f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Returns whether the outgoing channel of the socket has already been
1076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * closed.
1077f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if writing to this socket is not possible anymore,
1079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} otherwise.
1080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isOutputShutdown() {
1082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isOutputShutdown;
1083adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1085adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1086adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the state of the {@code SocketOptions.SO_REUSEADDR} for this socket.
1087f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1088adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param reuse
1089adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the state whether this option is enabled or not.
1090adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
1091adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while setting the option.
1092adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#SO_REUSEADDR
1093adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1094adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setReuseAddress(boolean reuse) throws SocketException {
1095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
1096adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.setOption(SocketOptions.SO_REUSEADDR, reuse ? Boolean.TRUE
1097adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                : Boolean.FALSE);
1098adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1099adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the setting of the socket option {@code SocketOptions.SO_REUSEADDR}.
1102f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the {@code SocketOptions.SO_REUSEADDR} is
1104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         enabled, {@code false} otherwise.
1105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
1106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while reading the socket option.
1107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#SO_REUSEADDR
1108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getReuseAddress() throws SocketException {
1110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
1111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((Boolean) impl.getOption(SocketOptions.SO_REUSEADDR))
1112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .booleanValue();
1113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the state of the {@code SocketOptions.SO_OOBINLINE} for this socket.
1117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * When this option is enabled urgent data can be received in-line with
1118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * normal data.
1119f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param oobinline
1121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            whether this option is enabled or not.
1122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
1123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while setting the option.
1124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#SO_OOBINLINE
1125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setOOBInline(boolean oobinline) throws SocketException {
1127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
1128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.setOption(SocketOptions.SO_OOBINLINE, oobinline ? Boolean.TRUE
1129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                : Boolean.FALSE);
1130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the setting of the socket option {@code SocketOptions.SO_OOBINLINE}.
1134f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the {@code SocketOptions.SO_OOBINLINE} is
1136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         enabled, {@code false} otherwise.
1137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
1138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while reading the socket option.
1139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#SO_OOBINLINE
1140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getOOBInline() throws SocketException {
1142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
1143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((Boolean) impl.getOption(SocketOptions.SO_OOBINLINE))
1144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .booleanValue();
1145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the value of the {@code SocketOptions.IP_TOS} for this socket. See
1149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the specification RFC 1349 for more information about the type of service
1150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * field.
1151f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value to be set for this option with a valid range of
1154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code 0-255}.
1155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
1156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while setting the option.
1157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#IP_TOS
1158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setTrafficClass(int value) throws SocketException {
1160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
1161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (value < 0 || value > 255) {
1162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
1163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.setOption(SocketOptions.IP_TOS, Integer.valueOf(value));
1165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the value of the socket option {@code SocketOptions.IP_TOS}.
1169f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value which represents the type of service.
1171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
1172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while reading the socket option.
1173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketOptions#IP_TOS
1174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getTrafficClass() throws SocketException {
1176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
1177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((Number) impl.getOption(SocketOptions.IP_TOS)).intValue();
1178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sends the given single byte data which is represented by the lowest octet
1182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of {@code value} as "TCP urgent data".
1183f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
1185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the byte of urgent data to be sent.
1186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
1187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while sending urgent data.
1188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void sendUrgentData(int value) throws IOException {
1190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!impl.supportsUrgentData()) {
1191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SocketException(Msg.getString("K0333")); //$NON-NLS-1$
1192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.sendUrgentData(value);
1194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Set the appropriate flags for a socket created by {@code
1198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ServerSocket.accept()}.
1199f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see ServerSocket#implAccept
1201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    void accepted() {
1203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isCreated = isBound = isConnected = true;
1204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static boolean preferIPv4Stack() {
1207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String result = AccessController.doPrivileged(new PriviAction<String>(
1208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                "java.net.preferIPv4Stack")); //$NON-NLS-1$
1209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return "true".equals(result); //$NON-NLS-1$
1210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the SocketChannel of this socket, if one is available. The current
1214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation of this method returns always {@code null}.
1215f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the related SocketChannel or {@code null} if no channel exists.
1217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public SocketChannel getChannel() {
1219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
1220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets performance preferences for connectionTime, latency and bandwidth.
1224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
1225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This method does currently nothing.
1226f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param connectionTime
1228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value representing the importance of a short connecting
1229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            time.
1230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param latency
1231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value representing the importance of low latency.
1232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param bandwidth
1233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value representing the importance of high bandwidth.
1234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setPerformancePreferences(int connectionTime, int latency,
1236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int bandwidth) {
1237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Our socket implementation only provide one protocol: TCP/IP, so
1238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // we do nothing for this method
1239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
1241