Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // Created by capone on 27.06.18.
- //
- #include "FileManager.h"
- USING_NS_CC;
- #define FILEUTILS FileUtils::getInstance()
- typedef size_t(*CURL_WRITEFUNCTION_PTR)(char*, size_t, size_t, FILE*);
- typedef int(*CURL_PROGRESSFUNCTION_PTR)(DownloadDelegate*, double, double, double, double);
- void FileManager::startDownload(std::string &url, std::string &filePath)
- {
- CURLM *curlm = curl_multi_init();
- CURL *curl = curl_easy_init();
- FILE *fp;
- if(curl) {
- downloading = true;
- fp = fopen(filePath.c_str(),"wb");
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
- curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
- curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
- auto writeCallback = [](char *ptr, size_t size, size_t nmemb, FILE *stream) -> size_t {
- size_t written = fwrite(ptr, size, nmemb, stream);
- return written;
- };
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, static_cast<CURL_WRITEFUNCTION_PTR>(writeCallback));
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
- auto progressCallback = [](DownloadDelegate *delegate, double dltotal, double dlnow, double ultotal, double ulnow) -> int {
- if (!FileManager::getInstance()->downloading) {
- CCLOG("download canceled");
- return 1;
- }
- double percent = dlnow * 100.0 / dltotal;
- //CCLOG("download progress %.0lf%%", percent);
- if (delegate) delegate->downloadTaskProgress(percent);
- return 0;
- };
- curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, static_cast<CURL_PROGRESSFUNCTION_PTR>(progressCallback));
- curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, _downloadDelegate);
- CCLOG("download started");
- curl_multi_add_handle(curlm, curl);
- Director::getInstance()->getScheduler()->schedule( [this, filePath, curlm, curl, fp](float dt) {
- int transfers;
- CURLMcode res = curl_multi_perform(curlm, &transfers);
- if (res != CURLM_OK) {
- auto error = std::string(curl_multi_strerror(res));
- CCLOG("downloading error: %s", error.c_str());
- if (_downloadDelegate) _downloadDelegate->downloadTaskError(error);
- } else {
- int msgq = 0;
- struct CURLMsg *m = curl_multi_info_read(curlm, &msgq);
- if(m && (m->msg == CURLMSG_DONE)) {
- transfers--;
- downloading = false;
- fclose(fp);
- curl_multi_remove_handle(curlm, curl);
- curl_easy_cleanup(curl);
- CCLOG("downloaded success");
- if (_downloadDelegate) _downloadDelegate->downloadTaskSuccess(filePath);
- Director::getInstance()->getScheduler()->unschedule("curl_loop", this);
- }
- }
- }, this, 0, CC_REPEAT_FOREVER, 0, false, "curl_loop");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement