123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- //
- // RUDownloader.hpp
- // red_utils
- //
- // Created by RedInfinity on 2023/12/6.
- //
- #ifndef RUDownloader_hpp
- #define RUDownloader_hpp
- ///C++标准库
- #include <string>
- #include <map>
- #include <chrono>
- ///第三方库
- #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<std::chrono::high_resolution_clock> 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<std::string, DownloadRequestData> _requestDatas;
- ///下载器总共需要下载的数量
- int _totalDownloadCnt = 0;
- ///下载器当前已经完成的下载数量
- int _downloadedCnt = 0;
- ///下载器下载速度(单位:Bps)
- int _downloadSpeed = 0;
- ///文件开始下载的时间戳表
- std::map<std::string, DownloadTimeClock> _downloadTimeClocks;
- ///文件已经下载的字节大小信息
- std::map<std::string, int64_t> _downloadedBytes;
- };
- NS_RU_END
- #endif /* RUDownloader_hpp */
|