using System; using System.Collections.Generic; using System.Windows.Forms; using System.Threading; using System.Diagnostics; using Microsoft.Win32; using System.IO; namespace FPER { // // 진입점 및 공용 이벤트, Enum 선언 // static class Program { /// /// 해당 응용 프로그램의 주 진입점입니다. /// [STAThread] static void Main() { // cyim 2013.10.11 : 데이타베이스 동작 가능 상태 확인 if (Process_Excute("fbserver") == false || Process_Excute("fbguard") == false) { MessageBox.Show("Fire Bird 데이타베이스가 실행되지 않았습니다. 프로그램을 종료합니다.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } // cyim 2015.7.29 수신반 모드 // ini 파일을 열어서 수신반이 될지 수신기가 될지 알아본다 // 만약 ini 파일이 없다면 기본적으로 수신기 모드로 동작한다 // 0 : 수신기, 1 : 수신반 string mode = _Ini.Read_Ini("PROGRAM", "MODE", 1024, Environment.CurrentDirectory + "\\Config.ini"); // cyim 2016.12.26 : UI 이탈방지 코드 추가 (후킹) _Data.Hook_Enable = _Ini.Read_Ini("PROGRAM", "HOOK_ENABLE", 1024, Environment.CurrentDirectory + "\\Config.ini"); if (mode == "1") { // cyim 2015.7.29 수신반 모드 _Data.FireDeskMode = true; // 현장명 _Data.Site_Name = _Ini.Read_Ini("PROGRAM", "SITE_NAME", 1024, Environment.CurrentDirectory + "\\Config.ini"); // cyim 2016.12.20 : 푸시메세지 연동 기능 추가 _Data.MOBILE_ENABLE = _Ini.Read_Ini("PROGRAM", "MOBILE_ENABLE", 1024, Environment.CurrentDirectory + "\\Config.ini"); _Data.GCM_ENABLE = _Ini.Read_Ini("PROGRAM", "GCM_ENABLE", 1024, Environment.CurrentDirectory + "\\Config.ini"); _Data.GCM_API_KEY = _Ini.Read_Ini("PROGRAM", "GCM_API_KEY", 1024, Environment.CurrentDirectory + "\\Config.ini"); _Data.GCM_TEST_MODE = _Ini.Read_Ini("PROGRAM", "GCM_TEST_MODE", 1024, Environment.CurrentDirectory + "\\Config.ini"); _Data.GCM_INFO_FIRE = _Ini.Read_Ini("PROGRAM", "GCM_INFO_FIRE", 1024, Environment.CurrentDirectory + "\\Config.ini"); _Data.GCM_INFO_FACILITY = _Ini.Read_Ini("PROGRAM", "GCM_INFO_FACILITY", 1024, Environment.CurrentDirectory + "\\Config.ini"); _Data.GCM_INFO_COMERROR = _Ini.Read_Ini("PROGRAM", "GCM_INFO_COMERROR", 1024, Environment.CurrentDirectory + "\\Config.ini"); _Data.GCM_INFO_BLOCK = _Ini.Read_Ini("PROGRAM", "GCM_INFO_BLOCK", 1024, Environment.CurrentDirectory + "\\Config.ini"); _Data.GCM_INFO_CUT = _Ini.Read_Ini("PROGRAM", "GCM_INFO_CUT", 1024, Environment.CurrentDirectory + "\\Config.ini"); _Data.GCM_INFO_CHECK = _Ini.Read_Ini("PROGRAM", "GCM_INFO_CHECK", 1024, Environment.CurrentDirectory + "\\Config.ini"); // cyim 2015.9.30 수신반은 ini 파일을 이용해서 데이타베이스 접속 string Temp_DATABASE_NAME = _Ini.Read_Ini("PROGRAM", "DATABASE_NAME", 1024, Environment.CurrentDirectory + "\\Config.ini");//rk.GetValue("DATABASE_NAME").ToString(); _Data.Registry_DATABASE_NAME = Temp_DATABASE_NAME; _Data.Registry_DATABASE_NAME_IP = Temp_DATABASE_NAME.Substring(0, Temp_DATABASE_NAME.IndexOf(":")); _Data.Registry_DATABASE_NAME_PATH = Temp_DATABASE_NAME.Substring(Temp_DATABASE_NAME.IndexOf(":") + 1); } else { // // cyim 2015.7.29 수신반 루틴을 위해 외부 파라미터로 동작하도록 수정 // // 레지스트리 값 읽기 RegistryKey rk = Registry.LocalMachine.OpenSubKey("SOFTWARE\\I_FPER_COMM_DAEMON", false); if (rk == null) { MessageBox.Show("레지스트리 읽기 실패!", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } else { // 수신기 아이디 _Data.Registry_ReceiverID = Convert.ToInt16(rk.GetValue("RECEIVER_ID").ToString()); // 데이타베이스 정보 string Temp_DATABASE_NAME = rk.GetValue("DATABASE_NAME").ToString(); _Data.Registry_DATABASE_NAME = Temp_DATABASE_NAME; _Data.Registry_DATABASE_NAME_IP = Temp_DATABASE_NAME.Substring(0, Temp_DATABASE_NAME.IndexOf(":")); _Data.Registry_DATABASE_NAME_PATH = Temp_DATABASE_NAME.Substring(Temp_DATABASE_NAME.IndexOf(":") + 1); // 모니터데몬 정보 try { _Data.Registry_MonitorDaemon_Enable = (rk.GetValue("MAIN_MONITOR_ACTIVE").ToString() == "1") ? true : false; _Data.Registry_MonitorDaemon_IP = rk.GetValue("MAIN_MONITOR_SERVER_IP").ToString(); } catch { // cyim 2015.8.18 레지스트리값 읽기 실패하면 기본값을 강제로 셋팅 // 모니터 데몬 정보가 현장에서 주로 셋팅할때 레지스트리값이 없으므로 보완한다 // 단, 기존의 Main Monitor 관련 변수만 셋팅한다 MessageBox.Show("레지스트리 읽기 실패! 기본값 셋팅 [MAIN_MONITOR_ACTIVE] 합니다. 종료하고 다시 시작해주세요", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning); // 레지스트리에 값을 쓰기 RegistryKey Set_Rk = Registry.LocalMachine.CreateSubKey("SOFTWARE").CreateSubKey("I_FPER_COMM_DAEMON"); Set_Rk.SetValue("MAIN_MONITOR_ACTIVE", 0); Set_Rk.SetValue("MAIN_MONITOR_SERVER_IP", "192.168.0.1"); Set_Rk.SetValue("MAIN_MONITOR_SERVER_PORT", 9003); Set_Rk.SetValue("MAIN_MONITOR_SERVER_PROCESS_DELAY", 5000); Set_Rk.SetValue("MAIN_MONITOR_SERVER_READ_TIMEOUT", 30000); return; } // // 중요사항 // // 네트워크 수신기에서 수신기아이디가 2인경우에도 Receiver1 폴더로 접근하도록 되어있다 // 폴더명과 ODBC 를 바꿔서 설정해야하는 불편함이 있다. 또한 런쳐가 실행되는 경로가 틀려져서 윈도우 부팅후 시작할수가 없다 // 결국 무조건 수신기 아이디와는 상관없이 폴더명은 Receiver1로 고정되므로 주의해야한다 // 프로젝트 정보 _Data.Registry_Project_Directory = rk.GetValue("PROJECT_DIR").ToString(); } } // // MUTEX 처리 // bool createdNew; Mutex dup = new Mutex(true, "__FIRE_UI_MUTEX__", out createdNew); if (createdNew) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); switch (mode) { // 수신반 case "1": Application.Run(new FireDesk_BigReceiver()); break; // 수신기 default: Application.AddMessageFilter(new AltF4Filter()); // Add a message filter Application.Run(new MDIParent(_Data.Registry_ReceiverID, null)); // cyim 2015.7.29 수신반 모드: 평상시에는 레지스트리값으로 아이디를 알아낸다 // cyim 2015.8.4 수신반을 위한 static 클래스 정리 break; } dup.ReleaseMutex(); } else { //MessageBox.Show("Already Program is Running!");// cyim 2015.2.11 중복방지 알림팝업창 제거 } } public class AltF4Filter : IMessageFilter { public bool PreFilterMessage(ref Message m) { const int WM_SYSKEYDOWN = 0x0104; if (m.Msg == WM_SYSKEYDOWN) { bool alt = ((int)m.LParam & 0x20000000) != 0; if (alt && (m.WParam == new IntPtr((int)Keys.F4))) Console.WriteLine("ALT+F4 Filtering됨."); return true; // eat it! } return false; } } // 프로세스 실행여부 public static bool Process_Excute(string ProcessName) { bool result = false; Process[] mProcess = Process.GetProcessesByName(ProcessName); if (mProcess.Length == 0) result = false; else result = true; return result; } } // //화면 인터페이스 모드 (GroupUIChange 함수의 인자값) // public enum UIMode { input, // 입력 및 수정 cancel // 보기 } // //DATABASE 작업 모드 // public enum QUERYMode { select, insert, update, delete, InsertAndUpdate } // //TB_COMM의 COMM_LOOP 필드 상수 (고정된값) // public enum COMMLOOP { FrontLoop = 1, BackLoop = 2, // 사용안함 IO = 3, KEYPAD = 4, BroadCast = 5 // 비상방송 5 // cyim 2013.7.10 디자인개선작업 : 수신기설정 } // // 명령응답을 처리하는 이벤트선언 // public delegate void dCommandResponse(CmdInfo d); // // 화면전환을 처리하는 이벤트선언 (예 : 화재발생시) // public delegate void dCommandFuctionCall(int id); // // 팝업 우선순위 (낮을수록 높은 등급) // public enum MappingStatus {//2010.10.29,k.s.d, pop up message level chnage. FireOn = 0, AccumulateOn = 1, WriteOn = 2, FaultOn = 16,//3, //2011.04.06,k.s.d, pop up message level chnage. PhoneOn = 4, CommConnectError = 5, FireOff = 6, WriteOff = 7, FaultOff = 17,//8, //2011.04.06,k.s.d, pop up message level chnage. FireRecovery = 9, AccumulateOff = 10, PhoneOff = 11, Normal = 12, CommConnectNormal = 13, ProgramStart = 14, ProgramEnd = 15, Log = 16, // cyim 2015.2.10 LOG DemonInit = 18,// add init message } // // 회로 타입 // /* 'I' : 입력,'O' : 출력 */ public struct code_InOutType { public const String Input = "I"; public const String Output = "O"; } // // 미사용 // /* 'G':그룹, 'D':DEVICE */ public struct code_processType { public const String Group = "G"; public const String Device = "D"; } // // 필터링 조건 // cyim 2013.10.2 : 발생위치 필터링 기능 추가 // public enum DB_Result_Filter { None, // 필터링 조건 사용안함 Device, // 디바이스명만 Positon, // 발생위치만 AND // 교집합 } }