|
@@ -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();
|