فهرست منبع

Fix bug that active downloads are not saved with --save-session-interval

Tatsuhiro Tsujikawa 12 سال پیش
والد
کامیت
3fc45edaa7
2فایلهای تغییر یافته به همراه27 افزوده شده و 0 حذف شده
  1. 17 0
      src/SessionSerializer.cc
  2. 10 0
      test/SessionSerializerTest.cc

+ 17 - 0
src/SessionSerializer.cc

@@ -212,6 +212,23 @@ bool SessionSerializer::save(BufferedFile& fp) const
       }
     }
   }
+  {
+    // Save active downloads.
+    const RequestGroupList& groups = rgman_->getRequestGroups();
+    for(RequestGroupList::SeqType::const_iterator itr = groups.begin(),
+          eoi = groups.end(); itr != eoi; ++itr) {
+      const SharedHandle<RequestGroup>& rg = (*itr).second;
+      SharedHandle<DownloadResult> dr = rg->createDownloadResult();
+      bool stopped = dr->result == error_code::FINISHED ||
+        dr->result == error_code::REMOVED;
+      if((!stopped && saveInProgress_) ||
+         (stopped && dr->option->getAsBool(PREF_FORCE_SAVE))) {
+        if(!writeDownloadResult(fp, metainfoCache, dr)) {
+          return false;
+        }
+      }
+    }
+  }
   if(saveWaiting_) {
     const RequestGroupList& groups = rgman_->getReservedGroups();
     for(RequestGroupList::SeqType::const_iterator itr = groups.begin(),

+ 10 - 0
test/SessionSerializerTest.cc

@@ -12,6 +12,8 @@
 #include "Option.h"
 #include "a2functional.h"
 #include "FileEntry.h"
+#include "SelectEventPoll.h"
+#include "DownloadEngine.h"
 
 namespace aria2 {
 
@@ -74,6 +76,13 @@ void SessionSerializerTest::testSave()
   for(size_t i = 0; i < sizeof(drs)/sizeof(drs[0]); ++i) {
     rgman->addDownloadResult(drs[i]);
   }
+
+
+  DownloadEngine e(SharedHandle<EventPoll>(new SelectEventPoll()));
+  e.setOption(option.get());
+  rgman->fillRequestGroupFromReserver(&e);
+  CPPUNIT_ASSERT_EQUAL((size_t)1, rgman->getRequestGroups().size());
+
   std::string filename = A2_TEST_OUT_DIR"/aria2_SessionSerializerTest_testSave";
   s.save(filename);
   std::ifstream ss(filename.c_str(), std::ios::binary);
@@ -82,6 +91,7 @@ void SessionSerializerTest::testSave()
   CPPUNIT_ASSERT_EQUAL(std::string("http://error\t"), line);
   std::getline(ss, line);
   CPPUNIT_ASSERT_EQUAL(fmt(" gid=%s", drs[1]->gid->toHex().c_str()), line);
+  // Check active download is also saved
   std::getline(ss, line);
   CPPUNIT_ASSERT_EQUAL(uris[0]+"\t"+uris[1]+"\t", line);
   std::getline(ss, line);