/**
 * Copyright (C) 2004-2011 Jive Software. 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 net.java.sipmack.sip;

import net.java.sipmack.common.Log;

/**
 * Title: SIPark
 * Description: JAIN-SIP Audio/Video phone application
 *
 * @author Thiago Rocha Camargo (thiago@jivesoftware.com)
 */

public class SIPConfig {

    private static boolean askPassword = true;

    private static String audioPort = "20002";

    private static String authenticationRealm = "";

    private static String authUserName = "";

    private static int bindRetries = 3;

    private static int defaultBufferLength = 250;

    private static String defaultDomain = "";

    private static String displayName = "";

    private static String excessiveURIChar = "( )-";

    private static boolean failCallInUserMismatch = false;

    private static boolean firstLaunch = false;

    private static String httpProxy = "";

    private static String IPAddress = "";

    private static String javaHome = "";

    private static int keepAliveDelay = 30;

    private static int localPort = 5060;

    private static boolean loopAlerts = true;

    private static String mediaSource = null;

    private static String os = "windows";

    private static String outboundProxy = "";

    private static boolean preferIPv4Stack = true;

    private static String preferredAudioCodec = "3";

    private static String preferredNetworkAddress = "";

    private static String preferredNetworkInterface = "";

    private static String preferredVideoCodec = "29";

    private static String publicAddress = "";

    private static String registrarAddress = "";

    private static int registrarPort = 5060;

    private static String registrarTransport = "UDP";

    private static int registrationExpiration = 2000;

    private static String retransmissionFilter = "";

    private static String routerPath = "net.java.sipmack.sip.SipCommRouter";

    private static String stackName = "SIPark";

    private static String stackPath = "gov.nist";

    private static String transport = "";

    private static String userName = "";

    private static String videoPort = "20006";

    private static int waitUnregistration = 1000;

    private static String stunServer = "";

    private static String stunPort = "";

    private static boolean useStun = false;

    public static String getAudioPort() {
        return audioPort;
    }

    public static String getAuthenticationRealm() {
        return authenticationRealm;
    }

    public static String getAuthUserName() {
        return authUserName;
    }

    public static int getBindRetries() {
        return bindRetries;
    }

    public static int getDefaultBufferLength() {
        return defaultBufferLength;
    }

    public static String getDefaultDomain() {
        return defaultDomain;
    }

    public static String getDisplayName() {
        return displayName;
    }

    public static String getExcessiveURIChar() {
        return excessiveURIChar;
    }

    public static String getHttpProxy() {
        return httpProxy;
    }

    public static String getIPAddress() {
        return IPAddress;
    }

    public static String getJavaHome() {
        return javaHome;
    }

    public static int getKeepAliveDelay() {
        return keepAliveDelay;
    }

    public static int getLocalPort() {
        return localPort;
    }

    public static String getMediaSource() {
        return mediaSource;
    }

    public static String getOs() {
        return os;
    }

    public static String getOutboundProxy() {
        return outboundProxy;
    }

    public static String getPreferredAudioCodec() {
        return preferredAudioCodec;
    }

    public static String getPreferredNetworkAddress() {
        return preferredNetworkAddress;
    }

    public static String getPreferredNetworkInterface() {
        return preferredNetworkInterface;
    }

    public static String getPreferredVideoCodec() {
        return preferredVideoCodec;
    }

    public static String getPublicAddress() {
        return publicAddress;
    }

    public static String getRegistrarAddress() {
        return registrarAddress;
    }

    public static int getRegistrarPort() {
        return registrarPort;
    }

    public static String getRegistrarTransport() {
        return registrarTransport;
    }

    public static int getRegistrationExpiration() {
        return registrationExpiration;
    }

    public static String getRetransmissionFilter() {
        return retransmissionFilter;
    }

    public static String getRouterPath() {
        return routerPath;
    }

    public static String getStackName() {
        return stackName;
    }

    public static String getStackPath() {
        return stackPath;
    }

    public static String getTransport() {
        return transport;
    }

    public static String getUserName() {
        return userName;
    }

    public static String getVideoPort() {
        return videoPort;
    }

    public static int getWaitUnregistration() {
        return waitUnregistration;
    }

    public static boolean isAskPassword() {
        return askPassword;
    }

    public static boolean isFailCallInUserMismatch() {
        return failCallInUserMismatch;
    }

    public static boolean isFirstLaunch() {
        return firstLaunch;
    }

    public static boolean isLoopAlerts() {
        return loopAlerts;
    }

    public static boolean isPreferIPv4Stack() {
        return preferIPv4Stack;
    }

    protected static void setAskPassword(boolean askPassword) {
        SIPConfig.askPassword = askPassword;
    }

    protected static void setAudioPort(String audioPort) {
        SIPConfig.audioPort = audioPort;
    }

    protected static void setAuthenticationRealm(String authenticationRealm) {
        SIPConfig.authenticationRealm = authenticationRealm;
    }

    protected static void setAuthUserName(String authUserName) {
        SIPConfig.authUserName = authUserName;
    }

    protected static void setBindRetries(int bindRetries) {
        SIPConfig.bindRetries = bindRetries;
    }

    protected static void setDefaultBufferLength(int defaultBufferLength) {
        SIPConfig.defaultBufferLength = defaultBufferLength;
    }

    protected static void setDefaultDomain(String defaultDomain) {
        SIPConfig.defaultDomain = defaultDomain;
    }

    protected static void setDisplayName(String displayName) {
        SIPConfig.displayName = displayName;
    }

    protected static void setExcessiveURIChar(String excessiveURIChar) {
        SIPConfig.excessiveURIChar = excessiveURIChar;
    }

    protected static void setFailCallInUserMismatch(
            boolean failCallInUserMismatch) {
        SIPConfig.failCallInUserMismatch = failCallInUserMismatch;
    }

    protected static void setFirstLaunch(boolean firstLaunch) {
        SIPConfig.firstLaunch = firstLaunch;
    }

    protected static void setHttpProxy(String httpProxy) {
        SIPConfig.httpProxy = httpProxy;
    }

    protected static void setIPAddress(String address) {
        IPAddress = address;
    }

    protected static void setJavaHome(String javaHome) {
        SIPConfig.javaHome = javaHome;
    }

    protected static void setKeepAliveDelay(int keepAliveDelay) {
        SIPConfig.keepAliveDelay = keepAliveDelay;
    }

    protected static void setLocalPort(int localPort) {
        SIPConfig.localPort = localPort;
    }

    protected static void setLoopAlerts(boolean loopAlerts) {
        SIPConfig.loopAlerts = loopAlerts;
    }

    protected static void setMediaSource(String mediaSource) {
        SIPConfig.mediaSource = mediaSource;
    }

    protected static void setOs(String os) {
        SIPConfig.os = os;
    }

    public static void setOutboundProxy(String outboundProxy) {
        SIPConfig.outboundProxy = outboundProxy;
    }

    protected static void setPreferIPv4Stack(boolean preferIPv4Stack) {
        SIPConfig.preferIPv4Stack = preferIPv4Stack;
    }

    protected static void setPreferredAudioCodec(String preferredAudioCodec) {
        SIPConfig.preferredAudioCodec = preferredAudioCodec;
    }

    public static void setPreferredNetworkAddress(
            String preferredNetworkAddress) {
        SIPConfig.preferredNetworkAddress = preferredNetworkAddress;
    }

    protected static void setPreferredNetworkInterface(
            String preferredNetworkInterface) {
        SIPConfig.preferredNetworkInterface = preferredNetworkInterface;
    }

    protected static void setPreferredVideoCodec(String preferredVideoCodec) {
        SIPConfig.preferredVideoCodec = preferredVideoCodec;
    }

    protected static void setPublicAddress(String publicAddress) {
        SIPConfig.publicAddress = publicAddress;
    }

    protected static void setRegistrarAddress(String registrarAddress) {
        SIPConfig.registrarAddress = registrarAddress;
    }

    protected static void setRegistrarPort(int registrarPort) {
        SIPConfig.registrarPort = registrarPort;
    }

    protected static void setRegistrarTransport(String registrarTransport) {
        SIPConfig.registrarTransport = registrarTransport;
    }

    protected static void setRegistrationExpiration(int registrationExpiration) {
        SIPConfig.registrationExpiration = registrationExpiration;
    }

    protected static void setRetransmissionFilter(String retransmissionFilter) {
        SIPConfig.retransmissionFilter = retransmissionFilter;
    }

    protected static void setRouterPath(String routerPath) {
        SIPConfig.routerPath = routerPath;
    }

    public static void setServer(String server) {
        defaultDomain = server;
        authenticationRealm = server;
        registrarAddress = server;
        outboundProxy = server + ":" + registrarPort + "/" + registrarTransport;
        setSystemProperties();
    }

    protected static void setStackName(String stackName) {
        SIPConfig.stackName = stackName;
    }

    protected static void setStackPath(String stackPath) {
        SIPConfig.stackPath = stackPath;
    }

    public static void setSystemProperties() {

        // javax.sip System Properties
        System.setProperty("javax.sip.IP_ADDRESS", IPAddress);
        System.setProperty("javax.sip.STACK_NAME", stackName);
        System.setProperty("javax.sip.ROUTER_PATH", routerPath);
        System.setProperty("javax.sip.OUTBOUND_PROXY", outboundProxy);
        System.setProperty("javax.sip.RETRANSMISSON_FILTER", "");
        System.setProperty("javax.sip.EXTENSION_METHODS", "");
        // Disabled Retransmission to be compliance with OpenSER
        //System.setProperty("javax.sip.RETRANSMISSION_FILTER", "true");
        System.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "0");
        System.setProperty("gov.nist.javax.sip.DELIVER_UNSOLICITED_NOTIFY", "true");
        System.setProperty("gov.nist.javax.sip.DELIVER_TERMINATED_EVENT_FOR_ACK", "true");
        Log.debug("SIP STACK CONFIGURED");

    }

    protected static void setTransport(String transport) {
        SIPConfig.transport = transport;
    }

    public static void setUserName(String userName) {
        SIPConfig.userName = userName;
    }

    protected static void setVideoPort(String videoPort) {
        SIPConfig.videoPort = videoPort;
    }

    protected static void setWaitUnregistration(int waitUnregistration) {
        SIPConfig.waitUnregistration = waitUnregistration;
    }

    public static String getStunPort() {
        return stunPort;
    }

    public static void setStunPort(String stunPort) {
        SIPConfig.stunPort = stunPort;
    }

    public static String getStunServer() {
        return stunServer;
    }

    public static void setStunServer(String stunServer) {
        SIPConfig.stunServer = stunServer;
    }

    public static boolean isUseStun() {
        return useStun;
    }

    public static void setUseStun(boolean useStun) {
        SIPConfig.useStun = useStun;
    }

}
