/**
 * $RCSfile$
 * $Revision$
 * $Date$
 *
 * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.jivesoftware.smack.proxy;

import javax.net.SocketFactory;

/**
 * Class which stores proxy information such as proxy type, host, port, 
 * authentication etc.
 * 
 * @author Atul Aggarwal
 */

public class ProxyInfo
{
    public static enum ProxyType
    {
        NONE,
        HTTP,
        SOCKS4,
        SOCKS5
    }
    
    private String proxyAddress;
    private int proxyPort;
    private String proxyUsername;
    private String proxyPassword;
    private ProxyType proxyType;
    
    public ProxyInfo(   ProxyType pType, String pHost, int pPort, String pUser, 
                        String pPass)
    {
        this.proxyType = pType;
        this.proxyAddress = pHost;
        this.proxyPort = pPort;
        this.proxyUsername = pUser;
        this.proxyPassword = pPass;
    }
    
    public static ProxyInfo forHttpProxy(String pHost, int pPort, String pUser, 
                                    String pPass)
    {
        return new ProxyInfo(ProxyType.HTTP, pHost, pPort, pUser, pPass);
    }
    
    public static ProxyInfo forSocks4Proxy(String pHost, int pPort, String pUser, 
                                    String pPass)
    {
        return new ProxyInfo(ProxyType.SOCKS4, pHost, pPort, pUser, pPass);
    }
    
    public static ProxyInfo forSocks5Proxy(String pHost, int pPort, String pUser, 
                                    String pPass)
    {
        return new ProxyInfo(ProxyType.SOCKS5, pHost, pPort, pUser, pPass);
    }
    
    public static ProxyInfo forNoProxy()
    {
        return new ProxyInfo(ProxyType.NONE, null, 0, null, null);
    }
    
    public static ProxyInfo forDefaultProxy()
    {
        return new ProxyInfo(ProxyType.NONE, null, 0, null, null);
    }
    
    public ProxyType getProxyType()
    {
        return proxyType;
    }
    
    public String getProxyAddress()
    {
        return proxyAddress;
    }
    
    public int getProxyPort()
    {
        return proxyPort;
    }
    
    public String getProxyUsername()
    {
        return proxyUsername;
    }
    
    public String getProxyPassword()
    {
        return proxyPassword;
    }
    
    public SocketFactory getSocketFactory()
    {
        if(proxyType == ProxyType.NONE)
        {
            return new DirectSocketFactory();
        }
        else if(proxyType == ProxyType.HTTP)
        {
            return new HTTPProxySocketFactory(this);
        }
        else if(proxyType == ProxyType.SOCKS4)
        {
            return new Socks4ProxySocketFactory(this);
        }
        else if(proxyType == ProxyType.SOCKS5)
        {
            return new Socks5ProxySocketFactory(this);
        }
        else
        {
            return null;
        }
    }
}
