RUDownloader.hpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. //
  2. // RUDownloader.hpp
  3. // red_utils
  4. //
  5. // Created by RedInfinity on 2023/12/6.
  6. //
  7. #ifndef RUDownloader_hpp
  8. #define RUDownloader_hpp
  9. ///C++标准库
  10. #include <string>
  11. #include <map>
  12. #include <chrono>
  13. ///第三方库
  14. #include "cocos2d.h"
  15. #include "network/CCDownloader.h"
  16. ///项目代码
  17. #include "RUDefine.h"
  18. NS_RU_BEGIN
  19. /**
  20. * 描述:Red下载器支持的最大下载线程数量
  21. */
  22. enum class kMaxDownloadCnt {
  23. ONE = 1,
  24. TWO = 2,
  25. THREE = 3,
  26. FOUR = 4,
  27. FIVE = 5,
  28. SIX = 6
  29. };
  30. /**
  31. * 描述:创建Red下载器的初始数据包
  32. */
  33. typedef struct _DownloaderCreateData {
  34. std::string id = ""; ///下载器id
  35. kMaxDownloadCnt maxDownloadCnt = kMaxDownloadCnt::SIX; ///默认使用最大数量(6个)
  36. } DownloaderCreateData;
  37. /**
  38. * 描述:下载请求数据
  39. */
  40. typedef struct _DownloadRequestData {
  41. std::string url = ""; ///下载的url地址
  42. std::string saveDir = ""; ///下载文件的保存路径
  43. bool verify = false; ///是否验证下载文件
  44. std::string md5 = ""; ///文件正确的md5值
  45. } DownloadRequestData;
  46. ///用于计算下载速度的时间戳
  47. typedef std::chrono::time_point<std::chrono::high_resolution_clock> DownloadTimeClock;
  48. /**
  49. * 描述:Red下载器委托,为外部根据下载数据自定义实现功能提供支持
  50. */
  51. class DownloaderDelegate {
  52. public:
  53. /**
  54. * 功能:指定url地址的文件下载成功
  55. * 参数 url:下载的url地址
  56. */
  57. virtual void onDownloadFileSuccess(const std::string& url) {};
  58. /**
  59. * 功能:指定url地址的文件下载失败
  60. * 参数 url:下载的url地址
  61. * 参数 log:下载失败的日志信息
  62. */
  63. virtual void onDownloadFileFail(const std::string& url, const std::string& log) {};
  64. /**
  65. * 功能:指定url地址的文件下载百分比
  66. * 参数 url:下载的url地址
  67. * 参数 percent:指定url地址的下载进度百分比(0~100),如果指定url地址还未开始下载则不会执行。
  68. */
  69. virtual void onDownloadFileProgress(const std::string& url, const int& percent) {};
  70. /**
  71. * 功能:Red下载器的下载百分比
  72. * 参数 percent: 下载器完成的百分比(0~100)
  73. */
  74. virtual void onDownloaderPercent(const int& percent) {};
  75. /**
  76. * 功能:Red下载器的下载进度
  77. * 参数 downloadedCnt:下载器完成下载的数量
  78. * 参数 totalDownloadCnt:下载器需要下载的总数量
  79. */
  80. virtual void onDownloaderProgress(const int& downloadedCnt, const int& totalDownloadCnt) {};
  81. /**
  82. * 功能:Red下载器的下载速度
  83. * 参数 downloadSpeed:下载速度(Bps)
  84. */
  85. virtual void onDownloaderSpeed(const double& downloadSpeed) {};
  86. protected:
  87. DownloaderDelegate() = default;
  88. virtual ~DownloaderDelegate() = default;
  89. };
  90. /**
  91. * 描述:Red下载器。对cocos2d的Downloader进一步封装。简化一些接口的实现
  92. */
  93. class Downloader final {
  94. public:
  95. /**
  96. * 功能:创建Red下载器
  97. * 参数 data:Red下载器创建的初始数据包
  98. * 参数 delegate:Red下载器委托,如果不需要则传空指针
  99. * 返回值:Red下载器对象
  100. */
  101. static Downloader* create(const DownloaderCreateData& data, DownloaderDelegate* delegate);
  102. /**
  103. * 功能:释放Red下载器
  104. */
  105. void release();
  106. /**
  107. * 功能:下载指定url地址的文件
  108. * 参数 url:下载的url地址
  109. * 参数 saveDir:下载文件的保存目录(文件夹)
  110. * 返回值:下载请求是否响应成功。
  111. */
  112. bool downloadFile(const std::string& url, const std::string& saveDir);
  113. /**
  114. * 功能:下载指定url地址的文件,并进行md5校验
  115. * 参数 url:下载的url地址
  116. * 参数 saveDir:下载文件的保存目录(文件夹)
  117. * 参数 md5:下载文件正确的md5值
  118. * 返回值:下载请求是否响应成功。
  119. */
  120. bool downloadFileAndVerifyMd5(const std::string& url, const std::string& saveDir, const std::string& md5);
  121. private:
  122. Downloader() = default;
  123. ~Downloader() = default;
  124. /**
  125. * 功能:初始化Red下载器
  126. * 参数 data:Red下载器创建的初始数据包
  127. * 参数 delegate:Red下载器委托,如果不需要则传空指针
  128. */
  129. void _init(const DownloaderCreateData& data, DownloaderDelegate* delegate);
  130. /**
  131. * 功能:创建内置的cocos2d下载器
  132. * 参数 maxDownloadCnt:最大下载线程数量
  133. */
  134. cocos2d::network::Downloader* _createInnerDownloader(const kMaxDownloadCnt& maxDownloadCnt);
  135. /**
  136. * 功能:初始化内置的cocos2d下载器
  137. */
  138. void _initInnerDownloader();
  139. /**
  140. * 功能:对url地址进行格式化编码,因为cocos2d的下载器对url地址有一定要求,如果不格式化会导致下载失败
  141. * 参数 url:原始url地址
  142. * 返回值:格式化编码后的url地址
  143. */
  144. std::string _encodeURL(const std::string& url);
  145. /**
  146. * 功能:获取格式化编码后url地址的原始url地址
  147. * 参数 url:格式化编码后url地址
  148. * 返回值:原始url地址
  149. */
  150. std::string _decodeURL(const std::string& url);
  151. /**
  152. * 功能:根据url地址获取文件名称
  153. * 参数 url:下载的url地址
  154. * 返回值:url地址下载的文件名称
  155. */
  156. std::string _getFileNameByUrl(const std::string& url);
  157. /**
  158. * 功能:添加下载请求
  159. * 参数 requestData:下载请求数据
  160. * 返回值:是否添加成功
  161. */
  162. bool _appendDownloadRequest(const DownloadRequestData& requestData);
  163. /**
  164. * 功能:移除下载请求
  165. * 参数 url:下载的url地址
  166. * 返回值:移除的下载请求数据
  167. */
  168. DownloadRequestData _removeDownloadRequest(const std::string& url);
  169. /**
  170. * 功能:增加下载器总共需要下载的数量
  171. */
  172. void _addTotalDownloadCnt();
  173. /**
  174. * 功能:增加下载器当前已经完成的下载数量
  175. */
  176. void _addDownloadedCnt();
  177. /**
  178. * 功能:获取下载器的下载百分比
  179. */
  180. float _getDownloadPercent();
  181. /**
  182. * 功能:验证下载文件的md5值是否正确
  183. * 参数 saveFilePath:下载文件的保存路径
  184. * 参数 md5:文件的正确md5值
  185. * 返回值:验证是否通过
  186. */
  187. bool _verifyFileMd5(const std::string& saveFilePath, const std::string& md5);
  188. /**
  189. * 功能:记录文件开始下载的时间戳
  190. * 参数 url:下载的url地址
  191. */
  192. void _recordDownloadStartTime(const std::string& url);
  193. /**
  194. * 功能:更新文件已经下载的字节大小
  195. * 参数 url:下载的url地址
  196. * 参数 downloadedByte:已经下载的字节大小
  197. */
  198. void _updateDownloadedByte(const std::string& url, const int64_t& downloadedByte);
  199. /**
  200. * 功能:更新下载器下载速度
  201. * 参数 url:下载的url地址
  202. */
  203. void _updateDownloadSpeed(const std::string& url);
  204. /**
  205. * 功能:清理指定zip包的下载缓存
  206. * 参数 zipFilePath:资源包文件路径
  207. */
  208. void _clearDownloadCache(const std::string& zipFilePath);
  209. private:
  210. ///下载器id
  211. std::string _id = "";
  212. ///cocos2d的下载器
  213. cocos2d::network::Downloader* _innerDownloader = nullptr;
  214. ///Red下载器委托
  215. DownloaderDelegate* _delegate = nullptr;
  216. ///下载请求表,包含正在下载和等待下载的请求数据
  217. std::map<std::string, DownloadRequestData> _requestDatas;
  218. ///下载器总共需要下载的数量
  219. int _totalDownloadCnt = 0;
  220. ///下载器当前已经完成的下载数量
  221. int _downloadedCnt = 0;
  222. ///下载器下载速度(单位:Bps)
  223. int _downloadSpeed = 0;
  224. ///文件开始下载的时间戳表
  225. std::map<std::string, DownloadTimeClock> _downloadTimeClocks;
  226. ///文件已经下载的字节大小信息
  227. std::map<std::string, int64_t> _downloadedBytes;
  228. };
  229. NS_RU_END
  230. #endif /* RUDownloader_hpp */