using System;
using System.Drawing;
using System.Windows.Forms;
using System.Data;

using Cosmos.BaseFrame;
using Cosmos.UserFrame;
using Cosmos.ServiceProvider;
using Cosmos.Common;
using Cosmos.CommonManager;
using System.Collections;
using System.IO;
using System.Diagnostics;
using System.Net; 

/*-----------------------------------------------------------------------------------------------*/
// 설      명 : 프로그램 다운로드
// 작  성  자 : 
// 변경  이력 : 
/*-----------------------------------------------------------------------------------------------*/
namespace Cosmos.Win
{
    public partial class frmPGMDownLoad : Form
    {
        #region Variable
        private SManager sManager = new SManager();                                 // 이 객체를 통해 업무 Service 호출
        private StateServer StateObject = (StateServer)StateServer.GetInstance();   // StateObject : StateServer Object (객체)
        private PosStatus m_cPosStatus = new PosStatus();                           // 기본정보 참조
        private TranStatus m_cTrnStatus = new TranStatus();                         // 거래정보 참조
        private DeviceStatus m_cDevStatus = new DeviceStatus();                       // 기기정보 참조

        private IDataProcessUs m_cDataService = null;
        private IDataCommonUs m_cDataCommon = null;                                 // POS 공통함수 인터페이스
        private ISvr2Tran m_cSvr2Tran = null;
        private INetworkFTP m_cNetworkFTP = null;

        private IDatabaseSQL m_cSqlDbService = null;                                // 데이터베이스 관리

        private IICReaderUs m_cDeviceICReader = null;                               // IC 리더기
        private IDeviceUpdate m_SignPadUpdate = null;                               // 서명패드 업데이트
        //#20171016 IC리더기 펌웨어 업데이트 Start, srlee
        private IICReaderUpdate m_ICReaderUpdate = null;                            // IC 리더기 업데이트
        //#20171016 IC리더기 펌웨어 업데이트 End, srlee
        private IWatcherBack m_cBackgroundDown = null;

        private Hashtable m_hRecvData;                                              // 프로그램 업데이트 FTP 서버 정보

        private FluentFTP.FtpClient Fcl = null;

        /// <summary>
        /// 프로그램 업데이트 FTP 서버정보
        /// </summary>
        public Hashtable SethRecvData { set { this.m_hRecvData = value; } }

        private string[] m_sRecvData;                                              // 프로그램 업데이트 목록
        /// <summary>
        /// 프로그램 업데이트 목록
        /// </summary>
        public string[] SetRecvData { set { this.m_sRecvData = value; } }

        private string m_sPosMenuKeyIn;
        public string PosMenuKeyIn { set { m_sPosMenuKeyIn = value; } get { return m_sPosMenuKeyIn; } }

        private bool bNotDoubleClik = false;                                        // 더블 클릭 방지용

        private string m_TagImgFileName = "TagImg_{0}_0{1}.png";                    // 이미지 파일 이름

        string[] sSignPadFile = null;

        string m_sFTPDownloadMode = "0";                                            // FTP 다운로드 모드 (0:Web, 1:TCP/IP)

        /// <summary>
        /// 자동/수동 모드
        /// </summary>
        private string m_sManualMode;
        public string ManualMode { set { m_sManualMode = value; } get { return m_sManualMode; } }

        /// <summary>
        /// 강제종료
        /// </summary>
        private bool m_bStop = false;

        /// <summary>
        /// 진행중
        /// </summary>
        private bool m_bStart = false;

        /// <summary>
        /// FTP Download 상태
        /// </summary>
        private FTP.DelegateFTP delegateFTP;

        /// <summary>
        /// Fluent FTP Download 상태
        /// </summary>
        private FluentFTP.FtpClient.DelegateFTP delegateFluentFTP;

        private string m_DownLoadMsg = "";
        private string m_PGMUpdateMsg = "";

        private DataTable m_dtSignPad = new DataTable();

        private string m_cUpDateMode = "";
        #endregion
        

        #region 생성자 & 소멸자
        /// <summary>
        /// 생성자
        /// </summary>
        public frmPGMDownLoad()
        {
            InitializeComponent();

            base.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw, true);
            //this.UpdateStyles();

            m_cPosStatus = (PosStatus)StateObject.POS;         // POS 기본정보
            m_cTrnStatus = (TranStatus)StateObject.TRAN;       // POS 거래정보
            m_cDevStatus = (DeviceStatus)StateObject.DEVICE;   // POS 주변기기정보

            m_cDataService = (IDataProcessUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.DATA_SERVICE);
            m_cDataCommon = (IDataCommonUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.DATA_COMMON);
            m_cSvr2Tran = (ISvr2Tran)sManager.InitServiceInstance(ServiceLists.BSV_SALE.DLL, ServiceLists.BSV_SALE.SVR2TRAN);
            m_cSqlDbService = (IDatabaseSQL)sManager.InitServiceInstance(ServiceLists.AGENT_DATABASE.DLL, ServiceLists.AGENT_DATABASE.DATABASE_MSSQL);

            m_cNetworkFTP = (INetworkFTP)sManager.InitServiceInstance(ServiceLists.AGENT_NETWORK.DLL, ServiceLists.AGENT_NETWORK.NETWORK_FTP);
            m_SignPadUpdate = (IDeviceUpdate)sManager.InitServiceInstance(ServiceLists.BSV_BASIC.DLL, ServiceLists.BSV_BASIC.SIGNPAD_UPDATE);
            m_cDeviceICReader = (IICReaderUs)sManager.InitServiceInstance(ServiceLists.AGENT_OLEDEVICE.DLL, ServiceLists.AGENT_OLEDEVICE.DEVICE_ICREADER);
            //#20171016 IC리더기 펌웨어 업데이트 Start, srlee
            m_ICReaderUpdate = (IICReaderUpdate)sManager.InitServiceInstance(ServiceLists.BSV_BASIC.DLL, ServiceLists.BSV_BASIC.ICREADER_UPDATE);
            //#20171016 IC리더기 펌웨어 업데이트 End, srlee

            // 백그라운드 다운 데몬 기동
            m_cBackgroundDown = (IWatcherBack)sManager.InitServiceInstance(ServiceLists.AGENT_BACKGROUND_DOWN.DLL, ServiceLists.AGENT_BACKGROUND_DOWN.BACKGROUND_DOWN_MAIN);

            delegateFTP = new FTP.DelegateFTP(OnDownloadProgressChanged);
            delegateFluentFTP = new FluentFTP.FtpClient.DelegateFTP(OnDownloadProgressChanged);

        }


        /// <summary>
        /// 폼로드
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmPGMDownLoad_Load(object sender, EventArgs e)
        {
            UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "");
            
            InitControl();

            // FTP 다운로드 모드 조회
            m_sFTPDownloadMode = GetFTPDownloadMode();
            Fcl = new FluentFTP.FtpClient();

            FluentFTP.FtpClient.SetEventHandle(delegateFluentFTP);
            FTP.SetEventHandle(delegateFTP);

        }


        /// <summary>
        /// 폼클로즈
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmPGMDownLoad_FormClosing(object sender, FormClosingEventArgs e)
        {
            FTP.ReleaseEventHandle();
            FluentFTP.FtpClient.ReleaseEventHandle();

            UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", lblTitle.Text);
        }


        /// <summary>
        /// 폼엑티브
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmPGMDownLoad_Activated(object sender, EventArgs e)
        {
            //this.TopMost = false;
        }


        /// <summary>
        /// 폼디엑티브
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmPGMDownLoad_Deactivate(object sender, EventArgs e)
        {
        }
        #endregion 생성자 & 소멸자
        

        #region 폼 컨트롤 초기화
        /// <summary>
        /// 폼 컨트롤 초기화
        /// </summary>
        private void InitControl()
        {
            try
            {
                FormManager.SetFormAllControlFont(this, m_cPosStatus.Base.FONT);
                FormManager.SetTextBoxGlobalInfo(this, m_cPosStatus.Global.m_stCultureMaster.nGroupingDigits, m_cPosStatus.Global.m_stCultureMaster.strGroupingSymbol
                    , m_cPosStatus.Global.m_stCultureMaster.nDecimalDigits, m_cPosStatus.Global.m_stCultureMaster.strDecimalSymbol);
                FormManager.MovePopUpForm(this, false, m_cPosStatus.Sale.ScreenSizeUser);

                m_bStop = false;
                m_bStart = false;

                bNotDoubleClik = false;

                lblCount.Visible = false; 
                pbWork.Visible = false;

                lblTitle.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0447);
                if (lblTitle.Text.Trim() == "") lblTitle.Text = "Program Update";

                lblUpdateInfo.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0455);
                if (lblUpdateInfo.Text.Trim() == "") lblUpdateInfo.Text = "Checking for program updates . . .\n Please wait a moment.";

                m_DownLoadMsg = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0440);
                if (m_DownLoadMsg.Trim() == "") m_DownLoadMsg = "File Downloading  . . .  ({0}%) ";

                m_PGMUpdateMsg = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0450);
                if (m_PGMUpdateMsg.Trim() == "") m_PGMUpdateMsg = "Updating program  . . .  ({0}%) ";

                if (m_sManualMode != "K")
                {
                    // 이미지 전체 재수신 여부
                    CmMessage m_PosSaleInfo = CmMessage.MakeMessageFromFile(BaseCom.NxIniPath + PosConst.INI_FILE_NAME.PosSaleInfo);
                    string sIMAGE_ALL_REDOWN_YN = CmUtil.StringNullEmpty(GetConfigInfo(m_PosSaleInfo, "POSOPEN", "IMAGE_ALL_REDOWN_YN"));
                    string sMstDownDate = CmUtil.MidH(CmUtil.StringNullEmpty(GetConfigInfo(m_PosSaleInfo, "POSOPEN", "MstDownDate")), 0, 4);

                    if (CmUtil.DoubleParse(sMstDownDate) <= 2010 && sIMAGE_ALL_REDOWN_YN != "0")
                        m_cUpDateMode = PosConst.PGM_UPDATE_DOWN_DIV.TOTAL;         // 최초시
                    else if (sIMAGE_ALL_REDOWN_YN == "1")
                        m_cUpDateMode = PosConst.PGM_UPDATE_DOWN_DIV.TOTAL;         // 수동 전체 이미지 수신 요청시
                    else 
                        m_cUpDateMode = PosConst.PGM_UPDATE_DOWN_DIV.ALL;
                }

                if (m_sManualMode == "K")
                {
                    m_cUpDateMode = PosConst.PGM_UPDATE_DOWN_DIV.UPDATE;

                    if (m_cPosStatus.Sale.ScreenSizeUser == 1024)
                    {
                        // 이미지 로딩 처리
                        picBack.Image = ImageManager.GetImage(BaseCom.NxImgPath, ImageManager.POP_FULL_SIZE); 
                        FormManager.SetControlSize(picBack, 0, 0, 1024, 696);
                        FormManager.SetControlSize(this, 0, 50, picBack.Size.Width, picBack.Size.Height);

                        FormManager.SetControlSize(this.lblTitle, 16, 1, 950, 50);
                        FormManager.SetControlSize(this.btnExit, 965, 1, 58, 50);

                        FormManager.SetControlSize(this.lblCount, 84, 579, 175, 14);
                        FormManager.SetControlSize(this.pbWork, 87, 603, 842, 40);
                        FormManager.SetControlSize(this.lblUpdateInfo, 112, 503, 800, 70);
                        FormManager.SetControlSize(this.pnlFunc, 112, 98, 892, 361); 
                    }
                    else
                    {
                        // 이미지 로딩 처리
                        picBack.Image = ImageManager.GetImage(BaseCom.NxImgPath, ImageManager.POP_SIZE_800X600);
                        FormManager.SetControlSize(picBack, 0, 0, 800, 600);
                        FormManager.SetControlSize(this, 0, 0, picBack.Size.Width, picBack.Size.Height);

                        FormManager.SetControlSize(this.lblTitle, 16, 1, 728, 50);
                        FormManager.SetControlSize(this.btnExit, 741, 1, 58, 50);

                        FormManager.SetControlSize(this.lblCount, 50, 519, 175, 14);
                        FormManager.SetControlSize(this.pbWork, 53, 543, 690, 40);
                        FormManager.SetControlSize(this.lblUpdateInfo, 0, 443, 800, 70);
                        FormManager.SetControlSize(this.pnlFunc, 0, 98, 892, 361); 
                    }

                    FormManager.MovePopUpForm(this, false, m_cPosStatus.Sale.ScreenSizeUser);
                    FormManager.SetFormAllControlFont(this, m_cPosStatus.Base.FONT);
                    // 수동모드
                    this.TopMost = false;
                    lblUpdateInfo.Visible = false;
                    btnExit.Visible = true;

                    pnlFunc.Visible = true;

                    //picBack.Image = ImageManager.GetImage(BaseCom.NxImgPath, ImageManager.POP_FULL_SIZE);

                    btnPGM.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0468);
                    btnRcptLogo.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0988);

                    btnContents.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0941);
                    btnCustomer.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0942);
                    btniTem.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0943);
                    btnCampaign.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0944);
                    btnTestMode.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0945);

                    btnMasterAll.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0787);
                    btnMasterUpdate.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0788);
                    btnCampaignMasterAll.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_1026);

                    btnSignUpdateFile.Visible = false;
                    if (m_cDevStatus.SignPad.UseYn == true)
                    {
                        btnSignUpdateFile.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0529);
                        btnSignUpdateFile.Visible = true;
                    }

                    btnICReaderUpdate.Visible = false;
                    if (m_cDevStatus.ICReader.UseYn == true)
                    {
                        btnICReaderUpdate.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_1019);
                        btnICReaderUpdate.Visible = true;
                    }

                    btnExit.Image = ImageManager.GetImage(BaseCom.NxImgPath, ImageManager.BTN_CLOSE);
                    if (btnExit.Image != null) btnExit.Text = ""; 

                    //GetTagImg();    // 상단 이미지
                    GetBtnImg();    // 버튼 이미지

                    btnMasterAll.Visible = true;
                    btnMasterUpdate.Visible = true;
                    btnCampaignMasterAll.Visible = true;
                    if (m_cPosStatus.Base.PosCommunicationType != PosConst.MAIN_POS_DIV.MAIN_POS)
                    {
                        // Main Pos가 아닌경우 마스터 수신 불가
                        btnMasterAll.Visible = false;
                        btnMasterUpdate.Visible = false;
                        btnCampaignMasterAll.Visible = false;
                    }

                    tmStart.Enabled = false;
                }
                else
                {
                    // 자동모드
                    lblUpdateInfo.Visible = true;

                    this.Size = new Size(788, 212);

                    lblUpdateInfo.Visible = true;

                    picBack.Image = ImageManager.GetImage(BaseCom.NxImgPath, ImageManager.MESSAGE_BOX);

                    FormManager.MovePopUpForm(this, false, m_cPosStatus.Sale.ScreenSizeUser);

                    pnlFunc.Visible = false;
                    FormManager.SetControlSize(lblTitle, 16, 1, 762, 50);
                    FormManager.SetControlSize(lblCount, 18, 138, 170, 14);
                    FormManager.SetControlSize(pbWork, 21, 161, 743, 40);
                    FormManager.SetControlSize(lblUpdateInfo, 100, 70, 588, 75);

                    this.TopMost = true;
                    btnExit.Visible = false;                    
                    tmStart.Enabled = true; 
                }
                //this.StartPosition = FormStartPosition.CenterParent;
                
            }
            catch (Exception ex)
            {
               WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }         
        #endregion
         

        #region 버튼 입력 처리
        private void btnExit_Click(object sender, EventArgs e)
        {
            string sMsg = "";
            try
            {
                if (m_bStart != false)
                {
                    sMsg = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0277);
                    if (sMsg.Trim() == "") sMsg = "The POS program is being received. \n" + "Are you sure you want to force it?";
                    if (WinManager.QuestionMessage(sMsg) != true) return;
                }
                m_bStop = true;

                if (m_sManualMode == "K" && m_cPosStatus.Sale.SysShutDown.Trim() != "")
                {
                    sMsg = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0281);
                    if (sMsg.Trim() == "") sMsg = "The POS program has been updated. \n" + "Restart the POS program.";
                    WinManager.ConfirmMessage(sMsg);
                }

                this.DialogResult = DialogResult.Cancel;
                this.Close();
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion
        
        
        #region 프로그램 다운로드
        /// <summary>
        /// 프로그램 다운로드
        /// </summary>
        /// <returns></returns>
        private string PGMDownLoad(string sDownDiv, string sFTP_IP, int iFTP_Port, string sFTP_ID, string sFTP_Pwd, string[] sRecvData)
        {
            string sRet = UserCom.RST_ERR;
            string sApplyType = "";
            string sLocalPath = BaseCom.NxDownPath;
            string sGroup = "";
            string sKind = "";
            string sApplyDate = "";
            string sApplyTime = "";
            string sFilePath = "";
            string sFileNm = "";
            string sFileVer = "";
            string sFileSeq = "";
            string sDeployDate = "";
            string sDeployTime = "";
            string sMsg = "";
            string sDeployDT = "";
            string sUseYn = "";

            string sBackupFile = "";
            int iConnect = -1;
            int iRet = -1;

            try
            {
                #region 디스크 용량 체크
                DriveInfo drv = new DriveInfo(CmUtil.MidH(BaseCom.NxDownPath, 0, 1));
                if (drv.TotalFreeSpace < 10000000)
                {
                    sMsg = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0659);
                    if (sMsg.Trim() == "") { sMsg = "There is not enough disk space. Please check."; }
                    WinManager.ErrorMessage(sMsg);
                    return sRet;
                }
                #endregion 

                pbWork.Value = 0;
                pbWork.Minimum = 0;

                CmUtil.CreateDirectory(sLocalPath);

                if (sRecvData.Length > 0)
                {
                    // 프로그램 다운로드
                    m_bStart = true;

                    // Connect
                    //  2019-03-26 - 1997fx11 : FTP 관련 참고
                    if (m_sFTPDownloadMode == "1") { iConnect = Fluent_Connect(sFTP_IP, iFTP_Port, sFTP_ID, sFTP_Pwd, 3000); }  // TCP-IP 모드
                    else { iConnect = m_cNetworkFTP.Connect(sFTP_IP, sFTP_ID, sFTP_Pwd, 3000, iFTP_Port); }     // Web 모드

                    if (iConnect == 0)
                    {
                        for (int iLoop = 0; iLoop < sRecvData.Length; iLoop++)
                        {
                            if (sRecvData[iLoop].Trim() == "") { continue; }

                            string[] aRecvData = sRecvData[iLoop].Split(new string[] { "|" }, StringSplitOptions.None);

                            aRecvData = sRecvData[iLoop].Split(new string[] { "|" }, StringSplitOptions.None);
                            sGroup = aRecvData[0].ToString();               // 그룹
                            sKind = sGroup + aRecvData[1].ToString();       // 배포구분 : 01:프로그램, 02:프로그램(기타), 03:객면 컨텐츠, 04:상품이미지
                            sApplyDate = aRecvData[3].ToString();           // 적용일자
                            sApplyTime = aRecvData[10].ToString();           // 적용시간
                            sFilePath = aRecvData[4].ToString();            // 파일위치
                            if (CmUtil.RightH(sFilePath, 1) != "/") sFilePath += "/";
                            sFileNm = aRecvData[5].ToString();              // 파일명
                            sFileVer = aRecvData[6].ToString();             // 파일버전
                            sFileSeq = aRecvData[7].ToString();             // 파일Seq
                            sDeployDate = aRecvData[8].ToString();          // 다운일자
                            sDeployTime = aRecvData[9].ToString();          // 다운시간
                            sDeployDT = aRecvData[11].ToString();           // 배포일자
                            sUseYn = "1";                                   // 사용유무

                            string[] aTempPath = sFilePath.Split(new string[] { "/" }, StringSplitOptions.None);
                            for (int i = 0; aTempPath.Length > i; i++)
                            {
                                if (aTempPath[i] == "nftpparis") { continue; }
                            }

                            // 이전에 받은파일이 있는지 체크                            
                            if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40
                            || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_50
                            || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_60)
                            {
                                // 서명패드 백업 위치
                                sBackupFile = BaseCom.NxBackPath + PosConst.BACKUP_PATH.SIGNPAD;
                            }
                            //#20171016 IC리더기 펌웨어 업데이트 Start, srlee
                            else if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_70)
                            {
                                // IC리더기 펌웨어 백업 위치
                                sBackupFile = BaseCom.NxBackPath + PosConst.BACKUP_PATH.ICREADER;
                            }
                            //#20171016 IC리더기 펌웨어 업데이트 End, srlee
                            //  2019-05-14 - 1997fx11 : KIOSK 백업위치
                            else if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10)
                            {
                                sBackupFile = BaseCom.NxBackPath + PosConst.BACKUP_PATH.KIOSK;
                            }
                            else
                            {
                                // PGM 백업 위치
                                sBackupFile = BaseCom.NxBackPath + PosConst.BACKUP_PATH.PGM;
                            }
                            if (CmUtil.Exists(sBackupFile + sFileNm) != true)
                            {
                                // FTP 다운로드
                                CmUtil.FileDelete(sLocalPath + sFileNm);

                                iRet = -1;

                                // DownLoad
                                if (m_sFTPDownloadMode == "1") { iRet = Fluent_Download(sLocalPath, sFilePath, sFileNm); }  // TCP-IP 모드
                                else
                                {
                                    iRet = m_cNetworkFTP.Download(sFilePath, sLocalPath, sFileNm, ref sMsg, m_cPosStatus.Base.FtpConnType);     // Web 모드
                                }

                                if (iRet != 0)
                                {
                                    sApplyType = ItemConst.PGM_DOWN_STATE.DownLoad_Fail;

                                    string sErrMsg = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0282);
                                    if (sErrMsg.Trim() == "") { sErrMsg = "There was an error downloading."; }

                                    WinManager.ErrorMessage(sErrMsg + "\n" + sMsg);
                                }
                                else
                                {
                                    // 다운로드만 적용
                                    sApplyType = ItemConst.PGM_DOWN_STATE.DownLoad_OK;
                                }
                            }
                            else
                            {
                                // 다운로드만 적용
                                sApplyType = ItemConst.PGM_DOWN_STATE.DownLoad_OK;

                                // 백업된 파일을 다운로드 폴더에 복사
                                CmUtil.FileCopy(sFileNm, sBackupFile, sLocalPath, "");
                            }

                            if (m_sManualMode == "K") { aRecvData[2] = m_cPosStatus.Base.SaleDate; }

                            // 다운로드 이력 저장
                            sRet = m_cSvr2Tran.PGMUpdate_History_Isert(sKind, sFileSeq, sFileVer, sFileNm, sApplyDate, sApplyTime, sApplyType, sDeployDate, sDeployTime, sFTP_IP, iFTP_Port.ToString(), sFTP_ID, sFTP_Pwd, sFilePath, "1", sDeployDT, sUseYn);


                            // 수신 상태 전송
                            sRet = m_cSvr2Tran.PGMUpdate_Complete(sKind, sApplyType, sFileNm, sFileSeq, sFileVer, sDownDiv, sDeployDate, sDeployDT);

                            SetProgreeBar(lblCount, pbWork, iLoop + 1, sRecvData.Length, m_DownLoadMsg, sFileNm);

                            if (sApplyType == ItemConst.PGM_DOWN_STATE.DownLoad_Fail && sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_20) { m_bStop = true; }

                            if (m_bStop == true) { break; }
                        }
                    }
                    //else   //   2019-05-16 - 1997fx11 : Connect가 성공하지 못한 경우 강제로 Disconnect
                    //{
                    //    if (m_sFTPDownloadMode == "1")
                    //    {
                    //        Fcl.Disconnect();
                    //        //if (Fcl != null) {  }
                    //    }
                    //}
                }

                sRet = UserCom.RST_OK;
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            finally
            {
                if (m_sFTPDownloadMode == "1")
                    Fcl.Disconnect();
                else
                    m_cNetworkFTP.Disconnect();
            }
            m_bStart = false;
            return sRet;
        }
        #endregion 
         

        #region 다운로드 프로그램 적용 
        /// <summary>
        /// 다운로드 프로그램 적용
        /// </summary>
        /// <returns></returns>
        private string PGMUpdate_Apply(string sDownDiv)
        {
            string sRet = UserCom.RST_ERR;
            string sApplyType = "";
            int iRet = -1;

            string sUnzip_RCPTLOGO_Path = BaseCom.NxImgPath + @"RCPTLOGO\";
            string sUnzip_SIGNPAD_FIRMWARE_Path = BaseCom.NxDonglePath + @"FIRMWARE\";
            string sUnzip_SIGNPAD_AVI_Path = BaseCom.NxDonglePath + @"AVI\";
            string sUnzip_SIGNPAD_IMG_Path = BaseCom.NxDonglePath + @"IMG\";
            string sUnzip_PGM_Path = BaseCom.NxDownPath + @"PGM\";
            string sUnzip_IMG_Path = BaseCom.NxDownPath;
            string sUnzip_CUSTOMER_Path = BaseCom.NxDownPath + @"CDP\CUSTOMER\";
            //  2019-03-29 - 1997fx11 : 기존 POS 상품 경로는 삭제
            //string sUnzip_ITEM_Path = BaseCom.NxDownPath + @"CDP\ITEM\";

            //  2019-03-29 - 1997fx11 : Kiosk 관련 경로 추가.
            string sUnzip_ITEM_Path = BaseCom.NxCDPPath; // + @"CDP\ITEM\";
            string sUnzip_OPTN_Path = BaseCom.NxCDPPath;    // + @"CDP\OPTN\";
            string sUnzip_CAMPN_Path = BaseCom.NxCDPPath;    //  + @"CDP\CAMPN\";
            string sUnzip_CATE_Path = BaseCom.NxCDPPath;    //  + @"CDP\CATE\";
            string sUnzip_SCREEN_Path = BaseCom.NxCDPPath;    //  + @"CDP\SCREEN\";
            string sUnzip_PRESENT_Path = BaseCom.NxCDPPath;    // + @"CDP\PRESENT\";
            string sUnzip_TAG_Path = BaseCom.NxCDPPath;    //  + @"CDP\TAG\";
            string sUnzip_LOGO_Path = BaseCom.NxCDPPath;    //  + @"CDP\LOGO\";


            //#20171016 IC리더기 펌웨어 업데이트 Start, srlee
            string sUnzip_ICREADER_FIRMWARE_Path = BaseCom.NxDownPath + @"ICREADER\"; 
            //#20171016 IC리더기 펌웨어 업데이트 End, srlee

            //string sDelete_CAMPAIGN_Path = BaseCom.NxDownPath + @"CDP\CAMPAIGN\";
            //string sDelete_CDP_COM_Path = BaseCom.NxDownPath + @"CDP\CDP_COM\";
            //string sDelete_CUSTOMER_Path = BaseCom.NxDownPath + @"CDP\CUSTOMER\";
            //string sDelete_ITEM_Path = BaseCom.NxDownPath + @"CDP\ITEM\";
            //string sDelete_TEST_MODE_Path = BaseCom.NxDownPath + @"CDP\TEST_MODE\";
            //string sDelete_ETC_Path = BaseCom.NxDownPath + @"CDP\ETC\";
            string sUnzipPath = "";
            DataTable dtData = new DataTable();

            string sGroup = "";
            string sKind = "";
            int index = 0;

            string sFTP_IP = "";
            int iFTP_Port = 0;
            string sFTP_ID = "";
            string sFTP_Pwd = "";

            string sApplyDate = "";
            string sApplyTime = "";
            string sFilePath = "";
            string sFileNm = "";
            string sFileVer = "";
            string sFileSeq = "";
            string sDeployDate = "";
            string sDeployTime = "";
            string sDeployDT = "";
            string sUseYn = "";

            DataRow drRow = null;

            bool bUnZIp = false;
            try
            {
                // DB Connect
                m_cSqlDbService.SetDBConnectionString(m_cPosStatus.Base.LocalDbSource, m_cPosStatus.Base.LocalDbCatalog, m_cPosStatus.Base.LocalDbUserID, m_cPosStatus.Base.LocalDbPassword);

                string sQuery = "";
                sQuery = "";
                sQuery += "SELECT *  \n";
                sQuery += " FROM POSMST..MST_PGM_VER_NEW  \n";
                sQuery += " WHERE  \n";
                sQuery += " 	CMP_CD	    = '" + m_cPosStatus.Base.CmpCd + "' \n";
                sQuery += " AND STOR_CD     = '" + m_cPosStatus.Base.StoreNo + "' \n";
                sQuery += " AND POS_NO      = '" + m_cPosStatus.Base.PosNo + "' \n";
                sQuery += " AND APP_TYPE    = '1' \n";                                                      // 적용구분(1:다운완료, 2:적용완료, F:다운실패, E:적용실패)
                //sQuery += " AND ISNULL(APPLY_DATE, '') <= '" + m_cPosStatus.Base.SaleDate + "'\n";        // 영업일로 하게되면 개점 이전에 적용되지 않아 서버에서 받은 시스템 일자로 조회
                sQuery += " AND ISNULL(APPLY_DATE, '') + ISNULL(APPLY_TIME, '')	<= '" + DateTime.Now.ToString("yyyyMMdd") + DateTime.Now.ToString("HHmm") + "'\n";     // 영업일로 하게되면 개점 이전에 적용되지 않아 서버에서 받은 시스템 일자로 조회
                //sQuery += " AND ISNULL(APPLY_DATE, '') + ISNULL(APPLY_TIME, '0000')	<= '" + m_cPosStatus.Base.SaleDate + DateTime.Now.ToString("HHmm") + "'\n";       
                sQuery += " AND ISNULL(USE_YN, '1') = '" + PosConst.MST_USE_YN.YES + "'  \n";
                sQuery += " ORDER BY APPLY_DATE, APPLY_TIME, FILE_VER, FILE_SEQ, KIND  \n";
                sQuery = sQuery.Replace("\t", " ");

                iRet = m_cSqlDbService.DBSelect(sQuery, out dtData);

                if (dtData != null && dtData.Rows.Count > 0)
                {
                    lblUpdateInfo.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0722);
                    if (lblUpdateInfo.Text.Trim() == "") lblUpdateInfo.Text = "Applying program update . . .\n Please wait a moment.";
                    lblUpdateInfo.Refresh();
                    WinManager.ShowSearchMessage(lblUpdateInfo.Text, this);

                    foreach (DataRow dr in dtData.Rows)
                    {
                        sGroup = CmUtil.MidH(CmUtil.GetDataRowStr(dr, PosMst.MST_PGM_VER.DATA.KIND), 0, 2);
                        sKind = CmUtil.GetDataRowStr(dr, PosMst.MST_PGM_VER.DATA.KIND);

                        sFTP_IP = CmUtil.GetDataRowStr(dr, "FTP_IP");
                        iFTP_Port = CmUtil.IntParse(CmUtil.GetDataRowStr(dr, "FTP_PORT"));
                        sFTP_ID = CmUtil.GetDataRowStr(dr, "FTP_ID");
                        sFTP_Pwd = CmUtil.GetDataRowStr(dr, "FTP_PWD");

                        sApplyDate = CmUtil.GetDataRowStr(dr, "APPLY_DATE");            // 적용일자
                        sApplyTime = CmUtil.GetDataRowStr(dr, "APPLY_TIME");            // 적용시간
                        sFilePath = CmUtil.GetDataRowStr(dr, "FTP_FILEPATH");           // 파일위치
                        if (CmUtil.RightH(sFilePath, 1) != "/") sFilePath += "/";
                        sFileNm = CmUtil.GetDataRowStr(dr, "FILE_NM");                  // 파일명
                        sFileVer = CmUtil.GetDataRowStr(dr, "FILE_VER");                // 파일버전
                        sFileSeq = CmUtil.GetDataRowStr(dr, "FILE_SEQ");                // 파일Seq
                        sDeployDate = CmUtil.GetDataRowStr(dr, "DEPLOY_DATE");          // 다운로드일자
                        sDeployTime = CmUtil.GetDataRowStr(dr, "DEPLOY_TIME");          // 다운로드시간
                        sDeployDT = CmUtil.GetDataRowStr(dr, "DEPLOY_DT");              // 배포일자
                        sUseYn = "1";                                                   // 사용유무

                        SetProgreeBar(lblCount, pbWork, ++index, dtData.Rows.Count, m_PGMUpdateMsg, sFileNm);

                        if (CmUtil.IsNull(sFileNm) == true || sFileNm.Trim().Length <= 0) continue;

                        // 적용 폴더 선택
                        if (sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_11 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_11_DIV.CUSTOMER)
                        { sUnzipPath = sUnzip_CUSTOMER_Path; }                             // POS 이미지 (고객면)


                        //  2019-03-29 - 1997fx11 : 기존 POS 상품 경로는 삭제
                        //else if (sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_11 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_11_DIV.ITEM_IMAGE)
                        //{ sUnzipPath = sUnzip_ITEM_Path; }                                 // POS 이미지 (상품)

                        //  2019-03-29 - 1997fx11 : Kiosk 관련 수정,추가.
                        else if (sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.ITEM)
                        { sUnzipPath = sUnzip_ITEM_Path; }
                        else if (sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.OPTN)
                        { sUnzipPath = sUnzip_OPTN_Path; }
                        else if (sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.CAMPN)
                        { sUnzipPath = sUnzip_CAMPN_Path; }
                        else if (sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.CATE)
                        { sUnzipPath = sUnzip_CATE_Path; }
                        else if (sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.SCREEN)
                        { sUnzipPath = sUnzip_SCREEN_Path; }
                        else if (sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.PRESENT)
                        { sUnzipPath = sUnzip_PRESENT_Path; }
                        else if (sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.TAG)
                        { sUnzipPath = sUnzip_TAG_Path; }
                        else if (sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.LOGO)
                        { sUnzipPath = sUnzip_LOGO_Path; }

                        else if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_20)
                        { sUnzipPath = sUnzip_PGM_Path; }                                  // POS 프로그램
                        else if (sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_30 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_30_DIV.RCPTLOGO_IMAGE)
                        { sUnzipPath = sUnzip_RCPTLOGO_Path; }                             // 영수증 로고 이미지
                        else if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40)
                        { sUnzipPath = sUnzip_SIGNPAD_FIRMWARE_Path; }                     // 서명패드 펌웨어
                        else if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_50)
                        { sUnzipPath = sUnzip_SIGNPAD_AVI_Path; }                          // 서명패드 동영상
                        else if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_60)
                        { sUnzipPath = sUnzip_SIGNPAD_IMG_Path; }                          // 서명패드 이미지
                        //#20171016 IC리더기 펌웨어 업데이트 Start, srlee
                        else if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_70)
                        { sUnzipPath = sUnzip_ICREADER_FIRMWARE_Path; }                    // IC리더기 펌웨어
                        //#20171016 IC리더기 펌웨어 업데이트 End, srlee
                        else sUnzipPath = sUnzip_PGM_Path;                                  // 프로그램

                        if (CmUtil.RightH(sFileNm, 3).ToUpper() == "ZIP")
                        {
                            // 파일 존재 여부 체크
                            if (File.Exists(BaseCom.NxDownPath + sFileNm) != true)
                            {
                                // 적용 상태
                                sApplyType = ItemConst.PGM_DOWN_STATE.Update_Fail;

                                // 다운로드 이력 저장
                                sRet = m_cSvr2Tran.PGMUpdate_History_Isert(sKind, sFileSeq, sFileVer, sFileNm, sApplyDate, sApplyTime, sApplyType, sDeployDate, sDeployTime, sFTP_IP, iFTP_Port.ToString(), sFTP_ID, sFTP_Pwd, sFilePath, "1", sDeployDT, sUseYn);
                                if (sRet != UserCom.RST_OK) continue;

                                // 수신 상태 전송
                                sRet = m_cSvr2Tran.PGMUpdate_Complete(sKind, sApplyType, sFileNm, sFileSeq, sFileVer, sDownDiv, sDeployDate, sDeployDT);
                                if (sRet != UserCom.RST_OK) continue;

                                continue;
                            }

                            // 압축 해제
                            bUnZIp = CmUtil.UnZipFile(sUnzipPath, BaseCom.NxDownPath + sFileNm);

                            //#20171016 IC리더기 펌웨어 업데이트 Start, srlee
                            // 기존
                            //if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_30 || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40 || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_50 || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_60) bUnZIp = false;

                            // 프로그램 재기동 안함
                            if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_30 || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40 || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_50 || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_60 || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_70) { bUnZIp = false;  }
                            //#20171016 IC리더기 펌웨어 업데이트 End, srlee

                            //#20180919 IC/MSR 폴더 삭제 후 배포받은 파일로 다시 생성해주기 start
                            FolderDelete_ReCreate(sGroup);
                            //#20180919 IC/MSR 폴더 삭제 후 배포받은 파일로 다시 생성해주기 end

                            // 압축 파일 BACKUP으로 이동
                            if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_20)
                            {
                                if (!Directory.Exists(BaseCom.NxBackPath + PosConst.BACKUP_PATH.PGM))
                                    Directory.CreateDirectory(BaseCom.NxBackPath + PosConst.BACKUP_PATH.PGM);

                                // PGM인 경우 차후 복구용으로 별도 위치로 이동한다.
                                CmUtil.FileMove(BaseCom.NxDownPath + sFileNm, BaseCom.NxBackPath + PosConst.BACKUP_PATH.PGM + sFileNm);

                                // POSSTART.EXE가 존재하면 BIN폴더에 덮어쓴다.
                                CmUtil.FileCopy("PosStart.exe", sUnzipPath, BaseCom.NxBinPath, "");
                            }
                            else if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40
                                    || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_50
                                    || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_60)
                            {
                                // 차후 복구용으로 별도 위치로 이동한다.
                                if (!Directory.Exists(BaseCom.NxBackPath + PosConst.BACKUP_PATH.SIGNPAD))
                                    Directory.CreateDirectory(BaseCom.NxBackPath + PosConst.BACKUP_PATH.SIGNPAD);
                                CmUtil.FileMove(BaseCom.NxDownPath + sFileNm, BaseCom.NxBackPath + PosConst.BACKUP_PATH.SIGNPAD + sFileNm);
                            }
                            //#20171016 IC리더기 펌웨어 업데이트 Start, srlee
                            else if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_70)
                            {
                                // 차후 복구용으로 별도 위치로 이동한다.
                                if (!Directory.Exists(BaseCom.NxBackPath + PosConst.BACKUP_PATH.ICREADER))
                                    Directory.CreateDirectory(BaseCom.NxBackPath + PosConst.BACKUP_PATH.ICREADER);
                                CmUtil.FileMove(BaseCom.NxDownPath + sFileNm, BaseCom.NxBackPath + PosConst.BACKUP_PATH.ICREADER + sFileNm);
                            }
                            //  2019-05-16 -1997fx11 : Kiosk용 백업경로
                            else if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10)
                            {
                                if (!Directory.Exists(BaseCom.NxBackPath + PosConst.BACKUP_PATH.KIOSK)) { Directory.CreateDirectory(BaseCom.NxBackPath + PosConst.BACKUP_PATH.KIOSK); }
                                CmUtil.FileMove(BaseCom.NxDownPath + sFileNm, BaseCom.NxBackPath + PosConst.BACKUP_PATH.KIOSK + sFileNm);
                            }
                            //#20171016 IC리더기 펌웨어 업데이트 End, srlee
                            else
                            {
                                // 적용후 zip 파일 삭제
                                CmUtil.FileDelete(BaseCom.NxDownPath + sFileNm);
                            }
                        }
                        else
                        {
                            // 압축을 풀 대상 폴더가 존재하지 않으면 생성
                            if (!Directory.Exists(sUnzipPath))
                                Directory.CreateDirectory(sUnzipPath);

                            // 일반 파일이면 적용폴더로 그대로 이동
                            CmUtil.FileMove(BaseCom.NxDownPath + sFileNm, sUnzipPath + sFileNm);
                        }

                        //#20171016 IC리더기 펌웨어 업데이트 Start, srlee
                        // 기존
                        /*if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40
                                    || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_50
                                    || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_60)*/
                        
                        if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40
                                    || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_50
                                    || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_60
                                    || sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_70)
                        //#20171016 IC리더기 펌웨어 업데이트 End, srlee                        
                        {
                            // 서명패드 적용상태 체크용 저장
                            dr["APP_TYPE"] = ItemConst.PGM_DOWN_STATE.Update_Fail;
                            DataTableCopy(dtData, ref m_dtSignPad);
                        }

                        // 적용 상태
                        sApplyType = ItemConst.PGM_DOWN_STATE.Update_OK;

                        // 다운로드 이력 저장
                        sRet = m_cSvr2Tran.PGMUpdate_History_Isert(sKind, sFileSeq, sFileVer, sFileNm, sApplyDate, sApplyTime, sApplyType, sDeployDate, sDeployTime, sFTP_IP, iFTP_Port.ToString(), sFTP_ID, sFTP_Pwd, sFilePath, "1", sDeployDT, sUseYn);
                        if (sRet != UserCom.RST_OK) continue;

                        // 수신 상태 전송
                        sRet = m_cSvr2Tran.PGMUpdate_Complete(sKind, sApplyType, sFileNm, sFileSeq, sFileVer, sDownDiv, sDeployDate, sDeployDT);
                        if (sRet != UserCom.RST_OK) continue;                    

                        if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_20)
                        {
                            // 이전 파일 삭제
                            PGM_FileDelete(sKind, sFileVer, sFileSeq);

                            // 프로그램 버전정보 설정
                            SetProgramVerIni(sKind, sFileVer, sFileSeq);
                        }
                        else if (sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_30 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_30_DIV.RCPTLOGO_IMAGE)
                        {
                            // 영수증로고 다운로드 후 영수증로고 업로드 함으로 변경
                            m_cPosStatus.Base.LogoUpload = PosConst.LOGO_UPLOAD_DIV.YES;

                            // PosConfig.INI 저장
                            IServiceUs cSaveConfigInfo = (IServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_OPEN_CLOSE.DLL, ServiceLists.BSV_OPEN_CLOSE.SAVE_CONFIGINFO);
                            cSaveConfigInfo = (IServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_OPEN_CLOSE.DLL, ServiceLists.BSV_OPEN_CLOSE.SAVE_CONFIGINFO);
                            cSaveConfigInfo.Execute(new string[] { PosConst.INI_FILE_NAME.PosConfig });
                        }
                    }

                    //if (m_sManualMode == "K")
                    //    WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0621));

                    if (bUnZIp == true) m_cPosStatus.Sale.SysShutDown = PosConst.SYS_SHUTDOWN.PGMRESTART;
                }
                else
                {
                    //    if (m_sManualMode == "K")
                    //    {
                    //        string sMsg = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0288);
                    //        if (sMsg.Trim() == "") sMsg = "You already have the latest version.";
                    //        WinManager.ConfirmMessage(sMsg);
                    //    }
                    sRet = UserCom.RST_OK;
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);

                // 수신 상태 전송
                sApplyType = ItemConst.PGM_DOWN_STATE.Update_Fail;
                sRet = m_cSvr2Tran.PGMUpdate_Complete(sKind, sApplyType, sFileNm, sFileSeq, sFileVer, sDownDiv, sDeployDate, sDeployDT);
            }
            return sRet;
        }
        #endregion


        #region 다운로드 프로그램 삭제 (현재 버전과 이전 버전 이외 삭제)
        /// <summary>
        /// 다운로드 프로그램 삭제 (현재 버전과 이전 버전 이외 삭제) 
        /// </summary>
        /// <returns></returns>
        private string PGM_FileDelete(string sKind, string sFileVer, string sFileSeq)
        {
            string sRet = UserCom.RST_ERR;
            string sUnzipPath = BaseCom.NxBackPath + PosConst.BACKUP_PATH.PGM;
            int iRet = -1;
            DataTable dtData = new DataTable();

            string sFileNm = "";

            try
            {
                // DB Connect
                m_cSqlDbService.SetDBConnectionString(m_cPosStatus.Base.LocalDbSource
                                                    , m_cPosStatus.Base.LocalDbCatalog
                                                    , m_cPosStatus.Base.LocalDbUserID
                                                    , m_cPosStatus.Base.LocalDbPassword);
                string sQuery = "";
                sQuery = "";
                sQuery += "SELECT \n";
                sQuery += "		KIND \n";
                sQuery += "	,	FILE_VER \n";
                sQuery += "	,	FILE_SEQ \n";
                sQuery += "	,	FILE_NM \n";
                sQuery += "FROM POSMST..MST_PGM_VER_NEW \n";
                sQuery += "WHERE  \n";
                sQuery += "	   CMP_CD	= '" + m_cPosStatus.Base.CmpCd + "'\n";
                sQuery += "AND STOR_CD  = '" + m_cPosStatus.Base.StoreNo + "'\n";
                sQuery += "AND POS_NO	= '" + m_cPosStatus.Base.PosNo + "'\n";
                sQuery += "AND KIND	    = '" + sKind + "'\n";
                sQuery += "AND APP_TYPE	<> '1' \n";                                  // 적용구분(1:다운완료, 2:적용완료, F:다운실패, E:적용실패)
                sQuery += "AND FILE_VER + CONVERT(VARCHAR(5), FILE_SEQ) < '" + sFileVer + sFileSeq + "'\n";
                sQuery += "AND FILE_VER + CONVERT(VARCHAR(5), FILE_SEQ) NOT IN(SELECT ISNULL(MAX(FILE_VER + CONVERT(VARCHAR(5), FILE_SEQ)), 0) \n";
                sQuery += "					FROM POSMST..MST_PGM_VER_NEW \n";
                sQuery += "					WHERE  \n";
                sQuery += "	                    CMP_CD	= '" + m_cPosStatus.Base.CmpCd + "'\n";
                sQuery += "                 AND STOR_CD  = '" + m_cPosStatus.Base.StoreNo + "'\n";
                sQuery += "                 AND POS_NO	= '" + m_cPosStatus.Base.PosNo + "'\n";
                sQuery += "                 AND KIND	    = '" + sKind + "'\n";
                sQuery += "                 AND APP_TYPE	<> '1' \n";                                  // 적용구분(1:다운완료, 2:적용완료, F:다운실패, E:적용실패)
                sQuery += "                 AND FILE_VER + CONVERT(VARCHAR(5), FILE_SEQ) <> '" + sFileVer + sFileSeq + "'\n";
                sQuery += "                 AND ISNULL(USE_YN, '1') = '" + PosConst.MST_USE_YN.YES + "'  \n";
                sQuery += "                 ) \n";
                sQuery += " AND ISNULL(USE_YN, '1') = '" + PosConst.MST_USE_YN.YES + "'  \n";
                sQuery += "ORDER BY 1, 2, 3 \n";
                 
                sQuery = sQuery.Replace("\t", " ");

                iRet = m_cSqlDbService.DBSelect(sQuery, out dtData);

                if (dtData != null && dtData.Rows.Count > 0)
                {
                    pbWork.Minimum = 0;
                    pbWork.Maximum = dtData.Rows.Count;

                    foreach (DataRow dr in dtData.Rows)
                    {
                        sKind = CmUtil.GetDataRowStr(dr, PosMst.MST_PGM_VER.DATA.KIND);
                        sFileNm = CmUtil.GetDataRowStr(dr, PosMst.MST_PGM_VER.DATA.FILE_NM);

                        if (sFileNm.Trim() == "") continue;

                        // 이전 파일 삭제
                        CmUtil.FileDelete(sUnzipPath + sFileNm);
                    }
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return sRet;
        }
        #endregion         


        #region 버튼 입력 처리
        /// <summary>
        /// 버튼 입력 처리
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnProc_Click(object sender, EventArgs e)
        {
            string sRet = UserCom.RST_ERR;
            string sGroup = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_ALL;
            string sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_ALL_DIV.ALL_PGM;
            string sSignPadKind = "";
            string[] sKind_Param = new string[10];
            string sMsg = "";

            try
            {
                if (bNotDoubleClik) return;
                bNotDoubleClik = true;

                // 백그라운드 다운 데몬 중지
                if (m_sManualMode == "K")
                    m_cBackgroundDown.Stop();

                m_cUpDateMode = (m_sManualMode == "K" ? PosConst.PGM_UPDATE_DOWN_DIV.UPDATE : PosConst.PGM_UPDATE_DOWN_DIV.ALL);

                lblCount.Text = "";
                lblCount.Visible = false;
                pbWork.Visible = false;
                this.Update();

                if (((Cosmos.UI.CsmButton)sender) == btnPGM)                    // POS 프로그램 다운로드
                {
                    sGroup = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_20;
                    sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_20_DIV.ALL_PGM;
                }
                else if (((Cosmos.UI.CsmButton)sender) == btnRcptLogo)           // 영수증 로고 이미지 다운로드
                {
                    sGroup = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_30;
                    sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_30_DIV.RCPTLOGO_IMAGE;
                }
                else if (((Cosmos.UI.CsmButton)sender) == btnSignUpdateFile)    // 서명패드 업데이트 파일 다운로드
                {
                    sGroup = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40;
                    sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.ALL_PGM;

                    // 처리상태  
                    m_dtSignPad.Clear();
                }
                else if (((Cosmos.UI.CsmButton)sender) == btnMasterAll)         // 마스터 전체
                {
                    sKind = "";

                    // 마스터 DB 수신
                    string sType = PosConst.MASTER_DOWN_OP.ALL;
                    WinBasic.ShowForm(new string[] { FormManager.FORM_PROGRAM_START, sType, PosConst.POS_PERIPHERAL_CHECK.NO_CHECK, m_sManualMode });

                    // POS 마스터 로딩
                    IServiceUs cLoadMstSrv = (IServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_OPEN_CLOSE.DLL, ServiceLists.BSV_OPEN_CLOSE.LOAD_MASTER_INFO);
                    cLoadMstSrv.Execute(new string[] { }); 

                    if (m_sManualMode == "K")
                        WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0621));
                }
                else if (((Cosmos.UI.CsmButton)sender) == btnMasterUpdate)          // 마스터 변경분
                {
                    sKind = "";                     

                    // 마스터 DB 수신
                    string sType = PosConst.MASTER_DOWN_OP.CHANGED;
                    WinBasic.ShowForm(new string[] { FormManager.FORM_PROGRAM_START, sType, PosConst.POS_PERIPHERAL_CHECK.NO_CHECK, m_sManualMode });

                    // POS 마스터 로딩
                    IServiceUs cLoadMstSrv = (IServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_OPEN_CLOSE.DLL, ServiceLists.BSV_OPEN_CLOSE.LOAD_MASTER_INFO);
                    cLoadMstSrv.Execute(new string[] { });

                    if (m_sManualMode == "K")
                        WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0621));
                }
                else if(((Cosmos.UI.CsmButton)sender) == btnCampaignMasterAll)      // 마스터 캠페인-전체
                {
                    sKind = "";

                    // 캠페인 마스터 수신
                    string sType = PosConst.MASTER_DOWN_OP.ALL_CAMPAIGN;
                    WinBasic.ShowForm(new string[] { FormManager.FORM_PROGRAM_START, sType, PosConst.POS_PERIPHERAL_CHECK.NO_CHECK, m_sManualMode });

                    // POS 마스터 로딩
                    IServiceUs cLoadMstSrv = (IServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_OPEN_CLOSE.DLL, ServiceLists.BSV_OPEN_CLOSE.LOAD_MASTER_INFO);
                    cLoadMstSrv.Execute(new string[] { });

                    if (m_sManualMode == "K")
                        WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0621));
                }
                else if (((Cosmos.UI.CsmButton)sender) == btnCustomer)          // 고객화면 이미지 다운로드
                {
                    //////if (m_sManualMode == "K")
                    //////{
                        sGroup = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_11;
                        sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_11_DIV.CUSTOMER;
                    //////}
                    //////else
                    //////{
                    //////    // 이미지 전체 재수신 (자동모드이면서 PosSaleInfo의 이미지 재수신이면)
                    //////    sGroup = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10;
                    //////    sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.ALL_PGM;
                    //////}
                }
                else if (((Cosmos.UI.CsmButton)sender) == btniTem)              // 상품 이미지 다운로드
                {
                    sGroup = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10;
                    sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.ITEM_IMAGE;
                }
                else if (((Cosmos.UI.CsmButton)sender) == btnTestMode)          // TEST 모드
                {
                    sGroup = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10;
                    sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.TEST_MODE;
                }
                else if (((Cosmos.UI.CsmButton)sender) == btnContents)          // 컨텐츠 
                {
                    sGroup = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10;
                    sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.CONTENTS;
                }
                else if (((Cosmos.UI.CsmButton)sender) == btnCampaign)          // 캠페인
                {
                    sGroup = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10;
                    sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.CAMPAIGN;
                }
                else if (((Cosmos.UI.CsmButton)sender) == btnICReaderUpdate)    // IC리더기 업데이트
                {
                    #region IC리더기 업데이트
                    //#20171016 IC리더기 펌웨어 업데이트 Start, srlee
                    // 기존
                    /*sGroup = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_70;
                    sKind = "";
                    sMsg = "";

                    if (m_cDevStatus.ICReader.UseYn == true)
                    {
                        this.TopMost = false;

                        if (m_cDeviceICReader.SetDE_DownloadFW(2, 2, 0, null, ref sMsg) != true)
                        {
                            if (sMsg.Trim() == "") sMsg = "There was an error updating the IC reader firmware.";
                            WinManager.ConfirmMessage(sMsg);
                        }
                        else
                        {
                            if (m_sManualMode == "K")
                            {
                                sMsg = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0621);
                                if (sMsg.Trim() == "") sMsg = "The download is complete.";
                                WinManager.ConfirmMessage(sMsg);
                            }
                        }
                    }*/

                    WinManager.ShowSearchMessage(MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0723), this);
                    m_dtSignPad.Clear();

                    sGroup = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_70;
                    if (m_cDevStatus.ICReader.UseYn == true)
                    {
                        // IC리더기 모델 SR-440P인 경우만 펌웨어 업데이트
                        if (m_ICReaderUpdate.ICReaderModelCheck())
                        {
                            m_dtSignPad = new DataTable();

                            sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_70_DIV.IC_READER_01;

                            if (sKind.Trim() != "")
                            {
                                sRet = PGMUpdateCheck_Manual(PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_70 + sKind, m_cUpDateMode, false);

                            }
                            WinManager.HideSearchMessage(this);

                            if (m_dtSignPad.Rows.Count > 0)
                            {
                                if (m_sManualMode == "K")
                                {
                                    lblCount.Visible = false;
                                    pbWork.Visible = false;
                                }

                                // IC리더기 펌웨어 업데이트
                                frmICReaderUpdate fForm = (frmICReaderUpdate)FormManager.GetForm(FormManager.FORM_ICREADER_UPDATE);
                                if (fForm == null)
                                {
                                    fForm = new frmICReaderUpdate();
                                    FormManager.AddForm(FormManager.FORM_ICREADER_UPDATE, fForm);
                                }
                                fForm.SetDataTable = m_dtSignPad;

                                if (fForm.ShowDialog() == DialogResult.OK)
                                {
                                    sRet = UserCom.RST_OK;
                                }
                                else
                                {
                                    sRet = UserCom.RST_ERR;
                                }

                                // 처리상태 저장
                                foreach (DataRow dr in m_dtSignPad.Rows)
                                {
                                    // 다운로드 이력 저장
                                    sRet = m_cSvr2Tran.PGMUpdate_History_Isert(dr["KIND"].ToString(), dr["FILE_SEQ"].ToString(), dr["FILE_VER"].ToString(), dr["FILE_NM"].ToString(), dr["APPLY_DATE"].ToString(), dr["APPLY_TIME"].ToString(), dr["APP_TYPE"].ToString(), dr["DEPLOY_DATE"].ToString(), dr["DEPLOY_TIME"].ToString(), dr["FTP_IP"].ToString(), dr["FTP_PORT"].ToString(), dr["FTP_ID"].ToString(), dr["FTP_PWD"].ToString(), dr["FTP_FILEPATH"].ToString(), "1", dr["DEPLOY_DT"].ToString(), "1");
                                    if (sRet != UserCom.RST_OK) continue;

                                    // 수신 상태 전송
                                    sRet = m_cSvr2Tran.PGMUpdate_Complete(dr["KIND"].ToString(), dr["APP_TYPE"].ToString(), dr["FILE_NM"].ToString(), dr["FILE_SEQ"].ToString(), dr["FILE_VER"].ToString(), m_cUpDateMode, dr["DEPLOY_DATE"].ToString(), dr["DEPLOY_DT"].ToString());
                                    if (sRet != UserCom.RST_OK) continue;
                                }
                                return;
                            }
                            else
                            {
                                sRet = UserCom.RST_ERR;
                            }
                        }
                    }
                    //#20171016 IC리더기 펌웨어 업데이트 End, srlee
                    #endregion
                }
                
                // 프로그램 업데이트 있는지 조회 요청후 다운로드
                if (sKind.Trim() != "")
                {
                    WinManager.ShowSearchMessage(MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0723), this);

                    #region 서명패드 업데이트
                    if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40 && sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.ALL_PGM)
                    {
                        if (m_cDevStatus.SignPad.UseYn == true)
                        {
                            // 서명패드일 경우 펌웨어, 동영상, 이미지를 다운 받는다.
                            m_dtSignPad = new DataTable();

                            // 서명패드 정보 조회 
                            string sSingPadModel = "";
                            sKind = "";
                            sSignPadKind = "";
                            sSingPadModel = m_SignPadUpdate.SignPadModelCheck();
                            switch (sSingPadModel)
                            {
                                case PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_MODEL_SSP_100:
                                    if (m_cDevStatus.ICReader.UseYn == true)
                                        sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_01;
                                    else
                                        sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_51;

                                    sSignPadKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_01;
                                    break;
                                case PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_MODEL_SN_350P:
                                    if (m_cDevStatus.ICReader.UseYn == true)
                                        sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_02;
                                    else
                                        sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_52;

                                    sSignPadKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_02;
                                    break;
                                case PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_MODEL_SN_150P:
                                    if (m_cDevStatus.ICReader.UseYn == true)
                                        sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_03;
                                    else
                                        sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_53;

                                    sSignPadKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_03;
                                    break;
                                case PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_MODEL_SR_170P:
                                    if (m_cDevStatus.ICReader.UseYn == true)
                                        sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_04;
                                    else
                                        sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_54;

                                    sSignPadKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_04;
                                    break;
                                case PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_MODEL_OLTMS:
                                    if (m_cDevStatus.ICReader.UseYn == true)
                                        sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_05;
                                    else
                                        sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_55;

                                    sSignPadKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_05;
                                    break;
                                case PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_MODEL_OLCSP:
                                    if (m_cDevStatus.ICReader.UseYn == true)
                                        sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_06;
                                    else
                                        sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_56;

                                    sSignPadKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40_DIV.SIGNPAD_06;
                                    break;
                            }

                            if (sKind.Trim() != "")
                            {
                                sKind_Param = new string[] { PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_40 + sKind
                                                    , PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_50 + sSignPadKind
                                                    , PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_60 + sSignPadKind };

                                for (int i = 0; i < sKind_Param.Length; i++)
                                {
                                    sRet = PGMUpdateCheck_Manual(sKind_Param[i], m_cUpDateMode, false);
                                }
                            }
                            WinManager.HideSearchMessage(this);                             

                            //if (m_SignPadUpdate.SignPadUpdateCnt(ref sImgFile, ref sAviFile, ref sFirmFile) > 0)
                            if (m_dtSignPad.Rows.Count > 0)
                            {
                                if (m_sManualMode == "K")
                                {
                                    lblCount.Visible = false;
                                    pbWork.Visible = false;
                                }

                                // 서명패드 업데이트
                                frmSignPadUpdate fForm = (frmSignPadUpdate)FormManager.GetForm(FormManager.FORM_SIGNPAD_UPDATE);
                                if (fForm == null)
                                {
                                    fForm = new frmSignPadUpdate();
                                    FormManager.AddForm(FormManager.FORM_SIGNPAD_UPDATE, fForm);
                                }
                                fForm.SetDataTable = m_dtSignPad;

                                if (fForm.ShowDialog() == DialogResult.OK)
                                {
                                    sRet = UserCom.RST_OK;
                                }
                                else
                                {
                                    sRet = UserCom.RST_ERR;
                                }

                                // 처리상태 저장
                                foreach (DataRow dr in m_dtSignPad.Rows)
                                {
                                    // 다운로드 이력 저장
                                    sRet = m_cSvr2Tran.PGMUpdate_History_Isert(dr["KIND"].ToString(), dr["FILE_SEQ"].ToString(), dr["FILE_VER"].ToString(), dr["FILE_NM"].ToString(), dr["APPLY_DATE"].ToString(), dr["APPLY_TIME"].ToString(), dr["APP_TYPE"].ToString(), dr["DEPLOY_DATE"].ToString(), dr["DEPLOY_TIME"].ToString(), dr["FTP_IP"].ToString(), dr["FTP_PORT"].ToString(), dr["FTP_ID"].ToString(), dr["FTP_PWD"].ToString(), dr["FTP_FILEPATH"].ToString(), "1", dr["DEPLOY_DT"].ToString(), "1");
                                    if (sRet != UserCom.RST_OK) continue;

                                    // 수신 상태 전송
                                    sRet = m_cSvr2Tran.PGMUpdate_Complete(dr["KIND"].ToString(), dr["APP_TYPE"].ToString(), dr["FILE_NM"].ToString(), dr["FILE_SEQ"].ToString(), dr["FILE_VER"].ToString(), m_cUpDateMode, dr["DEPLOY_DATE"].ToString(), dr["DEPLOY_DT"].ToString());
                                    if (sRet != UserCom.RST_OK) continue;
                                }
                                return;
                            }
                            else
                            {
                                sRet = UserCom.RST_ERR;
                            }
                        }
                    }
                    #endregion  서명패드 업데이트

                    #region 상품 이미지 업데이트
                    else if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 && sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.ITEM_IMAGE)
                    {
                        sKind_Param = new string[] { PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 + sKind
                                                    , PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_11 + sKind };

                        for (int i = 0; i < sKind_Param.Length; i++)
                        {
                            sRet = PGMUpdateCheck_Manual(sKind_Param[i], m_cUpDateMode, false);
                        }
                    }
                    #endregion 
                    
                    //////#region 이미지 재수신요청
                    //////else if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 && sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.ALL_PGM)
                    //////{
                    //////    sKind_Param = new string[] { PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.ITEM_IMAGE
                    //////                                , PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.CAMPAIGN
                    //////                                , PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.TEST_MODE
                    //////                                , PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_10_DIV.ITEM_IMAGE
                    //////                                , PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_11 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_11_DIV.ITEM_IMAGE
                    //////                                , PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_11 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_11_DIV.CUSTOMER
                    //////                                 };

                    //////    for (int i = 0; i < sKind_Param.Length; i++)
                    //////    {
                    //////        sRet = PGMUpdateCheck_Manual(sKind_Param[i], "U", false);
                    //////    }

                    //////    if (sRet == UserCom.RST_OK)
                    //////    {
                    //////        // PosSaleInfo.INI 저장
                    //////        CmMessage cmPosSaleInfo = CmMessage.MakeMessageFromFile(BaseCom.NxIniPath + PosConst.INI_FILE_NAME.PosSaleInfo);
                    //////        cmPosSaleInfo.GetMessage("POSOPEN").MakeMessageOverWrite("IMAGE_ALL_REDOWN_YN", "0");
                    //////        cmPosSaleInfo.MakeFileFromMessage(BaseCom.NxIniPath + PosConst.INI_FILE_NAME.PosSaleInfo);
                    //////    }
                    //////}
                    //////#endregion
                    
                    else
                    {
                        sRet = PGMUpdateCheck_Manual(sGroup + sKind, m_cUpDateMode, false);
                    }
                    WinManager.HideSearchMessage(this);

                    #region 전체 수신후 메시지 표시
                    // 전체 수신후 메시지 표시
                    if (sRet == UserCom.RST_OK)
                    {
                        // 영수증 이미지 로고 다운로드 후 영수증프린터에 Uploading
                        if (sGroup == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_30 && sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_30_DIV.RCPTLOGO_IMAGE) SetRcptLogo();

                        if (m_sManualMode == "K")
                        {
                            lblCount.Visible = false;
                            pbWork.Visible = false;

                            sMsg = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0621);
                            if (sMsg.Trim() == "") sMsg = "The download is complete.";
                            WinManager.ConfirmMessage(sMsg);
                        }
                    }
                    else
                    {
                        if (m_sManualMode == "K")
                        {
                            lblCount.Visible = false;
                            pbWork.Visible = false;

                            sMsg = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0288);
                            if (sMsg.Trim() == "") sMsg = "You already have the latest version.";
                            WinManager.ConfirmMessage(sMsg);
                        }
                    }
                    #endregion
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                     System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
                bNotDoubleClik = false;
            }
            finally
            {
                WinManager.HideSearchMessage(this);

                lblCount.Visible = false;
                pbWork.Visible = false;

                // 백그라운드 다운 데몬 시작
                if (m_sManualMode == "K")
                    m_cBackgroundDown.Start();

                bNotDoubleClik = false;
            }
        }
        #endregion
        
        
        #region  프로그램 업데이트 있는지 조회 요청 - 수동
        /// <summary>
        /// 프로그램 업데이트 있는지 조회 요청 - 수동
        /// </summary>
        /// <param name="sKind"></param>
        /// <returns></returns>
        private string PGMUpdateCheck_Manual(string sKind, string sDownDiv, bool bView)
        {
            string sRet = UserCom.RST_OK;
            string sMsg = "";
            try
            {
                if (m_cSvr2Tran.PGMUpdate(sKind, sDownDiv, ref m_sRecvData, ref m_hRecvData) == UserCom.RST_OK)
                {
                    // FTP 수신
                    if (bView == true) WinManager.ShowSearchMessage(MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0723), this);

                    string sFTP_IP = m_hRecvData[Column.IQ_PGMUPDATE_RSP.DATA.FTP_IP].ToString();
                    int iFTP_Port = CmUtil.IntParse(m_hRecvData[Column.IQ_PGMUPDATE_RSP.DATA.FTP_PORT].ToString());
                    string sFTP_ID = m_hRecvData[Column.IQ_PGMUPDATE_RSP.DATA.FTP_ID].ToString();
                    string sFTP_Pwd = m_hRecvData[Column.IQ_PGMUPDATE_RSP.DATA.FTP_PWD].ToString();

                    PGMDownLoad(sDownDiv, sFTP_IP, iFTP_Port, sFTP_ID, sFTP_Pwd, m_sRecvData);
                    
                    if (bView == true) WinManager.HideSearchMessage(this);
                }

                // 프로그램 적용
                sMsg = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0722);
                if (sMsg.Trim() == "") sMsg = "Applying program update.";

                if (bView == true) WinManager.ShowSearchMessage(sMsg, this);
                sRet = PGMUpdate_Apply(sDownDiv);
                if (bView == true) WinManager.HideSearchMessage(this); 

                if (m_sManualMode != "K")
                {
                    if (m_cPosStatus.Sale.SysShutDown.Trim() != "")
                    {
                        // 수동모드가 아닌경우 화면 닫기
                        if (sRet == UserCom.RST_OK)
                        {
                            this.DialogResult = DialogResult.OK;
                        }
                        else
                        {
                            this.DialogResult = DialogResult.Cancel;
                        }

                        this.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
                sRet = UserCom.RST_ERR;
            }
            finally
            {
                if (bView == true) WinManager.HideSearchMessage(this);
            }

            return sRet;
        }
        #endregion 
        
        
        #region  프로그램 업데이트 있는지 조회 요청
        /// <summary>
        /// 프로그램 업데이트 있는지 조회 요청
        /// </summary>
        /// <param name="sKind"></param>
        /// <returns></returns>
        private string PGMUpdateCheck(string sKind, string sDownDiv)
        {
            string sRet = UserCom.RST_OK; 
            bool bReDown = false;

            try
            {
                sRet = m_cSvr2Tran.PGMUpdate(sKind, sDownDiv, ref m_sRecvData, ref m_hRecvData);
                if (sRet != UserCom.RST_OK)
                {
                    // 최신버전을 받을게 없을 경우 로컬버전과 서버버전 체크
                    CmMessage m_PosConfig = CmMessage.MakeMessageFromFile(BaseCom.NxIniPath + PosConst.INI_FILE_NAME.PosConfig);

                    sKind = PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_20 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_20_DIV.ALL_PGM;
                    sRet = m_cSvr2Tran.PGMUpdate(sKind, "U", ref m_sRecvData, ref m_hRecvData);
                    if (sRet== UserCom.RST_OK)
                    {
                        for (int iLoop = 0; iLoop < m_sRecvData.Length; iLoop++)
                        {
                            if (m_sRecvData[iLoop].Trim() == "") continue;

                            string[] aRecvData = m_sRecvData[iLoop].Split(new string[] { "|" }, StringSplitOptions.None);

                            if (aRecvData.Length <= 0) continue;

                            aRecvData = m_sRecvData[iLoop].Split(new string[] { "|" }, StringSplitOptions.None);
                             
                            string sLocalVer = CmUtil.StringNullEmpty(GetConfigInfo(m_PosConfig, "PGMVER", "ProgramVer" + aRecvData[1].Trim().ToString()));

                            // 서버에서 받은 최종 적용버전과 로컬적용 버전이 다른경우 프로그램 재수신
                            if (aRecvData[6].Trim().ToString() != sLocalVer.Trim() || sLocalVer.Trim().Length <= 0)
                            {
                                // 재수신 하도록 설정
                                bReDown = true;
                            }
                            else
                            {
                                // 다시 받지 않아도 되도록 삭제
                                m_sRecvData[iLoop] = "";
                            }
                        }
                    }
                    // bReDown이 True가 아니면 Skip
                    sRet = UserCom.RST_ERR;
                }

                if (sRet == UserCom.RST_OK || bReDown == true)
                {
                    // FTP 수신 
                    lblUpdateInfo.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0723);
                    if (lblUpdateInfo.Text.Trim() == "") lblUpdateInfo.Text = "Downloading program updates . . .\n Please wait a moment.";
                    lblUpdateInfo.Refresh();

                    string sFTP_IP = m_hRecvData[Column.IQ_PGMUPDATE_RSP.DATA.FTP_IP].ToString();
                    int iFTP_Port = CmUtil.IntParse(m_hRecvData[Column.IQ_PGMUPDATE_RSP.DATA.FTP_PORT].ToString());
                    string sFTP_ID = m_hRecvData[Column.IQ_PGMUPDATE_RSP.DATA.FTP_ID].ToString();
                    string sFTP_Pwd = m_hRecvData[Column.IQ_PGMUPDATE_RSP.DATA.FTP_PWD].ToString();

                    PGMDownLoad(sDownDiv, sFTP_IP, iFTP_Port, sFTP_ID, sFTP_Pwd, m_sRecvData);
                    
                    //WinManager.HideSearchMessage(this);
                }

                // 프로그램 적용
                lblUpdateInfo.Text = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0455);
                if (lblUpdateInfo.Text.Trim() == "") lblUpdateInfo.Text = "Checking for program updates . . .\n Please wait a moment.";
                lblUpdateInfo.Refresh();

                WinManager.ShowSearchMessage(lblUpdateInfo.Text, this);
                sRet = PGMUpdate_Apply(sDownDiv);
                WinManager.HideSearchMessage(this);

                //#20171016 IC리더기 펌웨어 업데이트 Start, srlee         
                // IC리더기 펌웨어 업데이트 - 수동만 가능하도록
                //btnProc_Click(btnICReaderUpdate, null);

                //  2019-05-16 - 1997fx11 : 임시로 막음.
                //btnProc_Click(btnICReaderUpdate, null);
                //#20171016 IC리더기 펌웨어 업데이트 End, srlee

                // 서명패드 업데이트
                //  2019-05-16 - 1997fx11 : 임시로 막음.
                //btnProc_Click(btnSignUpdateFile, null);

                //////// 이미지 전체 재수신 여부 체크
                //////try
                //////{
                //////    string sIMAGE_ALL_REDOWN_YN = null;
                //////    CmMessage cPosSaleInfo = CmMessage.MakeMessageFromFile(BaseCom.NxIniPath + PosConst.INI_FILE_NAME.PosSaleInfo);
                //////    sIMAGE_ALL_REDOWN_YN = CmUtil.StringNullEmpty(GetConfigInfo(cPosSaleInfo, "POSOPEN", "IMAGE_ALL_REDOWN_YN"));

                //////    if (sIMAGE_ALL_REDOWN_YN != "0")
                //////    {
                //////        // 이미지 전체 재수신
                //////        btnProc_Click(btnCustomer, null);
                //////    }
                //////}
                //////catch (Exception ex)
                //////{
                //////    WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                //////        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
                //////}

                if (m_sManualMode != "K" || m_cPosStatus.Sale.SysShutDown.Trim() != "")
                {
                    // 수동모드가 아닌경우 화면 닫기
                    if (sRet == UserCom.RST_OK)
                    {
                        // 이미지 전체 재수신 여부 설정
                        CmMessage m_PosSaleInfo = CmMessage.MakeMessageFromFile(BaseCom.NxIniPath + PosConst.INI_FILE_NAME.PosSaleInfo);
                        m_PosSaleInfo.GetMessage("POSOPEN").MakeMessageOverWrite("IMAGE_ALL_REDOWN_YN", "0");
                        m_PosSaleInfo.MakeFileFromMessage(BaseCom.NxIniPath + PosConst.INI_FILE_NAME.PosSaleInfo);

                        this.DialogResult = DialogResult.OK;
                    }
                    else
                    {
                        this.DialogResult = DialogResult.Cancel;
                    }

                    this.Close();
                }

            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
                sRet = UserCom.RST_OK;
            }
            finally
            {
                WinManager.HideSearchMessage(this);
            }
            return sRet;
        }
        #endregion 
        
        
        #region 태크 이미지 로드
        /// <summary>
        /// 태크 이미지 로드
        /// </summary>
        private void GetTagImg()
        {
            try
            {
                string sTmpImg = "";
                //bool bImg = false;

                for (int iRow = 1; iRow <= 3; iRow++)
                {
                    sTmpImg = string.Format(m_TagImgFileName, PosKey.MENU_KEY.POS_SETTING, iRow);

                    string sPicName = "picTabImg" + iRow.ToString();

                    Control[] ctrls = pnlFunc.Controls.Find(sPicName, false);
                    if (ctrls != null && ctrls[0] is Cosmos.UI.CsmPictureBox)
                    {
                        ((Cosmos.UI.CsmPictureBox)ctrls[0]).Image = CmUtil.LoadImage(BaseCom.NxImgPath + sTmpImg);
                    }
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion


        #region 버튼이미지 로드
        /// <summary>
        /// 버튼이미지 로드
        /// </summary>
        private void GetBtnImg()
        {
            try
            {
                // 다운로드
                btnPGM.DefaultImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_BLUE_BASIC);
                btnPGM.ClickImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_BLUE_PRESS);
                // 영수증 로고 이미지
                btnRcptLogo.DefaultImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_BLUE_BASIC);
                btnRcptLogo.ClickImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_BLUE_PRESS);
                // 서명패드 업데이트 파일
                btnSignUpdateFile.DefaultImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_BLUE_BASIC);
                btnSignUpdateFile.ClickImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_BLUE_PRESS);
                // IC리더기 업데이트 
                btnICReaderUpdate.DefaultImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_BLUE_BASIC);
                btnICReaderUpdate.ClickImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_BLUE_PRESS);

                // POS 운영 이미지
                btnContents.DefaultImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_ORANGE_BASIC);
                btnContents.ClickImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_ORANGE_PRESS);
                // 고객면 이미지
                btnCustomer.DefaultImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_ORANGE_BASIC);
                btnCustomer.ClickImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_ORANGE_PRESS);
                // 상품이미지
                btniTem.DefaultImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_ORANGE_BASIC);
                btniTem.ClickImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_ORANGE_PRESS);
                // 캠페인 이미지
                btnCampaign.DefaultImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_ORANGE_BASIC);
                btnCampaign.ClickImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_ORANGE_PRESS);
                // 시험모드 이미지
                btnTestMode.DefaultImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_ORANGE_BASIC);
                btnTestMode.ClickImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_ORANGE_PRESS);

                // 마스터(전체)
                btnMasterAll.DefaultImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_GREEN_BASIC);
                btnMasterAll.ClickImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_GREEN_PRESS);
                // 마스터(변경분)
                btnMasterUpdate.DefaultImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_GREEN_BASIC);
                btnMasterUpdate.ClickImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_GREEN_PRESS);
                // 마스터(캠페인-전체)
                btnCampaignMasterAll.DefaultImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_GREEN_BASIC);
                btnCampaignMasterAll.ClickImage = CmUtil.LoadImage(BaseCom.NxImgPath + ImageManager.MENU_BTN_GREEN_PRESS);
                 
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion


        #region 상태 진행바
        /// <summary>
        /// 상태 진행바
        /// </summary>
        /// <param name="iMaxPercent"></param>
        private void SetProgreeBar(Label lblLabel, ProgressBar pbProgreeBar, long nValue, long nMaxValue, string sMsgCD, string sFileName)
        {
            string sViewFileName = sFileName;
            string[] sData = null;
            double nPercent = 0;
            try
            {
                if (nMaxValue > 0)
                {
                    nPercent = CmUtil.DoubleMultiplication(CmUtil.DoubleDivision(nValue, nMaxValue), 100);
                }

                pbProgreeBar.Visible = true;
                pbProgreeBar.Minimum = 0;
                pbProgreeBar.Maximum = 100;
                pbProgreeBar.Value = (int)Math.Round(nPercent, 0, MidpointRounding.AwayFromZero);
                pbProgreeBar.Update();

                sData = sFileName.Split(new string[] { @"/" }, StringSplitOptions.None);
                if (sData.Length > 0) sViewFileName = sData[sData.Length - 1];

                lblLabel.Visible = true;
                lblLabel.Text = string.Format(sMsgCD + "  (" + m_cPosStatus.Global.NumericToQuantity(nValue) + " / " + m_cPosStatus.Global.NumericToQuantity(nMaxValue) + ")", Math.Round(nPercent, 0, MidpointRounding.AwayFromZero).ToString()) + "    >>> " + sViewFileName;
                lblLabel.Update();

                this.Update();
                Application.DoEvents();
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion
        

        #region FTP DownLoad ProgressBar Event  
        /// <summary>
        /// FTP DownLoad ProgressBar Event  
        /// </summary>
        /// <param name="sDevice"></param>
        /// <param name="sData1"></param>
        /// <param name="sData2"></param>
        /// <param name="sData3"></param>
        public void OnDownloadProgressChanged(string sFileName, long nDownSize, long nTotalSize)
        {
            try
            {
                SetProgreeBar(lblCount, pbWork, nDownSize, nTotalSize, m_DownLoadMsg, sFileName);
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                     System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion


        #region 영수증 로고 파일 관리
        /// <summary>
        /// 영수증 로고 파일 관리
        /// </summary>
        private void SetRcptLogo()
        {
            try
            {
                if (m_cPosStatus.Base.OlePosPrinterModel != "99")
                {
                    string sTopLogoTargetFile = BaseFrame.BaseCom.NxImgPath + @"RCPTLOGO\" + m_cPosStatus.Base.BrandDiv + "_TOP.bmp";
                    string sBotLogoTargetFile = BaseFrame.BaseCom.NxImgPath + @"RCPTLOGO\" + m_cPosStatus.Base.BrandDiv + "_BOT.bmp";
                    string sTopLogoFile = BaseFrame.BaseCom.NxImgPath + m_cPosStatus.Base.BrandDiv + "_TOP.bmp";
                    string sBotLogoFile = BaseFrame.BaseCom.NxImgPath + m_cPosStatus.Base.BrandDiv + "_BOT.bmp";
                    // 새로 다운 받은 영수증로고 이미지 폴더에서 자기 상단영수증로고를 image 폴더로 copy
                    if (File.Exists(sTopLogoTargetFile))
                    {
                        foreach (string file in Directory.EnumerateFiles(BaseFrame.BaseCom.NxImgPath, "??_TOP.bmp"))
                        {
                            File.Delete(file);
                        }
                        File.Copy(sTopLogoTargetFile, sTopLogoFile, true);
                    }
                    // 새로 다운 받은 영수증로고 이미지 폴더에서 자기 하단영수증로고를 image 폴더로 copy
                    if (File.Exists(sBotLogoTargetFile))
                    {
                        foreach (string file in Directory.EnumerateFiles(BaseFrame.BaseCom.NxImgPath, "??_BOT.bmp"))
                        {
                            File.Delete(file);
                        }
                        File.Copy(sBotLogoTargetFile, sBotLogoFile, true);
                    }

                    // 새로 다운 받은 영수증로고 이미지 폴더를 삭제
                    DirectoryInfo di = new DirectoryInfo(BaseFrame.BaseCom.NxImgPath + @"RCPTLOGO\");
                    if (di.Exists == true)
                    {
                        di.Delete(true);
                    }

                    // 로고 이미지 Printer Upload
                    if (m_cPosStatus.Base.LogoUpload != PosConst.LOGO_UPLOAD_DIV.NO)
                    {
                        IPosPrinterUs cPosPrinterUs = (IPosPrinterUs)sManager.InitServiceInstance(ServiceLists.AGENT_OLEDEVICE.DLL, ServiceLists.AGENT_OLEDEVICE.DEVICE_POSPRINTER);
                        cPosPrinterUs.OpenDevice(PosConst.OPOS_DEVICE.POSPRINTER, PosConst.OPOS_LDN.POSPRINTER);

                        bool bCheckPrinter = true;

                        //#20171212 프린터 상태 체크 여부 추가 start
                        //0: 체크, 1: 체크안함
                        //기존
                        /*
                        if (m_cPosStatus.Base.OlePosPrinterModel == PosConst.POS_DEVICE_LIST.POS_PRINTER._1_EPSON)
                        {
                            bCheckPrinter = cPosPrinterUs.CheckPrinter();
                        }
                        */
                        //변경
                        if (m_cPosStatus.Base.OlePosPrinterModel == PosConst.POS_DEVICE_LIST.POS_PRINTER._1_EPSON && 
                            m_cPosStatus.Base.OlePosPrinterCheckYn == "0")
                        {
                            bCheckPrinter = cPosPrinterUs.CheckPrinter();
                        }
                        //#20171212 프린터 상태 체크 여부 추가 end

                        //if (cPosPrinterUs.CheckPrinter() == true)
                        if(bCheckPrinter == true)
                        {
                            if (cPosPrinterUs.SetLogoBmp() == true)
                            {
                                UserLog.WriteLogFile(UserCom.LOG_ERROR
                                                    , UserCom.INFO_LEVEL
                                                    , System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name
                                                    , System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()"
                                                    , "BMP Logo update successed!");

                                // 영수증로고 수정일자 PosSaleInfo.ini 저장
                                IServiceUs cSaveConfigInfo = (IServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_OPEN_CLOSE.DLL, ServiceLists.BSV_OPEN_CLOSE.SAVE_CONFIGINFO);
                                string sRet = cSaveConfigInfo.Execute(new string[] { PosConst.INI_FILE_NAME.PosSaleInfo });

                                //DirectoryInfo di = new DirectoryInfo(BaseFrame.BaseCom.NxImgPath + "rcpt_logo\\");
                                //if (di.Exists == true)
                                //{
                                //    di.Delete(true);
                                //}
                                if (m_cPosStatus.Base.LogoUpload == PosConst.LOGO_UPLOAD_DIV.YES)
                                {
                                    // 영수증로고 업로드 후 영수증로고 업로드 안 함으로 변경
                                    m_cPosStatus.Base.LogoUpload = PosConst.LOGO_UPLOAD_DIV.NO;

                                    // PosConfig.INI 저장
                                    cSaveConfigInfo = (IServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_OPEN_CLOSE.DLL, ServiceLists.BSV_OPEN_CLOSE.SAVE_CONFIGINFO);
                                    cSaveConfigInfo.Execute(new string[] { PosConst.INI_FILE_NAME.PosConfig });
                                }
                            }
                            else
                            {
                                UserLog.WriteLogFile(UserCom.LOG_ERROR
                                                    , UserCom.INFO_LEVEL
                                                    , System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name
                                                    , System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()"
                                                    , "BMP Logo update failed...");
                            }
                            //cPosPrinterUs.CloseDevice();
                        }
                        cPosPrinterUs.CloseDevice();
                    }
                    else
                    {
                        // Upload 아니더라도 OPOS는 항상 Upload 후 사용
                        if (m_cPosStatus.Base.OlePosPrinterController == PosConst.POS_DEVICE_CONTROLLER.OPOS)
                        {
                            IPosPrinterUs cPosPrinterUs = (IPosPrinterUs)sManager.InitServiceInstance(ServiceLists.AGENT_OLEDEVICE.DLL, ServiceLists.AGENT_OLEDEVICE.DEVICE_POSPRINTER);
                            cPosPrinterUs.OpenDevice(PosConst.OPOS_DEVICE.POSPRINTER, PosConst.OPOS_LDN.POSPRINTER);

                            if (cPosPrinterUs.SetLogoBmp() == true)
                            {
                                UserLog.WriteLogFile(UserCom.LOG_ERROR
                                                    , UserCom.INFO_LEVEL
                                                    , System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name
                                                    , System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()"
                                                    , "(OPOS)BMP Logo update successed!");

                                // 영수증로고 수정일자 PosSaleInfo.ini 저장
                                IServiceUs cSaveConfigInfo = (IServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_OPEN_CLOSE.DLL, ServiceLists.BSV_OPEN_CLOSE.SAVE_CONFIGINFO);
                                string sRet = cSaveConfigInfo.Execute(new string[] { PosConst.INI_FILE_NAME.PosSaleInfo });
                            }
                            else
                            {
                                UserLog.WriteLogFile(UserCom.LOG_ERROR
                                                    , UserCom.INFO_LEVEL
                                                    , System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name
                                                    , System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()"
                                                    , "(OPOS)BMP Logo update failed...");
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                UserLog.WriteLogFile(UserCom.LOG_ERROR,
                                     System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,      // Project Name (프로젝트명)
                                     System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." +  // Class Name (Class Name (클래스명))
                                     System.Reflection.MethodBase.GetCurrentMethod().Name + "()",                // Function Name (Function Name (함수명))
                                     "영수증로고Upload 실패:" + ex.Message);
            }
        }
        #endregion 영수증 로고 파일 관리


        #region 프로그램 버전 ini 저장
        private string SetProgramVerIni(string sKind, string sVer, string sSeq)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                CmMessage cmPosConfig = CmMessage.MakeMessageFromFile(BaseCom.NxIniPath + PosConst.INI_FILE_NAME.PosConfig);

                // 프로그램 버전정보 설정
                if (sKind == PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_20 + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_20_DIV.POS_PGM10)
                {
                    //m_cPosStatus.Ver.ProgramVer = sVer;
                    //m_cPosStatus.Ver.ProgramVerSeq = sSeq;

                    // 프로그램 버전 INI 파일 설정
                    cmPosConfig.GetMessage("PGMVER").MakeMessageOverWrite("ProgramVer_Update", sVer);
                    cmPosConfig.GetMessage("PGMVER").MakeMessageOverWrite("ProgramVerSeq_Update", sSeq);

                    // 실제 적용시점 (Start)에 버전적용
                }
                else
                {
                    // 프로그램 버전 INI 파일 설정
                    cmPosConfig.GetMessage("PGMVER").MakeMessageOverWrite("ProgramVer" + CmUtil.MidH(sKind, 2, 2), sVer);
                    cmPosConfig.GetMessage("PGMVER").MakeMessageOverWrite("ProgramVerSeq" + CmUtil.MidH(sKind, 2, 2), sSeq);
                }
                cmPosConfig.MakeFileFromMessage(BaseCom.NxIniPath + PosConst.INI_FILE_NAME.PosConfig);

                sRet = UserCom.RST_OK;

            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }

            return sRet;
        }
        #endregion 


        #region 프로그램 버전 ini 읽기
        private string GetProgramVerIni(string sKind, bool bVerOnly)
        { 
            string sRet = "";

            try
            {
                CmMessage cmPosConfig = CmMessage.MakeMessageFromFile(BaseCom.NxIniPath + PosConst.INI_FILE_NAME.PosConfig);

                // 프로그램 버전정보 읽기
                string sProgramVer = CmUtil.StringNullEmpty(cmPosConfig.GetMessage("PGMVER").GetMessageValue("ProgramVer" + CmUtil.MidH(sKind, 2, 2)));
                string sProgramVerSeq = CmUtil.StringNullEmpty(cmPosConfig.GetMessage("PGMVER").GetMessageValue("ProgramVerSeq" + CmUtil.MidH(sKind, 2, 2)));

                sRet = sProgramVer + (bVerOnly == true ? sProgramVerSeq : "");
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }

            return sRet;
        }
        #endregion
        

        #region 설정 파일 읽기
        /// <summary>
        /// 설정 파일 읽기
        /// </summary>
        /// <param name="cCfgInfo"></param>
        /// <param name="sGroup"></param>
        /// <param name="sValueName"></param>
        /// <param name="sDefault"></param>
        /// <returns></returns>
        private string GetConfigInfo(CmMessage cCfgInfo, string sGroup, string sValueName, string sDefault = "")
        {
            try
            {
                string sValue = cCfgInfo.GetMessage(sGroup).GetMessageValue(sValueName);
                //if (sValue == null)
                if (string.IsNullOrWhiteSpace(sValue))
                    return sDefault;
                else
                    return sValue;
            }
            catch { }

            return sDefault;
        }    
        #endregion 
        

        #region DataTable 복사
        /// <summary>
        /// DataTable 복사
        /// </summary>
        /// <param name="sourceTable">소스 테이블</param>
        /// <param name="targetTable">타겟 테이블</param>
        public void DataTableCopy(DataTable sourceTable, ref DataTable targetTable)
        {
            try
            {
                if (targetTable.Rows.Count <= 0)
                    targetTable = sourceTable.Clone();

                for (int i = 0; i < sourceTable.Rows.Count; i++)
                {
                    object array = sourceTable.Rows[i].ItemArray.Clone();

                    DataRow targetRow = targetTable.NewRow();

                    targetRow.ItemArray = (object[])array;

                    targetTable.Rows.Add(targetRow);
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion


        #region TCP/IP Mode DownLaod
        /// <summary>
        /// Fluent_Connect
        /// </summary>
        /// <param name="sServerIP"></param>
        /// <param name="sServerPort"></param>
        /// <param name="sUserID"></param>
        /// <param name="sPassword"></param>
        /// <returns></returns>
        private int Fluent_Connect(string sServerIP, int iServerPort, string sUserID, string sPassword, int nTimeOut)
        {
            bool bRet = false;
            int iRet = -1;

            try
            {
                // 접속정보 설정
                Fcl.Host = sServerIP.Trim();

                //  2019-05-13 - 1997fx11 : 테스트환경에서는 SFTP, but 모든 POS는 FTP를 사용하기때문에 임시로 적용.
                //Fcl.Port = iServerPort;
                Fcl.SslProtocols = System.Security.Authentication.SslProtocols.Default;
                //  2019-05-13 - 1997fx11 : 테스트환경에서는 SFTP, but 모든 POS는 FTP를 사용하기때문에 임시로 적용.

                Fcl.Credentials = new NetworkCredential(sUserID.Trim(), sPassword.Trim());
                Fcl.ConnectTimeout = nTimeOut;
                Fcl.ReadTimeout = nTimeOut;

                Fcl.Connect();

                // 접속 불가시 Skip
                bRet = Fcl.IsConnected;
                if (bRet == true) { iRet = 0; }
                else { iRet = -1; }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return iRet;
        }


        /// <summary>
        /// Fluent_Download
        /// </summary>
        /// <param name="sLocalPath"></param>
        /// <param name="sServerPath"></param>
        /// <param name="sFileName"></param>
        /// <returns></returns>
        private int Fluent_Download(string sLocalPath, string sServerPath, string sFileName)
        {
            bool bRet = false;
            int iRet = -1;

            try
            {
                // 로컬 디렉토리 생성
                if (Directory.Exists(sLocalPath.Trim()) != true) Directory.CreateDirectory(sLocalPath.Trim());
                // 로컬 파일 삭제
                if (File.Exists(sLocalPath.Trim() + @"\" + sFileName.Trim()) != true) File.Delete(sLocalPath.Trim() + @"\" + sFileName.Trim());

                // 접속정보 설정
                if (Fcl.IsConnected != true)
                {
                    // 재접속
                    Fcl.Connect();

                    // 접속 불가시 Skip
                    if (Fcl.IsConnected != true) { return iRet; }
                }

                // 다운로드 진행
                bRet = Fcl.DownloadFile(sLocalPath.Trim() + @"\" + sFileName.Trim(), sServerPath.Trim() + @"\" + sFileName.Trim());
                if (bRet == true) iRet = 0;
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }

            return iRet;
        }
          

        /// <summary>
        ///  FTP 다운로드 유형 (TCP/IP) 조회
        /// </summary>
        /// <returns></returns>
        private string GetFTPDownloadMode()
        {
            string sRet = "";

            try
            {
                CmMessage cmPosConfig = CmMessage.MakeMessageFromFile(BaseCom.NxIniPath + PosConst.INI_FILE_NAME.PosConfig);

                string sFTPDownLoadTCPMode = CmUtil.StringNullEmpty(GetConfigInfo(cmPosConfig, "SERVER", "FTPDownLoadTCPMode"));

                if (sFTPDownLoadTCPMode == null || sFTPDownLoadTCPMode.Length <= 0)
                {
                    cmPosConfig.GetMessage("SERVER").MakeMessageOverWrite("FTPDownLoadTCPMode", "0");
                    cmPosConfig.MakeFileFromMessage(BaseCom.NxIniPath + PosConst.INI_FILE_NAME.PosConfig);
                    sFTPDownLoadTCPMode = "0";
                }

                sRet = sFTPDownLoadTCPMode;
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return sRet;
        }
        #endregion


        #region 타이머
        /// <summary>
        /// 프로그램 업데이트 있는지 조회 요청후 다운로드 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tmStart_Tick(object sender, EventArgs e)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                tmStart.Enabled = false;

                // 프로그램 업데이트 있는지 조회 요청후 다운로드 
                sRet = PGMUpdateCheck(PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_ALL + PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_ALL_DIV.ALL_PGM, m_cUpDateMode);
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion


        //#20180919 IC/MSR 폴더 삭제 후 배포받은 파일로 다시 생성해주기 start
        #region IC/MSR 폴더 삭제 후 배포받은 파일로 다시 생성해주기
        private void FolderDelete_ReCreate(string sGroup)
        {
            try
            {
                // 프로그램 파일 다운로드일 때만!!
                if (sGroup != PosConst.PGM_UPDATE_TYPE.POSDOWN_GROUP_20) return;

                // 현재 디렉토리 
                DirectoryInfo dirParent = Directory.GetParent(Directory.GetCurrentDirectory());
                string sTargetDirectory = "";

                // IC 버전인지 MSR 버전인지 체크 
                CmMessage cmDeviceInfo = CmMessage.MakeMessageFromFile(dirParent.FullName + @"\INI\PosDevice.INI");
                string sICReaderUseYn = cmDeviceInfo.GetMessage("ICREADER").GetMessageValue("UseFlag");

                // IC 버전
                if (sICReaderUseYn == "1")
                {
                    // ic폴더 안에있는 파일 삭제
                    sTargetDirectory = dirParent.FullName + @"\BIN\IC\";
                }
                // MSR 버전
                else
                {
                    // msr폴더 안에있는 파일 삭제
                    sTargetDirectory = dirParent.FullName + @"\BIN\MSR\";
                }

                // 해당 경로의 하위파일 모두 삭제 
                string[] fFilePath = Directory.GetFiles(sTargetDirectory);
                foreach (string fFileName in fFilePath)
                {
                    File.Delete(fFileName);
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                            System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." +
                                            System.Reflection.MethodBase.GetCurrentMethod().Name + "()",
                                            ex.Message);
            }
        }
        #endregion 
        //#20180919 IC/MSR 폴더 삭제 후 배포받은 파일로 다시 생성해주기 end
    }
}
