summaryrefslogtreecommitdiff
path: root/src/DefaultBtInteractive.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-11-23 13:17:48 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-11-23 13:17:48 +0000
commit6e8074c0876fa97e1ba868e5053fc50cd8f487f5 (patch)
tree9cc95e0d2df514dbb9280de586d0451b98a66229 /src/DefaultBtInteractive.cc
parent95370fc11f82d3f351e3c4e7a5d462d360c2ac65 (diff)
2009-11-23 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added BitTorrent Magnet Link support. Base32 encoded link is not supported yet. Fixed typo in method name in RequestGroup. In metadataGetMode, don't show "Your share ratio was ..." message. * src/DefaultBtInteractive.cc * src/DefaultBtInteractive.h * src/DownloadHandlerFactory.cc * src/DownloadHandlerFactory.h * src/HandshakeExtensionMessage.cc * src/Makefile.am * src/Metalink2RequestGroup.cc * src/PeerInteractionCommand.cc * src/RequestGroup.cc * src/RequestGroup.h * src/UTMetadataPostDownloadHandler.cc * src/UTMetadataPostDownloadHandler.h * src/download_helper.cc * test/HandshakeExtensionMessageTest.cc * test/Makefile.am * test/UTMetadataPostDownloadHandlerTest.cc * test/UTMetadataRejectExtensionMessageTest.cc
Diffstat (limited to 'src/DefaultBtInteractive.cc')
-rw-r--r--src/DefaultBtInteractive.cc86
1 files changed, 68 insertions, 18 deletions
diff --git a/src/DefaultBtInteractive.cc b/src/DefaultBtInteractive.cc
index 3dd62096..df70e063 100644
--- a/src/DefaultBtInteractive.cc
+++ b/src/DefaultBtInteractive.cc
@@ -69,6 +69,8 @@
#include "RequestGroup.h"
#include "RequestGroupMan.h"
#include "bittorrent_helper.h"
+#include "UTMetadataRequestFactory.h"
+#include "UTMetadataRequestTracker.h"
namespace aria2 {
@@ -78,6 +80,7 @@ DefaultBtInteractive::DefaultBtInteractive
:
_downloadContext(downloadContext),
peer(peer),
+ _metadataGetMode(false),
logger(LogFactory::getInstance()),
allowedFastSetSize(10),
keepAliveInterval(120),
@@ -146,11 +149,15 @@ void DefaultBtInteractive::doPostHandshakeProcessing() {
if(peer->isExtendedMessagingEnabled()) {
addHandshakeExtendedMessageToQueue();
}
- addBitfieldMessageToQueue();
+ if(!_metadataGetMode) {
+ addBitfieldMessageToQueue();
+ }
if(peer->isDHTEnabled() && _dhtEnabled) {
addPortMessageToQueue();
}
- addAllowedFastMessageToQueue();
+ if(!_metadataGetMode) {
+ addAllowedFastMessageToQueue();
+ }
sendPendingMessage();
}
@@ -365,6 +372,16 @@ void DefaultBtInteractive::addRequests() {
void DefaultBtInteractive::cancelAllPiece() {
btRequestFactory->removeAllTargetPiece();
+ if(_metadataGetMode && _downloadContext->getTotalLength() > 0) {
+ std::vector<size_t> metadataRequests =
+ _utMetadataRequestTracker->getAllTrackedIndex();
+ for(std::vector<size_t>::const_iterator i = metadataRequests.begin();
+ i != metadataRequests.end(); ++i) {
+ logger->debug("Cancel metadata: piece=%lu",
+ static_cast<unsigned long>(*i));
+ _pieceStorage->cancelPiece(_pieceStorage->getPiece(*i));
+ }
+ }
}
void DefaultBtInteractive::sendPendingMessage() {
@@ -439,29 +456,58 @@ void DefaultBtInteractive::addPeerExchangeMessage()
}
void DefaultBtInteractive::doInteractionProcessing() {
- checkActiveInteraction();
+ if(_metadataGetMode) {
+ sendKeepAlive();
+ _numReceivedMessage = receiveMessages();
+ // PieceStorage is re-initialized with metadata_size in
+ // HandshakeExtensionMessage::doReceivedAction().
+ _pieceStorage =
+ _downloadContext->getOwnerRequestGroup()->getPieceStorage();
+
+ if(peer->getExtensionMessageID("ut_metadata") &&
+ _downloadContext->getTotalLength() > 0) {
+ size_t num = _utMetadataRequestTracker->avail();
+ if(num > 0) {
+ std::deque<SharedHandle<BtMessage> > requests;
+ _utMetadataRequestFactory->create(requests, num, _pieceStorage);
+ dispatcher->addMessageToQueue(requests);
+ }
+ if(_perSecCheckPoint.elapsed(1)) {
+ _perSecCheckPoint.reset();
+ // Drop timeout request after queuing message to give a chance
+ // to other connection to request piece.
+ std::vector<size_t> indexes =
+ _utMetadataRequestTracker->removeTimeoutEntry();
+ for(std::vector<size_t>::const_iterator i = indexes.begin();
+ i != indexes.end(); ++i) {
+ _pieceStorage->cancelPiece(_pieceStorage->getPiece(*i));
+ }
+ }
+ }
+ } else {
+ checkActiveInteraction();
- decideChoking();
+ decideChoking();
- detectMessageFlooding();
+ detectMessageFlooding();
- if(_perSecCheckPoint.elapsed(1)) {
- _perSecCheckPoint.reset();
- dispatcher->checkRequestSlotAndDoNecessaryThing();
- }
- checkHave();
+ if(_perSecCheckPoint.elapsed(1)) {
+ _perSecCheckPoint.reset();
+ dispatcher->checkRequestSlotAndDoNecessaryThing();
+ }
+ checkHave();
- sendKeepAlive();
+ sendKeepAlive();
- _numReceivedMessage = receiveMessages();
+ _numReceivedMessage = receiveMessages();
- btRequestFactory->removeCompletedPiece();
+ btRequestFactory->removeCompletedPiece();
- decideInterest();
- if(!_pieceStorage->downloadFinished()) {
- addRequests();
+ decideInterest();
+ if(!_pieceStorage->downloadFinished()) {
+ addRequests();
+ }
}
-
if(peer->getExtensionMessageID("ut_pex") && _utPexEnabled) {
addPeerExchangeMessage();
}
@@ -491,7 +537,11 @@ size_t DefaultBtInteractive::countReceivedMessageInIteration() const
size_t DefaultBtInteractive::countOutstandingRequest()
{
- return dispatcher->countOutstandingRequest();
+ if(_metadataGetMode) {
+ return _utMetadataRequestTracker->count();
+ } else {
+ return dispatcher->countOutstandingRequest();
+ }
}
void DefaultBtInteractive::setBtRuntime