/// <summary>
        /// 게이트웨이로 데이터동기화의 동기 처리 결과 메시지 전송.
        /// </summary>
        public bool SendResultOfSASProfileUpdate(uint requestEventID, int updateResult)
        {
            bool result = false;

            try
            {
                SyncResult syncResult = SyncResult.Success;
                if (updateResult != 0)
                {
                    syncResult = SyncResult.Fail;
                }

                SYNCProtocolBase protoBase = IEASProtocolManager.CreateProtocolForSYNC(SYNCCmdValue.SyncResult);
                SYNCPrtCmd13     cmd13     = protoBase as SYNCPrtCmd13;
                cmd13.Result     = syncResult;
                cmd13.Identifier = requestEventID;
                byte[] frameData = IEASProtocolManager.MakeFrameForSYNC(cmd13);

                result = this.sessionManager.SendData(frameData);
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("[CommunicationManager] SendResultOfSASProfileUpdate( " + ex.ToString() + " )");
                FileLogManager.GetInstance().WriteLog("[CommunicationManager] SendResultOfSASProfileUpdate( Exception=[" + ex.ToString() + "] )");

                return(false);
            }
            return(result);
        }
        /// <summary>
        /// 큐에 저장된 패킷 데이터를 프레임 단위로 파싱.
        /// </summary>
        private int ParsingQueuingData(byte[] queuingData)
        {
            try
            {
                if (queuingData == null)
                {
                    System.Console.WriteLine("[CommunicationManager] 파싱 실패 : 입력 파라미터가 널");
                    return(-1);
                }

                AnalyzeResult frameResult = IEASProtocolManager.AnalyzeFrame(this.remainderPacket, queuingData);
                if (frameResult == null || frameResult.FrameInfo == null)
                {
                    System.Console.WriteLine("[CommunicationManager] 파싱 실패 : 입력 파라미터가 널");
                    return(-2);
                }

                // 프레임을 분리하고 남은 불완전 데이터를 남은데이터 보관 버퍼(로컬)에 저장
                this.remainderPacket = null;
                if (frameResult.RemainderFrame != null && frameResult.RemainderFrame.Length > 0)
                {
                    this.remainderPacket = new byte[frameResult.RemainderFrame.Length];
                    Buffer.BlockCopy(frameResult.RemainderFrame, 0, this.remainderPacket, 0, frameResult.RemainderFrame.Length);
                }

                // 파싱 실패 체크: 프레임 단위로 분리할 만한 데이터 크기가 아닌 경우 등
                if (frameResult.FrameInfo.Count == 0)
                {
                    System.Console.WriteLine("[CommunicationManager] 프레임 분리 실패(길이 부족 등)");
                    return(-3);
                }

                for (int index = 0; index < frameResult.FrameInfo.Count; index++)
                {
                    Frame currentFrame = frameResult.FrameInfo[index];
                    if (currentFrame.HeaderKind == HeaderKind.KCAP)
                    {
                        IEASProtocolBase baseData = IEASProtocolManager.ParseFrameForKCAP(currentFrame.Data);
                        DistributeKCAPCommandData(baseData.CmdValue, baseData);
                    }
                    else
                    {
                        SYNCProtocolBase baseData = IEASProtocolManager.ParseFrameForSYNC(currentFrame.Data);
                        DistributeSYNCCommandData(baseData.CmdValue, baseData);
                    }
                }
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("[CommunicationManager] ParsingQueuingData( " + ex.ToString() + " )");
                FileLogManager.GetInstance().WriteLog("[CommunicationManager] ParsingQueuingData( Exception=[" + ex.ToString() + "] )");

                return(-99);
            }

            return(0);
        }
        /// <summary>
        /// 게이트웨이로 개별 해쉬키 체크 결과 전송.
        /// 전체 해쉬키가 불일치일 때만 개별해쉬키 체크가 수행되므로, 불일치 프로필 아이디가 널인 경우는 논리적으로는 있을 수 없다.
        /// </summary>
        public bool SendResultOfCheckSingleHashKey(uint requestEventID, List <string> lstProfileID)
        {
            System.Console.WriteLine("[CommunicationManager] SendResultOfCheckSingleHashKey (requestEventID=[" + requestEventID + "])");

            bool sendResult = true;

            try
            {
                if (lstProfileID == null || lstProfileID.Count <= 0)
                {
                    System.Console.WriteLine("[ERROR] 모든 데이터가 동기화된 상태!!!");

                    // 빈 패킷이라도 보내야 하나?
                }
                else
                {
                    uint totalCount = (uint)(lstProfileID.Count());
                    uint currentNo  = 1;
                    foreach (string profileID in lstProfileID)
                    {
                        SYNCProtocolBase protoBase = IEASProtocolManager.CreateProtocolForSYNC(SYNCCmdValue.ChkSingleHashResult);
                        SYNCPrtCmd12     cmd12     = protoBase as SYNCPrtCmd12;
                        cmd12.Identifier = requestEventID;
                        cmd12.TotalCount = totalCount;
                        cmd12.Num        = currentNo++;
                        cmd12.ProfileID  = profileID;

                        byte[] frameData = IEASProtocolManager.MakeFrameForSYNC(cmd12);

                        bool result = this.sessionManager.SendData(frameData);
                        if (!result)
                        {
                            System.Console.WriteLine("패킷 전송 실패(currentNo=" + currentNo + ")");
                            sendResult = false;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("[CommunicationManager] SendResultOfCheckSingleHashKey( " + ex.ToString() + " )");
                FileLogManager.GetInstance().WriteLog("[CommunicationManager] SendResultOfCheckSingleHashKey( Exception=[" + ex.ToString() + "] )");

                return(false);
            }

            System.Console.WriteLine("[CommunicationManager] SendResultOfCheckSingleHashKey (sendResult=[" + sendResult.ToString() + "])");

            return(sendResult);
        }
        /// <summary>
        /// 데이터 동기화 수신 데이터 CRC16 체크 결과 전송
        /// </summary>
        /// <param name="validationResult"></param>
        /// <returns></returns>
        public int SendResultOfCheckDataValidation(uint requestEventID, DataValidationCheckResult validationResult, List <uint> lstPacketNo = null)
        {
            int result = 0;

            try
            {
                SYNCProtocolBase protoBase = IEASProtocolManager.CreateProtocolForSYNC(SYNCCmdValue.RecvResult);
                SYNCPrtCmd10     cmd10     = protoBase as SYNCPrtCmd10;
                cmd10.Identifier = requestEventID;
                cmd10.Result     = RecvResult.Success;

                if (lstPacketNo == null)
                {
                    cmd10.Num = 0;
                    byte[] frameData = IEASProtocolManager.MakeFrameForSYNC(cmd10);

                    bool sendResult = this.sessionManager.SendData(frameData);
                    if (!sendResult)
                    {
                        result--;
                    }
                }
                else
                {
                    foreach (uint packetNo in lstPacketNo)
                    {
                        cmd10.Num = packetNo;
                        byte[] frameData = IEASProtocolManager.MakeFrameForSYNC(cmd10);

                        bool sendResult = this.sessionManager.SendData(frameData);
                        if (!sendResult)
                        {
                            result--;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("[CommunicationManager] SendResultOfCheckDataValidation( " + ex.ToString() + " )");
                FileLogManager.GetInstance().WriteLog("[CommunicationManager] SendResultOfCheckDataValidation( Exception=[" + ex.ToString() + "] )");

                return(-99);
            }
            return(result);
        }
        private int DistributeSYNCCommandData(SYNCCmdValue command, SYNCProtocolBase baseData)
        {
            System.Console.WriteLine("[CommunicationManager] SYNC 프레임 데이터 분배 - command(" + command.ToString() + ")");

            try
            {
                switch (command)
                {
                case SYNCCmdValue.ChkTotalHash:    // 전체 해쉬키 체크 요청
                case SYNCCmdValue.ChkSingleHash:
                case SYNCCmdValue.UpdateProfile:
                {
                    if (this.NotifyDataSyncRequested != null)
                    {
                        SynchronizationReqData syncReqData = ConvertToSynchronizationReqData(command, baseData);
                        this.NotifyDataSyncRequested(this, new DataSyncEvtArgs(syncReqData));
                    }
                }
                break;

                default:
                {
                    // do nothing
                }
                break;
                }
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("[CommunicationManager] DistributeSYNCCommandData( " + ex.ToString() + " )");
                FileLogManager.GetInstance().WriteLog("[CommunicationManager] DistributeSYNCCommandData( Exception=[" + ex.ToString() + "] )");

                return(-99);
            }

            return(0);
        }
        /// <summary>
        /// 게이트웨이로 전체 해쉬키 체크 결과 전송
        /// </summary>
        public bool SendResultOfCheckEntireHashKey(uint requestEventID, bool isMatched)
        {
            bool result = false;

            try
            {
                ChkTotalHashResult checkResult = (isMatched ? ChkTotalHashResult.Success : ChkTotalHashResult.Fail);
                SYNCProtocolBase   protoBase   = IEASProtocolManager.CreateProtocolForSYNC(SYNCCmdValue.ChkTotalHashResult);
                SYNCPrtCmd11       cmd11       = protoBase as SYNCPrtCmd11;
                cmd11.Result     = checkResult;
                cmd11.Identifier = requestEventID;
                byte[] frameData = IEASProtocolManager.MakeFrameForSYNC(cmd11);

                result = this.sessionManager.SendData(frameData);
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("[CommunicationManager] SendResultOfCheckEntireHashKey( " + ex.ToString() + " )");
                FileLogManager.GetInstance().WriteLog("[CommunicationManager] SendResultOfCheckEntireHashKey( Exception=[" + ex.ToString() + "] )");

                return(false);
            }
            return(result);
        }
        private SynchronizationReqData ConvertToSynchronizationReqData(SYNCCmdValue command, SYNCProtocolBase baseData)
        {
            SynchronizationReqData reqData = null;

            switch (command)
            {
            case SYNCCmdValue.ChkTotalHash:    // 전체 해쉬키 체크 요청
            {
                reqData         = new SynchronizationReqData();
                reqData.Command = DataSyncCommand.ChkEntireHashKey;

                SYNCPrtCmd1 protoCmd1 = baseData as SYNCPrtCmd1;

                reqData.EventID        = protoCmd1.Identifier;
                reqData.ProfileHashKey = protoCmd1.HashKey;
                reqData.Crc16          = protoCmd1.Crc16;
            }
            break;

            case SYNCCmdValue.ChkSingleHash:
            {
                reqData         = new SynchronizationReqData();
                reqData.Command = DataSyncCommand.ChkSingleHashKey;

                SYNCPrtCmd2 protoCmd2 = baseData as SYNCPrtCmd2;

                reqData.EventID         = protoCmd2.Identifier;
                reqData.TotalPacketCnt  = protoCmd2.TotalCount;
                reqData.CurrentPacketNo = protoCmd2.Num;
                reqData.ProfileID       = protoCmd2.ProfileID;
                reqData.ProfileHashKey  = protoCmd2.HashKey;
                reqData.Crc16           = protoCmd2.Crc16;
            }
            break;

            case SYNCCmdValue.UpdateProfile:
            {
                reqData         = new SynchronizationReqData();
                reqData.Command = DataSyncCommand.UpdateProfileData;

                SYNCPrtCmd3 protoCmd3 = baseData as SYNCPrtCmd3;

                reqData.EventID         = protoCmd3.Identifier;
                reqData.TotalPacketCnt  = protoCmd3.TotalCount;
                reqData.CurrentPacketNo = protoCmd3.Num;
                switch (protoCmd3.Mode)
                {
                case SyncUpdateMode.Regist:
                    reqData.Mode = ProfileUpdateMode.Regist;
                    break;

                case SyncUpdateMode.Modify:
                    reqData.Mode = ProfileUpdateMode.Modify;
                    break;

                case SyncUpdateMode.Delete:
                    reqData.Mode = ProfileUpdateMode.Delete;
                    break;

                default:
                    break;
                }
                reqData.ProfileID = protoCmd3.ID;

                reqData.SystemProfile          = new SASProfile();
                reqData.SystemProfile.ID       = protoCmd3.ID;
                reqData.SystemProfile.Name     = protoCmd3.SystemName;
                reqData.SystemProfile.AuthCode = protoCmd3.AuthCode;
                reqData.SystemProfile.KindCode = protoCmd3.SystemKindCode;
                reqData.SystemProfile.IpType   = IPType.IPv4;
                if (protoCmd3.IPType == IPAddressType.IPv4)
                {
                    reqData.SystemProfile.IpType = IPType.IPv4;
                }
                else if (protoCmd3.IPType == IPAddressType.IPv6)
                {
                    reqData.SystemProfile.IpType = IPType.IPv6;
                }
                else
                {
                    //
                }
                reqData.SystemProfile.IpAddress = protoCmd3.IPAddress;
                reqData.SystemProfile.Latitude  = protoCmd3.Latitude.ToString();
                reqData.SystemProfile.Longitude = protoCmd3.Longitude.ToString();
                reqData.SystemProfile.AssignedIAGWRegionCode = protoCmd3.AssignedIAGWRegionCode;
                reqData.SystemProfile.Address           = protoCmd3.Address;
                reqData.SystemProfile.ManagerName       = protoCmd3.ManagerName;
                reqData.SystemProfile.ManagerDepartment = protoCmd3.ManagerDepartment;
                reqData.SystemProfile.ManagerPhone      = protoCmd3.ManagerPhone;
            }
            break;

            default:
            {
                // do nothing
            }
            break;
            }
            return(reqData);
        }