- curl_multi_remove_handle(m_multi_handle, msg->easy_handle);
- //FIXME: finish_transfer(msg->easy_handle);
+ {
+ log_info << "Download completed with " << msg->data.result << std::endl;
+ curl_multi_remove_handle(m_multi_handle, msg->easy_handle);
+
+ auto it = std::find_if(m_transfers.begin(), m_transfers.end(),
+ [&msg](const std::unique_ptr<Transfer>& rhs) {
+ return rhs->get_curl_handle() == msg->easy_handle;
+ });
+ assert(it != m_transfers.end());
+ TransferStatusPtr status = (*it)->get_status();
+ status->error_msg = (*it)->get_error_buffer();
+ m_transfers.erase(it);
+
+ if (msg->data.result == CURLE_OK)
+ {
+ bool success = true;
+ for(auto& callback : status->callbacks)
+ {
+ try
+ {
+ callback(success);
+ }
+ catch(const std::exception& err)
+ {
+ success = false;
+ log_warning << "Exception in Downloader: " << err.what() << std::endl;
+ status->error_msg = err.what();
+ }
+ }
+ }
+ else
+ {
+ log_warning << "Error: " << curl_easy_strerror(msg->data.result) << std::endl;
+ for(auto& callback : status->callbacks)
+ {
+ try
+ {
+ callback(false);
+ }
+ catch(const std::exception& err)
+ {
+ log_warning << "Illegal exception in Downloader: " << err.what() << std::endl;
+ }
+ }
+ }
+ }