Refactor PeerInterationCommand ctor

pull/106/head
Tatsuhiro Tsujikawa 2013-07-06 21:12:55 +09:00
parent 3c66c18489
commit 3f5f1e26d9
8 changed files with 181 additions and 180 deletions

View File

@ -614,27 +614,27 @@ void DefaultBtInteractive::setPeer(const std::shared_ptr<Peer>& peer)
} }
void DefaultBtInteractive::setBtMessageReceiver void DefaultBtInteractive::setBtMessageReceiver
(const std::shared_ptr<BtMessageReceiver>& receiver) (std::unique_ptr<BtMessageReceiver> receiver)
{ {
btMessageReceiver_ = receiver; btMessageReceiver_ = std::move(receiver);
} }
void DefaultBtInteractive::setDispatcher void DefaultBtInteractive::setDispatcher
(const std::shared_ptr<BtMessageDispatcher>& dispatcher) (std::unique_ptr<BtMessageDispatcher> dispatcher)
{ {
dispatcher_ = dispatcher; dispatcher_ = std::move(dispatcher);
} }
void DefaultBtInteractive::setBtRequestFactory void DefaultBtInteractive::setBtRequestFactory
(const std::shared_ptr<BtRequestFactory>& factory) (std::unique_ptr<BtRequestFactory> factory)
{ {
btRequestFactory_ = factory; btRequestFactory_ = std::move(factory);
} }
void DefaultBtInteractive::setPeerConnection void DefaultBtInteractive::setPeerConnection
(const std::shared_ptr<PeerConnection>& peerConnection) (std::unique_ptr<PeerConnection> peerConnection)
{ {
peerConnection_ = peerConnection; peerConnection_ = std::move(peerConnection);
} }
void DefaultBtInteractive::setExtensionMessageFactory void DefaultBtInteractive::setExtensionMessageFactory
@ -644,9 +644,9 @@ void DefaultBtInteractive::setExtensionMessageFactory
} }
void DefaultBtInteractive::setBtMessageFactory void DefaultBtInteractive::setBtMessageFactory
(const std::shared_ptr<BtMessageFactory>& factory) (std::unique_ptr<BtMessageFactory> factory)
{ {
messageFactory_ = factory; messageFactory_ = std::move(factory);
} }
void DefaultBtInteractive::setRequestGroupMan(RequestGroupMan* rgman) void DefaultBtInteractive::setRequestGroupMan(RequestGroupMan* rgman)
@ -654,4 +654,22 @@ void DefaultBtInteractive::setRequestGroupMan(RequestGroupMan* rgman)
requestGroupMan_ = rgman; requestGroupMan_ = rgman;
} }
void DefaultBtInteractive::setExtensionMessageRegistry
(std::unique_ptr<ExtensionMessageRegistry> registry)
{
extensionMessageRegistry_ = std::move(registry);
}
void DefaultBtInteractive::setUTMetadataRequestTracker
(std::unique_ptr<UTMetadataRequestTracker> tracker)
{
utMetadataRequestTracker_ = std::move(tracker);
}
void DefaultBtInteractive::setUTMetadataRequestFactory
(std::unique_ptr<UTMetadataRequestFactory> factory)
{
utMetadataRequestFactory_ = std::move(factory);
}
} // namespace aria2 } // namespace aria2

View File

@ -110,17 +110,15 @@ private:
std::shared_ptr<Peer> peer_; std::shared_ptr<Peer> peer_;
std::shared_ptr<BtMessageReceiver> btMessageReceiver_; std::unique_ptr<BtMessageReceiver> btMessageReceiver_;
std::shared_ptr<BtMessageDispatcher> dispatcher_; std::unique_ptr<BtMessageDispatcher> dispatcher_;
std::shared_ptr<BtRequestFactory> btRequestFactory_; std::unique_ptr<BtRequestFactory> btRequestFactory_;
// Although peerStorage_ is not used in this class, this object std::unique_ptr<PeerConnection> peerConnection_;
// holds the reference so that peerConnection_ is not deleted. std::unique_ptr<BtMessageFactory> messageFactory_;
std::shared_ptr<PeerConnection> peerConnection_;
std::shared_ptr<BtMessageFactory> messageFactory_;
std::unique_ptr<ExtensionMessageFactory> extensionMessageFactory_; std::unique_ptr<ExtensionMessageFactory> extensionMessageFactory_;
std::shared_ptr<ExtensionMessageRegistry> extensionMessageRegistry_; std::unique_ptr<ExtensionMessageRegistry> extensionMessageRegistry_;
std::shared_ptr<UTMetadataRequestFactory> utMetadataRequestFactory_; std::unique_ptr<UTMetadataRequestFactory> utMetadataRequestFactory_;
std::shared_ptr<UTMetadataRequestTracker> utMetadataRequestTracker_; std::unique_ptr<UTMetadataRequestTracker> utMetadataRequestTracker_;
bool metadataGetMode_; bool metadataGetMode_;
@ -210,24 +208,21 @@ public:
void setPeer(const std::shared_ptr<Peer>& peer); void setPeer(const std::shared_ptr<Peer>& peer);
void setBtMessageReceiver(const std::shared_ptr<BtMessageReceiver>& receiver); void setBtMessageReceiver(std::unique_ptr<BtMessageReceiver> receiver);
void setDispatcher(const std::shared_ptr<BtMessageDispatcher>& dispatcher); void setDispatcher(std::unique_ptr<BtMessageDispatcher> dispatcher);
void setBtRequestFactory(const std::shared_ptr<BtRequestFactory>& factory); void setBtRequestFactory(std::unique_ptr<BtRequestFactory> factory);
void setPeerConnection(const std::shared_ptr<PeerConnection>& peerConnection); void setPeerConnection(std::unique_ptr<PeerConnection> peerConnection);
void setBtMessageFactory(const std::shared_ptr<BtMessageFactory>& factory); void setBtMessageFactory(std::unique_ptr<BtMessageFactory> factory);
void setExtensionMessageFactory void setExtensionMessageFactory
(std::unique_ptr<ExtensionMessageFactory> factory); (std::unique_ptr<ExtensionMessageFactory> factory);
void setExtensionMessageRegistry void setExtensionMessageRegistry
(const std::shared_ptr<ExtensionMessageRegistry>& registry) (std::unique_ptr<ExtensionMessageRegistry> registry);
{
extensionMessageRegistry_ = registry;
}
void setKeepAliveInterval(time_t keepAliveInterval) { void setKeepAliveInterval(time_t keepAliveInterval) {
keepAliveInterval_ = keepAliveInterval; keepAliveInterval_ = keepAliveInterval;
@ -248,16 +243,10 @@ public:
void setRequestGroupMan(RequestGroupMan* rgman); void setRequestGroupMan(RequestGroupMan* rgman);
void setUTMetadataRequestTracker void setUTMetadataRequestTracker
(const std::shared_ptr<UTMetadataRequestTracker>& tracker) (std::unique_ptr<UTMetadataRequestTracker> tracker);
{
utMetadataRequestTracker_ = tracker;
}
void setUTMetadataRequestFactory void setUTMetadataRequestFactory
(const std::shared_ptr<UTMetadataRequestFactory>& factory) (std::unique_ptr<UTMetadataRequestFactory> factory);
{
utMetadataRequestFactory_ = factory;
}
void enableMetadataGetMode() void enableMetadataGetMode()
{ {

View File

@ -149,8 +149,8 @@ bool InitiatorMSEHandshakeCommand::executeInternal() {
} }
case INITIATOR_RECEIVE_PAD_D: { case INITIATOR_RECEIVE_PAD_D: {
if(mseHandshake_->receivePad()) { if(mseHandshake_->receivePad()) {
std::shared_ptr<PeerConnection> peerConnection auto peerConnection = make_unique<PeerConnection>
(new PeerConnection(getCuid(), getPeer(), getSocket())); (getCuid(), getPeer(), getSocket());
if(mseHandshake_->getNegotiatedCryptoType() == if(mseHandshake_->getNegotiatedCryptoType() ==
MSEHandshake::CRYPTO_ARC4){ MSEHandshake::CRYPTO_ARC4){
size_t buflen = mseHandshake_->getBufferLength(); size_t buflen = mseHandshake_->getBufferLength();
@ -172,7 +172,7 @@ bool InitiatorMSEHandshakeCommand::executeInternal() {
peerStorage_, peerStorage_,
getSocket(), getSocket(),
PeerInteractionCommand::INITIATOR_SEND_HANDSHAKE, PeerInteractionCommand::INITIATOR_SEND_HANDSHAKE,
peerConnection)); std::move(peerConnection)));
return true; return true;
} else { } else {
done = true; done = true;

View File

@ -90,13 +90,13 @@ PeerInteractionCommand::PeerInteractionCommand
const std::shared_ptr<PeerStorage>& peerStorage, const std::shared_ptr<PeerStorage>& peerStorage,
const std::shared_ptr<SocketCore>& s, const std::shared_ptr<SocketCore>& s,
Seq sequence, Seq sequence,
const std::shared_ptr<PeerConnection>& passedPeerConnection) std::unique_ptr<PeerConnection> peerConnection)
:PeerAbstractCommand(cuid, p, e, s), : PeerAbstractCommand{cuid, p, e, s},
requestGroup_(requestGroup), requestGroup_{requestGroup},
btRuntime_(btRuntime), btRuntime_{btRuntime},
pieceStorage_(pieceStorage), pieceStorage_{pieceStorage},
peerStorage_(peerStorage), peerStorage_{peerStorage},
sequence_(sequence) sequence_{sequence}
{ {
// TODO move following bunch of processing to separate method, like init() // TODO move following bunch of processing to separate method, like init()
if(sequence_ == INITIATOR_SEND_HANDSHAKE) { if(sequence_ == INITIATOR_SEND_HANDSHAKE) {
@ -119,59 +119,47 @@ PeerInteractionCommand::PeerInteractionCommand
bittorrent::getTorrentAttrs(requestGroup_->getDownloadContext()); bittorrent::getTorrentAttrs(requestGroup_->getDownloadContext());
bool metadataGetMode = torrentAttrs->metadata.empty(); bool metadataGetMode = torrentAttrs->metadata.empty();
std::shared_ptr<ExtensionMessageRegistry> exMsgRegistry auto exMsgRegistry = make_unique<ExtensionMessageRegistry>();
(new ExtensionMessageRegistry());
exMsgRegistry->setExtensionMessageID(ExtensionMessageRegistry::UT_PEX, 8); exMsgRegistry->setExtensionMessageID(ExtensionMessageRegistry::UT_PEX, 8);
// http://www.bittorrent.org/beps/bep_0009.html // http://www.bittorrent.org/beps/bep_0009.html
exMsgRegistry->setExtensionMessageID(ExtensionMessageRegistry::UT_METADATA, exMsgRegistry->setExtensionMessageID(ExtensionMessageRegistry::UT_METADATA,
9); 9);
std::shared_ptr<UTMetadataRequestFactory> utMetadataRequestFactory;
std::shared_ptr<UTMetadataRequestTracker> utMetadataRequestTracker;
if(metadataGetMode) {
utMetadataRequestFactory.reset(new UTMetadataRequestFactory());
utMetadataRequestTracker.reset(new UTMetadataRequestTracker());
}
auto extensionMessageFactory = auto extensionMessageFactory =
make_unique<DefaultExtensionMessageFactory>(getPeer(), make_unique<DefaultExtensionMessageFactory>(getPeer(),
exMsgRegistry.get()); exMsgRegistry.get());
auto extensionMessageFactoryPtr = extensionMessageFactory.get();
extensionMessageFactory->setPeerStorage(peerStorage.get()); extensionMessageFactory->setPeerStorage(peerStorage.get());
extensionMessageFactory->setDownloadContext extensionMessageFactory->setDownloadContext
(requestGroup_->getDownloadContext().get()); (requestGroup_->getDownloadContext().get());
extensionMessageFactory->setUTMetadataRequestTracker
(utMetadataRequestTracker.get());
// PieceStorage will be set later. // PieceStorage will be set later.
DefaultBtMessageFactory* factoryPtr(new DefaultBtMessageFactory()); auto factory = make_unique<DefaultBtMessageFactory>();
factoryPtr->setCuid(cuid); auto factoryPtr = factory.get();
factoryPtr->setDownloadContext(requestGroup_->getDownloadContext().get()); factory->setCuid(cuid);
factoryPtr->setPieceStorage(pieceStorage.get()); factory->setDownloadContext(requestGroup_->getDownloadContext().get());
factoryPtr->setPeerStorage(peerStorage.get()); factory->setPieceStorage(pieceStorage.get());
factoryPtr->setExtensionMessageFactory(extensionMessageFactory.get()); factory->setPeerStorage(peerStorage.get());
factoryPtr->setPeer(getPeer()); factory->setExtensionMessageFactory(extensionMessageFactory.get());
factory->setPeer(getPeer());
if(family == AF_INET) { if(family == AF_INET) {
factoryPtr->setLocalNode(DHTRegistry::getData().localNode.get()); factory->setLocalNode(DHTRegistry::getData().localNode.get());
factoryPtr->setRoutingTable(DHTRegistry::getData().routingTable.get()); factory->setRoutingTable(DHTRegistry::getData().routingTable.get());
factoryPtr->setTaskQueue(DHTRegistry::getData().taskQueue.get()); factory->setTaskQueue(DHTRegistry::getData().taskQueue.get());
factoryPtr->setTaskFactory(DHTRegistry::getData().taskFactory.get()); factory->setTaskFactory(DHTRegistry::getData().taskFactory.get());
} else { } else {
factoryPtr->setLocalNode(DHTRegistry::getData6().localNode.get()); factory->setLocalNode(DHTRegistry::getData6().localNode.get());
factoryPtr->setRoutingTable(DHTRegistry::getData6().routingTable.get()); factory->setRoutingTable(DHTRegistry::getData6().routingTable.get());
factoryPtr->setTaskQueue(DHTRegistry::getData6().taskQueue.get()); factory->setTaskQueue(DHTRegistry::getData6().taskQueue.get());
factoryPtr->setTaskFactory(DHTRegistry::getData6().taskFactory.get()); factory->setTaskFactory(DHTRegistry::getData6().taskFactory.get());
} }
if(metadataGetMode) { if(metadataGetMode) {
factoryPtr->enableMetadataGetMode(); factory->enableMetadataGetMode();
} }
std::shared_ptr<BtMessageFactory> factory(factoryPtr);
if(!peerConnection) {
std::shared_ptr<PeerConnection> peerConnection; peerConnection = make_unique<PeerConnection>(cuid, getPeer(), getSocket());
if(!passedPeerConnection) {
peerConnection.reset(new PeerConnection(cuid, getPeer(), getSocket()));
} else { } else {
peerConnection = passedPeerConnection;
if(sequence_ == RECEIVER_WAIT_HANDSHAKE && if(sequence_ == RECEIVER_WAIT_HANDSHAKE &&
peerConnection->getBufferLength() > 0) { peerConnection->getBufferLength() > 0) {
setStatus(Command::STATUS_ONESHOT_REALTIME); setStatus(Command::STATUS_ONESHOT_REALTIME);
@ -187,44 +175,88 @@ PeerInteractionCommand::PeerInteractionCommand
1+(requestGroup_->getDownloadContext()->getNumPieces()+7)/8; 1+(requestGroup_->getDownloadContext()->getNumPieces()+7)/8;
peerConnection->reserveBuffer(bitfieldPayloadSize); peerConnection->reserveBuffer(bitfieldPayloadSize);
DefaultBtMessageDispatcher* dispatcherPtr(new DefaultBtMessageDispatcher()); auto dispatcher = make_unique<DefaultBtMessageDispatcher>();
dispatcherPtr->setCuid(cuid); auto dispatcherPtr = dispatcher.get();
dispatcherPtr->setPeer(getPeer()); dispatcher->setCuid(cuid);
dispatcherPtr->setDownloadContext(requestGroup_->getDownloadContext().get()); dispatcher->setPeer(getPeer());
dispatcherPtr->setPieceStorage(pieceStorage.get()); dispatcher->setDownloadContext(requestGroup_->getDownloadContext().get());
dispatcherPtr->setPeerStorage(peerStorage.get()); dispatcher->setPieceStorage(pieceStorage.get());
dispatcherPtr->setRequestTimeout(getOption()-> dispatcher->setPeerStorage(peerStorage.get());
dispatcher->setRequestTimeout(getOption()->
getAsInt(PREF_BT_REQUEST_TIMEOUT)); getAsInt(PREF_BT_REQUEST_TIMEOUT));
dispatcherPtr->setBtMessageFactory(factoryPtr); dispatcher->setBtMessageFactory(factory.get());
dispatcherPtr->setRequestGroupMan dispatcher->setRequestGroupMan
(getDownloadEngine()->getRequestGroupMan().get()); (getDownloadEngine()->getRequestGroupMan().get());
dispatcherPtr->setPeerConnection(peerConnection.get()); dispatcher->setPeerConnection(peerConnection.get());
std::shared_ptr<BtMessageDispatcher> dispatcher(dispatcherPtr);
DefaultBtMessageReceiver* receiverPtr(new DefaultBtMessageReceiver()); auto receiver = make_unique<DefaultBtMessageReceiver>();
std::shared_ptr<BtMessageReceiver> receiver(receiverPtr); receiver->setDownloadContext(requestGroup_->getDownloadContext().get());
receiverPtr->setDownloadContext(requestGroup_->getDownloadContext().get()); receiver->setPeerConnection(peerConnection.get());
receiverPtr->setPeerConnection(peerConnection.get()); receiver->setDispatcher(dispatcher.get());
receiverPtr->setDispatcher(dispatcherPtr); receiver->setBtMessageFactory(factory.get());
receiverPtr->setBtMessageFactory(factoryPtr);
DefaultBtRequestFactory* reqFactoryPtr(new DefaultBtRequestFactory()); auto reqFactory = make_unique<DefaultBtRequestFactory>();
reqFactoryPtr->setPeer(getPeer()); reqFactory->setPeer(getPeer());
reqFactoryPtr->setPieceStorage(pieceStorage.get()); reqFactory->setPieceStorage(pieceStorage.get());
reqFactoryPtr->setBtMessageDispatcher(dispatcherPtr); reqFactory->setBtMessageDispatcher(dispatcher.get());
reqFactoryPtr->setBtMessageFactory(factoryPtr); reqFactory->setBtMessageFactory(factory.get());
reqFactoryPtr->setCuid(cuid); reqFactory->setCuid(cuid);
std::shared_ptr<BtRequestFactory> reqFactory(reqFactoryPtr);
// reverse depends // reverse depends
factoryPtr->setBtMessageDispatcher(dispatcherPtr); factory->setBtMessageDispatcher(dispatcher.get());
factoryPtr->setBtRequestFactory(reqFactoryPtr); factory->setBtRequestFactory(reqFactory.get());
factoryPtr->setPeerConnection(peerConnection.get()); factory->setPeerConnection(peerConnection.get());
extensionMessageFactory->setBtMessageDispatcher(dispatcherPtr); extensionMessageFactory->setBtMessageDispatcher(dispatcher.get());
extensionMessageFactory->setBtMessageFactory(factoryPtr); extensionMessageFactory->setBtMessageFactory(factory.get());
getPeer()->allocateSessionResource
(requestGroup_->getDownloadContext()->getPieceLength(),
requestGroup_->getDownloadContext()->getTotalLength());
getPeer()->setBtMessageDispatcher(dispatcher.get());
auto btInteractive = make_unique<DefaultBtInteractive>
(requestGroup_->getDownloadContext(), getPeer());
btInteractive->setBtRuntime(btRuntime_);
btInteractive->setPieceStorage(pieceStorage_);
btInteractive->setPeerStorage(peerStorage); // Note: Not a member variable.
btInteractive->setCuid(cuid);
btInteractive->setBtMessageReceiver(std::move(receiver));
btInteractive->setDispatcher(std::move(dispatcher));
btInteractive->setBtRequestFactory(std::move(reqFactory));
btInteractive->setPeerConnection(std::move(peerConnection));
btInteractive->setExtensionMessageFactory
(std::move(extensionMessageFactory));
btInteractive->setExtensionMessageRegistry(std::move(exMsgRegistry));
btInteractive->setKeepAliveInterval
(getOption()->getAsInt(PREF_BT_KEEP_ALIVE_INTERVAL));
btInteractive->setRequestGroupMan
(getDownloadEngine()->getRequestGroupMan().get());
btInteractive->setBtMessageFactory(std::move(factory));
if((metadataGetMode || !torrentAttrs->privateTorrent) &&
!getPeer()->isLocalPeer()) {
if(getOption()->getAsBool(PREF_ENABLE_PEER_EXCHANGE)) {
btInteractive->setUTPexEnabled(true);
}
if(family == AF_INET) {
if(DHTRegistry::isInitialized()) {
btInteractive->setDHTEnabled(true);
factoryPtr->setDHTEnabled(true);
btInteractive->setLocalNode(DHTRegistry::getData().localNode.get());
}
} else {
if(DHTRegistry::isInitialized6()) {
btInteractive->setDHTEnabled(true);
factoryPtr->setDHTEnabled(true);
btInteractive->setLocalNode(DHTRegistry::getData6().localNode.get());
}
}
}
if(metadataGetMode) { if(metadataGetMode) {
auto utMetadataRequestFactory = make_unique<UTMetadataRequestFactory>();
auto utMetadataRequestTracker = make_unique<UTMetadataRequestTracker>();
utMetadataRequestFactory->setCuid(cuid); utMetadataRequestFactory->setCuid(cuid);
utMetadataRequestFactory->setDownloadContext utMetadataRequestFactory->setDownloadContext
(requestGroup_->getDownloadContext().get()); (requestGroup_->getDownloadContext().get());
@ -233,60 +265,21 @@ PeerInteractionCommand::PeerInteractionCommand
utMetadataRequestFactory->setPeer(getPeer()); utMetadataRequestFactory->setPeer(getPeer());
utMetadataRequestFactory->setUTMetadataRequestTracker utMetadataRequestFactory->setUTMetadataRequestTracker
(utMetadataRequestTracker.get()); (utMetadataRequestTracker.get());
extensionMessageFactoryPtr->setUTMetadataRequestTracker
(utMetadataRequestTracker.get());
btInteractive->setUTMetadataRequestFactory
(std::move(utMetadataRequestFactory));
btInteractive->setUTMetadataRequestTracker
(std::move(utMetadataRequestTracker));
} }
getPeer()->allocateSessionResource btInteractive->setTcpPort(e->getBtRegistry()->getTcpPort());
(requestGroup_->getDownloadContext()->getPieceLength(),
requestGroup_->getDownloadContext()->getTotalLength());
getPeer()->setBtMessageDispatcher(dispatcherPtr);
DefaultBtInteractive* btInteractivePtr
(new DefaultBtInteractive(requestGroup_->getDownloadContext(), getPeer()));
btInteractivePtr->setBtRuntime(btRuntime_);
btInteractivePtr->setPieceStorage(pieceStorage_);
btInteractivePtr->setPeerStorage(peerStorage); // Note: Not a member variable.
btInteractivePtr->setCuid(cuid);
btInteractivePtr->setBtMessageReceiver(receiver);
btInteractivePtr->setDispatcher(dispatcher);
btInteractivePtr->setBtRequestFactory(reqFactory);
btInteractivePtr->setPeerConnection(peerConnection);
btInteractivePtr->setExtensionMessageFactory
(std::move(extensionMessageFactory));
btInteractivePtr->setExtensionMessageRegistry(exMsgRegistry);
btInteractivePtr->setKeepAliveInterval
(getOption()->getAsInt(PREF_BT_KEEP_ALIVE_INTERVAL));
btInteractivePtr->setRequestGroupMan
(getDownloadEngine()->getRequestGroupMan().get());
btInteractivePtr->setBtMessageFactory(factory);
if((metadataGetMode || !torrentAttrs->privateTorrent) &&
!getPeer()->isLocalPeer()) {
if(getOption()->getAsBool(PREF_ENABLE_PEER_EXCHANGE)) {
btInteractivePtr->setUTPexEnabled(true);
}
if(family == AF_INET) {
if(DHTRegistry::isInitialized()) {
btInteractivePtr->setDHTEnabled(true);
factoryPtr->setDHTEnabled(true);
btInteractivePtr->setLocalNode(DHTRegistry::getData().localNode.get());
}
} else {
if(DHTRegistry::isInitialized6()) {
btInteractivePtr->setDHTEnabled(true);
factoryPtr->setDHTEnabled(true);
btInteractivePtr->setLocalNode(DHTRegistry::getData6().localNode.get());
}
}
}
btInteractivePtr->setUTMetadataRequestFactory(utMetadataRequestFactory);
btInteractivePtr->setUTMetadataRequestTracker(utMetadataRequestTracker);
btInteractivePtr->setTcpPort(e->getBtRegistry()->getTcpPort());
if(metadataGetMode) { if(metadataGetMode) {
btInteractivePtr->enableMetadataGetMode(); btInteractive->enableMetadataGetMode();
} }
std::shared_ptr<BtInteractive> btInteractive(btInteractivePtr); btInteractive_ = std::move(btInteractive);
btInteractive_ = btInteractive;
btRuntime_->increaseConnections(); btRuntime_->increaseConnections();
requestGroup_->increaseNumCommand(); requestGroup_->increaseNumCommand();

View File

@ -64,7 +64,7 @@ private:
std::shared_ptr<PeerStorage> peerStorage_; std::shared_ptr<PeerStorage> peerStorage_;
Seq sequence_; Seq sequence_;
std::shared_ptr<BtInteractive> btInteractive_; std::unique_ptr<BtInteractive> btInteractive_;
const std::shared_ptr<Option>& getOption() const; const std::shared_ptr<Option>& getOption() const;
protected: protected:
@ -83,8 +83,8 @@ public:
const std::shared_ptr<PeerStorage>& peerStorage, const std::shared_ptr<PeerStorage>& peerStorage,
const std::shared_ptr<SocketCore>& s, const std::shared_ptr<SocketCore>& s,
Seq sequence, Seq sequence,
const std::shared_ptr<PeerConnection>& peerConnection = std::unique_ptr<PeerConnection> peerConnection =
std::shared_ptr<PeerConnection>()); nullptr);
virtual ~PeerInteractionCommand(); virtual ~PeerInteractionCommand();
}; };

View File

@ -66,9 +66,9 @@ PeerReceiveHandshakeCommand::PeerReceiveHandshakeCommand
const std::shared_ptr<Peer>& peer, const std::shared_ptr<Peer>& peer,
DownloadEngine* e, DownloadEngine* e,
const std::shared_ptr<SocketCore>& s, const std::shared_ptr<SocketCore>& s,
const std::shared_ptr<PeerConnection>& peerConnection) std::unique_ptr<PeerConnection> peerConnection)
: PeerAbstractCommand(cuid, peer, e, s), : PeerAbstractCommand{cuid, peer, e, s},
peerConnection_(peerConnection) peerConnection_{std::move(peerConnection)}
{ {
if(peerConnection_) { if(peerConnection_) {
if(peerConnection_->getBufferLength() > 0) { if(peerConnection_->getBufferLength() > 0) {
@ -76,7 +76,8 @@ PeerReceiveHandshakeCommand::PeerReceiveHandshakeCommand
getDownloadEngine()->setNoWait(true); getDownloadEngine()->setNoWait(true);
} }
} else { } else {
peerConnection_.reset(new PeerConnection(cuid, getPeer(), getSocket())); peerConnection_ = make_unique<PeerConnection>
(cuid, getPeer(), getSocket());
} }
} }
@ -151,7 +152,7 @@ bool PeerReceiveHandshakeCommand::executeInternal()
peerStorage, peerStorage,
getSocket(), getSocket(),
PeerInteractionCommand::RECEIVER_WAIT_HANDSHAKE, PeerInteractionCommand::RECEIVER_WAIT_HANDSHAKE,
peerConnection_)); std::move(peerConnection_)));
A2_LOG_DEBUG(fmt(MSG_INCOMING_PEER_CONNECTION, A2_LOG_DEBUG(fmt(MSG_INCOMING_PEER_CONNECTION,
getCuid(), getCuid(),
getPeer()->usedBy())); getPeer()->usedBy()));

View File

@ -46,7 +46,7 @@ class Peer;
class PeerReceiveHandshakeCommand:public PeerAbstractCommand class PeerReceiveHandshakeCommand:public PeerAbstractCommand
{ {
private: private:
std::shared_ptr<PeerConnection> peerConnection_; std::unique_ptr<PeerConnection> peerConnection_;
protected: protected:
virtual bool executeInternal() CXX11_OVERRIDE; virtual bool executeInternal() CXX11_OVERRIDE;
virtual bool exitBeforeExecute() CXX11_OVERRIDE; virtual bool exitBeforeExecute() CXX11_OVERRIDE;
@ -56,8 +56,7 @@ public:
const std::shared_ptr<Peer>& peer, const std::shared_ptr<Peer>& peer,
DownloadEngine* e, DownloadEngine* e,
const std::shared_ptr<SocketCore>& s, const std::shared_ptr<SocketCore>& s,
const std::shared_ptr<PeerConnection>& peerConnection = std::unique_ptr<PeerConnection> peerConnection = nullptr);
std::shared_ptr<PeerConnection>());
virtual ~PeerReceiveHandshakeCommand(); virtual ~PeerReceiveHandshakeCommand();
}; };

View File

@ -103,16 +103,17 @@ bool ReceiverMSEHandshakeCommand::executeInternal()
("The legacy BitTorrent handshake is not acceptable by the" ("The legacy BitTorrent handshake is not acceptable by the"
" preference."); " preference.");
} }
std::shared_ptr<PeerConnection> peerConnection auto peerConnection = make_unique<PeerConnection>
(new PeerConnection(getCuid(), getPeer(), getSocket())); (getCuid(), getPeer(), getSocket());
peerConnection->presetBuffer(mseHandshake_->getBuffer(), peerConnection->presetBuffer(mseHandshake_->getBuffer(),
mseHandshake_->getBufferLength()); mseHandshake_->getBufferLength());
getDownloadEngine()->addCommand getDownloadEngine()->addCommand
(make_unique<PeerReceiveHandshakeCommand>(getCuid(), (make_unique<PeerReceiveHandshakeCommand>
(getCuid(),
getPeer(), getPeer(),
getDownloadEngine(), getDownloadEngine(),
getSocket(), getSocket(),
peerConnection)); std::move(peerConnection)));
return true; return true;
} }
default: default:
@ -206,8 +207,8 @@ bool ReceiverMSEHandshakeCommand::executeInternal()
void ReceiverMSEHandshakeCommand::createCommand() void ReceiverMSEHandshakeCommand::createCommand()
{ {
std::shared_ptr<PeerConnection> peerConnection auto peerConnection = make_unique<PeerConnection>
(new PeerConnection(getCuid(), getPeer(), getSocket())); (getCuid(), getPeer(), getSocket());
if(mseHandshake_->getNegotiatedCryptoType() == MSEHandshake::CRYPTO_ARC4) { if(mseHandshake_->getNegotiatedCryptoType() == MSEHandshake::CRYPTO_ARC4) {
peerConnection->enableEncryption(mseHandshake_->popEncryptor(), peerConnection->enableEncryption(mseHandshake_->popEncryptor(),
mseHandshake_->popDecryptor()); mseHandshake_->popDecryptor());
@ -221,7 +222,7 @@ void ReceiverMSEHandshakeCommand::createCommand()
// match, then drop connection. // match, then drop connection.
getDownloadEngine()->addCommand(make_unique<PeerReceiveHandshakeCommand> getDownloadEngine()->addCommand(make_unique<PeerReceiveHandshakeCommand>
(getCuid(), getPeer(), getDownloadEngine(), (getCuid(), getPeer(), getDownloadEngine(),
getSocket(), peerConnection)); getSocket(), std::move(peerConnection)));
} }
} // namespace aria2 } // namespace aria2