X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Faddon%2Fdownloader.cpp;h=905dd2b5d4d0f54184d1c871a8789b95935dcabb;hb=9410759b4897ceeaaca7da00a060b5c85a6fe6dd;hp=b923813f5be15a2840549dc49e1e04f8ac2c207d;hpb=5033c64a9b71986cd64f0963e690ac985dd0fd1a;p=supertux.git diff --git a/src/addon/downloader.cpp b/src/addon/downloader.cpp index b923813f5..905dd2b5d 100644 --- a/src/addon/downloader.cpp +++ b/src/addon/downloader.cpp @@ -18,6 +18,7 @@ #include "addon/downloader.hpp" #include +#include #include #include #include @@ -49,6 +50,12 @@ size_t my_curl_physfs_write(void* ptr, size_t size, size_t nmemb, void* userdata } // namespace void +TransferStatus::abort() +{ + m_downloader.abort(id); +} + +void TransferStatus::update() { m_downloader.update(); @@ -75,8 +82,8 @@ public: m_id(id), m_url(url), m_handle(), - m_error_buffer({'\0'}), - m_status(new TransferStatus(downloader, id)), + m_error_buffer({{'\0'}}), + m_status(new TransferStatus(m_downloader, id)), m_fout(PHYSFS_openWrite(outfile.c_str()), PHYSFS_close) { if (!m_fout) @@ -105,8 +112,8 @@ public: curl_easy_setopt(m_handle, CURLOPT_FOLLOWLOCATION, 1); curl_easy_setopt(m_handle, CURLOPT_NOPROGRESS, 0); - curl_easy_setopt(m_handle, CURLOPT_XFERINFODATA, this); - curl_easy_setopt(m_handle, CURLOPT_XFERINFOFUNCTION, &Transfer::on_progress_wrap); + curl_easy_setopt(m_handle, CURLOPT_PROGRESSDATA, this); + curl_easy_setopt(m_handle, CURLOPT_PROGRESSFUNCTION, &Transfer::on_progress_wrap); } } @@ -146,14 +153,16 @@ public: return size * nmemb; } - void on_progress(curl_off_t dltotal, curl_off_t dlnow, - curl_off_t ultotal, curl_off_t ulnow) + int on_progress(double dltotal, double dlnow, + double ultotal, double ulnow) { - m_status->dltotal = dltotal; - m_status->dlnow = dlnow; + m_status->dltotal = static_cast(dltotal); + m_status->dlnow = static_cast(dlnow); + + m_status->ultotal = static_cast(ultotal); + m_status->ulnow = static_cast(ulnow); - m_status->ultotal = ultotal; - m_status->ulnow = ulnow; + return 0; } private: @@ -162,9 +171,9 @@ private: return static_cast(userdata)->on_data(ptr, size, nmemb); } - static void on_progress_wrap(void* userdata, - curl_off_t dltotal, curl_off_t dlnow, - curl_off_t ultotal, curl_off_t ulnow) + static int on_progress_wrap(void* userdata, + double dltotal, double dlnow, + double ultotal, double ulnow) { return static_cast(userdata)->on_progress(dltotal, dlnow, ultotal, ulnow); } @@ -239,6 +248,7 @@ Downloader::download(const std::string& url) void Downloader::download(const std::string& url, const std::string& filename) { + log_info << "download: " << url << " to " << filename << std::endl; std::unique_ptr fout(PHYSFS_openWrite(filename.c_str()), PHYSFS_close); download(url, my_curl_physfs_write, fout.get()); @@ -258,8 +268,22 @@ Downloader::abort(TransferId id) } else { + TransferStatusPtr status = (*it)->get_status(); + curl_multi_remove_handle(m_multi_handle, (*it)->get_curl_handle()); m_transfers.erase(it); + + for(auto& callback : status->callbacks) + { + try + { + callback(false); + } + catch(const std::exception& err) + { + log_warning << "Illegal exception in Downloader: " << err.what() << std::endl; + } + } } } @@ -340,6 +364,7 @@ Downloader::update() TransferStatusPtr Downloader::request_download(const std::string& url, const std::string& outfile) { + log_info << "request_download: " << url << std::endl; std::unique_ptr transfer(new Transfer(*this, m_next_transfer_id++, url, outfile)); curl_multi_add_handle(m_multi_handle, transfer->get_curl_handle()); m_transfers.push_back(std::move(transfer));