/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.net; import android.net.LinkCapabilities; import android.net.LinkProperties; import android.net.LinkSocketNotifier; import android.util.Log; import java.io.IOException; import java.net.Socket; import java.net.SocketAddress; import java.net.SocketTimeoutException; import java.net.UnknownHostException; import java.util.HashSet; import java.util.Set; /** @hide */ public class LinkSocket extends Socket { private final static String TAG = "LinkSocket"; private final static boolean DBG = true; /** * Default constructor */ public LinkSocket() { if (DBG) log("LinkSocket() EX"); } /** * Creates a new unconnected socket. * @param notifier a reference to a class that implements {@code LinkSocketNotifier} */ public LinkSocket(LinkSocketNotifier notifier) { if (DBG) log("LinkSocket(notifier) EX"); } /** * Creates a new unconnected socket usign the given proxy type. * @param notifier a reference to a class that implements {@code LinkSocketNotifier} * @param proxy the specified proxy for this socket * @throws IllegalArgumentException if the argument proxy is null or of an invalid type. * @throws SecurityException if a security manager exists and it denies the permission * to connect to the given proxy. */ public LinkSocket(LinkSocketNotifier notifier, Proxy proxy) { if (DBG) log("LinkSocket(notifier, proxy) EX"); } /** * @return the {@code LinkProperties} for the socket */ public LinkProperties getLinkProperties() { if (DBG) log("LinkProperties() EX"); return new LinkProperties(); } /** * Set the {@code LinkCapabilies} needed for this socket. If the socket is already connected * or is a duplicate socket the request is ignored and {@code false} will * be returned. A needs map can be created via the {@code createNeedsMap} static * method. * @param needs the needs of the socket * @return {@code true} if needs are successfully set, {@code false} otherwise */ public boolean setNeededCapabilities(LinkCapabilities needs) { if (DBG) log("setNeeds() EX"); return false; } /** * @return the LinkCapabilites set by setNeededCapabilities, empty if none has been set */ public LinkCapabilities getNeededCapabilities() { if (DBG) log("getNeeds() EX"); return null; } /** * @return all of the {@code LinkCapabilities} of the link used by this socket */ public LinkCapabilities getCapabilities() { if (DBG) log("getCapabilities() EX"); return null; } /** * Returns this LinkSockets set of capabilities, filtered according to * the given {@code Set}. Capabilities in the Set but not available from * the link will not be reported in the results. Capabilities of the link * but not listed in the Set will also not be reported in the results. * @param capabilities {@code Set} of capabilities requested * @return the filtered {@code LinkCapabilities} of this LinkSocket, may be empty */ public LinkCapabilities getCapabilities(Set capabilities) { if (DBG) log("getCapabilities(capabilities) EX"); return new LinkCapabilities(); } /** * Provide the set of capabilities the application is interested in tracking * for this LinkSocket. * @param capabilities a {@code Set} of capabilities to track */ public void setTrackedCapabilities(Set capabilities) { if (DBG) log("setTrackedCapabilities(capabilities) EX"); } /** * @return the {@code LinkCapabilities} that are tracked, empty if none has been set. */ public Set getTrackedCapabilities() { if (DBG) log("getTrackedCapabilities(capabilities) EX"); return new HashSet(); } /** * Connects this socket to the given remote host address and port specified * by dstName and dstPort. * @param dstName the address of the remote host to connect to * @param dstPort the port to connect to on the remote host * @param timeout the timeout value in milliseconds or 0 for infinite timeout * @throws UnknownHostException if the given dstName is invalid * @throws IOException if the socket is already connected or an error occurs * while connecting * @throws SocketTimeoutException if the timeout fires */ public void connect(String dstName, int dstPort, int timeout) throws UnknownHostException, IOException, SocketTimeoutException { if (DBG) log("connect(dstName, dstPort, timeout) EX"); } /** * Connects this socket to the given remote host address and port specified * by dstName and dstPort. * @param dstName the address of the remote host to connect to * @param dstPort the port to connect to on the remote host * @throws UnknownHostException if the given dstName is invalid * @throws IOException if the socket is already connected or an error occurs * while connecting */ public void connect(String dstName, int dstPort) throws UnknownHostException, IOException { if (DBG) log("connect(dstName, dstPort, timeout) EX"); } /** * Connects this socket to the given remote host address and port specified * by the SocketAddress with the specified timeout. * @deprecated Use {@code connect(String dstName, int dstPort, int timeout)} * instead. Using this method may result in reduced functionality. * @param remoteAddr the address and port of the remote host to connect to * @throws IllegalArgumentException if the given SocketAddress is invalid * @throws IOException if the socket is already connected or an error occurs * while connecting * @throws SocketTimeoutException if the timeout expires */ @Override @Deprecated public void connect(SocketAddress remoteAddr, int timeout) throws IOException, SocketTimeoutException { if (DBG) log("connect(remoteAddr, timeout) EX DEPRECATED"); } /** * Connects this socket to the given remote host address and port specified * by the SocketAddress. * TODO add comment on all these that the network selection happens during connect * and may take 30 seconds * @deprecated Use {@code connect(String dstName, int dstPort)} * Using this method may result in reduced functionality. * @param remoteAddr the address and port of the remote host to connect to. * @throws IllegalArgumentException if the SocketAddress is invalid or not supported. * @throws IOException if the socket is already connected or an error occurs * while connecting */ @Override @Deprecated public void connect(SocketAddress remoteAddr) throws IOException { if (DBG) log("connect(remoteAddr) EX DEPRECATED"); } /** * Connect a duplicate socket socket to the same remote host address and port * as the original with a timeout parameter. * @param timeout the timeout value in milliseconds or 0 for infinite timeout * @throws IOException if the socket is already connected or an error occurs * while connecting */ public void connect(int timeout) throws IOException { if (DBG) log("connect(timeout) EX"); } /** * Connect a duplicate socket socket to the same remote host address and port * as the original. * @throws IOException if the socket is already connected or an error occurs * while connecting */ public void connect() throws IOException { if (DBG) log("connect() EX"); } /** * Closes the socket. It is not possible to reconnect or rebind to this * socket thereafter which means a new socket instance has to be created. * @throws IOException if an error occurs while closing the socket */ @Override public synchronized void close() throws IOException { if (DBG) log("close() EX"); } /** * Request that a new LinkSocket be created using a different radio * (such as WiFi or 3G) than the current LinkSocket. If a different * radio is available a call back will be made via {@code onBetterLinkAvail}. * If unable to find a better radio, application will be notified via * {@code onNewLinkUnavailable} * @see LinkSocketNotifier#onBetterLinkAvailable(LinkSocket, LinkSocket) * @param linkRequestReason reason for requesting a new link. */ public void requestNewLink(LinkRequestReason linkRequestReason) { if (DBG) log("requestNewLink(linkRequestReason) EX"); } /** * @deprecated LinkSocket will automatically pick the optimum interface * to bind to * @param localAddr the specific address and port on the local machine * to bind to * @throws IOException always as this method is deprecated for LinkSocket */ @Override @Deprecated public void bind(SocketAddress localAddr) throws UnsupportedOperationException { if (DBG) log("bind(localAddr) EX throws IOException"); throw new UnsupportedOperationException("bind is deprecated for LinkSocket"); } /** * Reason codes an application can specify when requesting for a new link. * TODO: need better documentation */ public static final class LinkRequestReason { /** No constructor */ private LinkRequestReason() {} /** This link is working properly */ public static final int LINK_PROBLEM_NONE = 0; /** This link has an unknown issue */ public static final int LINK_PROBLEM_UNKNOWN = 1; } /** * Debug logging */ protected static void log(String s) { Log.d(TAG, s); } }