ソースを参照

Compact readout when more than 1 simultaneous downloads are going on

If more than 1 simultaneous downloads are going on, use more compact
format in readout. Currently, at most 5 download stats are displayed.

util::abbrevSize() is rewritten to support "Gi" unit and provides more
compact abbreviation.
Tatsuhiro Tsujikawa 13 年 前
コミット
4fdd5da27d
3 ファイル変更100 行追加35 行削除
  1. 69 16
      src/ConsoleStatCalc.cc
  2. 23 14
      src/util.cc
  3. 8 5
      test/UtilTest.cc

+ 69 - 16
src/ConsoleStatCalc.cc

@@ -95,6 +95,69 @@ protected:
 };
 } // namespace
 
+namespace {
+void printSeedRatio(std::ostream& o, const SharedHandle<RequestGroup>& rg,
+                    const TransferStat& stat)
+{
+  if(rg->getCompletedLength() > 0) {
+    std::streamsize oldprec = o.precision();
+    o << std::fixed << std::setprecision(1)
+      << ((stat.allTimeUploadLength*10)/rg->getCompletedLength())/10.0
+      << std::setprecision(oldprec)
+      << std::resetiosflags(std::ios::fixed);
+  } else {
+    o << "--";
+  }
+}
+} // namespace
+
+namespace {
+void printProgressCompact(std::ostream& o, const DownloadEngine* e,
+                          const SizeFormatter& sizeFormatter)
+{
+  if(!e->getRequestGroupMan()->downloadFinished()) {
+    NetStat& netstat = e->getRequestGroupMan()->getNetStat();
+    int dl = netstat.calculateDownloadSpeed();
+    int ul = netstat.calculateUploadSpeed();
+    o << "[DL:" << sizeFormatter(dl) << "B UL:" << sizeFormatter(ul) << "B]";
+  }
+
+  const std::deque<SharedHandle<RequestGroup> >& groups =
+    e->getRequestGroupMan()->getRequestGroups();
+  size_t cnt = 0;
+  const size_t MAX_ITEM = 5;
+  for(std::deque<SharedHandle<RequestGroup> >::const_iterator
+        i = groups.begin(), eoi = groups.end(); i != eoi && cnt < MAX_ITEM;
+      ++i, ++cnt) {
+    TransferStat stat = (*i)->calculateStat();
+    o << "[#" << (*i)->getGID() << " ";
+#ifdef ENABLE_BITTORRENT
+    if((*i)->getDownloadContext()->hasAttribute(CTX_ATTR_BT) &&
+       !bittorrent::getTorrentAttrs((*i)->getDownloadContext())
+       ->metadata.empty() && (*i)->downloadFinished()) {
+      o << "SEED(";
+      printSeedRatio(o, *i, stat);
+      o << ")";
+    } else
+#endif // ENABLE_BITTORRENT
+      {
+        o << sizeFormatter((*i)->getCompletedLength()) << "B"
+          << "/"
+          << sizeFormatter((*i)->getTotalLength()) << "B";
+        if((*i)->getTotalLength() > 0) {
+          o << "("
+            << 100*(*i)->getCompletedLength()/(*i)->getTotalLength()
+            << "%)";
+        }
+      }
+    o << "]";
+  }
+  if(cnt < groups.size()) {
+    o << "(" << groups.size()-cnt << "more)";
+  }
+}
+} // namespace
+
 namespace {
 void printProgress
 (std::ostream& o, const SharedHandle<RequestGroup>& rg, const DownloadEngine* e,
@@ -113,15 +176,7 @@ void printProgress
      !bittorrent::getTorrentAttrs(rg->getDownloadContext())->metadata.empty() &&
      rg->downloadFinished()) {
     o << "SEEDING(ratio:";
-    if(rg->getCompletedLength() > 0) {
-      std::streamsize oldprec = o.precision();
-      o << std::fixed << std::setprecision(1)
-        << ((stat.allTimeUploadLength*10)/rg->getCompletedLength())/10.0
-        << std::setprecision(oldprec)
-        << std::resetiosflags(std::ios::fixed);
-    } else {
-      o << "--";
-    }
+    printSeedRatio(o, rg, stat);
     o << ")";
   } else
 #endif // ENABLE_BITTORRENT
@@ -289,7 +344,8 @@ ConsoleStatCalc::calculateStat(const DownloadEngine* e)
   if(!readoutVisibility_) {
     return;
   }
-  if(e->getRequestGroupMan()->countRequestGroup() > 0) {
+  size_t numGroup = e->getRequestGroupMan()->countRequestGroup();
+  if(numGroup == 1) {
     SharedHandle<RequestGroup> firstRequestGroup =
       e->getRequestGroupMan()->getRequestGroup(0);
 
@@ -300,12 +356,9 @@ ConsoleStatCalc::calculateStat(const DownloadEngine* e)
         << e->getRequestGroupMan()->countRequestGroup()-1
         << "more...)";
     }
-  }
-
-  if(e->getRequestGroupMan()->countRequestGroup() > 1 &&
-     !e->getRequestGroupMan()->downloadFinished()) {
-    int spd = e->getRequestGroupMan()->getNetStat().calculateDownloadSpeed();
-    o << " [TOTAL SPD:" << sizeFormatter(spd) << "Bs]";
+  } else if(numGroup > 1) {
+    // For more than 2 RequestGroups, use compact readout form
+    printProgressCompact(o, e, sizeFormatter);
   }
 
   {

+ 23 - 14
src/util.cc

@@ -1292,20 +1292,29 @@ int64_t getRealSize(const std::string& sizeWithUnit)
 
 std::string abbrevSize(int64_t size)
 {
-  if(size < 1024) {
-    return itos(size, true);
-  }
-  static const char units[] = { 'K', 'M' };
-  size_t i = 0;
-  int r = size&0x3ffu;
-  size >>= 10;
-  for(; i < sizeof(units)-1 && size >= 1024; ++i) {
-    r = size&0x3ffu;
-    size >>= 10;
-  }
-  std::string result = itos(size, true);
-  result += fmt(".%d%ci", r*10/1024, units[i]);
-  return result;
+  static const char* UNITS[] = { "", "Ki", "Mi", "Gi" };
+  int64_t t = size;
+  size_t uidx = 0;
+  int r = 0;
+  while(t >= 1024 && uidx+1 < sizeof(UNITS)/sizeof(UNITS[0])) {
+    lldiv_t d = lldiv(t, 1024);
+    t = d.quot;
+    r = d.rem;
+    ++uidx;
+  }
+  if(uidx+1 < sizeof(UNITS)/sizeof(UNITS[0]) && t >= 512) {
+    ++uidx;
+    r = t;
+    t = 0;
+  }
+  std::string res;
+  res += itos(t, true);
+  if(t < 10 && uidx > 0) {
+    res += ".";
+    res += itos(r*10/1024);
+  }
+  res += UNITS[uidx];
+  return res;
 }
 
 void sleep(long seconds) {

+ 8 - 5
test/UtilTest.cc

@@ -1550,13 +1550,16 @@ void UtilTest::testGetRealSize()
 
 void UtilTest::testAbbrevSize()
 {
-  CPPUNIT_ASSERT_EQUAL(std::string("4,096.0Mi"), util::abbrevSize(4294967296LL));
+  CPPUNIT_ASSERT_EQUAL(std::string("8,589,934,591Gi"),
+                       util::abbrevSize(9223372036854775807LL));
+  CPPUNIT_ASSERT_EQUAL(std::string("4.0Gi"), util::abbrevSize(4294967296LL));
   CPPUNIT_ASSERT_EQUAL(std::string("1.0Ki"), util::abbrevSize(1024));
-  CPPUNIT_ASSERT_EQUAL(std::string("1,023"), util::abbrevSize(1023));
+  CPPUNIT_ASSERT_EQUAL(std::string("0.9Ki"), util::abbrevSize(1023));
+  CPPUNIT_ASSERT_EQUAL(std::string("0.5Ki"), util::abbrevSize(512));
+  CPPUNIT_ASSERT_EQUAL(std::string("511"), util::abbrevSize(511));
   CPPUNIT_ASSERT_EQUAL(std::string("0"), util::abbrevSize(0));
   CPPUNIT_ASSERT_EQUAL(std::string("1.1Ki"), util::abbrevSize(1127));
   CPPUNIT_ASSERT_EQUAL(std::string("1.5Mi"), util::abbrevSize(1572864));
-
 }
 
 void UtilTest::testToStream()
@@ -1576,10 +1579,10 @@ void UtilTest::testToStream()
                                    "idx|path/length\n"
                                    "===+===========================================================================\n"
                                    "  1|aria2.tar.bz2\n"
-                                   "   |12.0KiB (12,300)\n"
+                                   "   |12KiB (12,300)\n"
                                    "---+---------------------------------------------------------------------------\n"
                                    "  2|aria2.txt\n"
-                                   "   |556B (556)\n"
+                                   "   |0.5KiB (556)\n"
                                    "---+---------------------------------------------------------------------------\n"),
                        readFile(filename));
 }