SocketImpl.java revision f5597e626ecf7949d249dea08c1a2964d890ec11
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.FileDescriptor;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.OutputStream;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.INetworkSystem;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.Platform;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.util.Msg;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class is the base of all streaming socket implementation classes.
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Streaming sockets are wrapped by two classes, {@code ServerSocket} and
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Socket} at the server and client end of a connection. At the server,
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * there are two types of sockets engaged in communication, the {@code
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ServerSocket} on a well known port (referred to as listener) used to
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * establish a connection and the resulting {@code Socket} (referred to as
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * host).
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class SocketImpl implements SocketOptions {
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The remote address this socket is connected to.
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected InetAddress address;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The remote port this socket is connected to.
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int port;
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The file descriptor of this socket.
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected FileDescriptor fd;
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The local port this socket is connected to.
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int localport;
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    INetworkSystem netImpl;
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // BEGIN android-removed
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // int receiveTimeout;
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // END android-removed
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    boolean streaming = true;
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    boolean shutdownInput;
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new connection-oriented socket implementation.
72f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see SocketImplFactory
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public SocketImpl() {
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.netImpl = Platform.getNetworkSystem();
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Waits for an incoming request and blocks until the connection is opened
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * on the given socket.
82f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newSocket
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the socket to accept connections on.
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while accepting a new connection.
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void accept(SocketImpl newSocket) throws IOException;
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the available number of bytes which are readable from this socket
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * without blocking.
93f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of bytes that may be read without blocking.
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while reading the number of bytes.
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract int available() throws IOException;
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Binds this socket to the specified local host address and port number.
102f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param address
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the local machine address to bind this socket to.
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param port
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port on the local machine to bind this socket to.
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while binding this socket.
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void bind(InetAddress address, int port)
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException;
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Closes this socket. This makes later access invalid.
115f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while closing this socket.
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void close() throws IOException;
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Connects this socket to the specified remote host and port number.
123f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param host
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the remote host this socket has to be connected to.
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param port
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the remote port on which this socket has to be connected.
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while connecting to the remote host.
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void connect(String host, int port) throws IOException;
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Connects this socket to the specified remote host address and port
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * number.
136f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param address
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the remote host address this socket has to be connected to.
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param port
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the remote port on which this socket has to be connected.
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while connecting to the remote host.
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void connect(InetAddress address, int port)
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException;
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new unconnected socket. The argument {@code isStreaming}
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * defines whether the new socket is a streaming or a datagram socket.
150f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param isStreaming
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            defines whether the type of the new socket is streaming or
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            datagram.
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while creating the socket.
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void create(boolean isStreaming) throws IOException;
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the file descriptor of this socket.
161f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the file descriptor of this socket.
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected FileDescriptor getFileDescriptor() {
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return fd;
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the remote address this socket is connected to.
170f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the remote address of this socket.
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected InetAddress getInetAddress() {
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return address;
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the input stream of this socket.
179f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the input stream of this socket.
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while accessing the input stream.
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract InputStream getInputStream() throws IOException;
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the local port number of this socket. The field is initialized to
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code -1} and upon demand will go to the IP stack to get the bound
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value. See the class comment for the context of the local port.
190f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the local port number this socket is bound to.
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int getLocalPort() {
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return localport;
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the value of the given socket option.
199f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param optID
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the socket option to retrieve.
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the option value.
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while accessing the option.
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract Object getOption(int optID) throws SocketException;
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the output stream of this socket.
210f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the output stream of this socket.
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while accessing the output stream.
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract OutputStream getOutputStream() throws IOException;
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the remote port number of this socket. This value is not meaningful
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * when this instance is wrapped by a {@code ServerSocket}.
220f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the remote port this socket is connected to.
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int getPort() {
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return port;
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Listens for connection requests on this streaming socket. Incoming
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * connection requests are queued up to the limit specified by {@code
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * backlog}. Additional requests are rejected. The method {@code listen()}
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * may only be invoked on streaming sockets.
232f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param backlog
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the maximum number of outstanding connection requests.
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while listening.
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void listen(int backlog) throws IOException;
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the value for the specified socket option.
242f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param optID
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the socket option to be set.
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param val
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the option value.
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while setting the option.
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract void setOption(int optID, Object val)
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws SocketException;
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a string containing a concise, human-readable description of the
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * socket.
256f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the textual representation of this socket.
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("nls")
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new StringBuffer(100).append("Socket[addr=").append(
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                getInetAddress()).append(",port=").append(port).append(
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ",localport=").append(getLocalPort()).append("]").toString();
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * In the IP stack, write at most {@code count} bytes on the socket
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * from the {@code buffer}, from the {@code offset}.
270f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buffer
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the buffer to read into
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the offset into the buffer
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param count
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of bytes to write
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return int the actual number of bytes written
278f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws IOException
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                thrown if an error occurs while writing
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    int write(byte[] buffer, int offset, int count) throws IOException {
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!streaming) {
283f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return this.netImpl.sendDatagram2(fd, buffer, offset, count, port,
284f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                    address);
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
286f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        return this.netImpl.write(fd, buffer, offset, count);
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Closes the input channel of this socket.
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This default implementation always throws an {@link IOException} to
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * indicate that the subclass should have overridden this method.
294f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             always because this method should be overridden.
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void shutdownInput() throws IOException {
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // KA025=Method has not been implemented
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new IOException(Msg.getString("KA025"));//$NON-NLS-1$
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Closes the output channel of this socket.
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This default implementation always throws an {@link IOException} to
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * indicate that the subclass should have overridden this method.
308f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             always because this method should be overridden.
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void shutdownOutput() throws IOException {
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // KA025=Method has not been implemented
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new IOException(Msg.getString("KA025"));//$NON-NLS-1$
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Connects this socket to the remote host address and port number specified
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * by the {@code SocketAddress} object with the given timeout. This method
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will block indefinitely if the timeout is set to zero.
321f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param remoteAddr
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the remote host address and port number to connect to.
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param timeout
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the timeout value in milliseconds.
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while connecting.
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void connect(SocketAddress remoteAddr, int timeout)
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException;
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns whether the socket supports urgent data or not. Subclasses should
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * override this method.
335f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code false} because subclasses must override this method.
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean supportsUrgentData() {
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sends the single byte of urgent data on the socket.
344f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the byte of urgent data.
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs sending urgent data.
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void sendUrgentData(int value) throws IOException;
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets performance preference for connection time, latency and bandwidth.
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Does nothing by default.
355f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param connectionTime
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the importance of connect time.
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param latency
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the importance of latency.
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param bandwidth
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the importance of bandwidth.
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void setPerformancePreferences(int connectionTime, int latency,
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int bandwidth) {
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Our socket implementation only provide one protocol: TCP/IP, so
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // we do nothing for this method
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
369