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