SysConfig.cpp
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:9k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. //
  20. #include "stdafx.h"
  21. #include "GVCapture.h"
  22. #include "SysConfig.h"
  23. #include "ConfigFile.h"
  24. #include "md5.h"
  25. #include ".sysconfig.h"
  26. #include "TestNetDlg.h"
  27. #ifdef _DEBUG
  28. #define new DEBUG_NEW
  29. #undef THIS_FILE
  30. static char THIS_FILE[] = __FILE__;
  31. #endif
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CSysConfig dialog
  34. CSysConfig::CSysConfig(CWnd* pParent /*=NULL*/)
  35. : CDialog(CSysConfig::IDD, pParent)
  36. {
  37. //{{AFX_DATA_INIT(CSysConfig)
  38. mstrChannelName = _T("");
  39. mstrPassword = _T("");
  40. mstrSPAddress = _T("");
  41. miUserID = 0;
  42. // mStrMMSAddr = _T("");
  43. miReconnectTime = 0;
  44. //}}AFX_DATA_INIT
  45. }
  46. void CSysConfig::DoDataExchange(CDataExchange* pDX)
  47. {
  48. CDialog::DoDataExchange(pDX);
  49. //{{AFX_DATA_MAP(CSysConfig)
  50. DDX_Text(pDX, IDC_CHANNELNAME, mstrChannelName);
  51. DDV_MaxChars(pDX, mstrChannelName, 20);
  52. DDX_Text(pDX, IDC_PASSWORD, mstrPassword);
  53. DDV_MaxChars(pDX, mstrPassword, 40);
  54. DDX_Text(pDX, IDC_SPADDRESS, mstrSPAddress);
  55. DDX_Text(pDX, IDC_USERID, miUserID);
  56. DDX_Text(pDX, IDC_RE_TIME, miReconnectTime);
  57. //}}AFX_DATA_MAP
  58. }
  59. BEGIN_MESSAGE_MAP(CSysConfig, CDialog)
  60. //{{AFX_MSG_MAP(CSysConfig)
  61. //}}AFX_MSG_MAP
  62. ON_BN_CLICKED(IDC_TEST_NET, OnBnClickedTestNet)
  63. ON_BN_CLICKED(IDOK, OnBnClickedOk)
  64. END_MESSAGE_MAP()
  65. /////////////////////////////////////////////////////////////////////////////
  66. // CSysConfig message handlers
  67. void CSysConfig::OnOK() 
  68. {
  69. UpdateData();
  70. if (!JudgeChannelName(mstrChannelName.GetBuffer(0)))
  71. {
  72. return ;
  73. }
  74. //该种加密是不可呢的,不能解密。
  75. MD5 loMd5((unsigned char*)mstrPassword.GetBuffer(0),strlen(mstrPassword.GetBuffer(0)));
  76. mstrPassword = loMd5.hex_digest();
  77. if (!JudgePassword(mstrPassword.GetBuffer(0)))
  78. {
  79. return ;
  80. }
  81. //保存为ini文件
  82. char lszEXEPath[MAX_PATH];
  83. GetCurrentCfgFile(lszEXEPath);
  84. SaveSysConfig(lszEXEPath);
  85. CDialog::OnOK();
  86. }
  87. //得到当前配置文件路径
  88. bool CSysConfig::GetCurrentCfgFile(char *aszFileName)
  89. {
  90. GetModuleFileName(NULL, aszFileName, MAX_PATH);
  91. int liLengthPath = strlen(aszFileName);
  92. while (aszFileName[liLengthPath - 1] != '\')
  93. {
  94. --liLengthPath;
  95. }
  96. if (liLengthPath > 0)
  97. {
  98. aszFileName[liLengthPath] = '';
  99. strcat(aszFileName, "CaptureServer.cfg");
  100. return true;
  101. }
  102. return false;
  103. }
  104. bool CSysConfig::SaveSysConfig(char *aszFileName)
  105. {
  106. //将所得的变量转换
  107. char lszChannelName[DEF_CHANNELNAME_LENGTH + 1] = {0};
  108. char lszPassword[DEF_KEY_LENGTH + 1] = {0};
  109. char lszSPAddress[DEF_ADDRESS_LENGTH + 1] = {0};
  110. //char lszmStrMMSAddr[DEF_ADDRESS_LENGTH + 1] = {0};
  111. strncpy(lszChannelName, mstrChannelName, DEF_CHANNELNAME_LENGTH);
  112. strncpy(lszPassword, mstrPassword, DEF_KEY_LENGTH);
  113. strncpy(lszSPAddress, mstrSPAddress, DEF_ADDRESS_LENGTH);
  114. // strncpy(lszmStrMMSAddr ,mStrMMSAddr, DEF_ADDRESS_LENGTH);
  115. int liWriteLen = 0;
  116. char lszTemp[DEF_TEMP_LENGTH + 1] = {0}; //用来定义临时的拷贝buf
  117. FILE* lfpFile = NULL;
  118. lfpFile = fopen(aszFileName, "w");
  119. if(!lfpFile)
  120. {
  121. MessageBox("写文件出错,可能该文件不可读","错误");
  122. return false;
  123. }
  124. //组成字符串文件头和长度
  125. strcpy(lszTemp, "[CaptureServer]nspAddress=");
  126. strcat(lszTemp, lszSPAddress);
  127. strcat(lszTemp,"n");
  128. strcat(lszTemp,"password=");
  129. strcat(lszTemp,lszPassword);
  130. strcat(lszTemp,"n");
  131. strcat(lszTemp,"channelName=");
  132. strcat(lszTemp,lszChannelName);
  133. strcat(lszTemp,"n");
  134. //strcat(lszTemp,"MMSAddress=");
  135. //strcat(lszTemp,lszmStrMMSAddr);
  136. strcat(lszTemp,"n");
  137. liWriteLen = fwrite(lszTemp, sizeof(char), strlen(lszTemp), lfpFile);
  138. if (liWriteLen != (int)strlen(lszTemp))
  139. {
  140. return false;
  141. }
  142. //写用户ID
  143. ZeroMemory(lszTemp, sizeof(DEF_TEMP_LENGTH));
  144. sprintf(lszTemp,"userID=%dn", miUserID);
  145. liWriteLen = fwrite(lszTemp, sizeof(char), strlen(lszTemp), lfpFile);
  146. if (liWriteLen != (int)strlen(lszTemp))
  147. {
  148. return false;
  149. }
  150. //写重新连接时间
  151. ZeroMemory(lszTemp, sizeof(DEF_TEMP_LENGTH));
  152. sprintf(lszTemp,"ReconnectTime=%dn", miReconnectTime);
  153. liWriteLen = (int)fwrite(lszTemp, sizeof(char), strlen(lszTemp), lfpFile);
  154. if (liWriteLen != (int)strlen(lszTemp))
  155. {
  156. return false;
  157. }
  158. if (0 != fclose(lfpFile))
  159. {
  160. return false;
  161. }
  162. return true;
  163. }
  164. BOOL CSysConfig::OnInitDialog() 
  165. {
  166. CDialog::OnInitDialog();
  167. char lszEXEPath[MAX_PATH] = {0};
  168. GetCurrentCfgFile(lszEXEPath);
  169. ConfigFile cfgFile(lszEXEPath);
  170. if(cfgFile.fileNotFound) 
  171. {
  172. MessageBox("无法找到配置文件CaptureServer.cfg.", "错误", MB_OK|MB_ICONERROR);
  173. return FALSE;
  174. }
  175. mstrSPAddress= cfgFile.Value("CaptureServer", "spAddress").c_str();
  176. if(cfgFile.stringNotFound) {
  177. MessageBox("配置文件中必须存在spAddress一项。", "错误", MB_OK|MB_ICONERROR);
  178. return FALSE;
  179. }
  180. mstrChannelName = cfgFile.Value("CaptureServer", "channelName").c_str();
  181. if(cfgFile.stringNotFound) {
  182. MessageBox( "配置文件中必须存在channelName一项。", "错误", MB_OK|MB_ICONERROR);
  183. return FALSE;
  184. }
  185. string reconnect = cfgFile.Value("CaptureServer", "ReconnectTime").c_str();
  186. if(!cfgFile.fileNotFound)
  187. {
  188. miReconnectTime = atoi(reconnect.data());
  189. }
  190. string id = cfgFile.Value("CaptureServer","userID");
  191. if(cfgFile.fileNotFound){
  192. MessageBox( "配置文件中必须存在userID一项。", "错误", MB_OK|MB_ICONERROR);
  193. return FALSE;
  194. }
  195. miUserID = atoi(id.data());
  196. //读入的是32位密码
  197. mstrPassword = cfgFile.Value("CaptureServer", "password").c_str();
  198. if(cfgFile.fileNotFound){
  199. MessageBox("配置文件中必须存在password一项目。", "错误", MB_OK|MB_ICONERROR);
  200. return FALSE;
  201. }
  202. /*
  203. //读入MMSAddress
  204. mStrMMSAddr = cfgFile.Value("CaptureServer", "MMSAddress").c_str();
  205. if(cfgFile.fileNotFound)
  206. {
  207. MessageBox( "配置文件中必须存在MMSAddress一项目。", "错误", MB_OK|MB_ICONERROR);
  208. return FALSE;
  209. }
  210. */
  211. UpdateData(false);
  212. return TRUE;  // return TRUE unless you set the focus to a control
  213.               // EXCEPTION: OCX Property Pages should return FALSE
  214. }
  215. bool CSysConfig::JudgeChannelName(string astrChannelName)
  216. {
  217. string::const_iterator it = astrChannelName.begin();
  218. BYTE tmpChar;
  219. for(; it != astrChannelName.end(); it++) 
  220. {
  221. tmpChar = static_cast<BYTE>(*it);
  222. if(isdigit(tmpChar) || isalpha(tmpChar))
  223. continue;
  224. if(tmpChar == '[' || tmpChar == ']')
  225. continue;
  226. //GB18030-2000编码标准的第一个字节的编码范围在0x81 ~ 0xFE之间;第二个字节的编码范围在0x40 ~ 0x7E和0x80 ~ 0xFE之间。
  227. //Big5编码标准的第一个字节的编码范围在0xA1 ~ 0xF9 之间;第二个字节的编码范围在0x40 ~ 0x7E 和0xA1 ~ 0xFE之间。
  228. //两者的并集是第一个字节[0x81, 0xfe],第二个字节[0x40, 0x7e]、[0x80, 0xfe];
  229. if(tmpChar>=0x81 && tmpChar <= 0xfe && it+1 != astrChannelName.end()) {
  230. tmpChar = static_cast<BYTE>(*(it+1));
  231. if( (tmpChar>=0x40 && tmpChar <= 0x7e) || (tmpChar>=0x80 && tmpChar <= 0xfe))
  232. {
  233. it++; // 跳过一个汉字字符
  234. continue;
  235. }
  236. }
  237. MessageBox("配置文件中channelName一项只能由字母、数字、汉字和方括弧组成。", "错误", MB_OK|MB_ICONERROR);
  238. return false;
  239. }
  240. return true;
  241. }
  242. //判断ip正确性
  243. bool CSysConfig::JudgeIP(string astrIP)
  244. {
  245. string::const_iterator it = astrIP.begin();
  246. BYTE tmpChar;
  247. for(; it != astrIP.end(); it++) 
  248. {
  249. tmpChar = static_cast<BYTE>(*it);
  250. if(isdigit(tmpChar) ||':' == tmpChar || '.' == tmpChar)
  251. continue;
  252. MessageBox("配置文件中服务器地址一项只能由数字和分隔符“:”组成。", "错误", MB_OK|MB_ICONERROR);
  253. return false;
  254. }
  255. return true;
  256. }
  257. bool CSysConfig::JudgePassword(string astrPassword)
  258. {
  259. if(astrPassword.length() != 32) 
  260. {
  261. MessageBox("加密过程出错,配置文件中Password一项md5加密后其长度必须等于32字符。", "错误", MB_OK|MB_ICONERROR);
  262. return false;
  263. }
  264. return true;
  265. }
  266. void CSysConfig::OnBnClickedTestNet()
  267. {
  268. UpdateData();
  269. if (false == JudgeIP((LPCTSTR)mstrSPAddress))
  270. {
  271. return;
  272. }
  273. CTestNetDlg loTestNet;
  274. loTestNet.GetAddr(mstrSPAddress);
  275. loTestNet.DoModal();
  276. }
  277. void CSysConfig::OnBnClickedOk()
  278. {
  279. // TODO: Add your control notification handler code here
  280. OnOK();
  281. }