summaryrefslogtreecommitdiff
path: root/src/SessionSerializer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/SessionSerializer.cc')
-rw-r--r--src/SessionSerializer.cc38
1 files changed, 31 insertions, 7 deletions
diff --git a/src/SessionSerializer.cc b/src/SessionSerializer.cc
index 0d260a3f..8dd9008a 100644
--- a/src/SessionSerializer.cc
+++ b/src/SessionSerializer.cc
@@ -272,11 +272,14 @@ bool writeDownloadResult(IOFile& fp, std::set<a2_gid_t>& metainfoCache,
}
} // namespace
-bool SessionSerializer::save(IOFile& fp) const
+namespace {
+template <typename InputIt>
+bool saveDownloadResult(IOFile& fp, std::set<a2_gid_t>& metainfoCache,
+ InputIt first, InputIt last, bool saveInProgress,
+ bool saveError)
{
- std::set<a2_gid_t> metainfoCache;
- const DownloadResultList& results = rgman_->getDownloadResults();
- for (const auto& dr : results) {
+ for (; first != last; ++first) {
+ const auto& dr = *first;
auto save = false;
switch (dr->result) {
case error_code::FINISHED:
@@ -284,20 +287,41 @@ bool SessionSerializer::save(IOFile& fp) const
save = dr->option->getAsBool(PREF_FORCE_SAVE);
break;
case error_code::IN_PROGRESS:
- save = saveInProgress_;
+ save = saveInProgress;
break;
case error_code::RESOURCE_NOT_FOUND:
case error_code::MAX_FILE_NOT_FOUND:
- save = saveError_ && dr->option->getAsBool(PREF_SAVE_NOT_FOUND);
+ save = saveError && dr->option->getAsBool(PREF_SAVE_NOT_FOUND);
break;
default:
- save = saveError_;
+ save = saveError;
break;
}
if (save && !writeDownloadResult(fp, metainfoCache, dr, false)) {
return false;
}
}
+ return true;
+}
+} // namespace
+
+bool SessionSerializer::save(IOFile& fp) const
+{
+ std::set<a2_gid_t> metainfoCache;
+
+ const auto& unfinishedResults = rgman_->getUnfinishedDownloadResult();
+ if (!saveDownloadResult(fp, metainfoCache, std::begin(unfinishedResults),
+ std::end(unfinishedResults), saveInProgress_,
+ saveError_)) {
+ return false;
+ }
+
+ const auto& results = rgman_->getDownloadResults();
+ if (!saveDownloadResult(fp, metainfoCache, std::begin(results),
+ std::end(results), saveInProgress_, saveError_)) {
+ return false;
+ }
+
{
// Save active downloads.
const RequestGroupList& groups = rgman_->getRequestGroups();