/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

/***
 * Java TelnetD library (embeddable telnet daemon)
 * Copyright (c) 2000-2005 Dieter Wimberger
 * All rights reserved.
 * <p/>
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 * <p/>
 * Neither the name of the author nor the names of its contributors
 * may be used to endorse or promote products derived from this software
 * without specific prior written permission.
 * <p/>
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS
 * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 ***/

package org.apache.felix.gogo.jline.telnet;

/**
 * Class implmenting a ConnectionEvent.<br>
 * These events are used to communicate things that are
 * supposed to be handled within the application context.
 * These events are processed by the Connection instance
 * calling upon its registered listeners.
 *
 * @author Dieter Wimberger
 * @version 2.0 (16/07/2006)
 * @see Connection
 * @see ConnectionListener
 */
public class ConnectionEvent {

    private final Connection source;
    private final Type type;
    /**
     * Constructs a new instance of a ConnectionEvent
     * with a given source (Connection) and a given type.
     *
     * @param source Connection that represents the source of this event.
     * @param type int that contains one of the defined event types.
     */
    public ConnectionEvent(Connection source, Type type) {
        this.type = type;
        this.source = source;
    }//constructor

    /**
     * Accessor method returning the source of the
     * ConnectionEvent instance.
     *
     * @return Connection representing the source.
     */
    public Connection getSource() {
        return source;
    }//getSource

    /**
     * Method that helps identifying the type.
     *
     * @return Event type.
     */
    public Type getType() {
        return type;
    }//getType

    public enum Type {
        /**
         * Defines the connection idle event type.<br>
         * It occurs if a connection has been idle exceeding
         * the configured time to warning.
         */
        CONNECTION_IDLE,

        /**
         * Defines the connection timed out event type.<br>
         * It occurs if a connection has been idle exceeding
         * the configured time to warning and the configured time
         * to timedout.
         */
        CONNECTION_TIMEDOUT,

        /**
         * Defines the connection requested logout event type.<br>
         * It occurs if a connection requested disgraceful logout by
         * sending a <Ctrl>-<D> key combination.
         */
        CONNECTION_LOGOUTREQUEST,

        /**
         * Defines the connection sent break event type.<br>
         * It occurs when the connection sent a NVT BREAK.
         */
        CONNECTION_BREAK,

        /**
         * Defines the connection geometry event type.
         * It occurs when the connection sent a NAWS.
         */
        CONNECTION_TERMINAL_GEOMETRY_CHANGED
    }


}//class ConnectionEvent