using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;

//DP: navržen v samostatné knihovně, aby mohl být použit i v aplikaci ... a opačně

namespace CommLib
{
    /// <summary>
    /// Delegát pro událost doručení zprávy
    /// </summary>
    /// <param name="message"></param>
    public delegate void ReceiveDlg(string message);

    /// <summary>
    /// Třída pro poslech na definovaném UDP portu.
    /// Inspirováno: http://msdn.microsoft.com/cs-cz/library/system.net.sockets.udpclient.beginreceive%28v=vs.110%29.aspx
    /// </summary>
    public class UdpListenerComm : IDisposable
    {
        public event ReceiveDlg OnReceive;

        UdpClient udpClient;
        IPEndPoint ep;

        /// <summary>
        /// Vytvoření instance a zahájení poslechu na zadaném UDP portu
        /// </summary>
        /// <param name="port">Číslo UDP portu</param>
        public UdpListenerComm(UInt16 port)
        {
            IPEndPoint e = new IPEndPoint(IPAddress.Any, port);
            udpClient = new UdpClient(e);
            udpClient.BeginReceive(new AsyncCallback(receiveCallback), null);
        }

        void receiveCallback(IAsyncResult ar)
        {
            try
            {
                string receiveString = Encoding.ASCII.GetString(udpClient.EndReceive(ar, ref ep));
                if (OnReceive != null)
                    OnReceive(receiveString);
                udpClient.BeginReceive(new AsyncCallback(receiveCallback), null);
            }
            catch
            {
            }
        }

        /// <summary>
        /// Ukončení poslechu
        /// </summary>
        public void Close()
        {
            udpClient.Close();
        }

        #region dispose

        private bool IsDisposed;

        public virtual void Dispose()
        {
            if (!this.IsDisposed)
            {
                udpClient.Close();
                this.IsDisposed = true;
            }
        }
        #endregion
    }
}
