19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19065b299df4159602327977dd007cb2cd6b64ab20Jeff Sharkeyimport java.io.Closeable; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.SocketOptions; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a (non-server) socket in the UNIX-domain namespace. The interface 28bf0dc0fba790cf95f76870c37469703f8f20a57cNeil Fuller * here is not entirely unlike that of java.net.Socket. This class and the streams 29bf0dc0fba790cf95f76870c37469703f8f20a57cNeil Fuller * returned from it may be used from multiple threads. 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31065b299df4159602327977dd007cb2cd6b64ab20Jeff Sharkeypublic class LocalSocket implements Closeable { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33d8e34a6a0d0200a74aec022bf16db8a1b4f8a85fIan Rogers private final LocalSocketImpl impl; 347fd724611b8113c7f584c603d14fd44071cad799Neil Fuller /** false if impl.create() needs to be called */ 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private volatile boolean implCreated; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private LocalSocketAddress localAddress; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean isBound; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean isConnected; 39e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood private final int sockType; 40e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood 41e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood /** unknown socket type (used for constructor with existing file descriptor) */ 42e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood /* package */ static final int SOCKET_UNKNOWN = 0; 43e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood /** Datagram socket type */ 44e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood public static final int SOCKET_DGRAM = 1; 45e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood /** Stream socket type */ 46e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood public static final int SOCKET_STREAM = 2; 47e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood /** Sequential packet socket type */ 48e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood public static final int SOCKET_SEQPACKET = 3; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a AF_LOCAL/UNIX domain stream socket. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LocalSocket() { 54e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood this(SOCKET_STREAM); 55e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood } 56e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood 57e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood /** 58e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood * Creates a AF_LOCAL/UNIX domain stream socket with given socket type 59e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood * 60e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood * @param sockType either {@link #SOCKET_DGRAM}, {@link #SOCKET_STREAM} 61e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood * or {@link #SOCKET_SEQPACKET} 62e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood */ 63e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood public LocalSocket(int sockType) { 64e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood this(new LocalSocketImpl(), sockType); 653b147b770269173d5d711d6c33f142dc5e723824zzy } 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 67b08c7bc0bdc48ae95be2697ca27ea89a9dd92c3eNeil Fuller private LocalSocket(LocalSocketImpl impl, int sockType) { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.impl = impl; 69e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood this.sockType = sockType; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.isConnected = false; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.isBound = false; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 74b08c7bc0bdc48ae95be2697ca27ea89a9dd92c3eNeil Fuller /** 757fd724611b8113c7f584c603d14fd44071cad799Neil Fuller * Creates a LocalSocket instances using the FileDescriptor for an already-connected 767fd724611b8113c7f584c603d14fd44071cad799Neil Fuller * AF_LOCAL/UNIX domain stream socket. Note: the FileDescriptor must be closed by the caller: 777fd724611b8113c7f584c603d14fd44071cad799Neil Fuller * closing the LocalSocket will not close it. 787fd724611b8113c7f584c603d14fd44071cad799Neil Fuller * 797fd724611b8113c7f584c603d14fd44071cad799Neil Fuller * @hide - used by BluetoothSocket. 807fd724611b8113c7f584c603d14fd44071cad799Neil Fuller */ 817fd724611b8113c7f584c603d14fd44071cad799Neil Fuller public static LocalSocket createConnectedLocalSocket(FileDescriptor fd) { 827fd724611b8113c7f584c603d14fd44071cad799Neil Fuller return createConnectedLocalSocket(new LocalSocketImpl(fd), SOCKET_UNKNOWN); 837fd724611b8113c7f584c603d14fd44071cad799Neil Fuller } 847fd724611b8113c7f584c603d14fd44071cad799Neil Fuller 857fd724611b8113c7f584c603d14fd44071cad799Neil Fuller /** 86b08c7bc0bdc48ae95be2697ca27ea89a9dd92c3eNeil Fuller * for use with LocalServerSocket.accept() 87b08c7bc0bdc48ae95be2697ca27ea89a9dd92c3eNeil Fuller */ 887fd724611b8113c7f584c603d14fd44071cad799Neil Fuller static LocalSocket createLocalSocketForAccept(LocalSocketImpl impl) { 897fd724611b8113c7f584c603d14fd44071cad799Neil Fuller return createConnectedLocalSocket(impl, SOCKET_UNKNOWN); 907fd724611b8113c7f584c603d14fd44071cad799Neil Fuller } 917fd724611b8113c7f584c603d14fd44071cad799Neil Fuller 927fd724611b8113c7f584c603d14fd44071cad799Neil Fuller /** 937fd724611b8113c7f584c603d14fd44071cad799Neil Fuller * Creates a LocalSocket from an existing LocalSocketImpl that is already connected. 947fd724611b8113c7f584c603d14fd44071cad799Neil Fuller */ 957fd724611b8113c7f584c603d14fd44071cad799Neil Fuller private static LocalSocket createConnectedLocalSocket(LocalSocketImpl impl, int sockType) { 96b08c7bc0bdc48ae95be2697ca27ea89a9dd92c3eNeil Fuller LocalSocket socket = new LocalSocket(impl, sockType); 97b08c7bc0bdc48ae95be2697ca27ea89a9dd92c3eNeil Fuller socket.isConnected = true; 98b08c7bc0bdc48ae95be2697ca27ea89a9dd92c3eNeil Fuller socket.isBound = true; 99b08c7bc0bdc48ae95be2697ca27ea89a9dd92c3eNeil Fuller socket.implCreated = true; 100b08c7bc0bdc48ae95be2697ca27ea89a9dd92c3eNeil Fuller return socket; 101b08c7bc0bdc48ae95be2697ca27ea89a9dd92c3eNeil Fuller } 102b08c7bc0bdc48ae95be2697ca27ea89a9dd92c3eNeil Fuller 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@inheritDoc} */ 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.toString() + " impl:" + impl; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It's difficult to discern from the spec when impl.create() should be 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * called, but it seems like a reasonable rule is "as soon as possible, 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but not in a context where IOException cannot be thrown" 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException from SocketImpl.create() 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void implCreateIfNeeded() throws IOException { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!implCreated) { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!implCreated) { 120c59a66238261778b3fbc496e9b21dfa043ee9160Jesse Wilson try { 121e7d309a929bf87a5752cd1fb2d48c72e47a671a2Mike Lockwood impl.create(sockType); 122c59a66238261778b3fbc496e9b21dfa043ee9160Jesse Wilson } finally { 123c59a66238261778b3fbc496e9b21dfa043ee9160Jesse Wilson implCreated = true; 124c59a66238261778b3fbc496e9b21dfa043ee9160Jesse Wilson } 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Connects this socket to an endpoint. May only be called on an instance 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that has not yet been connected. 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param endpoint endpoint address 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException if socket is in invalid state or the address does 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not exist. 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void connect(LocalSocketAddress endpoint) throws IOException { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isConnected) { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("already connected"); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project implCreateIfNeeded(); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project impl.connect(endpoint, 0); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isConnected = true; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isBound = true; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Binds this socket to an endpoint name. May only be called on an instance 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that has not yet been bound. 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bindpoint endpoint address 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void bind(LocalSocketAddress bindpoint) throws IOException { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project implCreateIfNeeded(); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isBound) { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IOException("already bound"); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project localAddress = bindpoint; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project impl.bind(localAddress); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isBound = true; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves the name that this socket is bound to, if any. 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Local address or null if anonymous 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LocalSocketAddress getLocalSocketAddress() { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return localAddress; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves the input stream for this instance. 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return input stream 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException if socket has been closed or cannot be created. 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputStream getInputStream() throws IOException { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project implCreateIfNeeded(); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return impl.getInputStream(); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves the output stream for this instance. 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return output stream 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException if socket has been closed or cannot be created. 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public OutputStream getOutputStream() throws IOException { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project implCreateIfNeeded(); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return impl.getOutputStream(); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Closes the socket. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 208065b299df4159602327977dd007cb2cd6b64ab20Jeff Sharkey @Override 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void close() throws IOException { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project implCreateIfNeeded(); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project impl.close(); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Shuts down the input side of the socket. 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void shutdownInput() throws IOException { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project implCreateIfNeeded(); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project impl.shutdownInput(); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Shuts down the output side of the socket. 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void shutdownOutput() throws IOException { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project implCreateIfNeeded(); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project impl.shutdownOutput(); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2337a8c36aa4e6a1b5e48f0ee5a787f10bcfece7587Ajay Panicker 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setReceiveBufferSize(int size) throws IOException { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project impl.setOption(SocketOptions.SO_RCVBUF, Integer.valueOf(size)); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2377a8c36aa4e6a1b5e48f0ee5a787f10bcfece7587Ajay Panicker 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getReceiveBufferSize() throws IOException { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((Integer) impl.getOption(SocketOptions.SO_RCVBUF)).intValue(); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSoTimeout(int n) throws IOException { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project impl.setOption(SocketOptions.SO_TIMEOUT, Integer.valueOf(n)); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2457a8c36aa4e6a1b5e48f0ee5a787f10bcfece7587Ajay Panicker 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSoTimeout() throws IOException { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((Integer) impl.getOption(SocketOptions.SO_TIMEOUT)).intValue(); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSendBufferSize(int n) throws IOException { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project impl.setOption(SocketOptions.SO_SNDBUF, Integer.valueOf(n)); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2537a8c36aa4e6a1b5e48f0ee5a787f10bcfece7587Ajay Panicker 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSendBufferSize() throws IOException { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((Integer) impl.getOption(SocketOptions.SO_SNDBUF)).intValue(); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //???SEC 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LocalSocketAddress getRemoteSocketAddress() { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //???SEC 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized boolean isConnected() { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return isConnected; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //???SEC 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isClosed() { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //???SEC 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized boolean isBound() { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return isBound; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //???SEC 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOutputShutdown() { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //???SEC 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isInputShutdown() { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //???SEC 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void connect(LocalSocketAddress endpoint, int timeout) 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enqueues a set of file descriptors to send to the peer. The queue 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is one deep. The file descriptors will be sent with the next write 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of normal data, and will be delivered in a single ancillary message. 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See "man 7 unix" SCM_RIGHTS on a desktop Linux machine. 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fds non-null; file descriptors to send. 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFileDescriptorsForSend(FileDescriptor[] fds) { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project impl.setFileDescriptorsForSend(fds); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves a set of file descriptors that a peer has sent through 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an ancillary message. This method retrieves the most recent set sent, 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and then returns null until a new set arrives. 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * File descriptors may only be passed along with regular data, so this 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method can only return a non-null after a read operation. 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return null or file descriptor array 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FileDescriptor[] getAncillaryFileDescriptors() throws IOException { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return impl.getAncillaryFileDescriptors(); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves the credentials of this socket's peer. Only valid on 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connected sockets. 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return non-null; peer credentials 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Credentials getPeerCredentials() throws IOException { 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return impl.getPeerCredentials(); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns file descriptor or null if not yet open/already closed 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return fd or null 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FileDescriptor getFileDescriptor() { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return impl.getFileDescriptor(); 3387a8c36aa4e6a1b5e48f0ee5a787f10bcfece7587Ajay Panicker } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 340