AppGlobalF.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. //---------------------------------------------------------------------------
  2. #pragma hdrstop
  3. //---------------------------------------------------------------------------
  4. #include <vcl.h>
  5. #include <assert.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <memory.h>
  10. #include <Systobj.h>
  11. #include <time.h>
  12. #include <Buttons.hpp>
  13. #include <Classes.hpp>
  14. #include <ComCtrls.hpp>
  15. #include <Controls.hpp>
  16. #include <Chart.hpp>
  17. #include <DB.hpp>
  18. #include <DBClient.hpp>
  19. #include <DBGrids.hpp>
  20. #include <DBXpress.hpp>
  21. #include <Dialogs.hpp>
  22. #include <ExtCtrls.hpp>
  23. #include <FMTBcd.hpp>
  24. #include <Forms.hpp>
  25. #include <Graphics.hpp>
  26. #include <Grids.hpp>
  27. #include <jpeg.hpp>
  28. #include <Mask.hpp>
  29. #include <Menus.hpp>
  30. #include <Messages.hpp>
  31. #include <OleCtrls.hpp>
  32. #include <Outline.hpp>
  33. #include <Provider.hpp>
  34. #include <SqlExpr.hpp>
  35. #include <StdCtrls.hpp>
  36. #include <System.hpp>
  37. #include <SysUtils.hpp>
  38. #include <Types.hpp>
  39. //#include <Windows.hpp>
  40. #include <inifiles.hpp>
  41. //---------------------------------------------------------------------------
  42. #include "AppGlobalF.h"
  43. //---------------------------------------------------------------------------
  44. #pragma package(smart_init)
  45. //---------------------------------------------------------------------------
  46. //---------------------------------------------------------------------------
  47. /*
  48. * 프로그램 환경설정 파일에서 설정 정보를 읽어온다.
  49. */
  50. bool APP_LoadConfigInfo()
  51. {
  52. String sTmp;
  53. String sCfgFile;
  54. sCfgFile = g_sCfgDir + g_sAppName + ".ini";
  55. g_AppCfg.sConfigFile = sCfgFile;
  56. DATABASE_INFO *pDb;
  57. TIniFile *pIniFile = new TIniFile(sCfgFile);
  58. try
  59. {
  60. g_AppCfg.sTitle = pIniFile->ReadString("APPLICATION", "TITLE", "VMS Communication Server");
  61. g_AppCfg.sSystemId = pIniFile->ReadString("APPLICATION", "SYSTEMID", "VMS01");
  62. g_AppCfg.sProcessId = pIniFile->ReadString("APPLICATION", "PROCESSID", "30101").ToIntDef(30101);
  63. g_AppCfg.nProcessPort = pIniFile->ReadString("APPLICATION", "PROCESSPORT", "5301").ToIntDef(5301);
  64. g_AppCfg.nProcessId = g_AppCfg.sProcessId.ToIntDef(0);
  65. g_AppCfg.nTrafficCycleTime = pIniFile->ReadString("APPLICATION", "TrafficCycleTime", "300").ToIntDef(300);
  66. g_AppCfg.nTrafficBasisTime = pIniFile->ReadString("APPLICATION", "TrafficBasisTime", "20").ToIntDef(20);
  67. if (g_AppCfg.nTrafficCycleTime < 60) g_AppCfg.nTrafficCycleTime = 60;
  68. g_AppCfg.EVehicleCheckSeconds = pIniFile->ReadString("APPLICATION", "EVehicleCheckSeconds", "20").ToIntDef(20);
  69. if (g_AppCfg.EVehicleCheckSeconds < 10) g_AppCfg.EVehicleCheckSeconds = 10;
  70. g_AppCfg.EVehicleCheckSeconds--;
  71. g_AppCfg.JobTimeout = pIniFile->ReadString("APPLICATION", "JobTimeout", "5000").ToIntDef(5000);
  72. if (g_AppCfg.JobTimeout < 3000) g_AppCfg.JobTimeout = 3000;
  73. if (g_AppCfg.JobTimeout > 300000) g_AppCfg.JobTimeout = 300000;
  74. g_AppCfg.UpdateMode = pIniFile->ReadString("APPLICATION", "UpdateMode", "0").ToIntDef(0);
  75. g_sFtpHomeDir = pIniFile->ReadString("APPLICATION", "FTPHOMEDIR", g_sFtpHomeDir);
  76. if (g_sFtpHomeDir.SubString(g_sFtpHomeDir.Length(), 1) != "\\")
  77. g_sFtpHomeDir += "\\";
  78. g_AppCfg.IsDbConnectPerJob = (pIniFile->ReadString("APPLICATION", "CONNECTPERJOB", "false").UpperCase() == "TRUE") ? true : false;
  79. g_AppCfg.comm.nCenterPort = pIniFile->ReadString("COMMUNICATION", "CENTERPORT", "6020").ToIntDef(6020);
  80. g_AppCfg.comm.nListenPort = pIniFile->ReadString("COMMUNICATION", "LISTENPORT", "6020").ToIntDef(6020);
  81. g_AppCfg.comm.nClientPort = pIniFile->ReadString("COMMUNICATION", "CLIENTPORT", "355").ToIntDef(355);
  82. g_AppCfg.comm.sLocalDomain = pIniFile->ReadString("COMMUNICATION", "LOCALDOMAIN", "VMS_SERVER");
  83. g_AppCfg.comm.sLoginUser = pIniFile->ReadString("COMMUNICATION", "LOGINUSER", "ysvms");
  84. pDb = &g_AppCfg.db;
  85. pDb->sConnectStr = pIniFile->ReadString("DATABASE", "CONNECTSTR", "");
  86. pDb->sProvider = pIniFile->ReadString("DATABASE", "PROVIDER", "");
  87. pDb->sServerName = pIniFile->ReadString("DATABASE", "SERVERNAME", "");
  88. pDb->sCatalog = pIniFile->ReadString("DATABASE", "CATALOG", "");
  89. pDb->sUserName = pIniFile->ReadString("DATABASE", "USERNAME", "");
  90. pDb->sPassword = pIniFile->ReadString("DATABASE", "PASSWORD", "");
  91. if (pDb->sConnectStr == "")
  92. {
  93. pDb->MakeConnString();
  94. }
  95. g_AppCfg.nMaxLogLines = pIniFile->ReadString("LOG", "LOGLINE", "200").ToIntDef(200);
  96. g_AppCfg.sLogDay = pIniFile->ReadString("LOG", "LOGDAY", "");
  97. if (g_AppCfg.nMaxLogLines > 1000) g_AppCfg.nMaxLogLines = 1000;
  98. if (g_AppCfg.nMaxLogLines < 100) g_AppCfg.nMaxLogLines = 100;
  99. g_LogCfg.Info = pIniFile->ReadString("LOG", "INFO", "1").ToIntDef(1) == 1 ? true : false;
  100. g_LogCfg.Data = pIniFile->ReadString("LOG", "DATA", "0").ToIntDef(1) == 1 ? true : false;
  101. g_LogCfg.Error = pIniFile->ReadString("LOG", "ERROR", "1").ToIntDef(1) == 1 ? true : false;
  102. g_LogCfg.Warning = pIniFile->ReadString("LOG", "WARNING", "1").ToIntDef(1) == 1 ? true : false;
  103. g_LogCfg.Debug = pIniFile->ReadString("LOG", "DEBUG", "0").ToIntDef(1) == 1 ? true : false;
  104. g_LogCfg.Detail = pIniFile->ReadString("LOG", "DETAIL", "0").ToIntDef(1) == 1 ? true : false;
  105. g_LogCfg.Detail = false;
  106. g_AppCfg.bThrExit = false;
  107. g_AppCfg.bThrJobExit = false;
  108. g_AppCfg.hFinishEvent = NULL;
  109. }
  110. __finally
  111. {
  112. if (pIniFile) delete pIniFile;
  113. pIniFile = NULL;
  114. }
  115. return APP_ReLoadConfigInfo();
  116. }
  117. //---------------------------------------------------------------------------
  118. bool APP_ReLoadConfigInfo()
  119. {
  120. String sTmp;
  121. TIniFile *pIniFile = new TIniFile(g_AppCfg.sConfigFile);
  122. try
  123. {
  124. LOAD_DB = pIniFile->ReadString("APPLICATION", "LOADDB", "1").ToIntDef(1) == 1 ? true : false;
  125. g_AppCfg.DownloadBitmap = pIniFile->ReadString("APPLICATION", "DOWNLOADBITMAP", "0").ToIntDef(0) == 1 ? true : false;
  126. g_AppCfg.nSaveFormType = pIniFile->ReadString("APPLICATION", "SaveFormType", "0").ToIntDef(0);
  127. g_AppCfg.nDefaultFillColor = pIniFile->ReadString("APPLICATION", "DefaultFillColor", "0").ToIntDef(0);
  128. if (g_AppCfg.nSaveFormType < 0 || g_AppCfg.nSaveFormType > 2) g_AppCfg.nSaveFormType = 0;
  129. g_AppCfg.IsDbConnectPerJob = (pIniFile->ReadString("APPLICATION", "CONNECTPERJOB", "false").UpperCase() == "TRUE") ? true : false;
  130. //정체폼 판정 주기(즉, 주기값이상인 경우 정체폼생성 >= )
  131. //1단 교통정보폼 중앙정렬 여부
  132. g_AppCfg.CngsContCnt = pIniFile->ReadString("APPLICATION", "CngsContCnt", "2").ToIntDef(2);
  133. g_AppCfg.IsImageSeqSave = pIniFile->ReadString("APPLICATION", "IMAGESEQSAVE", "0").ToIntDef(0) == 1 ? true : false;
  134. if (g_AppCfg.CngsContCnt < 1) g_AppCfg.CngsContCnt = 1;
  135. g_AppCfg.IsCheckNewForm = pIniFile->ReadString ("APPLICATION", "CheckNewForm", "1").ToIntDef(1) == 1 ? true : false;
  136. g_AppCfg.PixelValue = pIniFile->ReadString ("APPLICATION", "PixelValue", "0").ToIntDef(0);
  137. if (g_AppCfg.PixelValue < 0) g_AppCfg.PixelValue = 0;
  138. if (g_AppCfg.PixelValue > 254) g_AppCfg.PixelValue = 254;
  139. g_AppCfg.EVehicleCheckSeconds = pIniFile->ReadString("APPLICATION", "EVehicleCheckSeconds", "20").ToIntDef(20);
  140. if (g_AppCfg.EVehicleCheckSeconds < 10) g_AppCfg.EVehicleCheckSeconds = 10;
  141. g_AppCfg.EVehicleCheckSeconds--;
  142. g_AppCfg.JobTimeout = pIniFile->ReadString("APPLICATION", "JobTimeout", "10000").ToIntDef(10000);
  143. if (g_AppCfg.JobTimeout < 3000) g_AppCfg.JobTimeout = 3000;
  144. if (g_AppCfg.JobTimeout > 300000) g_AppCfg.JobTimeout = 300000;
  145. g_AppCfg.UpdateMode = pIniFile->ReadString("APPLICATION", "UpdateMode", "0").ToIntDef(0);
  146. int nPixelFormat = pIniFile->ReadString ("APPLICATION", "BitmapFormat", "24").ToIntDef(24);
  147. switch(nPixelFormat)
  148. {
  149. case 4: g_AppCfg.PixelFormat = pf4bit; break;
  150. case 8: g_AppCfg.PixelFormat = pf8bit; break;
  151. case 16: g_AppCfg.PixelFormat = pf16bit; break;
  152. case 24: g_AppCfg.PixelFormat = pf24bit; break;
  153. case 32: g_AppCfg.PixelFormat = pf32bit; break;
  154. default: g_AppCfg.PixelFormat = pf24bit; break;
  155. }
  156. g_AppCfg.MaxMemory = pIniFile->ReadString("RESOURCE", "MAXMEMORY", "512").ToIntDef(512);
  157. g_AppCfg.MaxHandle = pIniFile->ReadString("RESOURCE", "MAXHANDLE", "0").ToIntDef(0);
  158. g_AppCfg.MaxThread = pIniFile->ReadString("RESOURCE", "MAXTHREAD", "4096").ToIntDef(4096);
  159. g_AppCfg.MaxGdi = pIniFile->ReadString("RESOURCE", "MAXGDI", "0").ToIntDef(0);
  160. g_AppCfg.RcRestart = pIniFile->ReadString("RESOURCE", "RESTART", "0").ToIntDef(0) == 1 ? true : false;
  161. g_AppCfg.comm.nConnectWait = pIniFile->ReadString("COMMUNICATION", "CONNECTWAIT", "60").ToIntDef(60);
  162. g_AppCfg.comm.nCmdTimeOut = pIniFile->ReadString("COMMUNICATION", "CMDTIMEOUT", "5").ToIntDef(5);
  163. g_AppCfg.comm.nWatchDogTime = pIniFile->ReadString("COMMUNICATION", "WATCHDOGTIME", "30").ToIntDef(30);
  164. g_AppCfg.comm.nPollingTime = pIniFile->ReadString("COMMUNICATION", "POLLINGTIME", "20").ToIntDef(20);
  165. g_AppCfg.IsIpChecking = pIniFile->ReadString("COMMUNICATION", "IPCHECKING", "1").ToIntDef(1) == 1 ? true : false;
  166. if (g_AppCfg.comm.nPollingTime < 10) g_AppCfg.comm.nPollingTime = 10;
  167. if (g_AppCfg.comm.nPollingTime > 90) g_AppCfg.comm.nPollingTime = 90;
  168. if (g_AppCfg.comm.nConnectWait < 30) g_AppCfg.comm.nConnectWait = 30;
  169. if (g_AppCfg.comm.nConnectWait > 60) g_AppCfg.comm.nConnectWait = 60;
  170. if (g_AppCfg.comm.nCmdTimeOut < 5) g_AppCfg.comm.nCmdTimeOut = 5;
  171. if (g_AppCfg.comm.nWatchDogTime < 30) g_AppCfg.comm.nWatchDogTime = 30;
  172. g_AppCfg.comm.nWatchDogTime += 5; // 5초정도를 더 추가해 준다(딜레이발생할 경우)
  173. g_AppCfg.BottomTrafficCycle = pIniFile->ReadString("FIGURE", "TRAFFIC_CYCLE", "0").ToIntDef(0);
  174. g_AppCfg.BottomTrafficMaxCnt = pIniFile->ReadString("FIGURE", "TRAFFIC_MAX", "1").ToIntDef(1);
  175. g_AppCfg.BottomTrafficCenter = pIniFile->ReadString("FIGURE", "TRAFFIC_CENTER", "1").ToIntDef(1) == 1 ? true : false;
  176. if (g_AppCfg.BottomTrafficCycle != 0)
  177. {
  178. if (g_AppCfg.BottomTrafficCycle < 3)
  179. {
  180. g_AppCfg.BottomTrafficCycle = 3; //하단소통정보 표출하는 경우 3초보다 작으면 최소 3초로 설정한다.
  181. }
  182. }
  183. FIGURE.GRADE0 = pIniFile->ReadString("FIGURE", "0", "-").Trim();
  184. FIGURE.GRADE1 = pIniFile->ReadString("FIGURE", "1", "월활").Trim();
  185. FIGURE.GRADE2 = pIniFile->ReadString("FIGURE", "2", "지체").Trim();
  186. FIGURE.GRADE3 = pIniFile->ReadString("FIGURE", "3", "정체").Trim();
  187. g_AppCfg.TextTrafficCenter = pIniFile->ReadString("TEXT", "TRAFFIC_CENTER", "1").ToIntDef(1) == 1 ? true : false;
  188. TEXT.GRADE0 = pIniFile->ReadString("TEXT", "0", "-").Trim();
  189. TEXT.GRADE1 = pIniFile->ReadString("TEXT", "1", "소통원활").Trim();
  190. TEXT.GRADE2 = pIniFile->ReadString("TEXT", "2", "지 체").Trim();
  191. TEXT.GRADE3 = pIniFile->ReadString("TEXT", "3", "정 체").Trim();
  192. }
  193. __finally
  194. {
  195. if (pIniFile) delete pIniFile;
  196. pIniFile = NULL;
  197. }
  198. return true;
  199. }
  200. //---------------------------------------------------------------------------
  201. /*
  202. * 응용프로그램이 중복으로 실행되는 것을 막기위해 뮤텍스를 생성한다.
  203. */
  204. bool APP_ApplicationSingleInstance(AnsiString AProgName, AnsiString APidFile)
  205. {
  206. bool isRunning = false;
  207. HANDLE hMutex = 0;
  208. AnsiString sMutexName;
  209. sMutexName = "Global\\" + AProgName;
  210. hMutex = CreateMutex(NULL, TRUE, sMutexName.c_str());
  211. if (hMutex && GetLastError() == ERROR_ALREADY_EXISTS)
  212. {
  213. char buffer[1000];
  214. ReleaseMutex(hMutex);
  215. hMutex=0;
  216. isRunning = true;
  217. ////////////////////////////////////////////////////////////////////////////
  218. AnsiString fn;
  219. char tmp[500];
  220. if (FileExists(APidFile))
  221. {
  222. TFileStream *fp = new TFileStream(APidFile, fmOpenRead);
  223. HWND hwnd;
  224. AnsiString nfo;
  225. memset(buffer, 0, 1000);
  226. fp->Read(buffer, 100);
  227. delete fp;
  228. hwnd = (HWND)(String(buffer).ToIntDef(0));
  229. if (hwnd)
  230. {
  231. SendMessage(hwnd, WM_USER, WM_WINDOW_RESTORE, 0);
  232. }
  233. }
  234. }
  235. if (hMutex)
  236. {
  237. ReleaseMutex(hMutex);
  238. hMutex=0;
  239. }
  240. return isRunning;
  241. }
  242. //---------------------------------------------------------------------------
  243. /*
  244. * 환경설정 정보를 저장하는 함수.
  245. */
  246. bool APP_WriteConfigInfo(String ASection, String AItem, String AValue, String ACfgFile/*=""*/)
  247. {
  248. String sConfigFile;
  249. TIniFile *pIniFile = NULL;
  250. if (ACfgFile == "")
  251. sConfigFile = g_AppCfg.sConfigFile;
  252. else
  253. sConfigFile = ACfgFile;
  254. try
  255. {
  256. pIniFile = new TIniFile(sConfigFile);
  257. if (pIniFile == NULL)
  258. {
  259. return false;
  260. }
  261. pIniFile->WriteString(ASection, AItem, AValue);
  262. }
  263. catch(...)
  264. {
  265. }
  266. if (pIniFile)
  267. {
  268. pIniFile->Free();
  269. pIniFile = NULL;
  270. }
  271. return true;
  272. }
  273. //---------------------------------------------------------------------------
  274. /*
  275. * 환경설정 정보를 읽어오는 함수.
  276. */
  277. bool APP_ReadConfigInfo(String ASection, String AItem, String &AValue, String ACfgFile/*=""*/)
  278. {
  279. bool bRes;
  280. String sConfigFile;
  281. TIniFile *pIniFile = NULL;
  282. bRes = false;
  283. if (ACfgFile == "")
  284. sConfigFile = g_AppCfg.sConfigFile;
  285. else
  286. sConfigFile = ACfgFile;
  287. try
  288. {
  289. pIniFile = new TIniFile(sConfigFile);
  290. if (pIniFile == NULL)
  291. {
  292. return bRes;
  293. }
  294. AValue = pIniFile->ReadString(ASection, AItem, "");
  295. if (AValue != "")
  296. {
  297. bRes = true;
  298. }
  299. }
  300. catch(...)
  301. {
  302. }
  303. if (pIniFile)
  304. {
  305. pIniFile->Free();
  306. pIniFile = NULL;
  307. }
  308. return bRes;
  309. }
  310. //---------------------------------------------------------------------------
  311. /*
  312. * 시스템오류 메시지를 얻는다.
  313. */
  314. String APP_GetSysError()
  315. {
  316. AnsiString sErrMsg = "";
  317. LPVOID lpMsgBuf = NULL;
  318. try
  319. {
  320. try
  321. {
  322. FormatMessage(
  323. FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  324. NULL,
  325. GetLastError(),
  326. //MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  327. MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT),
  328. (LPTSTR) &lpMsgBuf,
  329. 0,
  330. NULL
  331. );
  332. char *pData = (char*)lpMsgBuf;
  333. if (strlen(pData) > 2)
  334. {
  335. pData[strlen(pData)-2] = 0x00;
  336. pData[strlen(pData)-1] = 0x00;
  337. }
  338. sErrMsg = AnsiString(pData);
  339. }
  340. __finally
  341. {
  342. if (lpMsgBuf) LocalFree(lpMsgBuf);
  343. lpMsgBuf = NULL;
  344. }
  345. }
  346. catch(Exception &e)
  347. {
  348. }
  349. return sErrMsg;
  350. }
  351. //---------------------------------------------------------------------------