Add average download rate to progressInfo struct

This commit is contained in:
Sude 2016-07-01 18:37:23 +03:00
parent d1a59a7d46
commit ca436a9927
2 changed files with 25 additions and 2 deletions

View File

@ -20,6 +20,7 @@ struct progressInfo
curl_off_t dlnow; curl_off_t dlnow;
curl_off_t dltotal; curl_off_t dltotal;
double rate; double rate;
double rate_avg;
}; };
class DownloadInfo class DownloadInfo

View File

@ -3112,7 +3112,25 @@ void Downloader::processDownloadQueue(Config conf, const unsigned int& tid)
curl_easy_getinfo(dlhandle, CURLINFO_RESPONSE_CODE, &response_code); curl_easy_getinfo(dlhandle, CURLINFO_RESPONSE_CODE, &response_code);
} }
if (result == CURLE_OK || result == CURLE_RANGE_ERROR || (result == CURLE_HTTP_RETURNED_ERROR && response_code == 416)) if (result == CURLE_OK || result == CURLE_RANGE_ERROR || (result == CURLE_HTTP_RETURNED_ERROR && response_code == 416))
msgQueue.push(msg_prefix + "Finished download: " + filepath.filename().string()); {
// Average download speed
std::ostringstream dlrate_avg;
std::string rate_unit;
progressInfo progress_info = vDownloadInfo[tid].getProgressInfo();
if (progress_info.rate_avg > 1048576) // 1 MB
{
progress_info.rate_avg /= 1048576;
rate_unit = "MB/s";
}
else
{
progress_info.rate_avg /= 1024;
rate_unit = "kB/s";
}
dlrate_avg << std::setprecision(2) << std::fixed << progress_info.rate_avg << rate_unit;
msgQueue.push(msg_prefix + "Finished download: " + filepath.filename().string() + " (@ " + dlrate_avg.str() + ")");
}
else else
{ {
msgQueue.push(msg_prefix + "Finished download (" + static_cast<std::string>(curl_easy_strerror(result)) + "): " + filepath.filename().string()); msgQueue.push(msg_prefix + "Finished download (" + static_cast<std::string>(curl_easy_strerror(result)) + "): " + filepath.filename().string());
@ -3166,7 +3184,7 @@ int Downloader::progressCallbackForThread(void *clientp, curl_off_t dltotal, cur
// trying to get rate and setting to NaN if it fails // trying to get rate and setting to NaN if it fails
if (CURLE_OK != curl_easy_getinfo(xferinfo->curlhandle, CURLINFO_SPEED_DOWNLOAD, &info.rate)) if (CURLE_OK != curl_easy_getinfo(xferinfo->curlhandle, CURLINFO_SPEED_DOWNLOAD, &info.rate))
info.rate = std::numeric_limits<double>::quiet_NaN(); info.rate_avg = std::numeric_limits<double>::quiet_NaN();
// setting full dlwnow and dltotal // setting full dlwnow and dltotal
if (xferinfo->offset > 0) if (xferinfo->offset > 0)
@ -3187,6 +3205,10 @@ int Downloader::progressCallbackForThread(void *clientp, curl_off_t dltotal, cur
uintmax_t size_last = xferinfo->TimeAndSize.back().second; uintmax_t size_last = xferinfo->TimeAndSize.back().second;
info.rate = (size_last - size_first) / static_cast<double>((time_last - time_first)); info.rate = (size_last - size_first) / static_cast<double>((time_last - time_first));
} }
else
{
info.rate = info.rate_avg;
}
vDownloadInfo[xferinfo->tid].setProgressInfo(info); vDownloadInfo[xferinfo->tid].setProgressInfo(info);
vDownloadInfo[xferinfo->tid].setStatus(DLSTATUS_RUNNING); vDownloadInfo[xferinfo->tid].setStatus(DLSTATUS_RUNNING);