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

模拟服务器

开发平台:

C/C++

  1. ////////////////////////////////////////////////////////////////////////////////
  2. //  
  3. //  FileName    :   DownloadFile.cpp
  4. //  Version     :   1.0
  5. //  Creater     :   Linsuyi
  6. //  Date        :   2002-01-31  21:52:16
  7. //  Comment     :   CDownloadFile class source file
  8. //  
  9. ////////////////////////////////////////////////////////////////////////////////
  10. #include "Stdafx.h"
  11. #include "DownloadFile.h"
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CDownloadFile::CDownloadFile()
  16. {
  17.     m_nForceDown = false;
  18.     
  19.     m_hNotifyWnd = NULL;
  20.     m_ulNotifyMsg = 0;
  21.     
  22.     m_ulNotifyCode = -1;
  23.     m_nDownProtocol = DOWN_PROTOCOL_NONE;
  24. m_hstartdown = NULL;
  25. m_hdowning = ::CreateEvent(NULL, TRUE, FALSE, NULL);
  26. }
  27. CDownloadFile::~CDownloadFile()
  28. {
  29. ::CloseHandle(m_hdowning);
  30. m_hdowning = NULL;
  31. ASSERT(m_hstartdown == NULL);
  32. }
  33. int GetUrlProtocolType(LPCTSTR lpszUrlPath)
  34. {
  35.     int nResult = DOWN_PROTOCOL_NONE;
  36.     
  37.     int nRetCode = 0;
  38.     CString strUrlPath;
  39.     
  40.     strUrlPath = lpszUrlPath;
  41.     strUrlPath.MakeLower();
  42.     
  43.     strUrlPath.TrimLeft();
  44.     nRetCode = strUrlPath.Find("http://");
  45.     if (0 == nRetCode)
  46.     {
  47.         nResult = DOWN_PROTOCOL_HTTP;
  48.         goto Exit1;
  49.     }
  50.     
  51.     nRetCode = strUrlPath.Find("ftp://");
  52.     if (0 == nRetCode)
  53.     {
  54.         nResult = DOWN_PROTOCOL_FTP;
  55.         goto Exit1;
  56.     }
  57.     
  58.     nRetCode = strUrlPath.Find("file://");
  59.     if (0 == nRetCode)
  60.     {
  61.         nResult = DOWN_PROTOCOL_FILE;
  62.         goto Exit1;
  63.     }
  64.     
  65. Exit1:
  66.     return nResult;
  67. }
  68. int CDownloadFile::SetSavePath(LPCTSTR lpszSavePath)
  69. {
  70.     int nResult = false;
  71.     
  72.     m_strSaveDirPath.Empty();
  73.     
  74.     if (lpszSavePath != NULL)
  75.     {
  76.         m_strSaveDirPath = lpszSavePath;
  77.     }
  78.     nResult = true;
  79.     
  80.     return nResult;
  81. }
  82. void CDownloadFile::SetTimeout(
  83.     ULONG ulSendTimeout,
  84.     ULONG ulRecvTimeout,
  85.     ULONG ulConnTimeout
  86. )
  87. {
  88.     m_FtpDownload.SetTimeout(ulSendTimeout, ulRecvTimeout, ulConnTimeout);
  89.     m_HttpDownload.SetTimeout(ulSendTimeout, ulRecvTimeout, ulConnTimeout);
  90. }
  91. void CDownloadFile::SetProxy(
  92.     int nProxyMode,
  93.     LPCTSTR lpszProxyHost,
  94.     int nProxyPort,
  95.     LPCTSTR lpszProxyUserName,
  96.     LPCTSTR lpszProxyPassword
  97. )
  98. {
  99.     int nProtocolMode = PROXY_MODE_NONE;
  100.     
  101.     switch (nProxyMode)
  102.     {
  103.     case PROXY_MODE_SOCKS4:
  104.         nProtocolMode = FTP_PROXY_SOCKS4;
  105.         break;
  106.     case PROXY_MODE_SOCKS4A:
  107.         nProtocolMode = FTP_PROXY_SOCKS4A;
  108.         break;
  109.     case PROXY_MODE_SOCKS5:
  110.         nProtocolMode = FTP_PROXY_SOCKS5;
  111.         break;
  112.     case PROXY_MODE_USEIE:
  113.         nProtocolMode = FTP_PROXY_USEIE;
  114.         break;
  115.         
  116.     case PROXY_MODE_NONE:
  117.     default:
  118.         nProtocolMode = FTP_PROXY_NONE;
  119.         break;
  120.     }
  121.     m_FtpDownload.SetProxy(
  122.         lpszProxyHost,
  123.         nProxyPort,
  124.         (nProtocolMode != FTP_PROXY_NONE),
  125.         (lpszProxyUserName != NULL),
  126.         lpszProxyUserName,
  127.         lpszProxyPassword,
  128.         nProtocolMode
  129.     );
  130.     
  131.     switch (nProxyMode)
  132.     {
  133.     case PROXY_MODE_HTTPGET:
  134.         nProtocolMode = HTTP_PROXY_HTTPGET;
  135.         break;
  136.     case PROXY_MODE_HTTPCONNECT:
  137.         nProtocolMode = HTTP_PROXY_HTTPCONNECT;
  138.         break;
  139.     case PROXY_MODE_SOCKS4:
  140.         nProtocolMode = HTTP_PROXY_SOCKS4;
  141.         break;
  142.     case PROXY_MODE_SOCKS4A:
  143.         nProtocolMode = HTTP_PROXY_SOCKS4A;
  144.         break;
  145.     case PROXY_MODE_SOCKS5:
  146.         nProtocolMode = HTTP_PROXY_SOCKS5;
  147.         break;
  148.         
  149.     case PROXY_MODE_NONE:
  150.     default:
  151.         nProtocolMode = HTTP_PROXY_NONE;
  152.         break;
  153.     }
  154.     m_HttpDownload.SetProxy(
  155.         lpszProxyHost,
  156.         nProxyPort,
  157.         (nProtocolMode != HTTP_PROXY_NONE),
  158.         (lpszProxyUserName != NULL),
  159.         lpszProxyUserName,
  160.         lpszProxyPassword,
  161.         nProtocolMode
  162.     );
  163. }
  164. int CDownloadFile::StartDownload(LPCTSTR lpszUrlPath, BOOL bEnableResume/*= TRUE*/, LPCTSTR lpszSaveAs/*= NULL*/)
  165. {
  166. if (m_hdowning != NULL)
  167.     {
  168. while (WaitForSingleObject(m_hdowning, 0) == WAIT_OBJECT_0)
  169. Sleep(1);
  170. }
  171.     int nResult = false;
  172.     int nRetCode = false;
  173.     
  174.     m_nForceDown = (bEnableResume == FALSE);
  175.     
  176.     m_strDownUrlPath = lpszUrlPath;
  177.     if (lpszSaveAs != NULL)
  178.     {
  179.         m_strSaveFilePath = lpszSaveAs;
  180.     }
  181.     else
  182.     {
  183.         m_strSaveFilePath = m_strSaveDirPath;
  184.     }    
  185.     
  186.     m_nDownProtocol = GetUrlProtocolType(lpszUrlPath);
  187.     ASSERT(m_nDownProtocol != DOWN_PROTOCOL_NONE);
  188.     
  189. if (IsThreadOK())
  190. {
  191. nRetCode = true;
  192. }
  193. else
  194. {
  195. ASSERT(NULL == m_hstartdown);
  196.     
  197. m_hstartdown = ::CreateEvent(NULL, TRUE, FALSE, NULL);
  198. if (NULL == m_hstartdown)
  199. nRetCode = FALSE;
  200. else
  201. nRetCode = StartThread();
  202. }
  203.     if (!nRetCode)
  204.     {
  205.         ASSERT(false);
  206.         goto Exit0;
  207.     }
  208. SetEvent(m_hstartdown); //green
  209.  
  210.     nResult = true;
  211.     
  212. Exit0:
  213.     return nResult;
  214. }
  215. int CDownloadFile::StopDownload()
  216. {
  217. if (m_hstartdown && WaitForSingleObject(m_hstartdown, 0) == WAIT_OBJECT_0)
  218. {
  219. switch (m_nDownProtocol)
  220. {
  221. case DOWN_PROTOCOL_FTP:
  222. m_FtpDownload.StopDownload();
  223. break;
  224.         
  225. case DOWN_PROTOCOL_HTTP:
  226. m_HttpDownload.StopDownload();
  227. break;
  228.         
  229. default:
  230. ASSERT(false);
  231. }
  232. if (m_hdowning != NULL)
  233. {
  234. while (WaitForSingleObject(m_hdowning, 0) == WAIT_OBJECT_0)
  235. Sleep(1);
  236. }
  237. }
  238. if (m_hstartdown)
  239. CloseHandle(m_hstartdown);
  240. m_hstartdown = NULL;
  241.     int nResult = false;
  242.     
  243. StopThread();
  244.     
  245.     nResult = true;
  246.     
  247.     return nResult;
  248. }
  249. void CDownloadFile::SetNotifyWnd(HWND hNotifyWnd, ULONG ulNotifyMsg)
  250. {
  251.     m_hNotifyWnd = hNotifyWnd;
  252.     m_ulNotifyMsg = ulNotifyMsg;
  253.     
  254.     m_FtpDownload.SetNotifyWnd(m_hNotifyWnd, m_ulNotifyMsg);
  255.     m_HttpDownload.SetNotifyWnd(m_hNotifyWnd, m_ulNotifyMsg);
  256. }
  257. ULONG CDownloadFile::MainExecution()
  258. {
  259. while (1)
  260.     {
  261. if (WaitForSingleObject(m_hStop, 0) == WAIT_OBJECT_0)
  262. break;
  263. Sleep(1);
  264. if (m_hstartdown && WaitForSingleObject(m_hstartdown, 0) == WAIT_OBJECT_0) //开始down
  265. {
  266. ResetEvent(m_hstartdown); //red
  267. DownOneFile();
  268. }
  269.     }
  270. return 0;
  271. }
  272. BOOL CDownloadFile::DownOneFile()
  273. {
  274. SetEvent(m_hdowning);
  275.     BOOL nRetCode = FALSE;
  276. ULONG ulResult = -1;
  277.     m_ulNotifyCode = -1;
  278.     switch (m_nDownProtocol)
  279.     {
  280.     case DOWN_PROTOCOL_HTTP:
  281.         ulResult = (ULONG)m_HttpDownload.Download(
  282.             m_strDownUrlPath,
  283.             m_strSaveFilePath,
  284.             m_nForceDown
  285.         );
  286.         nRetCode = m_HttpDownload.IsUserStop();
  287.         if (!nRetCode)
  288.         {
  289.             m_ulNotifyCode = ulResult;
  290.         }
  291.         break;
  292.         
  293.     case DOWN_PROTOCOL_FTP:
  294.         ulResult = (ULONG)m_FtpDownload.Download(
  295.             m_strDownUrlPath,
  296.             m_strSaveFilePath,
  297.             m_nForceDown
  298.         );
  299.         nRetCode = m_FtpDownload.IsUserStop();
  300.         if (!nRetCode)
  301.         {
  302.             m_ulNotifyCode = ulResult;
  303.         }
  304.         break;
  305.         
  306.     default:
  307.         ASSERT(false);
  308.         break;
  309.     }
  310.     
  311. ResetEvent(m_hdowning);
  312.     if (m_ulNotifyCode != -1)
  313.     {
  314.         ::SendMessage(
  315.             m_hNotifyWnd,
  316.             m_ulNotifyMsg,
  317.             MSG_DOWNLOAD_RESULT,
  318.             m_ulNotifyCode
  319.         );
  320.     }
  321.     return nRetCode;
  322. }