Get `Waiting` downloads before `Active` ones.

`Waiting` can become `Active` while we are getting the downloads.
We may have rare case where we miss a download if we get `Active` before
`Waiting`.
This commit is contained in:
Matthieu Gautier 2023-02-08 12:06:51 +01:00
parent 2c3b7409aa
commit 1ba588272c
1 changed files with 12 additions and 10 deletions

View File

@ -127,14 +127,6 @@ void Download::cancelDownload()
Downloader::Downloader() : Downloader::Downloader() :
mp_aria(new Aria2()) mp_aria(new Aria2())
{ {
try {
for (auto gid : mp_aria->tellActive()) {
m_knownDownloads[gid] = std::unique_ptr<Download>(new Download(mp_aria, gid));
m_knownDownloads[gid]->updateStatus(false);
}
} catch (std::exception& e) {
std::cerr << "aria2 tellActive failed : " << e.what() << std::endl;
}
try { try {
for (auto gid : mp_aria->tellWaiting()) { for (auto gid : mp_aria->tellWaiting()) {
m_knownDownloads[gid] = std::unique_ptr<Download>(new Download(mp_aria, gid)); m_knownDownloads[gid] = std::unique_ptr<Download>(new Download(mp_aria, gid));
@ -143,6 +135,16 @@ Downloader::Downloader() :
} catch (std::exception& e) { } catch (std::exception& e) {
std::cerr << "aria2 tellWaiting failed : " << e.what() << std::endl; std::cerr << "aria2 tellWaiting failed : " << e.what() << std::endl;
} }
try {
for (auto gid : mp_aria->tellActive()) {
if( m_knownDownloads.find(gid) == m_knownDownloads.end()) {
m_knownDownloads[gid] = std::unique_ptr<Download>(new Download(mp_aria, gid));
m_knownDownloads[gid]->updateStatus(false);
}
}
} catch (std::exception& e) {
std::cerr << "aria2 tellActive failed : " << e.what() << std::endl;
}
} }
/* Destructor */ /* Destructor */
@ -185,13 +187,13 @@ std::shared_ptr<Download> Downloader::getDownload(const std::string& did)
try { try {
return m_knownDownloads.at(did); return m_knownDownloads.at(did);
} catch(std::exception& e) { } catch(std::exception& e) {
for (auto gid : mp_aria->tellActive()) { for (auto gid : mp_aria->tellWaiting()) {
if (gid == did) { if (gid == did) {
m_knownDownloads[gid] = std::make_shared<Download>(mp_aria, gid); m_knownDownloads[gid] = std::make_shared<Download>(mp_aria, gid);
return m_knownDownloads[gid]; return m_knownDownloads[gid];
} }
} }
for (auto gid : mp_aria->tellWaiting()) { for (auto gid : mp_aria->tellActive()) {
if (gid == did) { if (gid == did) {
m_knownDownloads[gid] = std::make_shared<Download>(mp_aria, gid); m_knownDownloads[gid] = std::make_shared<Download>(mp_aria, gid);
return m_knownDownloads[gid]; return m_knownDownloads[gid];