1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $RCSfile$
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Revision$
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Date$
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License.
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *     http://www.apache.org/licenses/LICENSE-2.0
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS,
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License.
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smackx.bytestreams.socks5;
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.IOException;
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.InputStream;
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.OutputStream;
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.net.Socket;
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.net.SocketException;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.bytestreams.BytestreamSession;
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Socks5BytestreamSession class represents a SOCKS5 Bytestream session.
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Henning Staib
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class Socks5BytestreamSession implements BytestreamSession {
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /* the underlying socket of the SOCKS5 Bytestream */
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private final Socket socket;
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /* flag to indicate if this session is a direct or mediated connection */
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private final boolean isDirect;
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    protected Socks5BytestreamSession(Socket socket, boolean isDirect) {
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.socket = socket;
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.isDirect = isDirect;
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns <code>true</code> if the session is established through a direct connection between
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * the initiator and target, <code>false</code> if the session is mediated over a SOCKS proxy.
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return <code>true</code> if session is a direct connection, <code>false</code> if session is
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *         mediated over a SOCKS5 proxy
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public boolean isDirect() {
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return this.isDirect;
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns <code>true</code> if the session is mediated over a SOCKS proxy, <code>false</code>
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * if this session is established through a direct connection between the initiator and target.
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return <code>true</code> if session is mediated over a SOCKS5 proxy, <code>false</code> if
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *         session is a direct connection
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public boolean isMediated() {
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return !this.isDirect;
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public InputStream getInputStream() throws IOException {
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return this.socket.getInputStream();
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public OutputStream getOutputStream() throws IOException {
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return this.socket.getOutputStream();
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public int getReadTimeout() throws IOException {
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        try {
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return this.socket.getSoTimeout();
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        catch (SocketException e) {
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            throw new IOException("Error on underlying Socket");
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void setReadTimeout(int timeout) throws IOException {
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        try {
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.socket.setSoTimeout(timeout);
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        catch (SocketException e) {
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            throw new IOException("Error on underlying Socket");
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void close() throws IOException {
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.socket.close();
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
99