using System;
using System.Collections;
using System.IO;
using System.Data;
using Cosmos.Common;
using Cosmos.UserFrame;
using Cosmos.CommonManager;
using Cosmos.ServiceProvider;
using Cosmos.BaseFrame;
using System.Diagnostics;
using System.Linq;
using System.Text;

//#20180322 포스스팩에 REAL IP, ISP 추가 start
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
//#20180322 포스스팩에 REAL IP, ISP 추가 end

//#20180710 LOCAL IP 가져오기 start
using System.Net;
using System.Net.NetworkInformation;
//#20180710 LOCAL IP 가져오기 end


namespace Cosmos.Service
{
    public class PosSpec : IServiceUs
    {
        private SManager sManager = new SManager();                                 // 이 객체를 통해 업무 Service 호출
        private PosStatus m_cPosStatus = new PosStatus();                           //기본정보 참조
        private StateServer StateObject = (StateServer)StateServer.GetInstance();   // StateObject : StateServer Object (객체)
        protected IDataCommonUs m_cDataCommon = null;                               // 판매공통 모듈
        private IICReaderUs m_cICReader = null;                                     // IC리더기
        private ISignPadUs m_cSignPad = null;                                       // 사인패드
        
        private readonly string m_FIELD_DIV = "|";
        private readonly string m_LINE_DIV = "#~";

        private string m_sWmiClass = "";
        private string m_sWin32Product = "";
        
        public PosSpec()
        {
            m_cPosStatus = (PosStatus)StateObject.POS;      // POS 기본정보
            m_cDataCommon = (IDataCommonUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.DATA_COMMON);
            m_cICReader = (IICReaderUs)sManager.InitServiceInstance(ServiceLists.AGENT_OLEDEVICE.DLL, ServiceLists.AGENT_OLEDEVICE.DEVICE_ICREADER);
            m_cSignPad = (ISignPadUs)sManager.InitServiceInstance(ServiceLists.AGENT_OLEDEVICE.DLL, ServiceLists.AGENT_OLEDEVICE.DEVICE_SIGNPAD);

        }

        public string Execute(string[] aParam)
        {

            string sRet = UserCom.RST_ERR;
            string sSendData = "";


            try
            {
                sSendData += GetBios();     //BIOS
                sSendData += GetBoard();    //BOARD
                sSendData += GetCpu();      //CPU
                sSendData += GetPosPgm();   //POS PROGRAM VERSION
                sSendData += GetDB();       //DB
                sSendData += GetDisk();     //DISK
                sSendData += GetMemory();   //MEMORY
                sSendData += GetNetWork();  //NETWORK
                sSendData += GetVideo();    //VIDEO
                sSendData += GetOS();       //OS

                //#20180710 Real OS 가져오기 start
                sSendData += GetRealOS();   //RealOS
                //#20180710 Real OS 가져오기 end

                sSendData += GetSignPad();  //SIGNPAD
                sSendData += GetProduct();  //PRODUCT
                sSendData += GetReader();   //CARDREADER
                sSendData += GetDeviceStatus(); // 주변장치 상태 정보 가져오기
                sSendData += GetLastLogData();  // 로그, 매출 최초 일자 
                sSendData += GetPosSystem();    // 인증 버전
                sSendData += GetCpiMstData();   // 캠페인코드(2017.06.21)

                //#20180322 포스스팩에 REAL IP, ISP 추가 start
                //ISP -> 인터넷 서비스 제공자
                sSendData += Get_IP_ISP();
                //#20180322 포스스팩에 REAL IP, ISP 추가 end

                //#20180710 LOCAL IP 가져오기 start
                sSendData += GetLocalIP();   //LOCAL IP
                //#20180710 LOCAL IP 가져오기 end

                //sSendData += GetFiles();    //FILE

                //앞 구분자 자르기
                sSendData = sSendData.Substring(2);


                UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                     System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." +
                                     System.Reflection.MethodBase.GetCurrentMethod().Name + "()",
                                     "▶ POS SPEC SEND DATA :" + sSendData);

                //전문 보내기
                sRet = ExecuteIrtPosSpec(sSendData);

            }
            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;

        }

        #region POS SPEC 전문 송신
        /// <summary>
        /// POS SPEC 전문 송신
        /// </summary>
        /// <param name="aParam"></param>
        /// <param name="aRet"></param>
        /// <returns></returns>
        private string ExecuteIrtPosSpec(string sSystemData)
        {
            string sRet = UserCom.RST_ERR;
            int iRecvTimeOut = 10000;

            Hashtable htRecvData = new Hashtable();
            Hashtable htSendData = new Hashtable();

            try
            {
                // 조회
                htSendData.Add(Column.IQ_POS_SPEC.DATA.INQ_TYPE, ItemConst.IRT_INQ_TYPE.POS_SPEC_INQ);
                htSendData.Add(Column.IQ_POS_SPEC.DATA.STOR_CD, m_cPosStatus.Base.StoreNo);
                htSendData.Add(Column.IQ_POS_SPEC.DATA.SALE_DT, DateTime.Now.ToString("yyyyMMdd"));
                htSendData.Add(Column.IQ_POS_SPEC.DATA.POS_NO, m_cPosStatus.Base.PosNo);
                htSendData.Add(Column.IQ_POS_SPEC.DATA.SYSTEM_DATA, sSystemData);
                htSendData.Add(Column.IQ_POS_SPEC.DATA.RES_CD, "");


                sRet = m_cDataCommon.ExecutePosIrt(ItemConst.COMM_MSG_TYPE.POSIRT, m_cPosStatus.Base.CommSvrIp, (int)m_cPosStatus.Base.SysInfoPort, iRecvTimeOut, htSendData, ref htRecvData);

                if (sRet != UserCom.RST_OK)
                {
                    UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "SPEC SEND FAIL : " + sRet);
                    sRet = UserCom.RST_ERR;
                    return sRet;
                }


                if (htRecvData[Column.IQ_POS_SPEC.DATA.RES_CD].ToString() == "00")
                {
                    UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "POS SPEC SEND SUCCESS");
                }
                else
                {
                    UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "SPEC SEND FAIL RSN_CD : " + htRecvData[Column.IQ_POS_SPEC.DATA.RES_CD].ToString());
                }


                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 System API 데이터 조회
        /// <summary>
        /// Return a hardware identifier
        /// </summary>
        /// <param name="wmiClass"></param>
        /// <param name="wmiProperty"></param>
        /// <param name="wmiMustBeTrue"></param>
        /// <returns></returns>
        private string identifier(string wmiClass, string wmiProperty, string wmiMustBeTrue)
        {
            string result = "";
            bool bCheck = false;

            System.Management.ManagementClass mc = new System.Management.ManagementClass(wmiClass);
            System.Management.ManagementObjectCollection moc = mc.GetInstances();
            foreach (System.Management.ManagementObject mo in moc)
            {
                if (wmiMustBeTrue != "")
                {
                    bCheck = mo[wmiMustBeTrue].ToString() == "True" ? true : false;
                }
                else
                {
                    bCheck = true;
                }


                if (bCheck == true)
                {

                    //Only get the first one
                    if (result == "")
                    {
                        try
                        {
                            result = mo[wmiProperty].ToString();
                            break;
                        }
                        catch { }
                    }

                }
            }
            return result;
        }

        /// <summary>
        /// Return a hardware identifier
        /// </summary>
        /// <param name="wmiClass"></param>
        /// <param name="wmiProperty"></param>
        /// <returns></returns>
        private string identifier(string wmiClass, string wmiProperty)
        {
            return identifier(wmiClass, wmiProperty, "");
        }
        #endregion

        #region 조회 데이터 포멧팅
        /// <summary>
        /// 조회 데이터 치환
        /// </summary>
        /// <param name="sInData"></param>
        /// <returns></returns>
        private string DataReplace(string sInData)
        {

            string sData = "";

            try
            {
                sData = sInData.Replace(m_FIELD_DIV, "").Replace(m_LINE_DIV, "").Replace("\n", "");
            }
            catch (Exception ex)
            {
                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }
            return sData;
        }

        /// <summary>
        /// 전송 데이터 포멧팅
        /// </summary>
        /// <param name="sWmiClass"></param>
        /// <param name="sWmiInstance"></param>
        /// <param name="sInstanceValue"></param>
        /// <returns></returns>
        private string DataFormat(string sWmiClass, string sWmiInstance, string sInstanceValue)
        {
            return DataFormat(sWmiClass, sWmiInstance, sInstanceValue, "");
        }

        /// <summary>
        /// 전송 데이터 포멧팅
        /// </summary>
        /// <param name="sWmiClass"></param>
        /// <param name="sWmiInstance"></param>
        /// <param name="sInstanceValue"></param>
        /// <param name="AddValues"></param>
        /// <returns></returns>
        private string DataFormat(string sWmiClass, string sWmiInstance, string sInstanceValue, string AddValues)
        {
            string sRetData = string.Empty;
            try
            {
                if (AddValues == "")
                {
                    sRetData = string.Format("{4}{1}{0}{2}{0}{3}", m_FIELD_DIV, sWmiClass, sWmiInstance, DataReplace(sInstanceValue), m_LINE_DIV);
                }
                else
                {
                    sRetData += string.Format("{4}{1}{0}{2}{0}{3} {5}", m_FIELD_DIV, sWmiClass, sWmiInstance, DataReplace(sInstanceValue), m_LINE_DIV, AddValues);
                }
                
            }
            catch (Exception ex)
            {
                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }
            return sRetData;
        }

        /// <summary>
        /// 사이즈 가져오기
        /// </summary>
        /// <param name="byteCount"></param>
        /// <returns></returns>
        private string GetFileSize(double byteCount)
        {

            string size = "0 Bytes";

            try
            {

                if (byteCount >= 1099511627776.0)
                    size = String.Format("{0:##.##}", byteCount / 1099511627776.0) + " TB";
                else if (byteCount >= 1073741824.0)
                    size = String.Format("{0:##.##}", byteCount / 1073741824.0) + " GB";
                else if (byteCount >= 1048576.0)
                    size = String.Format("{0:##.##}", byteCount / 1048576.0) + " MB";
                else if (byteCount >= 1024.0)
                    size = String.Format("{0:##.##}", byteCount / 1024.0) + " KB";
                else if (byteCount > 0 && byteCount < 1024.0)
                    size = byteCount.ToString() + " Bytes";
            }
            catch (Exception ex)
            {
                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                         System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }
            return size;
        }
        #endregion

        #region CPU 정보 가져오기
        /// <summary>
        /// CPU 정보 가져오기
        /// </summary>
        /// <returns></returns>
        private string GetCpu()
        {

            string sRetData = string.Empty;
            
            try
            {
                m_sWmiClass = "CPU";
                m_sWin32Product = "Win32_Processor";
                
                string retVal = identifier(m_sWin32Product, "Name");

                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "Name", retVal);

                }

            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region Bios 정보 가져오기
        /// <summary>
        /// Bios 정보 가져오기
        /// </summary>
        /// <returns></returns>
        private string GetBios()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;
            
            try
            {
                m_sWmiClass = "BIOS";
                m_sWin32Product = "Win32_BIOS";

                retVal = identifier(m_sWin32Product, "Name");
                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "Name", retVal);
                    retVal = "";
                }

                retVal = identifier(m_sWin32Product, "SerialNumber");
                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "SerialNumber", retVal);
                    retVal = "";
                }

                retVal = identifier(m_sWin32Product, "SMBIOSBIOSVersion");
                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "SMBIOSBIOSVersion", retVal);                    
                    retVal = "";
                }

            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region Disk 정보 가져오기
        /// <summary>
        /// Disk 정보 가져오기
        /// </summary>
        /// <returns></returns>
        private string GetDisk()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;
            
            try
            {
                m_sWmiClass = "DISK";
                m_sWin32Product = "Win32_DiskDrive";

                retVal = identifier(m_sWin32Product, "Model");
                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "Model", retVal);
                    retVal = "";
                }

                retVal = identifier(m_sWin32Product, "InterfaceType");
                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "InterfaceType", retVal);
                    retVal = "";
                }

                retVal = identifier(m_sWin32Product, "Size");
                if (retVal != "")
                {

                    //int iMaxMem = (int)(CmUtil.DoubleParse(retVal) / 1000000000);

                    //sRetData += DataFormat(m_sWmiClass, "Size", iMaxMem.ToString(), "GB");

                    sRetData += DataFormat(m_sWmiClass, "Size", GetFileSize(CmUtil.DoubleParse(retVal)));

                    retVal = "";
                }


            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region Board 정보 가져오기
        /// <summary>
        /// Board 정보 가져오기
        /// </summary>
        /// <returns></returns>
        private string GetBoard()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;
            
            try
            {
                m_sWmiClass = "BOARD";
                m_sWin32Product = "Win32_BaseBoard";

                retVal = identifier(m_sWin32Product, "Product");
                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "Product", retVal);
                    retVal = "";
                }

                retVal = identifier(m_sWin32Product, "SerialNumber");
                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "SerialNumber", retVal);
                    retVal = "";
                }

                retVal = identifier(m_sWin32Product, "Manufacturer");
                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "Manufacturer", retVal);
                    retVal = "";
                }

            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region Video 정보 가져오기
        /// <summary>
        /// Video 정보 가져오기
        /// </summary>
        /// <returns></returns>
        private string GetVideo()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;
            
            try
            {
                m_sWmiClass = "VIDEO";
                m_sWin32Product = "Win32_VideoController";

                retVal = identifier(m_sWin32Product, "Name");
                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "Name", retVal);
                    retVal = "";
                }

                retVal = identifier(m_sWin32Product, "VideoModeDescription");
                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "VideoModeDescription", retVal);
                    retVal = "";
                }

                retVal = identifier(m_sWin32Product, "CurrentHorizontalResolution") + " X " + identifier("Win32_VideoController", "CurrentVerticalResolution");
                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "Resolution", retVal);
                    retVal = "";
                }


            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region NetWork 정보 가져오기
        /// <summary>
        /// NetWork 정보 가져오기
        /// </summary>
        /// <returns></returns>
        private string GetNetWork()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;
            

            try
            {
                m_sWmiClass = "NETWORK";
                m_sWin32Product = "Win32_NetworkAdapterConfiguration";

                retVal = identifier(m_sWin32Product, "MACAddress", "IPEnabled");
                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "MACAddress", retVal);
                    retVal = "";
                }

            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region Memory 정보 가져오기
        /// <summary>
        /// Memory 정보 가져오기
        /// </summary>
        /// <returns></returns>
        private string GetMemory()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;
            
            try
            {
                m_sWmiClass = "MEMORY";
                m_sWin32Product = "Win32_ComputerSystem";

                retVal = identifier(m_sWin32Product, "TotalPhysicalMemory");
                if (retVal != "")
                {

                    //int iMaxMem = (int)(CmUtil.DoubleParse(retVal) / 1024);
                    
                    //sRetData += DataFormat(m_sWmiClass, "TotalVisibleMemorySize", iMaxMem.ToString(), "MB");
                    sRetData += DataFormat(m_sWmiClass, "TotalPhysicalMemory", GetFileSize(CmUtil.DoubleParse(retVal)));
                    
                    
                    retVal = "";
                }

            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region OS 정보 가져오기
        /// <summary>
        /// OS 정보 가져오기
        /// </summary>
        /// <returns></returns>
        private string GetOS()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;
            

            try
            {
                m_sWmiClass = "OS";
                m_sWin32Product = "Win32_OperatingSystem";

                retVal = identifier(m_sWin32Product, "Caption");
                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "Caption", retVal);
                    retVal = "";
                }


                retVal = identifier(m_sWin32Product, "SerialNumber");
                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "SerialNumber", retVal);
                    retVal = "";
                }


                retVal = identifier(m_sWin32Product, "CSDVersion");
                if (retVal != "")
                {
                    sRetData += DataFormat(m_sWmiClass, "CSDVersion", retVal);
                    retVal = "";
                }

            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region Files 정보 가져오기
        /// <summary>
        /// Files 정보 가져오기
        /// </summary>
        /// <returns></returns>
        private string GetFiles()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;
            

            try
            {
                m_sWmiClass = "FILE";

                if (System.IO.Directory.Exists(BaseCom.NxBinPath))
                {
                    System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(BaseCom.NxBinPath);

                    foreach (var item in di.GetFiles())
                    {

                        //if (item.Extension.ToUpper() == ".EXE" || item.Extension.ToUpper() == ".DLL" || item.Extension.ToUpper() == ".OCX" || item.Extension.ToUpper() == ".COM")
                        //{
                        FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(item.FullName);
                        retVal = myFileVersionInfo.FileVersion;

                        if (retVal == "" || retVal == null)
                        {
                            retVal = item.CreationTime.ToString("yyyy-MM-dd HH:mm:ss");
                        }

                        sRetData += DataFormat(m_sWmiClass, item.Name, retVal);
                        //sRetData += string.Format("{4}{1}{0}{2}{0}{3}", m_FIELD_DIV, "FILE", item.Name, DataReplace(retVal), m_LINE_DIV);
                        //}

                    }
                }
            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region SignPad 정보 가져오기
        /// <summary>
        /// SignPad 정보 가져오기
        /// </summary>
        /// <returns></returns>
        private string GetSignPad()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;
            try
            {
                m_sWmiClass = "SIGNPAD";

                //응답메시지 (모델명(10) + 펌웨어버젼(20) + App버젼(30) + RF버젼(30) + 시리얼번호(30) + POS연동타입(1)
                if (m_cSignPad.GetSignPadInfo(ref retVal) == true)
                {
                    sRetData += DataFormat(m_sWmiClass, "ModelName", CmUtil.MidH(retVal, 0, 9).Trim());
                    sRetData += DataFormat(m_sWmiClass, "FirmwareVersion", CmUtil.MidH(retVal, 10, 20).Trim());
                    sRetData += DataFormat(m_sWmiClass, "AppVersion", CmUtil.MidH(retVal, 30, 30).Trim());
                    sRetData += DataFormat(m_sWmiClass, "RFVersion", CmUtil.MidH(retVal, 60, 30).Trim());
                    sRetData += DataFormat(m_sWmiClass, "SerialNumber", CmUtil.MidH(retVal, 90, 30).Trim());
                    sRetData += DataFormat(m_sWmiClass, "PosConnectedType", CmUtil.MidH(retVal, 120, 1).Trim());
                }
            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region DB 정보 가져오기
        /// <summary>
        /// DB 정보 가져오기
        /// </summary>
        /// <returns></returns>
        private string GetDB()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;
            try
            {
                m_sWmiClass = "DB";

                sRetData += DataFormat(m_sWmiClass, "Version", m_cPosStatus.Base.MstDownDate);

            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region 프로그램 정보 가져오기
        /// <summary>
        /// 프로그램 정보 가져오기
        /// </summary>
        /// <returns></returns>
        private string GetPosPgm()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;

            string sProgramVer = ""; 

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

                m_sWmiClass = "POS_PGM";

                for (int iLoop = 10; iLoop <= 19; iLoop++)
                {
                    sProgramVer = CmUtil.StringNullEmpty(cmPosConfig.GetMessage("PGMVER").GetMessageValue("ProgramVer" + iLoop)); 
                    sRetData += DataFormat(m_sWmiClass, "ProgramVer" + iLoop, string.Format("{0}", sProgramVer == "" ? "2016011000001" : sProgramVer));
                }
            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region Product 정보 가져오기
        /// <summary>
        /// Product 정보 가져오기
        /// </summary>
        /// <returns></returns>
        private string GetProduct()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;
            try
            {
                m_sWmiClass = "PRODUCT";
                m_sWin32Product = "";
            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region CARDREADER 정보 가져오기
        /// <summary>
        /// CARDREADER 정보 가져오기
        /// </summary>
        /// <returns></returns>
        private string GetReader()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;
            try
            {
                m_sWmiClass = "CARDREADER";
                m_sWin32Product = "";
                
                DeviceStatus m_cDevStatus = (DeviceStatus)StateObject.DEVICE;
                
                if (m_cDevStatus.ICReader.UseYn == false)
                {
                    sRetData += DataFormat(m_sWmiClass, "CardRederType", "MSR");
                }
                else
                {
                    sRetData += DataFormat(m_sWmiClass, "CardRederType", "IC");

                    if (m_cICReader != null)
                    {
                        string[] arRet = m_cICReader.GetStatus_ICReader(PosConst.POS_CARD_READER_DEVICE_TYPE.IC_READER);

                        if (arRet != null && arRet.Length > 6)
                        {
                            sRetData += DataFormat(m_sWmiClass, "HwStatus", arRet[0].Trim());
                            sRetData += DataFormat(m_sWmiClass, "IntegrityStatus", arRet[1].Trim());
                            sRetData += DataFormat(m_sWmiClass, "CardInStatus", arRet[2].Trim());
                            sRetData += DataFormat(m_sWmiClass, "ReaderName", arRet[3].Trim());
                            sRetData += DataFormat(m_sWmiClass, "ReaderVersion", arRet[4].Trim());
                            sRetData += DataFormat(m_sWmiClass, "ModuleId", arRet[5].Trim());
                        }
                    }
                }
                
            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region 주변장치 상태 정보 가져오기
        /// <summary>
        /// 주변장치 상태 정보 가져오기
        /// </summary>
        /// <returns></returns>
        private string GetDeviceStatus()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;
            try
            {
                m_sWmiClass = "DEVICE_STATUS";
                
                //프린터
                sRetData += DataFormat(m_sWmiClass, "POS_PRINTER", ConvertSetDeviceStatus(m_cPosStatus.Base.OlePosPrinterStatus));

                //IC리더기
                sRetData += DataFormat(m_sWmiClass, "POS_ICREADER", ConvertSetDeviceStatus(m_cPosStatus.Base.OlePosICReaderStatus));

                //CAT 단말기
                sRetData += DataFormat(m_sWmiClass, "POS_CAT", ConvertSetDeviceStatus(m_cPosStatus.Base.OlePosCATStatus));

                //돈통
                //sRetData += DataFormat(m_sWmiClass, "POS_CASHDRAWER", ConvertSetDeviceStatus(m_cPosStatus.Base.OlePosCashDrawerStatus));
                
                //저울
                sRetData += DataFormat(m_sWmiClass, "POS_SCALE", ConvertSetDeviceStatus(m_cPosStatus.Base.OlePosScaleStatus));

                //사인패드
                sRetData += DataFormat(m_sWmiClass, "POS_SIGNPAD", ConvertSetDeviceStatus(m_cPosStatus.Base.OlePosSignPadStatus));

                //라벨프린터
                sRetData += DataFormat(m_sWmiClass, "POS_LABELPRINT", ConvertSetDeviceStatus(m_cPosStatus.Base.OlePosLabelPrinterStatus));

                //MSR
                //sRetData += DataFormat(m_sWmiClass, "POS_MSR", ConvertSetDeviceStatus(m_cPosStatus.Base.OlePosMsrStatus));

                //폴디스플레이
                sRetData += DataFormat(m_sWmiClass, "POS_SCALEPOLEDISP", ConvertSetDeviceStatus(m_cPosStatus.Base.OlePosScalePoleDispStatus));

            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region 로그, 매출 최초 일자
        /// <summary>
        /// 로그, 매출 최초 일자 
        /// </summary>
        /// <returns></returns>
        private string GetLastLogData()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;
            string sQuery = string.Empty;

            try
            {
                m_sWmiClass = "LAST_LOG_DATE";
                                
                IMasterUs m_cMstService = (IMasterUs)sManager.InitServiceInstance(ServiceLists.ASV_MASTER.DLL, ServiceLists.ASV_MASTER.POS_MASTER);

                if (m_cMstService != null)
                {
                    sQuery = " SELECT MIN(SALE_DT) AS SALE_DT ";
                    sQuery += "  FROM POSLOG..TR_SALE_HEADER";
                    sQuery += " WHERE CMP_CD  = '" + m_cPosStatus.Base.CmpCd + "'";
                    sQuery += "   AND STOR_CD = '" + m_cPosStatus.Base.StoreNo + "'";
                    sQuery += "   AND POS_NO  = '" + m_cPosStatus.Base.PosNo + "'";

                    System.Data.DataTable dt = m_cMstService.Select(new string[] { sQuery });

                    if (!(dt == null || dt.Rows.Count == 0))
                    {
                        System.Data.DataRow dr = dt.Rows[0];

                        //매출 헤더 최초 일자
                        sRetData += DataFormat(m_sWmiClass, "TR_FRIST_SALE", dr["SALE_DT"].ToString());
                    }
                }

                // 로그 최초 일자
                if (Directory.Exists(BaseCom.NxLogPath))
                {
                    DirectoryInfo di = new DirectoryInfo(BaseCom.NxLogPath);

                    foreach (var item in di.GetFiles().OrderByDescending(f => f.LastWriteTime))
                    {
                        //로그 최초 일자
                        sRetData += DataFormat(m_sWmiClass, "FRIST_TEXT_LOG", item.LastWriteTime.ToString("yyyyMMdd"));
                        break;
                    }
                }

            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region 상태값 문자 변환
        /// <summary>
        /// 상태값 문자 변환
        /// </summary>
        /// <param name="sData"></param>
        /// <returns></returns>
        private string ConvertSetDeviceStatus(string sData)
        {
            string sRetData = string.Empty;

            try
            {
                if (sData == "" || sData == UserCom.RST_IGNORE) //사용 안함
                {
                    sRetData = "NO";
                }
                else if (sData == UserCom.RST_OK)   //정상
                {
                    sRetData = "OK";
                }
                else    //그외 에러
                {
                    sRetData = "NG";
                }

            }
            catch (Exception ex)
            {
                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;

        }
        #endregion

        #region POS SYSTEM INFO
        /// <summary>
        /// POS SYSTEM INFO
        /// </summary>
        /// <returns></returns>
        private string GetPosSystem()
        {

            string sRetData = string.Empty;
            string retVal = string.Empty;
            StringBuilder sbVer = null;

            try
            {

                if (m_cICReader != null)
                {
                    m_sWmiClass = "POS_SYSTEM_INFO";

                    //여전법 인증 번호
                    sRetData += DataFormat(m_sWmiClass, "AUTH_SOFTWARE_VER", CmUtil.MidH(m_cPosStatus.Base.Auth_POS_SW_Ver.ToString(), 0, 16));
                    
                    //IC리더기
                    sbVer = m_cICReader.SetAuthInfoString(PosConst.POS_CARD_READER_DEVICE_TYPE.IC_READER);
                    if (sbVer.ToString() != "")
                        sRetData += DataFormat(m_sWmiClass, "AUTH_ICREADER_VER", CmUtil.MidH(sbVer.ToString(), 0, 16));
                    
                    
                    //사인패드
                    sbVer = m_cICReader.SetAuthInfoString(PosConst.POS_CARD_READER_DEVICE_TYPE.SAIGNPAD);
                    if (sbVer.ToString() != "") 
                        sRetData += DataFormat(m_sWmiClass, "AUTH_SIGNPAD_VER",  CmUtil.MidH(sbVer.ToString(), 0, 16));
                }
            }
            catch (Exception ex)
            {

                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }

            return sRetData;
        }
        #endregion

        #region 캠페인마스터 정보(2017.06.21)
        /// <summary>
        /// 캠페인마스터 정보
        /// </summary>
        /// <returns></returns>
        private string GetCpiMstData()
        {
            string sRetData = string.Empty;
            string sQuery = string.Empty;

            try
            {
                m_sWmiClass = "MST_CPI";

                IMasterUs m_cMstService = (IMasterUs)sManager.InitServiceInstance(ServiceLists.ASV_MASTER.DLL, ServiceLists.ASV_MASTER.POS_MASTER);
                if (m_cMstService == null) return "";

                // 캠페인 마스터
                sQuery = " SELECT * FROM POSMST..MST_CPI WITH(NOLOCK) ";
                sQuery += " WHERE CMP_CD = '" + m_cPosStatus.Base.CmpCd + "'";
                sQuery += "   AND STOR_CD = '" + m_cPosStatus.Base.StoreNo + "'";
                sQuery += "   AND '" + DateTime.Now.ToString("yyyyMMdd") + "' BETWEEN STARTDAY AND FNSHDAY ";
                sQuery += "   AND PRGRS_STATUS = 'C'";
                sQuery += "   AND USE_YN  = '" + PosConst.MST_USE_YN.YES + "'";
                //sQuery += " ORDER BY CPI_CD ";

                DataTable dtMstCpi = m_cMstService.Select(new string[] { sQuery });
                if (dtMstCpi == null || dtMstCpi.Rows.Count <= 0) return "";

                foreach (DataRow dr in dtMstCpi.Rows)
                {
                    // 캠페인 코드 설정
                    sRetData += DataFormat(m_sWmiClass, CmUtil.GetDataRowStr(dr, PosMst.MST_CPI.DATA.CPI_CD), "");
                }
            }
            catch (Exception ex)
            {
                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }
            return sRetData;
        }
        #endregion

        //#20180322 포스스팩에 REAL IP, ISP 추가 start
        #region REAL IP, ISP
        /// <summary>
        /// REAL IP, ISP 정보
        /// </summary>
        /// <returns></returns>
        private string Get_IP_ISP()
        {
            string sRetData = string.Empty;
            string sQuery = string.Empty;

            try
            {

                string url = "http://ipinfo.io/json";
                System.Net.WebRequest req = System.Net.WebRequest.Create(url);
                System.Net.WebResponse resp = req.GetResponse();
                System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
                string response = sr.ReadToEnd().Trim();

                JObject jo = JObject.Parse(response);

                string sRealIP = jo["ip"].ToString();
                string sISP = jo["org"].ToString();

                m_sWmiClass = "NETWORK";

                sRetData += DataFormat(m_sWmiClass, "REALIP", sRealIP);
                sRetData += DataFormat(m_sWmiClass, "ISP", sISP);
            }
            catch (Exception ex)
            {
                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.ToString());
            }
            return sRetData;
        }
        #endregion
        //#20180322 포스스팩에 REAL IP, ISP 추가 end

        //#20180710 Real OS 가져오기 start
        #region Real OS 가져오기
        private string GetRealOS()
        {
            string sRetData = string.Empty;
            string retVal = string.Empty;

            try
            {

                #region 또다른방법
                /*
                OperatingSystem OS = Environment.OSVersion;
                string sWinName = string.Empty;
                switch (OS.Platform)
                {
                    case PlatformID.Win32Windows:
                        if (OS.Version.Major == 4)
                        {
                            switch (OS.Version.Minor)
                            {
                                case 0:
                                    sWinName = "Windows 95";
                                    break;
                                case 10:
                                    sWinName = "Windows 98";
                                    break;
                                case 90:
                                    sWinName = "Window Me";
                                    break;
                            }
                        }
                        break;

                    case PlatformID.Win32NT:
                        if (OS.Version.Major == 4)
                        {
                            switch (OS.Version.Minor)
                            {
                                case 0:
                                    sWinName = "Windows NT 4.0";
                                    break;
                            }
                        }
                        else if (OS.Version.Major == 5)
                        {
                            switch (OS.Version.Minor)
                            {
                                case 0:
                                    sWinName = "Windows 2000";
                                    break;
                                case 1:
                                    sWinName = "Windows XP";
                                    break;
                                case 2:
                                    sWinName = "Window Server 2003";
                                    break;
                            }

                        }
                        else if (OS.Version.Major == 6)
                        {
                            switch (OS.Version.Minor)
                            {
                                case 0:
                                    sWinName = "Windows Vista";
                                    break;
                            }
                        }
                        break;
                }
                */
                #endregion

                #region 구포스방법

                m_sWmiClass = "OS";

                string strTempXPEmbedded = "SYSTEM\\WPA\\EMBEDDED";
                string strTempEBStandard2009 = "SYSTEM\\WPA\\WES";
                string strTempEMPOSReady2009 = "SYSTEM\\WPA\\POSREADY";
                string strTempWEPOS = "SYSTEM\\WPA\\WEPOS";

                OperatingSystem OS = Environment.OSVersion;


                UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                     System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." +
                                     System.Reflection.MethodBase.GetCurrentMethod().Name + "()",
                                     "▶ Platform :" + OS.Platform.ToString() + ", Version Major :" + OS.Version.Major + ", OS ServicePack :" + OS.ServicePack + ", OS Version :" + OS.Version + ", OS VersionString :" + OS.VersionString);

                // xp 계열
                if (OS.Platform == PlatformID.Win32NT && OS.Version.Major == 5)
                {
                    //1. Windows XP Embedded
                    Microsoft.Win32.RegistryKey rgTempXPEmbedded = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(strTempXPEmbedded, Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree); //                    
                    if (rgTempXPEmbedded != null)
                    {
                        retVal = "Windows XP Embedded " + OS.ServicePack;
                    }

                    //2. Windows Embedded Standard 2009
                    Microsoft.Win32.RegistryKey rgTempEBStandard2009 = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(strTempEBStandard2009, Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree); //Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree                    
                    if (rgTempEBStandard2009 != null)
                    {
                        retVal = "Windows Embedded Standard 2009 " + OS.ServicePack;
                    }

                    //3. Windows Embedded POSReady 2009
                    Microsoft.Win32.RegistryKey rgTempEMPOSReady2009 = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(strTempEMPOSReady2009, Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree); //Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree
                    if (rgTempEMPOSReady2009 != null)
                    {
                        retVal = "Windows Embedded POSReady 2009 " + OS.ServicePack;
                    }

                    //4. Windows Embedded for Point of Service(WEPOS)
                    Microsoft.Win32.RegistryKey rgTempWEPOS = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(strTempWEPOS, Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree); //Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree
                    if (rgTempWEPOS != null)
                    {
                        retVal = "Windows Embedded for Point of Service " + OS.ServicePack;
                    }

                    UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                         System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." +
                                         System.Reflection.MethodBase.GetCurrentMethod().Name + "()",
                                         "▶ XP - GetRealOS :" + retVal);


                    if (retVal != "")
                    {
                        sRetData += DataFormat(m_sWmiClass, "Real_OS", retVal);
                        retVal = "";
                    }
                }
                else
                {
                    m_sWmiClass = "OS";
                    m_sWin32Product = "Win32_OperatingSystem";

                    string sCaption = "";
                    string sCSDVersion = "";                     
                    sCaption = identifier(m_sWin32Product, "Caption");
                    sCSDVersion = identifier(m_sWin32Product, "CSDVersion");

                    retVal = sCaption + sCSDVersion;

                    UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                          System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." +
                                          System.Reflection.MethodBase.GetCurrentMethod().Name + "()",
                                          "▶ 7 - GetRealOS :" + retVal);

                    if (retVal != "")
                    {
                        sRetData += DataFormat(m_sWmiClass, "Real_OS", retVal);
                        retVal = "";
                    }
                }

                #endregion
            }
            catch (Exception ex)
            {
                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                     System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." +
                                     System.Reflection.MethodBase.GetCurrentMethod().Name + "()",
                                     ex.ToString());
            }

            return sRetData;
        }
        #endregion Real OS 가져오기
        //#20180710 Real OS 가져오기 end


        //#20180710 LOCAL IP 가져오기 start
        #region Local IP
        private string GetLocalIP()
        {
            string myIP = "";
            string strHostName = "";
            string sRetData = string.Empty;
            try
            {

                m_sWmiClass = "NETWORK";

                strHostName = System.Net.Dns.GetHostName();
                IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName);
                foreach (IPAddress ipAddress in ipEntry.AddressList)
                {
                    if (ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                    {
                        myIP = ipAddress.ToString();
                    }
                }

                sRetData += DataFormat(m_sWmiClass, "LOCAL_IP", myIP);

                UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                      System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." +
                                      System.Reflection.MethodBase.GetCurrentMethod().Name + "()",
                                      "▶ LOCAL_IP :" + myIP);
            }
            catch (Exception ex)
            {
                UserLog.WriteLogFile(UserCom.LOG_ERROR,
                                     System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                     System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." +
                                     System.Reflection.MethodBase.GetCurrentMethod().Name + "()",
                                     ex.ToString());
            }
            return sRetData;
        }
        #endregion
        //#20180710 LOCAL IP 가져오기 end

    }
}
