mirror of https://github.com/aria2/aria2
				
				
				
			2009-12-06 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Set default value for SIZE in --bt-prioritize-piece to 1MiB. * src/usage_text.h * src/util.cc * test/UtilTest.ccpull/1/head
							parent
							
								
									5cc0d57e26
								
							
						
					
					
						commit
						a41b927a57
					
				| 
						 | 
					@ -1,3 +1,10 @@
 | 
				
			||||||
 | 
					2009-12-06  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Set default value for SIZE in --bt-prioritize-piece to 1MiB.
 | 
				
			||||||
 | 
						* src/usage_text.h
 | 
				
			||||||
 | 
						* src/util.cc
 | 
				
			||||||
 | 
						* test/UtilTest.cc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
2009-12-06  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 | 
					2009-12-06  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Updated Russian, Ukrainian, German and French translations.
 | 
						Updated Russian, Ukrainian, German and French translations.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -575,7 +575,7 @@ _(" --bt-prioritize-piece=head[=SIZE],tail[=SIZE] Try to download first and last
 | 
				
			||||||
  "                              first SIZE bytes of each file get higher priority.\n"\
 | 
					  "                              first SIZE bytes of each file get higher priority.\n"\
 | 
				
			||||||
  "                              tail=SIZE means the range of last SIZE bytes of\n"\
 | 
					  "                              tail=SIZE means the range of last SIZE bytes of\n"\
 | 
				
			||||||
  "                              each file. SIZE can include K or M(1K = 1024, 1M =\n"\
 | 
					  "                              each file. SIZE can include K or M(1K = 1024, 1M =\n"\
 | 
				
			||||||
  "                              1024K).")
 | 
					  "                              1024K). If SIZE is omitted, SIZE=1M is used.")
 | 
				
			||||||
#define TEXT_INTERFACE \
 | 
					#define TEXT_INTERFACE \
 | 
				
			||||||
_(" --interface=INTERFACE        Bind sockets to given interface. You can specify\n"\
 | 
					_(" --interface=INTERFACE        Bind sockets to given interface. You can specify\n"\
 | 
				
			||||||
  "                              interface name, IP address and hostname.")
 | 
					  "                              interface name, IP address and hostname.")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										90
									
								
								src/util.cc
								
								
								
								
							
							
						
						
									
										90
									
								
								src/util.cc
								
								
								
								
							| 
						 | 
					@ -525,60 +525,78 @@ IntSequence parseIntRange(const std::string& src)
 | 
				
			||||||
  return values;
 | 
					  return values;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void computeHeadPieces
 | 
				
			||||||
 | 
					(std::vector<size_t>& indexes,
 | 
				
			||||||
 | 
					 const std::vector<SharedHandle<FileEntry> >& fileEntries,
 | 
				
			||||||
 | 
					 size_t pieceLength,
 | 
				
			||||||
 | 
					 uint64_t head)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if(head == 0) {
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  for(std::vector<SharedHandle<FileEntry> >::const_iterator fi =
 | 
				
			||||||
 | 
						fileEntries.begin(); fi != fileEntries.end(); ++fi) {
 | 
				
			||||||
 | 
					    if((*fi)->getLength() == 0) {
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    size_t lastIndex =
 | 
				
			||||||
 | 
					      ((*fi)->getOffset()+std::min(head, (*fi)->getLength())-1)/pieceLength;
 | 
				
			||||||
 | 
					    for(size_t index = (*fi)->getOffset()/pieceLength;
 | 
				
			||||||
 | 
						index <= lastIndex; ++index) {
 | 
				
			||||||
 | 
					      indexes.push_back(index);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void computeTailPieces
 | 
				
			||||||
 | 
					(std::vector<size_t>& indexes,
 | 
				
			||||||
 | 
					 const std::vector<SharedHandle<FileEntry> >& fileEntries,
 | 
				
			||||||
 | 
					 size_t pieceLength,
 | 
				
			||||||
 | 
					 uint64_t tail)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if(tail == 0) {
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  for(std::vector<SharedHandle<FileEntry> >::const_iterator fi =
 | 
				
			||||||
 | 
						fileEntries.begin(); fi != fileEntries.end(); ++fi) {
 | 
				
			||||||
 | 
					    if((*fi)->getLength() == 0) {
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    uint64_t endOffset = (*fi)->getLastOffset();
 | 
				
			||||||
 | 
					    size_t fromIndex =
 | 
				
			||||||
 | 
					      (endOffset-1-(std::min(tail, (*fi)->getLength())-1))/pieceLength;
 | 
				
			||||||
 | 
					    for(size_t index = fromIndex; index <= (endOffset-1)/pieceLength;
 | 
				
			||||||
 | 
						++index) {
 | 
				
			||||||
 | 
					      indexes.push_back(index);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void parsePrioritizePieceRange
 | 
					void parsePrioritizePieceRange
 | 
				
			||||||
(std::vector<size_t>& result, const std::string& src,
 | 
					(std::vector<size_t>& result, const std::string& src,
 | 
				
			||||||
 const std::vector<SharedHandle<FileEntry> >& fileEntries,
 | 
					 const std::vector<SharedHandle<FileEntry> >& fileEntries,
 | 
				
			||||||
 size_t pieceLength)
 | 
					 size_t pieceLength)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					  const uint64_t DEFAULT_SIZE = 1024*1024;
 | 
				
			||||||
  std::vector<size_t> indexes;
 | 
					  std::vector<size_t> indexes;
 | 
				
			||||||
  std::vector<std::string> parts;
 | 
					  std::vector<std::string> parts;
 | 
				
			||||||
  split(src, std::back_inserter(parts), ",", true);
 | 
					  split(src, std::back_inserter(parts), ",", true);
 | 
				
			||||||
  for(std::vector<std::string>::const_iterator i = parts.begin();
 | 
					  for(std::vector<std::string>::const_iterator i = parts.begin();
 | 
				
			||||||
      i != parts.end(); ++i) {
 | 
					      i != parts.end(); ++i) {
 | 
				
			||||||
    if((*i) == "head") {
 | 
					    if((*i) == "head") {
 | 
				
			||||||
      for(std::vector<SharedHandle<FileEntry> >::const_iterator fi = 
 | 
					      computeHeadPieces(indexes, fileEntries, pieceLength, DEFAULT_SIZE);
 | 
				
			||||||
	    fileEntries.begin(); fi != fileEntries.end(); ++fi) {
 | 
					 | 
				
			||||||
	indexes.push_back((*fi)->getOffset()/pieceLength);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    } else if(util::startsWith(*i, "head=")) {
 | 
					    } else if(util::startsWith(*i, "head=")) {
 | 
				
			||||||
      std::string sizestr = std::string((*i).begin()+(*i).find("=")+1,
 | 
					      std::string sizestr = std::string((*i).begin()+(*i).find("=")+1,
 | 
				
			||||||
					(*i).end());
 | 
										(*i).end());
 | 
				
			||||||
      uint64_t head = std::max((int64_t)0, getRealSize(sizestr));
 | 
					      computeHeadPieces(indexes, fileEntries, pieceLength,
 | 
				
			||||||
      for(std::vector<SharedHandle<FileEntry> >::const_iterator fi =
 | 
								std::max((int64_t)0, getRealSize(sizestr)));
 | 
				
			||||||
	    fileEntries.begin(); fi != fileEntries.end(); ++fi) {
 | 
					 | 
				
			||||||
	if((*fi)->getLength() == 0) {
 | 
					 | 
				
			||||||
	  continue;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	size_t lastIndex =
 | 
					 | 
				
			||||||
	  ((*fi)->getOffset()+std::min(head, (*fi)->getLength())-1)/pieceLength;
 | 
					 | 
				
			||||||
	for(size_t index = (*fi)->getOffset()/pieceLength;
 | 
					 | 
				
			||||||
	    index <= lastIndex; ++index) {
 | 
					 | 
				
			||||||
	  indexes.push_back(index);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    } else if((*i) == "tail") {
 | 
					    } else if((*i) == "tail") {
 | 
				
			||||||
      for(std::vector<SharedHandle<FileEntry> >::const_iterator fi =
 | 
					      computeHeadPieces(indexes, fileEntries, pieceLength, DEFAULT_SIZE);
 | 
				
			||||||
	    fileEntries.begin(); fi != fileEntries.end(); ++fi) {
 | 
					 | 
				
			||||||
	indexes.push_back
 | 
					 | 
				
			||||||
	  (((*fi)->getOffset()+(*fi)->getLength()-1)/pieceLength);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    } else if(util::startsWith(*i, "tail=")) {
 | 
					    } else if(util::startsWith(*i, "tail=")) {
 | 
				
			||||||
      std::string sizestr = std::string((*i).begin()+(*i).find("=")+1,
 | 
					      std::string sizestr = std::string((*i).begin()+(*i).find("=")+1,
 | 
				
			||||||
					(*i).end());
 | 
										(*i).end());
 | 
				
			||||||
      uint64_t tail = std::max((int64_t)0, getRealSize(sizestr));
 | 
					      computeTailPieces(indexes, fileEntries, pieceLength,
 | 
				
			||||||
      for(std::vector<SharedHandle<FileEntry> >::const_iterator fi =
 | 
								std::max((int64_t)0, getRealSize(sizestr)));
 | 
				
			||||||
	    fileEntries.begin(); fi != fileEntries.end(); ++fi) {
 | 
					 | 
				
			||||||
	if((*fi)->getLength() == 0) {
 | 
					 | 
				
			||||||
	  continue;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	uint64_t endOffset = (*fi)->getLastOffset();
 | 
					 | 
				
			||||||
	size_t fromIndex =
 | 
					 | 
				
			||||||
	  (endOffset-1-(std::min(tail, (*fi)->getLength())-1))/pieceLength;
 | 
					 | 
				
			||||||
	for(size_t index = fromIndex; index <= (endOffset-1)/pieceLength;
 | 
					 | 
				
			||||||
	    ++index) {
 | 
					 | 
				
			||||||
	  indexes.push_back(index);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      throw DL_ABORT_EX
 | 
					      throw DL_ABORT_EX
 | 
				
			||||||
	(StringFormat("Unrecognized token %s", (*i).c_str()).str());
 | 
						(StringFormat("Unrecognized token %s", (*i).c_str()).str());
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -842,13 +842,13 @@ void UtilTest::testParsePrioritizePieceRange()
 | 
				
			||||||
  entries[3].reset(new FileEntry("file4",3584,entries[2]->getLastOffset()));
 | 
					  entries[3].reset(new FileEntry("file4",3584,entries[2]->getLastOffset()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  std::vector<size_t> result;
 | 
					  std::vector<size_t> result;
 | 
				
			||||||
  util::parsePrioritizePieceRange(result, "head", entries, pieceLength);
 | 
					  util::parsePrioritizePieceRange(result, "head=1", entries, pieceLength);
 | 
				
			||||||
  CPPUNIT_ASSERT_EQUAL((size_t)3, result.size());
 | 
					  CPPUNIT_ASSERT_EQUAL((size_t)3, result.size());
 | 
				
			||||||
  CPPUNIT_ASSERT_EQUAL((size_t)0, result[0]);
 | 
					  CPPUNIT_ASSERT_EQUAL((size_t)0, result[0]);
 | 
				
			||||||
  CPPUNIT_ASSERT_EQUAL((size_t)1, result[1]);
 | 
					  CPPUNIT_ASSERT_EQUAL((size_t)1, result[1]);
 | 
				
			||||||
  CPPUNIT_ASSERT_EQUAL((size_t)3, result[2]);
 | 
					  CPPUNIT_ASSERT_EQUAL((size_t)3, result[2]);
 | 
				
			||||||
  result.clear();
 | 
					  result.clear();
 | 
				
			||||||
  util::parsePrioritizePieceRange(result, "tail", entries, pieceLength);
 | 
					  util::parsePrioritizePieceRange(result, "tail=1", entries, pieceLength);
 | 
				
			||||||
  CPPUNIT_ASSERT_EQUAL((size_t)3, result.size());
 | 
					  CPPUNIT_ASSERT_EQUAL((size_t)3, result.size());
 | 
				
			||||||
  CPPUNIT_ASSERT_EQUAL((size_t)0, result[0]);
 | 
					  CPPUNIT_ASSERT_EQUAL((size_t)0, result[0]);
 | 
				
			||||||
  CPPUNIT_ASSERT_EQUAL((size_t)3, result[1]);
 | 
					  CPPUNIT_ASSERT_EQUAL((size_t)3, result[1]);
 | 
				
			||||||
| 
						 | 
					@ -868,15 +868,14 @@ void UtilTest::testParsePrioritizePieceRange()
 | 
				
			||||||
  CPPUNIT_ASSERT_EQUAL((size_t)3, result[2]);
 | 
					  CPPUNIT_ASSERT_EQUAL((size_t)3, result[2]);
 | 
				
			||||||
  CPPUNIT_ASSERT_EQUAL((size_t)6, result[3]);
 | 
					  CPPUNIT_ASSERT_EQUAL((size_t)6, result[3]);
 | 
				
			||||||
  result.clear();
 | 
					  result.clear();
 | 
				
			||||||
  util::parsePrioritizePieceRange(result, "head,tail", entries, pieceLength);
 | 
					  util::parsePrioritizePieceRange(result, "head=1,tail=1", entries, pieceLength);
 | 
				
			||||||
  CPPUNIT_ASSERT_EQUAL((size_t)4, result.size());
 | 
					  CPPUNIT_ASSERT_EQUAL((size_t)4, result.size());
 | 
				
			||||||
  CPPUNIT_ASSERT_EQUAL((size_t)0, result[0]);
 | 
					  CPPUNIT_ASSERT_EQUAL((size_t)0, result[0]);
 | 
				
			||||||
  CPPUNIT_ASSERT_EQUAL((size_t)1, result[1]);
 | 
					  CPPUNIT_ASSERT_EQUAL((size_t)1, result[1]);
 | 
				
			||||||
  CPPUNIT_ASSERT_EQUAL((size_t)3, result[2]);
 | 
					  CPPUNIT_ASSERT_EQUAL((size_t)3, result[2]);
 | 
				
			||||||
  CPPUNIT_ASSERT_EQUAL((size_t)6, result[3]);
 | 
					  CPPUNIT_ASSERT_EQUAL((size_t)6, result[3]);
 | 
				
			||||||
  result.clear();
 | 
					  result.clear();
 | 
				
			||||||
  util::parsePrioritizePieceRange
 | 
					  util::parsePrioritizePieceRange(result, "head,tail", entries, pieceLength);
 | 
				
			||||||
    (result, "head=300M,tail=300M", entries, pieceLength);
 | 
					 | 
				
			||||||
  CPPUNIT_ASSERT_EQUAL((size_t)7, result.size());
 | 
					  CPPUNIT_ASSERT_EQUAL((size_t)7, result.size());
 | 
				
			||||||
  for(size_t i = 0; i < 7; ++i) {
 | 
					  for(size_t i = 0; i < 7; ++i) {
 | 
				
			||||||
    CPPUNIT_ASSERT_EQUAL(i, result[i]);
 | 
					    CPPUNIT_ASSERT_EQUAL(i, result[i]);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue