using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Config;
using System.Net.Sockets;
using System.Net;

namespace SuperSocket.SocketEngine
{
    delegate void ErrorHandler(ISocketListener listener, Exception e);

    delegate void NewClientAcceptHandler(ISocketListener listener, Socket client, object state);

    /// <summary>
    /// The interface for socket listener
    /// </summary>
    interface ISocketListener
    {
        /// <summary>
        /// Gets the info of listener
        /// </summary>
        ListenerInfo Info { get; }

        /// <summary>
        /// Gets the end point the listener is working on
        /// </summary>
        IPEndPoint EndPoint { get; }

        /// <summary>
        /// Starts to listen
        /// </summary>
        /// <param name="config">The server config.</param>
        /// <returns></returns>
        bool Start(IServerConfig config);

        /// <summary>
        /// Stops listening
        /// </summary>
        void Stop();

        /// <summary>
        /// Occurs when new client accepted.
        /// </summary>
        event NewClientAcceptHandler NewClientAccepted;

        /// <summary>
        /// Occurs when error got.
        /// </summary>
        event ErrorHandler Error;


        /// <summary>
        /// Occurs when [stopped].
        /// </summary>
        event EventHandler Stopped;
    }
}