using CommonNetwork_ICE.Msg;
using Slice;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CommonNetwork_ICE.handler
{
    /// <summary>
    /// 客户端UDP数据接收实现类:接收服务器端发来的ICE请求,委托监听器实现类处理
    /// </summary>
    internal class ClientUdpSendHandler : SenderDisp_
    {
        private ClientMsgHandler delegateHandler;

        public ClientUdpSendHandler(ClientMsgHandler delegateHandler)
        {
            this.delegateHandler = delegateHandler;
        }

        /// <summary>
        /// 接收服务器端发送的数据包
        /// </summary>
        /// <param name="recvPort">侦听端口</param>
        /// <param name="message">数据包</param>
        /// <param name="current">Ice通讯包</param>
        public override void SendData(int recvPort, TransMessage message, Ice.Current current)
        {
            Ice.UDPConnectionInfo udpConInfo = (Ice.UDPConnectionInfo)current.con.getInfo();
            delegateHandler.RecvData(recvPort, message, udpConInfo.remoteAddress, udpConInfo.remotePort);
        }

        /// <summary>
        /// 接收服务器收到客户端数据包时回送的应答关键数据包序列号
        /// </summary>
        /// <param name="recvPort">侦听端口</param>
        /// <param name="serial">应答数据包序列号</param>
        /// <param name="current">Ice通讯包</param>
        public override void SendAck(int recvPort, long serial, Ice.Current current)
        {
            Ice.UDPConnectionInfo udpConInfo = (Ice.UDPConnectionInfo)current.con.getInfo();
            delegateHandler.SendDataRecvAck(recvPort, serial, udpConInfo.remoteAddress, udpConInfo.remotePort);
        }

        /// <summary>
        /// 服务器连接客户端
        /// </summary>
        /// <param name="recvPort">侦听端口</param>
        /// <param name="current">Ice通讯包</param>
        public override void Connect(int recvPort, Ice.Current current)
        {
            // 目前服务端不会主动连接到客户端,所以忽略次方法
        }

        /// <summary>
        /// 接收客户端连接到服务器时,服务器发回的正常连接响应
        /// </summary>
        /// <param name="current">Ice通讯包</param>
        public override void ConnectAck(Ice.Current current)
        {
            Ice.UDPConnectionInfo udpConInfo = (Ice.UDPConnectionInfo)current.con.getInfo();
            delegateHandler.ConnectAck(udpConInfo.remoteAddress, udpConInfo.remotePort);
        }

        /// <summary>
        /// 处理服务器发来的主动关闭请求
        /// </summary>
        /// <param name="recvPort">侦听端口</param>
        /// <param name="current">Ice通讯包</param>
        public override void Close(int recvPort, Ice.Current current)
        {
            Ice.UDPConnectionInfo udpConInfo = (Ice.UDPConnectionInfo)current.con.getInfo();
            delegateHandler.Close(recvPort, udpConInfo.remoteAddress, udpConInfo.remotePort);
        }

        /// <summary>
        /// 客户端关闭通讯通道时服务器发来的成功关闭响应
        /// </summary>
        /// <param name="recvPort">侦听端口</param>
        /// <param name="current">Ice通讯包</param>
        public override void CloseAck(int recvPort, Ice.Current current)
        {
            Ice.UDPConnectionInfo udpConInfo = (Ice.UDPConnectionInfo)current.con.getInfo();
            delegateHandler.CloseAck(recvPort, udpConInfo.remoteAddress, udpConInfo.remotePort);
        }
    }
}