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