100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville/*
200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville * Copyright (C) 2010 The Android Open Source Project
300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville *
400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville * you may not use this file except in compliance with the License.
600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville * You may obtain a copy of the License at
700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville *
800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville *
1000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville * Unless required by applicable law or agreed to in writing, software
1100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
1200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville * See the License for the specific language governing permissions and
1400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville * limitations under the License.
1500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville */
1600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
1700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Savillepackage android.net;
1800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
1900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Savilleimport android.net.LinkCapabilities;
2000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Savilleimport android.net.LinkProperties;
2100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Savilleimport android.net.LinkSocketNotifier;
2200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
2300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Savilleimport android.util.Log;
2400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
2500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Savilleimport java.io.IOException;
2600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Savilleimport java.net.Socket;
2700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Savilleimport java.net.SocketAddress;
2800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Savilleimport java.net.SocketTimeoutException;
2900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Savilleimport java.net.UnknownHostException;
3000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Savilleimport java.util.HashSet;
3100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Savilleimport java.util.Set;
3200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
3300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville/** @hide */
3400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Savillepublic class LinkSocket extends Socket {
3500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    private final static String TAG = "LinkSocket";
3600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    private final static boolean DBG = true;
3700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
3800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
3900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * Default constructor
4000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
4100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public LinkSocket() {
4200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("LinkSocket() EX");
4300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
4400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
4500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
4600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * Creates a new unconnected socket.
4700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @param notifier a reference to a class that implements {@code LinkSocketNotifier}
4800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
4900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public LinkSocket(LinkSocketNotifier notifier) {
5000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("LinkSocket(notifier) EX");
5100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
5200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
5300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
5400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * Creates a new unconnected socket usign the given proxy type.
5500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @param notifier a reference to a class that implements {@code LinkSocketNotifier}
5600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @param proxy the specified proxy for this socket
5700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @throws IllegalArgumentException if the argument proxy is null or of an invalid type.
5800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @throws SecurityException if a security manager exists and it denies the permission
5900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     *                           to connect to the given proxy.
6000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
6100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public LinkSocket(LinkSocketNotifier notifier, Proxy proxy) {
6200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("LinkSocket(notifier, proxy) EX");
6300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
6400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
6500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
6600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @return the {@code LinkProperties} for the socket
6700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
6800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public LinkProperties getLinkProperties() {
6900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("LinkProperties() EX");
7000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        return new LinkProperties();
7100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
7200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
7300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
7400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * Set the {@code LinkCapabilies} needed for this socket.  If the socket is already connected
7500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * or is a duplicate socket the request is ignored and {@code false} will
7600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * be returned. A needs map can be created via the {@code createNeedsMap} static
7700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * method.
7800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @param needs the needs of the socket
7900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @return {@code true} if needs are successfully set, {@code false} otherwise
8000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
8100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public boolean setNeededCapabilities(LinkCapabilities needs) {
8200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("setNeeds() EX");
8300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        return false;
8400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
8500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
8600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
8700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @return the LinkCapabilites set by setNeededCapabilities, empty if none has been set
8800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
8900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public LinkCapabilities getNeededCapabilities() {
9000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("getNeeds() EX");
9100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        return null;
9200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
9300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
9400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
9500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @return all of the {@code LinkCapabilities} of the link used by this socket
9600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
9700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public LinkCapabilities getCapabilities() {
9800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("getCapabilities() EX");
9900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        return null;
10000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
10100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
10200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
10300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * Returns this LinkSockets set of capabilities, filtered according to
10400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * the given {@code Set}.  Capabilities in the Set but not available from
10500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * the link will not be reported in the results.  Capabilities of the link
10600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * but not listed in the Set will also not be reported in the results.
10700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @param capabilities {@code Set} of capabilities requested
10800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @return the filtered {@code LinkCapabilities} of this LinkSocket, may be empty
10900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
11000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public LinkCapabilities getCapabilities(Set<Integer> capabilities) {
11100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("getCapabilities(capabilities) EX");
11200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        return new LinkCapabilities();
11300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
11400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
11500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
11600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * Provide the set of capabilities the application is interested in tracking
11700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * for this LinkSocket.
11800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @param capabilities a {@code Set} of capabilities to track
11900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
12000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public void setTrackedCapabilities(Set<Integer> capabilities) {
12100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("setTrackedCapabilities(capabilities) EX");
12200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
12300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
12400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
12500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @return the {@code LinkCapabilities} that are tracked, empty if none has been set.
12600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
12700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public Set<Integer> getTrackedCapabilities() {
12800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("getTrackedCapabilities(capabilities) EX");
12900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        return new HashSet<Integer>();
13000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
13100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
13200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
13300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * Connects this socket to the given remote host address and port specified
13400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * by dstName and dstPort.
13500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @param dstName the address of the remote host to connect to
13600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @param dstPort the port to connect to on the remote host
13700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @param timeout the timeout value in milliseconds or 0 for infinite timeout
13800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @throws UnknownHostException if the given dstName is invalid
13900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @throws IOException if the socket is already connected or an error occurs
14000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     *                     while connecting
14100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @throws SocketTimeoutException if the timeout fires
14200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
14300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public void connect(String dstName, int dstPort, int timeout)
14400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville            throws UnknownHostException, IOException, SocketTimeoutException {
14500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("connect(dstName, dstPort, timeout) EX");
14600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
14700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
14800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
14900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * Connects this socket to the given remote host address and port specified
15000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * by dstName and dstPort.
15100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @param dstName the address of the remote host to connect to
15200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @param dstPort the port to connect to on the remote host
15300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @throws UnknownHostException if the given dstName is invalid
15400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @throws IOException if the socket is already connected or an error occurs
15500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     *                     while connecting
15600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
15700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public void connect(String dstName, int dstPort)
15800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville            throws UnknownHostException, IOException {
15900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("connect(dstName, dstPort, timeout) EX");
16000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
16100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
16200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
16300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * Connects this socket to the given remote host address and port specified
16400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * by the SocketAddress with the specified timeout.
16500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @deprecated Use {@code connect(String dstName, int dstPort, int timeout)}
16600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     *             instead.  Using this method may result in reduced functionality.
16700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @param remoteAddr the address and port of the remote host to connect to
16800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @throws IllegalArgumentException if the given SocketAddress is invalid
16900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @throws IOException if the socket is already connected or an error occurs
17000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     *                     while connecting
17100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @throws SocketTimeoutException if the timeout expires
17200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
17300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    @Override
17400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    @Deprecated
17500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public void connect(SocketAddress remoteAddr, int timeout)
17600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville            throws IOException, SocketTimeoutException {
17700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("connect(remoteAddr, timeout) EX DEPRECATED");
17800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
17900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
18000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
18100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * Connects this socket to the given remote host address and port specified
18200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * by the SocketAddress.
18300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * TODO add comment on all these that the network selection happens during connect
18400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * and may take 30 seconds
18500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @deprecated Use {@code connect(String dstName, int dstPort)}
18600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     *             Using this method may result in reduced functionality.
18700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @param remoteAddr the address and port of the remote host to connect to.
18800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @throws IllegalArgumentException if the SocketAddress is invalid or not supported.
18900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @throws IOException if the socket is already connected or an error occurs
19000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     *                     while connecting
19100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
19200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    @Override
19300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    @Deprecated
19400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public void connect(SocketAddress remoteAddr) throws IOException {
19500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("connect(remoteAddr) EX DEPRECATED");
19600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
19700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
19800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
19900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * Connect a duplicate socket socket to the same remote host address and port
2006e80997a9a7b6a15370544edde322cd8833e9524Wink Saville     * as the original with a timeout parameter.
2016e80997a9a7b6a15370544edde322cd8833e9524Wink Saville     * @param timeout the timeout value in milliseconds or 0 for infinite timeout
2026e80997a9a7b6a15370544edde322cd8833e9524Wink Saville     * @throws IOException if the socket is already connected or an error occurs
2036e80997a9a7b6a15370544edde322cd8833e9524Wink Saville     *                     while connecting
2046e80997a9a7b6a15370544edde322cd8833e9524Wink Saville     */
2056e80997a9a7b6a15370544edde322cd8833e9524Wink Saville    public void connect(int timeout) throws IOException {
2066e80997a9a7b6a15370544edde322cd8833e9524Wink Saville        if (DBG) log("connect(timeout) EX");
2076e80997a9a7b6a15370544edde322cd8833e9524Wink Saville    }
2086e80997a9a7b6a15370544edde322cd8833e9524Wink Saville
2096e80997a9a7b6a15370544edde322cd8833e9524Wink Saville    /**
2106e80997a9a7b6a15370544edde322cd8833e9524Wink Saville     * Connect a duplicate socket socket to the same remote host address and port
21100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * as the original.
21200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @throws IOException if the socket is already connected or an error occurs
21300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     *                     while connecting
21400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
21500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public void connect() throws IOException {
21600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("connect() EX");
21700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
21800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
21900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
22000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * Closes the socket.  It is not possible to reconnect or rebind to this
22100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * socket thereafter which means a new socket instance has to be created.
22200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @throws IOException if an error occurs while closing the socket
22300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
22400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    @Override
22500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public synchronized void close() throws IOException {
22600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("close() EX");
22700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
22800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
22900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
23000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * Request that a new LinkSocket be created using a different radio
23100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * (such as WiFi or 3G) than the current LinkSocket.  If a different
23200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * radio is available a call back will be made via {@code onBetterLinkAvail}.
23300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * If unable to find a better radio, application will be notified via
23400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * {@code onNewLinkUnavailable}
23500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @see LinkSocketNotifier#onBetterLinkAvailable(LinkSocket, LinkSocket)
23600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @param linkRequestReason reason for requesting a new link.
23700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
23800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public void requestNewLink(LinkRequestReason linkRequestReason) {
23900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("requestNewLink(linkRequestReason) EX");
24000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
24100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
24200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
24300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @deprecated LinkSocket will automatically pick the optimum interface
24400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     *             to bind to
24500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @param localAddr the specific address and port on the local machine
24600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     *                  to bind to
24700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * @throws IOException always as this method is deprecated for LinkSocket
24800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
24900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    @Override
25000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    @Deprecated
2516e80997a9a7b6a15370544edde322cd8833e9524Wink Saville    public void bind(SocketAddress localAddr) throws UnsupportedOperationException {
25200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        if (DBG) log("bind(localAddr) EX throws IOException");
2536e80997a9a7b6a15370544edde322cd8833e9524Wink Saville        throw new UnsupportedOperationException("bind is deprecated for LinkSocket");
25400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
25500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
25600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
25700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * Reason codes an application can specify when requesting for a new link.
25800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * TODO: need better documentation
25900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
26000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    public static final class LinkRequestReason {
26100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        /** No constructor */
26200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        private LinkRequestReason() {}
26300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
26400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        /** This link is working properly */
26500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        public static final int LINK_PROBLEM_NONE = 0;
26600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        /** This link has an unknown issue */
26700cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        public static final int LINK_PROBLEM_UNKNOWN = 1;
26800cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
26900cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville
27000cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    /**
27100cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     * Debug logging
27200cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville     */
27300cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    protected static void log(String s) {
27400cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville        Log.d(TAG, s);
27500cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville    }
27600cfe112b436eaafb44c0466ceacce3baf10a8f3Wink Saville}
277