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