package com.limegroup.gnutella.handshaking;

import java.io.IOException;

import com.limegroup.gnutella.ConnectionManager;
import com.limegroup.gnutella.RouterService;

/**
 * This is an abstract class that provides a default implementation of
 * HandshakeResponder. 
 */
public abstract class DefaultHandshakeResponder implements HandshakeResponder {

    /**
     * An instance of connection manager (to reference other stuff
     * held by connection manager)
     */
    protected final ConnectionManager _manager;
    
    /**
     * The host to which are opening connection
     */
    private final String _host;

	/**
	 * Whether the handshake responder should do locale preferencing.
	 */
    private boolean _pref = false;
    
    /**
     * Creates a new instance
     * @param manager Instance of connection manager, managing this
     * connection
     * @param host The host with whom we are handshaking
     */
    public DefaultHandshakeResponder(String host) {
        this._manager = RouterService.getConnectionManager();
        this._host = host;
    }
    
	/**
	 * Calls respondToOutgoing or respondToIncoming based on the value of outgoing.
	 */
    public HandshakeResponse respond(HandshakeResponse response, boolean outgoing) throws IOException {
		if (outgoing) return respondToOutgoing(response);
		return respondToIncoming(response);
	}

    /**
     * Returns the Remote IP.
     */
    protected String getRemoteIP() {
        return _host;
    }    

    /**
     * Responds to the given outgoing HandshakeResponse.
     */
	protected abstract HandshakeResponse respondToOutgoing(HandshakeResponse response);

    /**
     * Responds to the given incoming HandshakeResponse.
     */
	protected abstract HandshakeResponse respondToIncoming(HandshakeResponse response);

    /**
     * Set locale preferencing.
     */
    public void setLocalePreferencing(boolean b) {
        _pref = b;
    }
	
	/**
	 * Get locale preferencing.
	 */
	public boolean getLocalePreferencing() {
		return _pref;
	}
}