DownloadPub.h
上传用户:oadesign
上传日期:2013-12-25
资源大小:265k
文件大小:6k
源码类别:

进程与线程

开发平台:

Visual C++

  1. // DownloadPub.h: interface for the CDownloadPub class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_DownloadPub_H__FF670BDB_1339_412D_AB6A_9B64FB29D2FE__INCLUDED_)
  5. #define AFX_DownloadPub_H__FF670BDB_1339_412D_AB6A_9B64FB29D2FE__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #include "SocketClient.h"
  10. #include <Afxmt.h>
  11. #include <afxtempl.h>
  12. //缺省的重试次数
  13. const UINT DEFAULT_RETRY_MAX = 10; 
  14. #define SLEEP_RETURN_Down(x)
  15. {
  16. if ( ::WaitForSingleObject ( m_hEvtEndModule, x ) == WAIT_OBJECT_0 )
  17. return DownloadEnd(FALSE);
  18. }
  19. enum
  20. {
  21. NOTIFY_TYPE_GOT_REMOTE_FILENAME, // 取得远程站点文件名, 当被下载的文件被重定向时才发送该通知,lpNotifyData 为 LPCTSTR 类型的文件名字符串指针
  22. NOTIFY_TYPE_GOT_REMOTE_FILESIZE, // 取得远程站点文件大小,lpNotifyData 为 int 类型的文件大小
  23. NOTIFY_TYPE_START_DOWNLOAD, // 开始下载,lpNotifyData 无用
  24. NOTIFY_TYPE_END_DOWNLOAD, // 结束下载,lpNotifyData 为 ENUM_DOWNLOAD_RESULT 类型的下载结果
  25. NOTIFY_TYPE_WILL_DOWNLOAD_SIZE, // 本次需要下载的大小,lpNotifyData 为 int 类型的需要下载的大小
  26. NOTIFY_TYPE_THREAD_DOWNLOADED_SIZE, // 某线程已下载的数据大小,lpNotifyData 为 int 类型的已下载的大小
  27. };
  28. typedef struct _DownloadNotifyPara
  29. {
  30. int nIndex;
  31. UINT nNotityType;
  32. LPVOID lpNotifyData;
  33. LPVOID pDownloadMTR;
  34. } t_DownloadNotifyPara;
  35. typedef CArray<t_DownloadNotifyPara,t_DownloadNotifyPara&> t_Ary_DownloadNotifyPara;
  36. // 消息通知回调函数
  37. typedef void (*FUNC_DownloadNotify) ( t_DownloadNotifyPara *pDownloadNotifyPara, WPARAM wParam );
  38. typedef void (*FUNC_SaveDownloadInfo) ( int nIndex, int nDownloadedSize, int nSimpleSaveSize, WPARAM wParam );
  39. // 缺省端口号
  40. #define DEFAULT_HTTP_PORT 80
  41. #define DEFAULT_HTTPS_PORT 443
  42. #define DEFAULT_FTP_PORT 21
  43. #define DEFAULT_SOCKS_PORT 6815
  44. #define RETRY_TIMES 999 // 重试多少次
  45. typedef enum _DownloadResult
  46. {
  47. ENUM_DOWNLOAD_RESULT_SUCCESS,
  48. ENUM_DOWNLOAD_RESULT_FAILED,
  49. ENUM_DOWNLOAD_RESULT_CANCEL,
  50. } ENUM_DOWNLOAD_RESULT;
  51. class CDownloadPub  
  52. {
  53. public:
  54. CString GetDownloadObjectFileName ( CString *pcsExtensionName=NULL );
  55. void Clear_Thread_Handle();
  56. void ResetVar();
  57. int GetUndownloadBytes ();
  58. BOOL ThreadProc_Download();
  59. BOOL SetSaveFileName ( LPCTSTR lpszSaveFileName );
  60. int Get_WillDownloadSize();
  61. void Set_WillDownloadSize ( int nWillDownloadSize );
  62. int Get_DownloadedSize();
  63. void Set_DownloadedSize ( int nDownloadedSize );
  64. int Get_TempSaveBytes();
  65. void Set_TempSaveBytes ( int nTempSaveBytes );
  66. int m_nIndex;
  67. CString GetRemoteFileName ();
  68. virtual BOOL GetRemoteSiteInfo();
  69. BOOL SetDownloadUrl ( LPCTSTR lpszDownloadUrl );
  70. virtual BOOL Connect ();
  71. CDownloadPub();
  72. virtual ~CDownloadPub();
  73. void SetAuthorization ( LPCTSTR lpszUsername, LPCTSTR lpszPassword );
  74. void SetReferer(LPCTSTR lpszReferer);
  75. void SetUserAgent(LPCTSTR lpszUserAgent);
  76. void Set_SaveDownloadInfo_Callback ( FUNC_SaveDownloadInfo Proc_SaveDownloadInfo, WPARAM wParam );
  77. virtual BOOL Download (
  78. int nWillDownloadStartPos,
  79. int nWillDownloadSize,
  80. int nDownloadedSize
  81. );
  82. BOOL Is_SupportResume () { return m_bSupportResume; }
  83. CString Get_ProtocolType () { return m_csProtocolType; }
  84. time_t Get_TimeLastModified() { return m_TimeLastModified.GetTime(); }
  85. int Get_FileTotalSize() { return m_nFileTotalSize; }
  86. CString Get_UserName () { return m_csUsername; }
  87. CString Get_GetPassword () { return m_csPassword; }
  88. CString Get_DownloadUrl () { return m_csDownloadUrl; }
  89. BOOL Is_DownloadSuccess() { return m_bDownloadSuccess; }
  90. HANDLE Get_Thread_Handle() { return m_hThread; }
  91. int Get_WillDownloadStartPos() { return m_nWillDownloadStartPos; }
  92. CString Get_ServerName() { return m_csServer; }
  93. void StopDownload ();
  94. LPVOID m_pDownloadMTR;
  95. protected:
  96. virtual BOOL DownloadOnce();
  97. CFile m_file;
  98. int SaveDataToFile ( char *data, int size );
  99. virtual BOOL RecvDataAndSaveToFile(CSocketClient &SocketClient,char *szTailData=NULL, int nTailSize=0);
  100. BOOL DownloadEnd ( BOOL bRes );
  101. // 模块结束事件
  102. HANDLE m_hEvtEndModule;
  103. // 连接服务器的 Socket
  104. CSocketClient m_SocketClient;
  105. // 待下载URL
  106. CString m_csDownloadUrl;
  107. CString m_csSaveFileName;
  108. // 保存下载信息的回调函数
  109. FUNC_SaveDownloadInfo m_Proc_SaveDownloadInfo;
  110. WPARAM m_wSaveDownloadInfo_Param;
  111. // 是否支持断点续传
  112. BOOL m_bSupportResume;
  113. HANDLE m_hThread;
  114. // 文件以及下载大小
  115. int m_nFileTotalSize; // 文件总的大小,-1表示未知文件大小
  116. int m_nWillDownloadStartPos; // 要下载文件的开始位置
  117. int m_nWillDownloadSize; // 本次需要下载的大小,-1表示不知道文件大小,所以下载到服务器关闭连接为止
  118. CCriticalSection m_CSFor_WillDownloadSize; // 访问 m_nWillDownloadSize 变量的互斥锁
  119. int m_nTempSaveBytes; // 存放在临时缓冲中的字节数
  120. CCriticalSection m_CSFor_TempSaveBytes; // 访问 m_nTempSaveBytes 变量的互斥锁
  121. int m_nDownloadedSize; // 已下载的字节数,指完全写到文件中的字节数,不包含临时缓冲里的数据
  122. CCriticalSection m_CSFor_DownloadedSize; // 访问 m_nDownloadedSize 变量的互斥锁
  123. // 文件日期(远程文件的信息)
  124. CTime m_TimeLastModified;
  125. // Referer
  126. CString m_csReferer;
  127. // UserAgent
  128. CString m_csUserAgent;
  129. // 是否进行验证 : Request-Header: Authorization
  130. CString m_csUsername;
  131. CString m_csPassword;
  132. // 下载过程中所用的变量
  133. CString m_csProtocolType; // 所使用的传输协议:http、ftp等
  134. CString m_csServer;
  135. CString m_csObject;
  136. CString m_csFileName;
  137. USHORT m_nPort;
  138. private:
  139. BOOL OpenFileForSave();
  140. BOOL m_bDownloadSuccess;
  141. };
  142. int Base64Encode(LPCTSTR lpszEncoding, CString &strEncoded);
  143. int Base64Decode(LPCTSTR lpszDecoding, CString &strDecoded);
  144. BOOL ParseURL(LPCTSTR lpszURL,CString& strServer,CString& strObject,USHORT& nPort, CString &csProtocolType);
  145. void Set_DownloadNotify_Callback ( FUNC_DownloadNotify Proc_DownloadNotify, WPARAM wParam );
  146. #endif // !defined(AFX_DownloadPub_H__FF670BDB_1339_412D_AB6A_9B64FB29D2FE__INCLUDED_)