// // RUDownloader.hpp // red_utils // // Created by RedInfinity on 2023/12/6. // #ifndef RUDownloader_hpp #define RUDownloader_hpp ///C++标准库 #include #include #include ///第三方库 #include "cocos2d.h" #include "network/CCDownloader.h" ///项目代码 #include "RUDefine.h" NS_RU_BEGIN /** * 描述:Red下载器支持的最大下载线程数量 */ enum class kMaxDownloadCnt { ONE = 1, TWO = 2, THREE = 3, FOUR = 4, FIVE = 5, SIX = 6 }; /** * 描述:创建Red下载器的初始数据包 */ typedef struct _DownloaderCreateData { std::string id = ""; ///下载器id kMaxDownloadCnt maxDownloadCnt = kMaxDownloadCnt::SIX; ///默认使用最大数量(6个) } DownloaderCreateData; /** * 描述:下载请求数据 */ typedef struct _DownloadRequestData { std::string url = ""; ///下载的url地址 std::string saveDir = ""; ///下载文件的保存路径 bool verify = false; ///是否验证下载文件 std::string md5 = ""; ///文件正确的md5值 } DownloadRequestData; ///用于计算下载速度的时间戳 typedef std::chrono::time_point DownloadTimeClock; /** * 描述:Red下载器委托,为外部根据下载数据自定义实现功能提供支持 */ class DownloaderDelegate { public: /** * 功能:指定url地址的文件下载成功 * 参数 url:下载的url地址 */ virtual void onDownloadFileSuccess(const std::string& url) {}; /** * 功能:指定url地址的文件下载失败 * 参数 url:下载的url地址 * 参数 log:下载失败的日志信息 */ virtual void onDownloadFileFail(const std::string& url, const std::string& log) {}; /** * 功能:指定url地址的文件下载百分比 * 参数 url:下载的url地址 * 参数 percent:指定url地址的下载进度百分比(0~100),如果指定url地址还未开始下载则不会执行。 */ virtual void onDownloadFileProgress(const std::string& url, const int& percent) {}; /** * 功能:Red下载器的下载百分比 * 参数 percent: 下载器完成的百分比(0~100) */ virtual void onDownloaderPercent(const int& percent) {}; /** * 功能:Red下载器的下载进度 * 参数 downloadedCnt:下载器完成下载的数量 * 参数 totalDownloadCnt:下载器需要下载的总数量 */ virtual void onDownloaderProgress(const int& downloadedCnt, const int& totalDownloadCnt) {}; /** * 功能:Red下载器的下载速度 * 参数 downloadSpeed:下载速度(Bps) */ virtual void onDownloaderSpeed(const double& downloadSpeed) {}; protected: DownloaderDelegate() = default; virtual ~DownloaderDelegate() = default; }; /** * 描述:Red下载器。对cocos2d的Downloader进一步封装。简化一些接口的实现 */ class Downloader final { public: /** * 功能:创建Red下载器 * 参数 data:Red下载器创建的初始数据包 * 参数 delegate:Red下载器委托,如果不需要则传空指针 * 返回值:Red下载器对象 */ static Downloader* create(const DownloaderCreateData& data, DownloaderDelegate* delegate); /** * 功能:释放Red下载器 */ void release(); /** * 功能:下载指定url地址的文件 * 参数 url:下载的url地址 * 参数 saveDir:下载文件的保存目录(文件夹) * 返回值:下载请求是否响应成功。 */ bool downloadFile(const std::string& url, const std::string& saveDir); /** * 功能:下载指定url地址的文件,并进行md5校验 * 参数 url:下载的url地址 * 参数 saveDir:下载文件的保存目录(文件夹) * 参数 md5:下载文件正确的md5值 * 返回值:下载请求是否响应成功。 */ bool downloadFileAndVerifyMd5(const std::string& url, const std::string& saveDir, const std::string& md5); private: Downloader() = default; ~Downloader() = default; /** * 功能:初始化Red下载器 * 参数 data:Red下载器创建的初始数据包 * 参数 delegate:Red下载器委托,如果不需要则传空指针 */ void _init(const DownloaderCreateData& data, DownloaderDelegate* delegate); /** * 功能:创建内置的cocos2d下载器 * 参数 maxDownloadCnt:最大下载线程数量 */ cocos2d::network::Downloader* _createInnerDownloader(const kMaxDownloadCnt& maxDownloadCnt); /** * 功能:初始化内置的cocos2d下载器 */ void _initInnerDownloader(); /** * 功能:对url地址进行格式化编码,因为cocos2d的下载器对url地址有一定要求,如果不格式化会导致下载失败 * 参数 url:原始url地址 * 返回值:格式化编码后的url地址 */ std::string _encodeURL(const std::string& url); /** * 功能:获取格式化编码后url地址的原始url地址 * 参数 url:格式化编码后url地址 * 返回值:原始url地址 */ std::string _decodeURL(const std::string& url); /** * 功能:根据url地址获取文件名称 * 参数 url:下载的url地址 * 返回值:url地址下载的文件名称 */ std::string _getFileNameByUrl(const std::string& url); /** * 功能:添加下载请求 * 参数 requestData:下载请求数据 * 返回值:是否添加成功 */ bool _appendDownloadRequest(const DownloadRequestData& requestData); /** * 功能:移除下载请求 * 参数 url:下载的url地址 * 返回值:移除的下载请求数据 */ DownloadRequestData _removeDownloadRequest(const std::string& url); /** * 功能:增加下载器总共需要下载的数量 */ void _addTotalDownloadCnt(); /** * 功能:增加下载器当前已经完成的下载数量 */ void _addDownloadedCnt(); /** * 功能:获取下载器的下载百分比 */ float _getDownloadPercent(); /** * 功能:验证下载文件的md5值是否正确 * 参数 saveFilePath:下载文件的保存路径 * 参数 md5:文件的正确md5值 * 返回值:验证是否通过 */ bool _verifyFileMd5(const std::string& saveFilePath, const std::string& md5); /** * 功能:记录文件开始下载的时间戳 * 参数 url:下载的url地址 */ void _recordDownloadStartTime(const std::string& url); /** * 功能:更新文件已经下载的字节大小 * 参数 url:下载的url地址 * 参数 downloadedByte:已经下载的字节大小 */ void _updateDownloadedByte(const std::string& url, const int64_t& downloadedByte); /** * 功能:更新下载器下载速度 * 参数 url:下载的url地址 */ void _updateDownloadSpeed(const std::string& url); /** * 功能:清理指定zip包的下载缓存 * 参数 zipFilePath:资源包文件路径 */ void _clearDownloadCache(const std::string& zipFilePath); private: ///下载器id std::string _id = ""; ///cocos2d的下载器 cocos2d::network::Downloader* _innerDownloader = nullptr; ///Red下载器委托 DownloaderDelegate* _delegate = nullptr; ///下载请求表,包含正在下载和等待下载的请求数据 std::map _requestDatas; ///下载器总共需要下载的数量 int _totalDownloadCnt = 0; ///下载器当前已经完成的下载数量 int _downloadedCnt = 0; ///下载器下载速度(单位:Bps) int _downloadSpeed = 0; ///文件开始下载的时间戳表 std::map _downloadTimeClocks; ///文件已经下载的字节大小信息 std::map _downloadedBytes; }; NS_RU_END #endif /* RUDownloader_hpp */