Advertisement
Guest User

FileManager.cpp

a guest
Jul 5th, 2018
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.09 KB | None | 0 0
  1. //
  2. // Created by capone on 27.06.18.
  3. //
  4.  
  5. #include "FileManager.h"
  6.  
  7. USING_NS_CC;
  8.  
  9. #define FILEUTILS FileUtils::getInstance()
  10.  
  11. typedef size_t(*CURL_WRITEFUNCTION_PTR)(char*, size_t, size_t, FILE*);
  12. typedef int(*CURL_PROGRESSFUNCTION_PTR)(DownloadDelegate*, double, double, double, double);
  13.  
  14. void FileManager::startDownload(std::string &url, std::string &filePath)
  15. {
  16.     CURLM *curlm = curl_multi_init();
  17.     CURL *curl = curl_easy_init();
  18.     FILE *fp;
  19.  
  20.     if(curl) {
  21.         downloading = true;
  22.         fp = fopen(filePath.c_str(),"wb");
  23.  
  24.         curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
  25.         curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
  26.         curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
  27.         curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
  28.  
  29.         auto writeCallback = [](char *ptr, size_t size, size_t nmemb, FILE *stream) -> size_t {
  30.             size_t written = fwrite(ptr, size, nmemb, stream);
  31.             return written;
  32.         };
  33.         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, static_cast<CURL_WRITEFUNCTION_PTR>(writeCallback));
  34.         curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
  35.  
  36.         auto progressCallback = [](DownloadDelegate *delegate,   double dltotal,   double dlnow,   double ultotal,   double ulnow) -> int {
  37.             if (!FileManager::getInstance()->downloading) {
  38.                 CCLOG("download canceled");
  39.                 return 1;
  40.             }
  41.  
  42.             double percent = dlnow * 100.0 / dltotal;
  43.             //CCLOG("download progress %.0lf%%", percent);
  44.             if (delegate) delegate->downloadTaskProgress(percent);
  45.  
  46.             return 0;
  47.         };
  48.         curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, static_cast<CURL_PROGRESSFUNCTION_PTR>(progressCallback));
  49.         curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, _downloadDelegate);
  50.  
  51.         CCLOG("download started");
  52.  
  53.         curl_multi_add_handle(curlm, curl);
  54.  
  55.         Director::getInstance()->getScheduler()->schedule( [this, filePath, curlm, curl, fp](float dt) {
  56.             int transfers;
  57.             CURLMcode res = curl_multi_perform(curlm, &transfers);
  58.  
  59.             if (res != CURLM_OK) {
  60.                 auto error = std::string(curl_multi_strerror(res));
  61.                 CCLOG("downloading error: %s", error.c_str());
  62.                 if (_downloadDelegate) _downloadDelegate->downloadTaskError(error);
  63.             } else {
  64.                 int msgq = 0;
  65.                 struct CURLMsg *m = curl_multi_info_read(curlm, &msgq);
  66.                 if(m && (m->msg == CURLMSG_DONE)) {
  67.                     transfers--;
  68.  
  69.                     downloading = false;
  70.                     fclose(fp);
  71.  
  72.                     curl_multi_remove_handle(curlm, curl);
  73.                     curl_easy_cleanup(curl);
  74.  
  75.                     CCLOG("downloaded success");
  76.                     if (_downloadDelegate) _downloadDelegate->downloadTaskSuccess(filePath);
  77.  
  78.                     Director::getInstance()->getScheduler()->unschedule("curl_loop", this);
  79.                 }
  80.             }
  81.         }, this, 0, CC_REPEAT_FOREVER, 0, false, "curl_loop");
  82.     }
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement