1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17
18package org.conscrypt;
19
20import java.io.IOException;
21import java.net.InetAddress;
22import java.net.Socket;
23import java.net.SocketAddress;
24import java.net.SocketException;
25
26/**
27 * This class wraps the SSL functionality over an existing connected socket.
28 */
29public class OpenSSLSocketImplWrapper extends OpenSSLSocketImpl {
30
31    private Socket socket;
32
33    protected OpenSSLSocketImplWrapper(Socket socket, String hostname, int port,
34            boolean autoClose, SSLParametersImpl sslParameters) throws IOException {
35        super(socket, hostname, port, autoClose, sslParameters);
36        if (!socket.isConnected()) {
37            throw new SocketException("Socket is not connected.");
38        }
39        this.socket = socket;
40    }
41
42    @Override
43    public void connect(SocketAddress sockaddr, int timeout)
44        throws IOException {
45        throw new IOException("Underlying socket is already connected.");
46    }
47
48    @Override
49    public void connect(SocketAddress sockaddr) throws IOException {
50        throw new IOException("Underlying socket is already connected.");
51    }
52
53    @Override
54    public void bind(SocketAddress sockaddr) throws IOException {
55        throw new IOException("Underlying socket is already connected.");
56    }
57
58    @Override
59    public SocketAddress getRemoteSocketAddress() {
60        return socket.getRemoteSocketAddress();
61    }
62
63    @Override
64    public SocketAddress getLocalSocketAddress() {
65        return socket.getLocalSocketAddress();
66    }
67
68    @Override
69    public InetAddress getLocalAddress() {
70        return socket.getLocalAddress();
71    }
72
73    @Override
74    public InetAddress getInetAddress() {
75        return socket.getInetAddress();
76    }
77
78    @Override
79    public String toString() {
80        return "SSL socket over " + socket.toString();
81    }
82
83    @Override
84    public void setSoLinger(boolean on, int linger) throws SocketException {
85        socket.setSoLinger(on, linger);
86    }
87
88    @Override
89    public void setTcpNoDelay(boolean on) throws SocketException {
90        socket.setTcpNoDelay(on);
91    }
92
93    @Override
94    public void setReuseAddress(boolean on) throws SocketException {
95        socket.setReuseAddress(on);
96    }
97
98    @Override
99    public void setKeepAlive(boolean on) throws SocketException {
100        socket.setKeepAlive(on);
101    }
102
103    @Override
104    public void setTrafficClass(int tos) throws SocketException {
105        socket.setTrafficClass(tos);
106    }
107
108    @Override
109    public void setSoTimeout(int to) throws SocketException {
110        socket.setSoTimeout(to);
111        super.setSoTimeout(to);
112    }
113
114    @Override
115    public void setSendBufferSize(int size) throws SocketException {
116        socket.setSendBufferSize(size);
117    }
118
119    @Override
120    public void setReceiveBufferSize(int size) throws SocketException {
121        socket.setReceiveBufferSize(size);
122    }
123
124    @Override
125    public boolean getTcpNoDelay() throws SocketException {
126        return socket.getTcpNoDelay();
127    }
128
129    @Override
130    public boolean getReuseAddress() throws SocketException {
131        return socket.getReuseAddress();
132    }
133
134    @Override
135    public boolean getOOBInline() throws SocketException {
136        return socket.getOOBInline();
137    }
138
139    @Override
140    public boolean getKeepAlive() throws SocketException {
141        return socket.getKeepAlive();
142    }
143
144    @Override
145    public int getTrafficClass() throws SocketException {
146        return socket.getTrafficClass();
147    }
148
149    @Override
150    public int getSoTimeout() throws SocketException {
151        return socket.getSoTimeout();
152    }
153
154    @Override
155    public int getSoLinger() throws SocketException {
156        return socket.getSoLinger();
157    }
158
159    @Override
160    public int getSendBufferSize() throws SocketException {
161        return socket.getSendBufferSize();
162    }
163
164    @Override
165    public int getReceiveBufferSize() throws SocketException {
166        return socket.getReceiveBufferSize();
167    }
168
169    @Override
170    public boolean isConnected() {
171        return socket.isConnected();
172    }
173
174    @Override
175    public boolean isClosed() {
176        return socket.isClosed();
177    }
178
179    @Override
180    public boolean isBound() {
181        return socket.isBound();
182    }
183
184    @Override
185    public boolean isOutputShutdown() {
186        return socket.isOutputShutdown();
187    }
188
189    @Override
190    public boolean isInputShutdown() {
191        return socket.isInputShutdown();
192    }
193
194    @Override
195    public int getPort() {
196        return socket.getPort();
197    }
198
199    @Override
200    public int getLocalPort() {
201        return socket.getLocalPort();
202    }
203}
204