Quellcode durchsuchen

Specify torrent file explicitly in createRequestGroupForBitTorrent()

Tatsuhiro Tsujikawa vor 13 Jahren
Ursprung
Commit
c1ddf34e4b

+ 3 - 3
src/RpcMethodImpl.cc

@@ -293,13 +293,13 @@ SharedHandle<ValueBase> AddTorrentRpcMethod::process
   if(util::saveAs(filename, torrentParam->s(), true)) {
     A2_LOG_INFO(fmt("Uploaded torrent data was saved as %s", filename.c_str()));
     requestOption->put(PREF_TORRENT_FILE, filename);
-    createRequestGroupForBitTorrent(result, requestOption, uris);
   } else {
     A2_LOG_INFO(fmt("Uploaded torrent data was not saved."
                     " Failed to write file %s", filename.c_str()));
-    createRequestGroupForBitTorrent(result, requestOption,
-                                    uris, torrentParam->s());
+    filename.clear();
   }
+  createRequestGroupForBitTorrent(result, requestOption, uris, filename,
+                                  torrentParam->s());
 
   if(!result.empty()) {
     return addRequestGroup(result.front(), e, posGiven, pos);

+ 2 - 1
src/UTMetadataPostDownloadHandler.cc

@@ -97,7 +97,8 @@ void UTMetadataPostDownloadHandler::getNextRequestGroups
     // Don't adjust announce URI because it has been done when
     // RequestGroup is created with magnet URI.
     createRequestGroupForBitTorrent(newRgs, requestGroup->getOption(),
-                                    std::vector<std::string>(), torrent, false);
+                                    std::vector<std::string>(),
+                                    A2STR::NIL, torrent, false);
     requestGroup->followedBy(newRgs.begin(), newRgs.end());
     if(requestGroup->getMetadataInfo()) {
       setMetadataInfo(newRgs.begin(), newRgs.end(),

+ 3 - 5
src/download_helper.cc

@@ -242,13 +242,14 @@ void createRequestGroupForBitTorrent
 (std::vector<SharedHandle<RequestGroup> >& result,
  const SharedHandle<Option>& option,
  const std::vector<std::string>& uris,
+ const std::string& metaInfoUri,
  const std::string& torrentData,
  bool adjustAnnounceUri)
 {
   SharedHandle<ValueBase> torrent;
   bittorrent::ValueBaseBencodeParser parser;
   if(torrentData.empty()) {
-    torrent = parseFile(parser, option->get(PREF_TORRENT_FILE));
+    torrent = parseFile(parser, metaInfoUri);
   } else {
     ssize_t error;
     torrent = parser.parseFinal(torrentData.c_str(), torrentData.size(),
@@ -258,10 +259,7 @@ void createRequestGroupForBitTorrent
     throw DL_ABORT_EX2("Bencode decoding failed",
                        error_code::BENCODE_PARSE_ERROR);
   }
-  createRequestGroupForBitTorrent(result, option, uris,
-                                  torrentData.empty() ?
-                                  option->get(PREF_TORRENT_FILE) : "",
-                                  torrent);
+  createRequestGroupForBitTorrent(result, option, uris, metaInfoUri, torrent);
 }
 
 void createRequestGroupForBitTorrent

+ 9 - 4
src/download_helper.h

@@ -54,18 +54,23 @@ class ValueBase;
 
 #ifdef ENABLE_BITTORRENT
 // Create RequestGroup object using torrent file specified by
-// torrent-file option.  If non-empty torrentData is specified, then
-// it is used as a content of torrent file instead. If
-// adjustAnnounceUri is true, announce URIs are adjusted using
-// bittorrent::adjustAnnounceUri().  In this function,
+// metaInfoUri, which is treated as local file path. If non-empty
+// torrentData is specified, then it is used as a content of torrent
+// file instead. If adjustAnnounceUri is true, announce URIs are
+// adjusted using bittorrent::adjustAnnounceUri().  In this function,
 // force-sequential is ignored.
 void createRequestGroupForBitTorrent
 (std::vector<SharedHandle<RequestGroup> >& result,
  const SharedHandle<Option>& option,
  const std::vector<std::string>& uris,
+ const std::string& metaInfoUri,
  const std::string& torrentData = "",
  bool adjustAnnounceUri = true);
 
+// Create RequestGroup object using already decoded torrent metainfo
+// structure.  If adjustAnnounceUri is true, announce URIs are
+// adjusted using bittorrent::adjustAnnounceUri().  In this function,
+// force-sequential is ignored.
 void createRequestGroupForBitTorrent
 (std::vector<SharedHandle<RequestGroup> >& result,
  const SharedHandle<Option>& option,

+ 2 - 1
src/main.cc

@@ -233,7 +233,8 @@ error_code::Value main(int argc, char* argv[])
       showTorrentFile(op->get(PREF_TORRENT_FILE));
       return exitStatus;
     } else {
-      createRequestGroupForBitTorrent(requestGroups, op, args);
+      createRequestGroupForBitTorrent(requestGroups, op, args,
+                                      op->get(PREF_TORRENT_FILE));
     }
   }
   else

+ 8 - 5
test/DownloadHelperTest.cc

@@ -320,8 +320,9 @@ void DownloadHelperTest::testCreateRequestGroupForBitTorrent()
   option_->put(PREF_BT_EXCLUDE_TRACKER, "http://tracker1");
   {
     std::vector<SharedHandle<RequestGroup> > result;
-  
-    createRequestGroupForBitTorrent(result, option_, auxURIs);
+
+    createRequestGroupForBitTorrent(result, option_, auxURIs,
+                                    option_->get(PREF_TORRENT_FILE));
 
     CPPUNIT_ASSERT_EQUAL((size_t)1, result.size());
 
@@ -344,7 +345,8 @@ void DownloadHelperTest::testCreateRequestGroupForBitTorrent()
     // no URIs are given
     std::vector<SharedHandle<RequestGroup> > result;
     std::vector<std::string> emptyURIs;
-    createRequestGroupForBitTorrent(result, option_, emptyURIs);
+    createRequestGroupForBitTorrent(result, option_, emptyURIs,
+                                    option_->get(PREF_TORRENT_FILE));
 
     CPPUNIT_ASSERT_EQUAL((size_t)1, result.size());
     SharedHandle<RequestGroup> group = result[0];
@@ -355,8 +357,9 @@ void DownloadHelperTest::testCreateRequestGroupForBitTorrent()
   option_->put(PREF_FORCE_SEQUENTIAL, A2_V_TRUE);
   {
     std::vector<SharedHandle<RequestGroup> > result;
-  
-    createRequestGroupForBitTorrent(result, option_, auxURIs);
+
+    createRequestGroupForBitTorrent(result, option_, auxURIs,
+                                    option_->get(PREF_TORRENT_FILE));
 
     // See --force-requencial is ignored
     CPPUNIT_ASSERT_EQUAL((size_t)1, result.size());