UpdateDLLImplement.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:27k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  FileName    :   UpdateDLLImplement.cpp
  4. //  Version     :   1.0
  5. //  Creater     :   Cheng Bitao
  6. //  Date        :   2002-9-25 15:43:50
  7. //  Comment     :   
  8. //
  9. //////////////////////////////////////////////////////////////////////////////////////
  10. #include "Stdafx.h"
  11. #include "UpdateDll.h"
  12. #include "UpdateData.h"
  13. #include "UpdateExport.h"
  14. #include "Global.h"
  15. #include "ProxyUtility.h"
  16. #include "publicfun.h"
  17. #include "UserCheck.h"
  18. #include "Sourcedef.h"
  19. extern KUPDATE_DATA g_UpdateData;
  20. extern CProcessIndex g_ProcessIndex;
  21. static const char *g_pszCheckHostArray[]= {
  22.     "www.duba.net",
  23.     "gz3.duba.net",
  24. "gz.duba.net",
  25.     "sh.duba.net",
  26.     "bj.duba.net",
  27.     "gz2.duba.net",
  28. "gz4.duba.net"
  29. };
  30. static const int   g_nCheckPortArray[]  = {
  31.     defCHECK_SERVER_PORT,
  32.     defCHECK_SERVER_PORT,
  33.     defCHECK_SERVER_PORT,
  34.     defCHECK_SERVER_PORT,
  35.     defCHECK_SERVER_PORT,
  36. defCHECK_SERVER_PORT,
  37. defCHECK_SERVER_PORT
  38. };
  39. static const int g_nCheckServerCount = sizeof(g_pszCheckHostArray)/sizeof(const char *);
  40. int CUpdateDLLApp::Init(CONST KUPDATE_SETTING& UpdateSetting)
  41. {
  42. int nRetCode = 0;  
  43.     RECT rect = { 0, 0, 100, 20};
  44. WORD wVersionRequested = 0;
  45. WSADATA wsaData         = {0};    
  46.     
  47.     m_pfnCallBackProc = UpdateSetting.pfnCallBackProc;
  48.     if (m_pfnCallBackProc)
  49.     {
  50.         m_pfnCallBackProc(defUPDATE_STATUS_INITIALIZING, 0);
  51.     }
  52. nRetCode = InitPaths();
  53. if (!nRetCode)
  54. {
  55. m_nResultCode = defUPDATE_RESULT_INIT_FAILED;
  56. goto Exit0;
  57. }
  58.      // get sock version
  59.     wVersionRequested = MAKEWORD(2, 2);
  60.     nRetCode = WSAStartup(wVersionRequested, &wsaData);
  61.     if (0 == nRetCode)
  62.     {
  63.         m_nInitWSA = true;
  64.     }
  65.     else
  66.     {
  67.         m_nResultCode = defUPDATE_RESULT_LOAD_SOCKET_ERROR;
  68.         goto Exit0;
  69.     }
  70.     InitUpdateData(UpdateSetting.bLog);
  71.     g_UpdateData.nMainVersion = UpdateSetting.nVersion;
  72.     g_UpdateData.nMethod = UpdateSetting.nUpdateMode;
  73.     strcpy(g_UpdateData.szHostURL, UpdateSetting.szUpdateSite);
  74.     strcpy(g_UpdateData.szDefHostURL, UpdateSetting.szUpdateSite);
  75.     g_UpdateData.ulTryTimes = UpdateSetting.ulTryTimes;
  76.     g_UpdateData.bAutoTryNextHost = UpdateSetting.bAutoTryNextHost;
  77.     g_UpdateData.bUseFastestHost = UpdateSetting.bUseFastestHost;
  78.     g_UpdateData.bUseVerify = UpdateSetting.bUseVerify;
  79.     strcpy(g_UpdateData.szVerifyInfo, UpdateSetting.szVerifyInfo);
  80.     // Setting the proxy setting
  81.     g_UpdateData.ProxySetting.nProxyMethod  = UpdateSetting.ProxySetting.nProxyMethod;
  82.     g_UpdateData.ProxySetting.nHostPort     = UpdateSetting.ProxySetting.nHostPort;
  83.     strcpy(g_UpdateData.ProxySetting.szHostAddr, UpdateSetting.ProxySetting.szHostAddr);
  84.     strcpy(g_UpdateData.ProxySetting.szPassword, UpdateSetting.ProxySetting.szPassword);
  85.     strcpy(g_UpdateData.ProxySetting.szUserName, UpdateSetting.ProxySetting.szUserName);
  86.     // setting the download destination directory
  87.     strcpy(g_PathTable.szDownloadDestPath, UpdateSetting.szDownloadPath);        
  88.     strcpy(g_UpdateData.szLocalPath, UpdateSetting.szDownloadPath);
  89.     // INitialize the Update destionation directory
  90.     strcpy(g_PathTable.szUpdateDestPath, UpdateSetting.szUpdatePath);
  91. strcpy(g_UpdateData.szExecuteProgram, UpdateSetting.szMainExecute);
  92.         
  93.     CDownNotify::SetNotifyMessage(WM_DOWNNOTIFY_DEFAULT);
  94.     
  95.     m_hExitNotify = CreateEvent(NULL, TRUE, FALSE, NULL);
  96.     
  97.     nRetCode = m_wndMessage.Create(
  98.         ::AfxRegisterWndClass(
  99.             CS_DBLCLKS | CS_VREDRAW,
  100.             0,
  101.             (HBRUSH)::GetStockObject(BLACK_BRUSH)),
  102.         "KingSoft Update Notify Window",
  103.         WS_OVERLAPPEDWINDOW & ~WS_VISIBLE,
  104.         rect,
  105.         CWnd::GetDesktopWindow(),
  106.         NULL
  107.     );
  108.     if (!nRetCode) 
  109.         goto Exit0; 
  110.     m_wndMessage.ShowWindow(SW_HIDE);
  111.     m_wndMessage.UpdateWindow();
  112.     
  113.     m_nInitFlag = true;
  114.     m_nResultCode = defUPDATE_RESULT_INIT_SUCCESS;
  115. if (m_pfnCallBackProc)
  116.     {
  117.         m_pfnCallBackProc(defUPDATE_STATUS_INITIALIZING, 100);
  118.     }
  119.     
  120. Exit0:
  121. return m_nResultCode;
  122. }
  123. int CUpdateDLLApp::UnInit()
  124. {
  125.     if (m_wndMessage.GetSafeHwnd() != NULL)
  126.         DestroyWindow(m_wndMessage.GetSafeHwnd());
  127.     
  128.     CDownNotify::SetNotifyMessage(0);
  129.     
  130.     if (m_hExitNotify != NULL)
  131.     {
  132.         CloseHandle(m_hExitNotify);
  133.         m_hExitNotify = NULL;
  134.     }
  135. if (m_nInitWSA)
  136.     {
  137.         WSACleanup();
  138.         m_nInitWSA = false;
  139.     }
  140.     UnInitCheckThread();
  141. return true;
  142. }
  143. int CUpdateDLLApp::UserVerify()
  144. {
  145.    int nRetCode = false;
  146.     int i = 0;
  147.     if (!m_nInitFlag)
  148. return defUPDATE_RESULT_INIT_FAILED;
  149.     if (!g_UpdateData.bUseVerify)
  150. {
  151. m_nResultCode = defUPDATE_RESULT_USER_VERIFY_SUCCESS;
  152. goto Exit1;
  153. }
  154.     if (m_bCheckUserOK)
  155.     {
  156.         m_nResultCode = defUPDATE_RESULT_USER_VERIFY_SUCCESS;
  157.         goto Exit1;
  158.     } 
  159.     
  160.     /*for (i = 0; i < g_nCheckServerCount; i++)
  161.     {
  162.         nRetCode = m_CheckThread.AddCheckServer(
  163.             g_pszCheckHostArray[i],
  164.             g_nCheckPortArray[i]
  165.         );
  166.         ASSERT(nRetCode);
  167.     }*/
  168.     
  169.     nRetCode = m_CheckThread.SetCheckCallback((IKCheckCallback *)this, 0);
  170.     ASSERT(nRetCode);
  171.     m_DownloadFile.SetNotifyWnd(m_wndMessage, WM_DOWNNOTIFY_DEFAULT);
  172.     nRetCode = SetDownloadProxy(m_DownloadFile, g_UpdateData.szHostURL);
  173.     if (nRetCode)
  174.         m_nProcessStep = DOWNINDEX_STEPCHKSNHTTP;
  175.     else
  176.     {
  177.         m_nProcessStep = DOWNINDEX_STEPCHKSNUDP;
  178.     
  179.         nRetCode = InitCheckThread();
  180.         if (!nRetCode)
  181.         {
  182.             m_nResultCode = defUPDATE_RESULT_USER_VERIFY_FAILED;
  183.             goto Exit1;
  184.         }
  185.     } 
  186.     ProcessNextStep(m_nProcessStep);
  187. Exit1:
  188.     return m_nResultCode;
  189. }
  190. int CUpdateDLLApp::CheckNeedUpdate()
  191. {
  192. char szFileName[MAX_PATH] = {0};
  193.     
  194.     int nRetCode = 0;
  195.     ULONG ulResult = 0;
  196.     
  197.     MSG stMsg = { 0 };
  198.     HWND hWnd = m_wndMessage.m_hWnd;
  199.     
  200. if (!m_nInitFlag)
  201. return defUPDATE_RESULT_INIT_FAILED;
  202.     if (g_UpdateData.nMethod == defUPDATE_METHOD_LAN)
  203.     {
  204. m_strIndexTempFile = (CString)g_PathTable.szDownloadDestPath + defINDEX_FILE_NAME;
  205.         nRetCode = ::ProcessIndexFile(m_strIndexTempFile);
  206. if (!nRetCode)
  207. {
  208. m_nResultCode = defUPDATE_RESULT_PROCESS_INDEX_FAILED;
  209. goto Exit0;
  210. }
  211. if(nRetCode == defVersionNotenough)
  212. {
  213. m_nResultCode = defUPDATE_RESULT_VERSION_NOT_ENOUGH;
  214. goto Exit0;
  215. }
  216.         m_nResultCode = defUPDATE_RESULT_PROCESS_INDEX_SUCCESS;
  217.         
  218. if (g_ProcessIndex.IsNotUpdateItem())
  219. m_nResultCode = defUPDATE_RESULT_NOT_UPDATE_FILE;
  220.         
  221.         goto Exit0;
  222.     }
  223.     m_nResultCode = defUPDATE_RESULT_DOWNLOAD_INDEX_FAILED;
  224.     
  225. ResetEvent(m_hExitNotify);
  226. // Download Index.dat
  227.     m_DownloadFile.SetNotifyWnd(m_wndMessage, WM_DOWNNOTIFY_DEFAULT);
  228.     SetDownloadProxy(m_DownloadFile, g_UpdateData.szHostURL);
  229. nRetCode = ProcessNextStep(DOWNINDEX_STEPINDEX);
  230. if (!nRetCode)
  231.     {
  232.         m_nResultCode = defUPDATE_RESULT_DOWNLOAD_INDEX_FAILED;
  233.         goto Exit0;
  234.     }
  235.     
  236.     do
  237.     {
  238.         nRetCode = ::WaitForSingleObject(m_hExitNotify, 0);
  239.         if (WAIT_OBJECT_0 == nRetCode)
  240.             break;
  241.         
  242.         nRetCode = ::PeekMessage(&stMsg, NULL, 0, 0, PM_REMOVE);
  243.         if (0 == nRetCode)
  244.             continue;
  245.         
  246.         if (WM_QUIT == stMsg.message)
  247.             break;
  248.         
  249.         if (-1 == nRetCode)
  250.         {
  251.             // handle the error and possibly exit
  252.         }
  253.         else
  254.         {
  255.             ::TranslateMessage(&stMsg); 
  256.             ::DispatchMessage(&stMsg); 
  257.         }
  258.     } while (true);
  259.     
  260. Exit0:
  261. m_DownloadFile.StopDownload();
  262. return m_nResultCode;
  263. }
  264. int CUpdateDLLApp::Download()
  265. {
  266. int nRetCode = 0;
  267.     MSG stMsg = { 0 };
  268.     if (!m_nInitFlag)
  269. return defUPDATE_RESULT_INIT_FAILED;
  270.     if (g_UpdateData.nMethod == defUPDATE_METHOD_LAN)
  271.         m_nResultCode = defUPDATE_RESULT_DOWNLOAD_SUCCESS;
  272. KUPDATE_ITEM* pDownItem = g_ProcessIndex.m_pUpdateItemList;
  273. while (pDownItem)
  274. {
  275. if (pDownItem->DownloadStatus != enumDOWNLOADSTATUS_DOWNLOADED)
  276. break;
  277. pDownItem = pDownItem->pNext;
  278. }
  279. if (pDownItem == NULL)
  280. m_nResultCode = defUPDATE_RESULT_DOWNLOAD_SUCCESS;
  281. ResetEvent(m_hExitNotify);
  282.     m_DownloadFile.SetNotifyWnd(m_wndMessage.GetSafeHwnd(), WM_DOWNNOTIFY_DEFAULT);
  283.     m_DownloadFile.SetSavePath((CString)g_PathTable.szDownloadDestPath);
  284.     SetDownloadProxy(m_DownloadFile, g_UpdateData.szHostURL);
  285.     m_nCurEnableResume = g_UpdateData.bAutoResume;
  286.     nRetCode = DownNextItem(false);
  287.     KAV_PROCESS_ERROR(nRetCode);
  288.     
  289.     do
  290.     {
  291.         nRetCode = ::WaitForSingleObject(m_hExitNotify, 0);
  292.         if (WAIT_OBJECT_0 == nRetCode)
  293.             break;
  294.         
  295.         nRetCode = ::PeekMessage(&stMsg, NULL, 0, 0, PM_REMOVE);
  296.         if (0 == nRetCode)
  297.             continue;
  298.         
  299.         if (WM_QUIT == stMsg.message)
  300.             break;
  301.         
  302.         if (-1 == nRetCode)
  303.         {
  304.             // handle the error and possibly exit
  305.         }
  306.         else
  307.         {
  308.             ::TranslateMessage(&stMsg); 
  309.             ::DispatchMessage(&stMsg); 
  310.         }
  311.     } while (true);
  312.     
  313. Exit0:
  314. m_DownloadFile.StopDownload();
  315.     return m_nResultCode;
  316. }  
  317. int CUpdateDLLApp::CancelDownload()
  318. {
  319.     if (!m_nInitFlag)
  320. return 0;
  321.     if (g_UpdateData.nMethod == defUPDATE_METHOD_LAN)
  322. return 0;
  323. m_DownloadFile.StopDownload();
  324. SetEvent(m_hExitNotify);
  325.     return 0;
  326. }  
  327. int CUpdateDLLApp::Update()
  328. {
  329. int m_nResultCode = defUPDATE_RESULT_UPDATE_SUCCESS;
  330. int nRetCode = 0;
  331. CString sMsg;
  332.                                                      
  333. if (!m_nInitFlag)
  334. return defUPDATE_RESULT_INIT_FAILED;
  335.     
  336.     nRetCode = UpdateFiles();
  337.     if (!nRetCode)
  338.     {
  339. sMsg = defIDS_UPDATE_FINISH_FAILED;
  340. m_nResultCode = defUPDATE_RESULT_UPDATE_FAILED;
  341. g_UpdateData.SaveLog.WriteLogString(sMsg, true);
  342. return m_nResultCode;
  343. }
  344.     sMsg = defIDS_UPDATE_FINISH_SUCCESS;
  345.     g_UpdateData.SaveLog.WriteLogString(sMsg, true);
  346.     if (g_UpdateData.bUpdateFailed)
  347.     {
  348.         sMsg = defIDS_NOTIFY_REUPDATE;
  349.         g_UpdateData.SaveLog.WriteLogString(sMsg, true);
  350. m_nResultCode = defUPDATE_RESULT_UPDATE_FAILED;
  351.     }   
  352. else
  353. {
  354. if (g_UpdateData.bNeedRebootFalg)
  355. {
  356. sMsg = defIDS_NEED_REBOOT;
  357. g_UpdateData.SaveLog.WriteLogString(sMsg, true);
  358. m_nResultCode = defUPDATE_RESULT_UPDATE_SUCCESS_NEED_REBOOT;
  359. }
  360. else if (g_UpdateData.bNeedUpdateSelfFirst)
  361. m_nResultCode = defUPDATE_RESULT_UPDATESELF_SUCCESS;
  362. else
  363. m_nResultCode = defUPDATE_RESULT_UPDATE_SUCCESS;
  364. }
  365. return m_nResultCode;
  366. }
  367. ULONG CUpdateDLLApp::OnDownResult(ULONG ulOverResult)
  368. {
  369.     ULONG ulResult = CDownNotify::OnDownResult(ulOverResult);
  370.     int nRetCode = false;   
  371. int nCurDownOK      = false;
  372. int nRedownCurrent  = false;
  373. CString sLog, sFormat;
  374.     if (DOWNINDEX_STEPCHKSNHTTP == m_nProcessStep)
  375.     {
  376.         ASSERT(!m_strCgiTempFile.IsEmpty());
  377.         
  378.         if (DOWN_RESULT_FAIL == ulOverResult)
  379.         {
  380.             ASSERT(!m_bCheckUserOK);
  381.             
  382.             //nRetCode = ProcessCheckFailed();
  383.             if (nRetCode)
  384.             {
  385.                 //nRetCode = ProcessNextStep(DOWNINDEX_STEPCHKSNHTTP);
  386.                 nRetCode = ProcessNextStep(DOWNINDEX_STEPCHKSNUDP);
  387.                 ASSERT(nRetCode);
  388.             }
  389.         }
  390.         goto Exit1;
  391.     }                 
  392.     if (DOWNINDEX_STEPINDEX == m_nProcessStep)
  393.     {
  394. if (DOWN_RESULT_SUCCESS == ulOverResult)
  395. {
  396. m_nResultCode = defUPDATE_RESULT_DOWNLOAD_INDEX_SUCCESS;
  397. nRetCode = ProcessNextStep(DOWNINDEX_STEPOVER);
  398. if(nRetCode == defVersionNotenough) {
  399. m_nResultCode = nRetCode;
  400. }
  401. PostQuitMessage(0);
  402. SetEvent(m_hExitNotify);
  403. goto Exit1;
  404. }
  405. else
  406. {
  407. m_nResultCode = defUPDATE_RESULT_DOWNLOAD_INDEX_FAILED;
  408.             if (!g_UpdateData.bAutoTryNextHost)
  409.             {
  410. PostQuitMessage(0);
  411. SetEvent(m_hExitNotify);
  412. goto Exit1;
  413. }
  414. // here to get Next host to download index
  415. //g_UpdateData.szHostURL
  416. SetDownloadProxy(m_DownloadFile, g_UpdateData.szHostURL);
  417. nRetCode = ProcessNextStep(DOWNINDEX_STEPINDEX);
  418. }
  419. }
  420. else
  421. {
  422. ASSERT(m_pCurDownItem != NULL);
  423.     
  424. m_nCurEnableResume = g_UpdateData.bAutoResume;
  425.     
  426. switch (ulOverResult)
  427. {
  428. case DOWN_RESULT_SUCCESS:
  429. case DOWN_RESULT_SAMEAS:
  430. m_pCurDownItem->DownloadStatus = enumDOWNLOADSTATUS_DOWNLOADED;
  431.         
  432. // Check file CRC
  433. nCurDownOK = CheckFileCRC(atoi(m_pCurDownItem->szCRC), m_pCurDownItem->szDownloadTmpFileName);
  434. if (!nCurDownOK)
  435. {
  436. if (!g_UpdateData.bAutoTryNextHost) //if (!ExistsOtherHost())
  437. {
  438. m_nResultCode = defUPDATE_RESULT_DOWNLOAD_FAILED;
  439. m_pCurDownItem->DownloadStatus = enumDOWNLOADSTATUS_ERROR;                
  440. sFormat = defIDS_DOWNLOAD_FILE_FAILED;
  441. sLog.Format(sFormat, m_pCurDownItem->szFileName, m_pCurDownItem->szDownloadTmpFileName);
  442. g_UpdateData.SaveLog.WriteLogString(sLog, true);
  443. if (!g_UpdateData.bDownloadFailed)
  444. g_UpdateData.bDownloadFailed = m_pCurDownItem->bNeedDownload;
  445. }
  446. else
  447. {
  448. //do not skip download this update file
  449. nRedownCurrent = true;
  450. m_pCurDownItem->DownloadStatus = enumDOWNLOADSTATUS_QUEUE;
  451. m_nCurEnableResume = false;
  452. }
  453. }
  454. else
  455. {
  456.                 m_nResultCode = defUPDATE_RESULT_DOWNLOAD_SUCCESS;
  457. sFormat = defIDS_DOWNLOAD_FILE_SUCCESSFUL;
  458. sLog.Format(sFormat, m_pCurDownItem->szFileName, m_pCurDownItem->szDownloadTmpFileName);
  459. g_UpdateData.SaveLog.WriteLogString(sLog, true);
  460. }
  461. break;
  462.         
  463. case DOWN_RESULT_FAIL:
  464. if (m_pCurDownItem->nDownTryTimes < (int)g_UpdateData.ulTryTimes)
  465. {
  466. nRedownCurrent = true;
  467. }
  468. if (!g_UpdateData.bAutoTryNextHost) //if (!ExistsOtherHost())
  469. {
  470. m_nResultCode = defUPDATE_RESULT_DOWNLOAD_FAILED;
  471. m_pCurDownItem->DownloadStatus = enumDOWNLOADSTATUS_ERROR;
  472. sFormat = defIDS_DOWNLOAD_FILE_FAILED;
  473. sLog.Format(sFormat, m_pCurDownItem->szFileName, m_pCurDownItem->szDownloadTmpFileName);
  474. g_UpdateData.SaveLog.WriteLogString(sLog, true);
  475. if (!g_UpdateData.bDownloadFailed)
  476. g_UpdateData.bDownloadFailed = m_pCurDownItem->bNeedDownload;
  477. }
  478. else
  479. {
  480. //do not skip download this update file
  481. nRedownCurrent = true;
  482. m_pCurDownItem->nDownTryTimes = 0;
  483. m_pCurDownItem->DownloadStatus = enumDOWNLOADSTATUS_QUEUE;
  484. }
  485. break;
  486.         
  487. default:
  488. ASSERT(FALSE);
  489. break;
  490. }
  491.     
  492. nRetCode = DownNextItem(nRedownCurrent);
  493. if (!nRetCode)
  494. {
  495. if (nRedownCurrent)
  496. ASSERT(FALSE);
  497. else
  498.             {                   
  499.                 PostQuitMessage(0);
  500. SetEvent(m_hExitNotify);
  501.                 goto Exit1;
  502.             }
  503.         }
  504.         if (m_nResultCode == defUPDATE_RESULT_CANCEL)
  505.         {
  506.         PostQuitMessage(0);
  507. SetEvent(m_hExitNotify);
  508. goto Exit1;
  509.         }
  510. }
  511.         
  512. Exit1:
  513.     return ulResult;
  514. }
  515. int CUpdateDLLApp::ProcessNextStep(int nDownStep)
  516. {
  517.     int nResult = false;
  518.     int nRetCode = false;
  519.     CString sMsg;
  520.     CString sTitle;
  521.     MSG stMsg = { 0 };
  522.     HANDLE Handle = NULL;
  523.     
  524.     CString strDownUrl;
  525.     
  526.     switch (nDownStep)
  527.     {
  528.     case DOWNINDEX_STEPCHKSNUDP:
  529.         m_strIndexTempFile.Empty();
  530.         
  531.         nRetCode = m_CheckThread.IsThreadOK();
  532.         if (nRetCode)
  533.         {
  534.             nRetCode = m_CheckThread.StopThread();
  535.             ASSERT(nRetCode);
  536.         }
  537.         nResult = m_CheckThread.StartThread();
  538.         
  539.         Handle = m_CheckThread.GetSafeHandle();
  540.         nRetCode = ::WaitForMultipleObjects(
  541.             1,
  542.             &Handle,
  543.             true,
  544.             INFINITE
  545.         );
  546.         if (WAIT_OBJECT_0 == nRetCode)
  547.             UnInitCheckThread();
  548.         break;
  549.         
  550.     case DOWNINDEX_STEPCHKSNHTTP:
  551.         m_strIndexTempFile.Empty();
  552.         
  553.         strDownUrl = defKAV_CHKSN_CGI_REQUEST;
  554.         strDownUrl += g_UpdateData.szVerifyInfo;
  555.         m_strCgiTempFile = g_PathTable.szTempPath;
  556.         m_strCgiTempFile += defKAV_CHKSN_CGI_TEMPFILE;
  557.         
  558.         m_DownloadFile.SetTimeout(10000, 24000, 24000);
  559.         nResult = m_DownloadFile.StartDownload(strDownUrl, false, m_strCgiTempFile);
  560.         
  561.         do
  562.         {
  563.             nRetCode = ::MsgWaitForMultipleObjects(
  564.                 1,
  565.                 &m_hExitNotify,
  566.                 false,
  567.                 INFINITE,
  568.                 QS_ALLINPUT
  569.             );
  570.             if (WAIT_OBJECT_0 == nRetCode)
  571.                 break;
  572.         
  573.             ASSERT((WAIT_OBJECT_0 + 1) == nRetCode);
  574.         
  575.             nRetCode = ::PeekMessage(&stMsg, NULL, 0, 0, PM_REMOVE);
  576.             if (0 == nRetCode)
  577.                 continue;
  578.         
  579.             if (WM_QUIT == stMsg.message)
  580.                 break;
  581.         
  582.             if (-1 == nRetCode)
  583.             {
  584.                 // handle the error and possibly exit
  585.             }
  586.             else
  587.             {
  588.                 ::TranslateMessage(&stMsg); 
  589.                 ::DispatchMessage(&stMsg); 
  590.             }
  591.         } while (true);      
  592.         break;
  593.     case DOWNINDEX_STEPINDEX:
  594.         strDownUrl = g_UpdateData.szHostURL;
  595.         strDownUrl += defINDEX_FILE_NAME;
  596.         
  597.         MkDirEx(g_PathTable.szDownloadDestPath);
  598.         m_strIndexTempFile = (CString)g_PathTable.szDownloadDestPath + defINDEX_FILE_NAME;
  599.         
  600.         m_DownloadFile.SetTimeout(10000, 24000, 24000);
  601.         nResult = m_DownloadFile.StartDownload(strDownUrl, false, m_strIndexTempFile);
  602.         break;
  603.         
  604.     case DOWNINDEX_STEPOVER:
  605.         if (m_pfnCallBackProc)
  606.         {
  607.             if (m_pfnCallBackProc(defUPDATE_STATUS_PROCESSING_INDEX, 0))
  608.             {
  609.                 m_nResultCode = defUPDATE_RESULT_CANCEL;
  610.         goto Exit0;
  611.             }
  612.         }
  613.         nRetCode = ::ProcessIndexFile(m_strIndexTempFile);
  614. if (!nRetCode)
  615. {
  616. m_nResultCode = defUPDATE_RESULT_PROCESS_INDEX_FAILED;
  617. goto Exit0;
  618. }
  619. if(nRetCode == defVersionNotenough) {
  620. // m_CheckThread.StopThread();
  621. return defVersionNotenough;
  622. }
  623. m_nResultCode = defUPDATE_RESULT_PROCESS_INDEX_SUCCESS;
  624. if (g_ProcessIndex.IsNotUpdateItem())
  625. m_nResultCode = defUPDATE_RESULT_NOT_UPDATE_FILE;
  626.         
  627.         break;
  628.         
  629.     default:
  630.         ASSERT(FALSE);
  631.         goto Exit0;
  632.     }
  633.     
  634.     m_nProcessStep = nDownStep;
  635.     nResult = true;
  636. Exit0:
  637.     return nResult;
  638. }
  639. int CUpdateDLLApp::DownNextItem(int nRedownCurrent /*=false*/)
  640. {
  641.     int nResult = false;
  642.     int nRetCode = false;
  643.     
  644.     if (nRedownCurrent)
  645.     {
  646.         if (NULL == m_pCurDownItem)
  647.         {
  648.             ASSERT(FALSE);
  649.             goto Exit0;
  650.         }
  651.         
  652.         ASSERT(m_pCurDownItem->DownloadStatus != enumDOWNLOADSTATUS_DOWNLOADED);
  653.     }
  654.     else
  655.     {
  656.         if (m_pCurDownItem != NULL)  
  657.             m_pCurDownItem = m_pCurDownItem->pNext;
  658.         
  659.         if (NULL == m_pCurDownItem)
  660.             m_pCurDownItem = g_ProcessIndex.m_pUpdateItemList;
  661.     }
  662.     
  663.     while (m_pCurDownItem != NULL)
  664.     {
  665.         switch (m_pCurDownItem->DownloadStatus)
  666.         {
  667.         case enumDOWNLOADSTATUS_ERROR:
  668.         case enumDOWNLOADSTATUS_DOWNLOADED:
  669.             if (!nRedownCurrent)
  670.             {
  671.                 m_pCurDownItem = m_pCurDownItem->pNext;
  672.                 continue;
  673.             }
  674.             break;
  675.             
  676.         case enumDOWNLOADSTATUS_QUEUE:
  677.             m_pCurDownItem->nDownTryTimes = 0;
  678.             break;
  679.             
  680.         default:
  681.             break;
  682.         }
  683.         
  684.         m_pCurDownItem->nDownTryTimes++;
  685.         break;
  686.     }
  687.     
  688.     if (m_pCurDownItem != NULL)
  689.     {
  690.         CString strDownUrlPath;
  691.         
  692.         strDownUrlPath = g_UpdateData.szHostURL;
  693.         strDownUrlPath += m_pCurDownItem->szRemotePath;
  694.         strDownUrlPath += m_pCurDownItem->szFileName;
  695.        
  696.         m_pCurDownItem->DownloadStatus = enumDOWNLOADSTATUS_DOWNLOADING;
  697. if (m_pfnCallBackProc)
  698. {
  699. KUPDATE_ITEM * pItem = g_ProcessIndex.m_pUpdateItemList;
  700. int nCount = 1;
  701. int nIndex = 1;
  702. while (pItem)
  703. {
  704. nCount++;
  705. if (m_pCurDownItem == pItem)
  706. {
  707. nIndex = nCount;
  708. }
  709. pItem = pItem->pNext;
  710. }
  711. if (m_pfnCallBackProc(defUPDATE_STATUS_DOWNLOADING, nIndex / nCount * 100))
  712. {
  713. m_nResultCode = defUPDATE_RESULT_CANCEL;
  714. goto Exit0;
  715. }
  716. }
  717.         
  718.         nRetCode = m_DownloadFile.StartDownload(
  719.             strDownUrlPath,
  720.             m_nCurEnableResume,
  721.             m_pCurDownItem->szDownloadTmpFileName
  722.         );
  723.         ASSERT(nRetCode);
  724.         
  725.         nResult = true;
  726.     }
  727.     
  728. Exit0:
  729.     return nResult;
  730. }
  731. int CUpdateDLLApp::GetCheckInfo(
  732.     ULONG   ulContextWith,
  733.     int     *pnSendSize,
  734.     unsigned char **ppbySendInfo
  735. )
  736. {
  737.     int nResult = false;
  738.     
  739.     ASSERT_POINTER(pnSendSize, int);
  740.     ASSERT_POINTER(ppbySendInfo, LPVOID);
  741.     
  742.     if (
  743.         (NULL == pnSendSize) || 
  744.         (NULL == ppbySendInfo)
  745.     )
  746.         goto Exit0;
  747.     
  748.     GetUserInfo(m_KavUserInfo, TRUE);
  749.     
  750.     *pnSendSize = sizeof(m_KavUserInfo);
  751.     *ppbySendInfo = (unsigned char *)&m_KavUserInfo;
  752.     
  753.     nResult = true;
  754.     
  755. Exit0:
  756.     return nResult;
  757. }
  758. int CUpdateDLLApp::CheckRecvInfo(
  759.     ULONG   ulContextWith,
  760.     int     nRecvSize,
  761.     unsigned char  *pbyRecvInfo
  762. )
  763. {
  764.     //int nResult = -1;
  765. int nResult = defConnectServerFailed - 1;
  766.     int nRetCode = 0;
  767.     SERVER_INFO *pServerInfo = NULL;
  768.     
  769.     if (nRecvSize < sizeof(SERVER_INFO))
  770.         goto Exit0;
  771.     
  772.     pServerInfo = (SERVER_INFO *)pbyRecvInfo;
  773.     
  774.     nRetCode = strncmp(
  775.         pServerInfo->szFlag,
  776.         defCHECK_CURRENT_SERVERFLAG,
  777.         sizeof(pServerInfo->szFlag)
  778.     );
  779.     if (nRetCode != 0)
  780.         goto Exit0;
  781.     
  782.     nResult = pServerInfo->nNumber;
  783.     
  784. Exit0:
  785.     return nResult;
  786. }
  787. void CUpdateDLLApp::CheckResult(
  788.     ULONG   ulContextWith,
  789.     int     nSvrResult
  790. )
  791. {
  792.     int nRetCode = false;
  793.     CString sMsg;
  794.     
  795.     if (m_nProcessStep != DOWNINDEX_STEPCHKSNUDP)
  796.     {
  797.         sMsg = defIDS_HTTP_CHECK_FAILED;
  798.         g_UpdateData.SaveLog.WriteLogString(sMsg, true);
  799.         ASSERT(false);
  800.         return;
  801.     }
  802.     
  803.     if (nSvrResult < defInhibitiveSerialNumber)
  804.     {
  805.         sMsg = defIDS_USE_HTTP_CHECK;
  806.         g_UpdateData.SaveLog.WriteLogString(sMsg, true);
  807.         
  808.         nRetCode = ProcessNextStep(DOWNINDEX_STEPCHKSNHTTP);
  809.         ASSERT(nRetCode);
  810.     }
  811.     else
  812.     {   
  813.         ProcessUserCheck(nSvrResult);
  814.     }
  815. }
  816. int CUpdateDLLApp::InitCheckThread()
  817. {
  818.     int nResult = false;
  819.     int nRetCode = false;
  820.     
  821.     if (m_nInitCheckThread)
  822.         goto Exit1;
  823.     
  824.     nRetCode = m_CheckThread.Create();
  825.     if (!nRetCode)
  826.     {
  827.         ASSERT(FALSE);
  828.         goto Exit0;
  829.     }
  830.     
  831. Exit1:
  832.     m_nInitCheckThread = true;
  833.     nResult = true;
  834.     
  835. Exit0:
  836.     return nResult;
  837. }
  838. int CUpdateDLLApp::UnInitCheckThread()
  839. {
  840.     int nResult = false;
  841.     int nRetCode = false;
  842.     
  843.     if (!m_nInitCheckThread)
  844.         goto Exit1;
  845.     
  846.     nRetCode = m_CheckThread.IsThreadOK();
  847.     if (nRetCode)
  848.     {
  849.         nRetCode = m_CheckThread.StopThread();
  850.         ASSERT(nRetCode);
  851.     }
  852.     
  853.     m_CheckThread.Destroy();
  854.     
  855. Exit1:
  856.     m_nInitCheckThread = false;
  857.     nResult = true;
  858.     
  859. //Exit0:
  860.     return nResult;
  861. }
  862. ULONG CUpdateDLLApp::OnStatusFileDowned(PDOWNLOADSTATUS pDownStatus)
  863. {
  864.     ULONG ulResult = 0;
  865.     
  866.     if (DOWNINDEX_STEPCHKSNHTTP == m_nProcessStep)
  867.     {
  868.         if (pDownStatus->dwFileDownloadedSize >= 20)
  869.         {
  870.             m_DownloadFile.StopDownload();
  871.             
  872.             int nRetCode = false;
  873.     
  874.             CFile file;
  875.             int nCheckOK = false;
  876.             HANDLE hCheckFile = INVALID_HANDLE_VALUE;
  877.     
  878.             char szCheckResult[256] = { 0 };
  879.     
  880.             nRetCode = m_strCgiTempFile.IsEmpty();
  881.             if (nRetCode)
  882.             {
  883.                 ASSERT(false);
  884.                 goto Exit0;
  885.             }
  886.     
  887.             TRY
  888.             {
  889.                 // Open the cgi url download temp file
  890.                 nRetCode = file.Open(m_strCgiTempFile + ".tmp", CFile::modeRead | CFile::shareDenyNone);
  891.                 if (!nRetCode)
  892.                 {
  893.                     nRetCode = file.Open(m_strCgiTempFile, CFile::modeRead | CFile::shareDenyNone);
  894.                     if (!nRetCode)
  895.                     {
  896.                         ASSERT(false);
  897.                         goto Exit0;
  898.                     }
  899.                 }
  900.         
  901.                 nRetCode = file.Read(szCheckResult, sizeof(szCheckResult) - 2);
  902.                 if (nRetCode <= 4)
  903.                 {
  904.                     ASSERT(false);
  905.                     goto Exit0;
  906.                 }
  907.             }
  908.             CATCH_ALL(pException)
  909.             {
  910.                 pException->Delete();
  911.                 goto Exit0;
  912.             }
  913.             END_CATCH_ALL;
  914.     
  915.             file.Close();
  916.     
  917.             nRetCode = (0 == ::strncmp(szCheckResult, "+OK", 3));
  918.     
  919.             ulResult = ProcessUserCheck(nRetCode);
  920.             PostQuitMessage(0);
  921.         }        
  922.     }
  923. else if (DOWNINDEX_STEPOVER == m_nProcessStep)
  924. {
  925. if (m_pfnCallBackProc && pDownStatus)
  926. {
  927. DOWNLOADFILESTATUS info;
  928. strncpy(info.strFileName, pDownStatus->strFileName, MAX_PATH);
  929. info.dwFileSize = pDownStatus->dwFileSize;
  930. info.dwFileDownloadedSize = pDownStatus->dwFileDownloadedSize;
  931. m_pfnCallBackProc(defUPDATE_STATUS_DOWNLOADING_FILE, (long)&info);
  932. }
  933. }
  934. Exit0:        
  935.     return ulResult;
  936. }           
  937. int CUpdateDLLApp::ProcessUserCheck(int nCheckOK)
  938. {
  939.     int nResult = false;
  940. int nRetCode = 0;
  941.     CString sLog;
  942. //int nMsgID = 0;
  943.     
  944.     if (nCheckOK >=0)
  945.         m_bCheckUserOK = true;
  946.     else 
  947.         m_bCheckUserOK = false;
  948.     
  949.     if (nCheckOK >=0)
  950.     {
  951.         if (m_nProcessStep == DOWNINDEX_STEPCHKSNUDP)
  952.         {
  953.             sLog = defIDS_UDP_CHECK_SUCCESSFUL;
  954.             g_UpdateData.SaveLog.WriteLogString(sLog, true);
  955.         }
  956.         else if (m_nProcessStep == DOWNINDEX_STEPCHKSNHTTP)
  957.         {
  958.             sLog = defIDS_HTTP_CHECK_SUCCESSFUL;
  959.             g_UpdateData.SaveLog.WriteLogString(sLog, true);
  960.         }
  961.         m_nResultCode = defUPDATE_RESULT_USER_VERIFY_SUCCESS;
  962.         nResult = true;
  963.     }
  964.     else
  965.     {
  966. switch (nCheckOK)
  967. {
  968. case defInvalidSerialNumber:
  969. sLog = defIDS_INVALID_USERCHECK;
  970.             m_nResultCode = defUPDATE_RESULT_INVALIDSN;
  971. break;
  972. case defPiraticSerialNumber:
  973.             sLog = defIDS_PIRATIC_SERIAL_NUMBER;
  974.             m_nResultCode = defUPDATE_RESULT_PIRATICSN;
  975.             break;
  976. case defInhibitiveSerialNumber:
  977.      sLog = defIDS_INHIBITIVE_SERIAL_NUMBER;
  978.             m_nResultCode = defUPDATE_RESULT_INHIBITIVESN;
  979. break;
  980. case defConnectServerFailed:
  981. sLog = defIDS_CONNECT_SERVER_FAILED;
  982.             m_nResultCode = defUPDATE_RESULT_CONNECT_SERVER_FAILED;
  983. break;
  984. default:
  985. sLog = defIDS_CHECK_SERIAL_NUMBER_ERROR;
  986.             m_nResultCode = defUPDATE_RESULT_ERRORSN;
  987. }
  988. g_UpdateData.SaveLog.WriteLogString(sLog, true);  
  989.     }
  990.     
  991.     return nResult;
  992. }