diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-11-23 13:17:48 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-11-23 13:17:48 +0000 |
| commit | 6e8074c0876fa97e1ba868e5053fc50cd8f487f5 (patch) | |
| tree | 9cc95e0d2df514dbb9280de586d0451b98a66229 /src/DefaultBtInteractive.cc | |
| parent | 95370fc11f82d3f351e3c4e7a5d462d360c2ac65 (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.cc | 86 |
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 |
