Internet.cpp
上传用户:kklily621
上传日期:2013-06-25
资源大小:252k
文件大小:13k
开发平台:

Visual C++

  1. //=============================================================================================
  2. /*
  3. 文件: Internet.cpp
  4. 说明:
  5. ---------------------------------------------------
  6. 网络数据传输操作,用来完成用户注册信息的上载和
  7. 网络命令的下载。
  8. ---------------------------------------------------
  9. 工程: Xfilter 个人防火墙
  10. 作者: 朱雁辉,朱雁冰
  11. 创建日期: 2001/08/26
  12. 网址: http://www.xfilt.com
  13. 电子邮件: xstudio@xfilt.com
  14. 版权所有 (c) 2001-2002 X 工作室
  15. 警告:
  16. ---------------------------------------------------
  17. 本电脑程序受著作权法的保护。未经授权,不能使用
  18. 和修改本软件全部或部分源代码。凡擅自复制、盗用或散
  19. 布此程序或部分程序或者有其它任何越权行为,将遭到民
  20. 事赔偿及刑事的处罚,并将依法以最高刑罚进行追诉。
  21. 凡通过合法途径购买本软件源代码的用户被默认授权
  22. 可以在自己的程序中使用本软件的部分代码,但作者不对
  23. 代码产生的任何后果负责。
  24. 使用了本软件代码的程序只能以可执行文件形式发布,
  25. 未经特别许可,不能将含有本软件源代码的源程序以任何
  26. 形式发布。
  27. ---------------------------------------------------
  28. */
  29. //=============================================================================================
  30. #include "stdafx.h"
  31. #include "..guires.h"
  32. #include "..Property.h" // in the header #include "internet.h"
  33. #include "..Register.h"
  34. const TCHAR szHeaders[] =
  35. _T("Accept: text/*rnUser-Agent: XFILTERrn");
  36. extern CAclFile m_AclFile;
  37. extern CPropertyApp theApp;
  38. CHttpRequest::CHttpRequest()
  39. {
  40. m_pUrlRequest[0] = '';
  41. m_DownloadThread = NULL;
  42. m_UploadThread = NULL;
  43. m_IsUploaded = TRUE;
  44. lCommandId = NULL;
  45. m_IsConnecting = FALSE;
  46. }
  47. CHttpRequest::~CHttpRequest()
  48. {
  49. Close();
  50. }
  51. int CHttpRequest::ConnectUrl(TCHAR *sUrl, TCHAR *sReturn, long *lVersion, int *Count)
  52. {
  53. ODS(_T("XFILTER.EXE: GetFromUrl Begin... "));
  54. if(sUrl == NULL)
  55. return XERR_INVALID_PARAMETER;
  56. CString strServerName;
  57. CString strObject;
  58. INTERNET_PORT nPort;
  59. DWORD dwServiceType;
  60. if (!AfxParseURL(sUrl, dwServiceType, strServerName, strObject, nPort) ||
  61. dwServiceType != INTERNET_SERVICE_HTTP)
  62. {
  63. ODS(_T("XFILTER.EXE: Internet Invalid Url ..."));
  64. return XERR_INTERNET_URL_ERROR;
  65. }
  66. CInternetSession session(GUI_APP_CLASS_NAME);
  67. CHttpConnection *pServer = NULL;
  68. CHttpFile *pFile = NULL;
  69. int iRet = XERR_SUCCESS;
  70. m_IsConnecting = TRUE;
  71. try
  72. {
  73. pServer = session.GetHttpConnection(strServerName, nPort);
  74. pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject);
  75. pFile->AddRequestHeaders(szHeaders);
  76. pFile->SendRequest();
  77. DWORD dwRet;
  78. pFile->QueryInfoStatusCode(dwRet);
  79. if (dwRet >= 400 && dwRet <= 499)
  80. {
  81. ODS(_T("XFILTER.EXE: Internet Request Error ..."));
  82. iRet = XERR_INTERNET_REQUEST_ERROR;
  83. }
  84. else if(dwRet >= 500 && dwRet <= 599)
  85. {
  86. ODS(_T("XFILTER.EXE: Internet Server Error ..."));
  87. iRet = XERR_INTERNET_SERVER_ERROR;
  88. }
  89. else if(sReturn != NULL)
  90. {
  91. pFile->ReadString(sReturn, MAX_NET_COMMAND_LENTH - 1);
  92. ODS(sReturn);
  93. CString tmpStr = sReturn;
  94. long lVer = atol(tmpStr.Left(MAX_NET_COMMAND_VERSION_LENTH));
  95. if(lVer > *lVersion)
  96. {
  97. *lVersion = lVer;
  98. int i = 1;
  99. while (i < MAX_NET_COMMAND
  100. && pFile->ReadString((sReturn + MAX_NET_COMMAND_LENTH * i), MAX_NET_COMMAND_LENTH - 1))
  101. {
  102. ODS(sReturn + i * MAX_NET_COMMAND_LENTH);
  103. i ++;
  104. }
  105. *Count = i;
  106. }
  107. }
  108. else
  109. {
  110. CString sRet;
  111. pFile->ReadString(sRet);
  112. if(sRet.GetAt(0) != '1')
  113. iRet = XERR_INTERNET_REG_ERROR;
  114. ODS2(_T("XFILTER.EXE: Internet User Register Return Value "),sRet);
  115. }
  116. pFile->Close();
  117. pServer->Close();
  118. }
  119. catch(CInternetException* pEx)
  120. {
  121. #if _DEBUG
  122. TCHAR sError[1024];
  123. pEx->GetErrorMessage(sError, 1024);
  124. ODS(sError);
  125. #endif
  126. pEx->Delete();
  127. iRet = XERR_INTERNET_CONNECT_ERROR;
  128. }
  129. if (pFile != NULL)
  130. delete pFile;
  131. if (pServer != NULL)
  132. delete pServer;
  133. session.Close();
  134. m_IsConnecting = FALSE;
  135. ODS(_T("XFILTER.EXE: GetFromUrl End... "));
  136. return iRet;
  137. }
  138. void CHttpRequest::Close()
  139. {
  140. if(lCommandId != NULL)
  141. {
  142. delete lCommandId;
  143. lCommandId = NULL;
  144. }
  145. if(m_UploadThread != NULL)
  146. {
  147. TerminateThread(m_UploadThread, 0);
  148. m_UploadThread = NULL;
  149. }
  150. if(m_DownloadThread != NULL)
  151. {
  152. TerminateThread(m_DownloadThread, 0);
  153. m_DownloadThread = NULL;
  154. }
  155. ODS(_T("XFILTER.EXE: Internet Close free lCommandId and exit thread..."));
  156. }
  157. BOOL CHttpRequest::IsConnected()
  158. {
  159. ODS(_T("XFILTER.EXE: Internet Check Connected..."));
  160.     RASCONN lpRasConn ;
  161. RASCONNSTATUS rasStatus;     
  162. DWORD cbBuf = 0;     
  163. DWORD cConn = 0;     
  164. DWORD dwRet = 0; 
  165. cbBuf = sizeof(RASCONN);
  166. lpRasConn.dwSize = sizeof(RASCONN );
  167. dwRet = RasEnumConnections(&lpRasConn, &cbBuf, &cConn );
  168. if ( dwRet != 0 )   
  169. return FALSE;
  170. else
  171. {
  172. rasStatus.dwSize = sizeof(RASCONNSTATUS);
  173. RasGetConnectStatus(lpRasConn.hrasconn,&rasStatus);
  174. if (rasStatus.rasconnstate==RASCS_Connected)
  175. return TRUE;
  176. else
  177. return FALSE;
  178. }
  179. return TRUE;
  180. }
  181. BOOL CHttpRequest::UserReg()
  182. {
  183. CRegister dlgReg;
  184. int iRet = dlgReg.DoModal();
  185. if(iRet == IDCANCEL)
  186. return FALSE;
  187. m_UserInfo.iStatus = REG_STATUS_REGISTERING;
  188. return theApp.m_Install.SaveReg(REG_INFO_ITEM, (BYTE*)&m_UserInfo, sizeof(XUSER_INFO));
  189. }
  190. BOOL CHttpRequest::InitRegister()
  191. {
  192. if(m_AclFile.mAclHeader.sSignature[0] == '' || m_AclFile.mAclHeader.sWebURL[0] == '')
  193. return FALSE;
  194. theApp.m_Install.ReadReg(REG_INFO_ITEM, (BYTE*)&m_UserInfo, sizeof(XUSER_INFO));
  195. if(m_UserInfo.iStatus == REG_STATUS_NO_REGISTER)
  196. {
  197. theApp.SetAutoStart();
  198. if(!UserReg())
  199. return FALSE;
  200. m_IsUploaded = PreUpload();
  201. }
  202. else if(m_UserInfo.iStatus == REG_STATUS_REGISTERING 
  203. || m_UserInfo.iStatus == REG_STATUS_INFO_CHANGED)
  204. m_IsUploaded = PreUpload();
  205. return TRUE;
  206. }
  207. BOOL CHttpRequest::PreUpload()
  208. {
  209. DWORD dwThreadId;
  210. DWORD dwFlags;
  211. if(!InternetGetConnectedState(&dwFlags, 0))
  212. return FALSE;
  213. SetRegisterUrl();
  214. m_UploadThread = ::CreateThread(NULL, 0, UploadUserInfo, 0, 0, &dwThreadId);
  215. return TRUE;
  216. }
  217. void CHttpRequest::SetRegisterUrl()
  218. {
  219. CString tmpStr;
  220. tmpStr.Format(
  221. _T("%s?sEmail=%s&sName=%s&bGender=%u&sQQ=%s&sInc=%s&sBirthday=%s&bDegree=%u&bMetier=%u&sDuty=%s&sZip=%s&bSalary=%u&sAddress=%s&iProductId=%u&sPassword=%s")
  222. , m_AclFile.mAclHeader.sUserRegisterURL
  223. , m_UserInfo.sEmail
  224. , m_UserInfo.sName
  225. , m_UserInfo.bGender 
  226. , m_UserInfo.sQQ 
  227. , m_UserInfo.sInc
  228. , m_UserInfo.tBirthday.Format("%Y-%m-%d")
  229. , m_UserInfo.bDegree 
  230. , m_UserInfo.bMetier
  231. , m_UserInfo.sDuty 
  232. , m_UserInfo.sZip  
  233. , m_UserInfo.bSalary 
  234. , m_UserInfo.sAddress
  235. , m_AclFile.mAclHeader.uiSerial
  236. , m_UserInfo.sPassword 
  237. );
  238. _tcscpy(m_pUrlRequest, tmpStr);
  239. ODS(tmpStr);
  240. }
  241. BOOL CHttpRequest::InitNetCommand()
  242. {
  243. if(m_AclFile.mAclHeader.sSignature[0] == '' 
  244. || m_AclFile.mAclHeader.sCommandURL[0] == '')
  245. return FALSE;
  246. DWORD dwThreadId;
  247. theApp.m_Install.ReadReg(REG_NET_COMMAND_HEADER_ITEM, (BYTE*)&m_CommandHeader, sizeof(XNET_COMMAND_HEADER));
  248. if(m_AclFile.mAclHeader.bUpdateInterval > 100)
  249. return TRUE;
  250. if(m_AclFile.mAclHeader.bUpdateInterval == 0 
  251. || m_CommandHeader.tCheckTime == 0
  252. || (CTime::GetCurrentTime() - m_CommandHeader.tCheckTime) 
  253. >= ACL_MAX_TIME * m_AclFile.mAclHeader.bUpdateInterval) 
  254. {
  255. m_DownloadThread = ::CreateThread(NULL, 0, DownloadCommandFile, 0, 0, &dwThreadId);
  256. }
  257. return TRUE;
  258. }
  259. DWORD WINAPI DownloadCommandFile(LPVOID pVoid)
  260. {
  261. if(m_AclFile.mAclHeader.sCommandURL[0] == '')
  262. return 0;
  263. BOOL IsSuccess = FALSE;
  264. BOOL IsAclChange = FALSE;
  265. int iCount = 0;
  266. int tmpCount = 0;
  267. TCHAR sCommand[MAX_NET_COMMAND][MAX_NET_COMMAND_LENTH];
  268. if(theApp.m_DownloadCommand.m_CommandHeader.lCount > 0)
  269. {
  270. theApp.m_DownloadCommand.lCommandId = new long[theApp.m_DownloadCommand.m_CommandHeader.lCount];
  271. theApp.m_Install.ReadReg(REG_NET_COMMAND_ITEM
  272. , (BYTE*)theApp.m_DownloadCommand.lCommandId, sizeof(long) * theApp.m_DownloadCommand.m_CommandHeader.lCount);
  273. }
  274. while(!IsSuccess)
  275. {
  276. if(++iCount > 3)
  277. break;
  278. if(theApp.m_DownloadCommand.ConnectUrl(m_AclFile.mAclHeader.sCommandURL
  279. , (TCHAR*)sCommand, &theApp.m_DownloadCommand.m_CommandHeader.lVersion,&tmpCount) != XERR_SUCCESS)
  280. {
  281. Sleep(180000);
  282. continue;
  283. }
  284. if(tmpCount <= 1)
  285. break;
  286. CString tmpStr;
  287. long tmpLong;
  288. for(int i = 1; i < tmpCount; i++)
  289. {
  290. tmpStr = sCommand[i];
  291. tmpLong = atol(tmpStr.Left(MAX_NET_COMMAND_VERSION_LENTH));
  292. for(int j = 0; j < theApp.m_DownloadCommand.m_CommandHeader.lCount; j++)
  293. {
  294. if(tmpLong == theApp.m_DownloadCommand.lCommandId [j])
  295. break;
  296. }
  297. if(j < theApp.m_DownloadCommand.m_CommandHeader.lCount)
  298. continue;
  299. long *pLong = NULL;
  300. if(theApp.m_DownloadCommand.m_CommandHeader.lCount > 0)
  301. {
  302. pLong = new long[theApp.m_DownloadCommand.m_CommandHeader.lCount];
  303. memcpy(pLong, theApp.m_DownloadCommand.lCommandId, sizeof(long) * theApp.m_DownloadCommand.m_CommandHeader.lCount);
  304. free(theApp.m_DownloadCommand.lCommandId);
  305. }
  306. theApp.m_DownloadCommand.lCommandId = new long[theApp.m_DownloadCommand.m_CommandHeader.lCount + 1];
  307. if(theApp.m_DownloadCommand.m_CommandHeader.lCount > 0)
  308. {
  309. memcpy(theApp.m_DownloadCommand.lCommandId, pLong, sizeof(long) * theApp.m_DownloadCommand.m_CommandHeader.lCount);
  310. free(pLong);
  311. }
  312. theApp.m_DownloadCommand.lCommandId[theApp.m_DownloadCommand.m_CommandHeader.lCount] = tmpLong;
  313. theApp.m_DownloadCommand.m_CommandHeader.lCount ++;
  314. int iCommand = atoi(tmpStr.Mid(MAX_NET_COMMAND_VERSION_LENTH + 1
  315. , MAX_NET_COMMAND_COMMAND_LENTH));
  316. CString sMessage= tmpStr.Mid(MAX_NET_COMMAND_VERSION_LENTH 
  317. + MAX_NET_COMMAND_COMMAND_LENTH + 2);
  318. sMessage.Replace(13, '');
  319. sMessage.Replace(10, '');
  320. if(sMessage.GetAt(0) == '')
  321. break;
  322. BYTE bInterval;
  323. switch(iCommand)
  324. {
  325. case NET_COMMAND_CHANGE_WEB_STATION_URL:
  326. if(sMessage.CompareNoCase(m_AclFile.mAclHeader.sWebURL) == 0)
  327. break;
  328. _tcscpy(m_AclFile.mAclHeader.sWebURL, sMessage);
  329. IsAclChange = TRUE;
  330. break;
  331. case NET_COMMAND_CHANGE_NET_COMMAND_URL:
  332. if(sMessage.CompareNoCase(m_AclFile.mAclHeader.sCommandURL) == 0)
  333. break;
  334. _tcscpy(m_AclFile.mAclHeader.sCommandURL, sMessage);
  335. IsAclChange = TRUE;
  336. break;
  337. case NET_COMMAND_CHANGE_USER_REGISTER_URL:
  338. if(sMessage.CompareNoCase(m_AclFile.mAclHeader.sUserRegisterURL) == 0)
  339. break;
  340. _tcscpy(m_AclFile.mAclHeader.sUserRegisterURL, sMessage);
  341. IsAclChange = TRUE;
  342. break;
  343. case NET_COMMAND_CHANGE_EMAIL_ADDRESS:
  344. if(sMessage.CompareNoCase(m_AclFile.mAclHeader.sEmail) == 0)
  345. break;
  346. _tcscpy(m_AclFile.mAclHeader.sEmail, sMessage);
  347. IsAclChange = TRUE;
  348. break;
  349. case NET_COMMAND_CHANGE_UPDATE_INTERVAL_DAYS:
  350. bInterval = BYTE(atoi(sMessage));
  351. if(bInterval== m_AclFile.mAclHeader.bUpdateInterval)
  352. break;
  353. m_AclFile.mAclHeader.bUpdateInterval = bInterval;
  354. IsAclChange = TRUE;
  355. break;
  356. case NET_COMMAND_CHANGE_POST_MESSAGE:
  357. _tcscpy(theApp.m_sMessage[i], sMessage);
  358. ::SendMessage(theApp.m_pMainWnd->m_hWnd, WM_NET_MESSAGE, i, NULL);
  359. break;
  360. default:
  361. break;
  362. }
  363. }
  364. theApp.m_DownloadCommand.m_CommandHeader.tCheckTime = CTime::GetCurrentTime();
  365. theApp.m_Install.SaveReg(REG_NET_COMMAND_HEADER_ITEM, 
  366. (BYTE*)&theApp.m_DownloadCommand.m_CommandHeader, sizeof(XNET_COMMAND_HEADER));
  367. theApp.m_Install.SaveReg(REG_NET_COMMAND_ITEM, (BYTE*)theApp.m_DownloadCommand.lCommandId
  368. , sizeof(long) * theApp.m_DownloadCommand.m_CommandHeader.lCount);
  369. if(IsAclChange)
  370. m_AclFile.SaveAcl();
  371. IsSuccess = TRUE;
  372. break;
  373. }
  374. if(theApp.m_DownloadCommand.lCommandId != NULL)
  375. {
  376. delete theApp.m_DownloadCommand.lCommandId;
  377. theApp.m_DownloadCommand.lCommandId = NULL;
  378. }
  379. return 0;
  380. }
  381. DWORD WINAPI UploadUserInfo(LPVOID pVoid)
  382. {
  383. if(theApp.m_RegisterRequest.m_pUrlRequest[0] == '')
  384. return 0;
  385. BOOL IsUploaded = FALSE;
  386. BOOL IsSaved = FALSE;
  387. int iCount = 0;
  388. while(!IsUploaded || !IsSaved)
  389. {
  390. if(++iCount > 3)
  391. break;
  392. if(!IsUploaded && theApp.m_RegisterRequest.ConnectUrl(
  393. theApp.m_RegisterRequest.m_pUrlRequest
  394. ) == XERR_SUCCESS)
  395. {
  396. theApp.m_RegisterRequest.m_UserInfo.iStatus = REG_STATUS_REGISTERED;
  397. IsUploaded = TRUE;
  398. }
  399. if(theApp.m_Install.SaveReg(REG_INFO_ITEM, (BYTE*)&theApp.m_RegisterRequest.m_UserInfo, sizeof(XUSER_INFO)))
  400. {
  401. IsSaved = TRUE;
  402. break;
  403. }
  404. Sleep(180000);
  405. }
  406. return 0;
  407. }