ソースを参照

2008-06-09 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	Changed -s options behavior. Now it means the number of 
connections
	made simultaneously in each http/ftp download.
	If 1 URL is specified, the behavior is the same with old 
implementation.
	If -s N is given and more than N URLs are specified, first N 
URLs are
	used and remaining URLs are used for backup. If less than N URLs 
are
	specified, some of URLs are used more than once so that totally 
N
	connections are made simultaneously.
	* src/main.cc
Tatsuhiro Tsujikawa 17 年 前
コミット
32edb40d7d
2 ファイル変更57 行追加21 行削除
  1. 11 0
      ChangeLog
  2. 46 21
      src/main.cc

+ 11 - 0
ChangeLog

@@ -1,3 +1,14 @@
+2008-06-09  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	Changed -s options behavior. Now it means the number of connections
+	made simultaneously in each http/ftp download.
+	If 1 URL is specified, the behavior is the same with old implementation.
+	If -s N is given and more than N URLs are specified, first N URLs are
+	used and remaining URLs are used for backup. If less than N URLs are
+	specified, some of URLs are used more than once so that totally N
+	connections are made simultaneously.
+	* src/main.cc
+
 2008-06-09  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	Included missing iosfwd or ostream header.

+ 46 - 21
src/main.cc

@@ -168,23 +168,32 @@ createBtRequestGroup(const std::string& torrentFilePath,
   return rg;
 }
 
-int32_t downloadBitTorrent(Option* op, const std::deque<std::string>& uri)
+int32_t downloadBitTorrent(Option* op, const std::deque<std::string>& uris)
 {
   std::deque<std::string> nargs;
   if(op->get(PREF_PARAMETERIZED_URI) == V_TRUE) {
-    nargs = unfoldURI(uri);
+    nargs = unfoldURI(uris);
   } else {
-    nargs = uri;
+    nargs = uris;
   }
-  std::deque<std::string> xargs;
-  ncopy(nargs.begin(), nargs.end(), op->getAsInt(PREF_SPLIT),
-	std::back_inserter(xargs));
-  
-  RequestGroupHandle rg = createBtRequestGroup(op->get(PREF_TORRENT_FILE),
-					       op, xargs);
-  
   RequestGroups groups;
-  groups.push_back(rg);
+  size_t numSplit = op->getAsInt(PREF_SPLIT);
+  if(nargs.size() >= numSplit) {
+    RequestGroupHandle rg = createBtRequestGroup(op->get(PREF_TORRENT_FILE),
+						 op, nargs);
+    rg->setNumConcurrentCommand(numSplit);
+    groups.push_back(rg);
+  } else {
+    std::deque<std::string> xargs;
+    if(!nargs.empty()) {
+      ncopy(nargs.begin(), nargs.end(), numSplit, std::back_inserter(xargs));
+      xargs.erase(xargs.begin()+numSplit, xargs.end());
+    }
+    RequestGroupHandle rg = createBtRequestGroup(op->get(PREF_TORRENT_FILE),
+						 op, xargs);
+    rg->setNumConcurrentCommand(numSplit);
+    groups.push_back(rg);
+  }
   return MultiUrlRequestInfo(groups, op, getStatCalc(op), getSummaryOut(op)).execute();
 }
 #endif // ENABLE_BITTORRENT
@@ -263,12 +272,20 @@ int32_t downloadUriList(Option* op, std::istream& in)
 		    AccRequestGroup(groups, op));
     } else if(uris.size() == 1) {
       std::for_each(uris.begin(), uris.end(), AccRequestGroup(groups, op));
-    } else if(uris.size() > 0) {
-      std::deque<std::string> xuris;
-      ncopy(uris.begin(), uris.end(), op->getAsInt(PREF_SPLIT),
-	    std::back_inserter(xuris));
-      SharedHandle<RequestGroup> rg = createRequestGroup(op, xuris);
-      groups.push_back(rg);
+    } else if(!uris.empty()) {
+      size_t numSplit = op->getAsInt(PREF_SPLIT);
+      if(uris.size() >= numSplit) {
+	SharedHandle<RequestGroup> rg = createRequestGroup(op, uris);
+	rg->setNumConcurrentCommand(numSplit);
+	groups.push_back(rg);
+      } else {
+	std::deque<std::string> xuris;
+	ncopy(uris.begin(), uris.end(), numSplit, std::back_inserter(xuris));
+	xuris.erase(xuris.begin()+numSplit, xuris.end());
+	SharedHandle<RequestGroup> rg = createRequestGroup(op, xuris);
+	rg->setNumConcurrentCommand(numSplit);
+	groups.push_back(rg);
+      }
     }
   }
   return MultiUrlRequestInfo(groups, op, getStatCalc(op), getSummaryOut(op)).execute();
@@ -313,11 +330,19 @@ int32_t downloadUri(Option* op, const std::deque<std::string>& uris)
     std::deque<std::string>::iterator strmProtoEnd =
       std::stable_partition(nargs.begin(), nargs.end(), StreamProtocolFilter());
     // let's process http/ftp protocols first.
-    std::deque<std::string> xargs;
-    ncopy(nargs.begin(), strmProtoEnd, op->getAsInt(PREF_SPLIT),
-	  std::back_inserter(xargs));
-    if(xargs.size()) {
+    size_t numSplit = op->getAsInt(PREF_SPLIT);
+    size_t numURIs = std::distance(nargs.begin(), strmProtoEnd);
+    if(numURIs >= numSplit) {
+      std::deque<std::string> xargs(nargs.begin(), strmProtoEnd);
+      RequestGroupHandle rg = createRequestGroup(op, xargs, op->get(PREF_OUT));
+      rg->setNumConcurrentCommand(numSplit);
+      groups.push_back(rg);
+    } else if(numURIs > 0) {
+      std::deque<std::string> xargs;
+      ncopy(nargs.begin(), strmProtoEnd, numSplit, std::back_inserter(xargs));
+      xargs.erase(xargs.begin()+numSplit, xargs.end());
       RequestGroupHandle rg = createRequestGroup(op, xargs, op->get(PREF_OUT));
+      rg->setNumConcurrentCommand(numSplit);
       groups.push_back(rg);
     }
     // process remaining URIs(local metalink, BitTorrent files)