mirror of https://github.com/aria2/aria2
				
				
				
			Use std::unique_ptr to receive BtMessage
							parent
							
								
									0cdeaa8177
								
							
						
					
					
						commit
						c6a733378f
					
				| 
						 | 
				
			
			@ -41,7 +41,8 @@
 | 
			
		|||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
class BtMessage;
 | 
			
		||||
 | 
			
		||||
class BtHandshakeMessage;
 | 
			
		||||
 | 
			
		||||
class BtInteractive {
 | 
			
		||||
public:
 | 
			
		||||
| 
						 | 
				
			
			@ -49,9 +50,10 @@ public:
 | 
			
		|||
 | 
			
		||||
  virtual void initiateHandshake() = 0;
 | 
			
		||||
 | 
			
		||||
  virtual std::shared_ptr<BtMessage> receiveHandshake(bool quickReply = false) = 0;
 | 
			
		||||
  virtual std::unique_ptr<BtHandshakeMessage> receiveHandshake
 | 
			
		||||
  (bool quickReply = false) = 0;
 | 
			
		||||
 | 
			
		||||
  virtual std::shared_ptr<BtMessage> receiveAndSendHandshake() = 0;
 | 
			
		||||
  virtual std::unique_ptr<BtHandshakeMessage> receiveAndSendHandshake() = 0;
 | 
			
		||||
 | 
			
		||||
  virtual void doPostHandshakeProcessing() = 0;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -48,11 +48,12 @@ class BtMessageReceiver {
 | 
			
		|||
public:
 | 
			
		||||
  virtual ~BtMessageReceiver() {}
 | 
			
		||||
 | 
			
		||||
  virtual std::shared_ptr<BtHandshakeMessage> receiveHandshake(bool quickReply = false) = 0;
 | 
			
		||||
  virtual std::unique_ptr<BtHandshakeMessage> receiveHandshake
 | 
			
		||||
  (bool quickReply = false) = 0;
 | 
			
		||||
 | 
			
		||||
  virtual std::shared_ptr<BtHandshakeMessage> receiveAndSendHandshake() = 0;
 | 
			
		||||
  virtual std::unique_ptr<BtHandshakeMessage> receiveAndSendHandshake() = 0;
 | 
			
		||||
 | 
			
		||||
  virtual std::shared_ptr<BtMessage> receiveMessage() = 0;
 | 
			
		||||
  virtual std::unique_ptr<BtMessage> receiveMessage() = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -119,9 +119,9 @@ void DefaultBtInteractive::initiateHandshake() {
 | 
			
		|||
  dispatcher_->sendMessages();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<BtMessage> DefaultBtInteractive::receiveHandshake(bool quickReply) {
 | 
			
		||||
  std::shared_ptr<BtHandshakeMessage> message =
 | 
			
		||||
    btMessageReceiver_->receiveHandshake(quickReply);
 | 
			
		||||
std::unique_ptr<BtHandshakeMessage> DefaultBtInteractive::receiveHandshake
 | 
			
		||||
(bool quickReply) {
 | 
			
		||||
  auto message = btMessageReceiver_->receiveHandshake(quickReply);
 | 
			
		||||
  if(!message) {
 | 
			
		||||
    return nullptr;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -131,11 +131,9 @@ std::shared_ptr<BtMessage> DefaultBtInteractive::receiveHandshake(bool quickRepl
 | 
			
		|||
      (fmt("CUID#%" PRId64 " - Drop connection from the same Peer ID",
 | 
			
		||||
           cuid_));
 | 
			
		||||
  }
 | 
			
		||||
  const PeerSet& usedPeers = peerStorage_->getUsedPeers();
 | 
			
		||||
  for(PeerSet::const_iterator i = usedPeers.begin(), eoi = usedPeers.end();
 | 
			
		||||
      i != eoi; ++i) {
 | 
			
		||||
    if((*i)->isActive() &&
 | 
			
		||||
       memcmp((*i)->getPeerId(), message->getPeerId(), PEER_ID_LENGTH) == 0) {
 | 
			
		||||
  for(auto& peer : peerStorage_->getUsedPeers()) {
 | 
			
		||||
    if(peer->isActive() &&
 | 
			
		||||
       memcmp(peer->getPeerId(), message->getPeerId(), PEER_ID_LENGTH) == 0) {
 | 
			
		||||
      throw DL_ABORT_EX
 | 
			
		||||
        (fmt("CUID#%" PRId64 " - Same Peer ID has been already seen.",
 | 
			
		||||
             cuid_));
 | 
			
		||||
| 
						 | 
				
			
			@ -166,7 +164,9 @@ std::shared_ptr<BtMessage> DefaultBtInteractive::receiveHandshake(bool quickRepl
 | 
			
		|||
  return message;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<BtMessage> DefaultBtInteractive::receiveAndSendHandshake() {
 | 
			
		||||
std::unique_ptr<BtHandshakeMessage>
 | 
			
		||||
DefaultBtInteractive::receiveAndSendHandshake()
 | 
			
		||||
{
 | 
			
		||||
  return receiveHandshake(true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -297,7 +297,7 @@ size_t DefaultBtInteractive::receiveMessages() {
 | 
			
		|||
       downloadContext_->getOwnerRequestGroup()->doesDownloadSpeedExceed()) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    std::shared_ptr<BtMessage> message = btMessageReceiver_->receiveMessage();
 | 
			
		||||
    auto message = btMessageReceiver_->receiveMessage();
 | 
			
		||||
    if(!message) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -173,9 +173,10 @@ public:
 | 
			
		|||
 | 
			
		||||
  virtual void initiateHandshake();
 | 
			
		||||
 | 
			
		||||
  virtual std::shared_ptr<BtMessage> receiveHandshake(bool quickReply = false);
 | 
			
		||||
  virtual std::unique_ptr<BtHandshakeMessage> receiveHandshake
 | 
			
		||||
  (bool quickReply = false);
 | 
			
		||||
 | 
			
		||||
  virtual std::shared_ptr<BtMessage> receiveAndSendHandshake();
 | 
			
		||||
  virtual std::unique_ptr<BtHandshakeMessage> receiveAndSendHandshake();
 | 
			
		||||
 | 
			
		||||
  virtual void doPostHandshakeProcessing();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,14 +54,14 @@
 | 
			
		|||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
DefaultBtMessageReceiver::DefaultBtMessageReceiver():
 | 
			
		||||
  handshakeSent_(false),
 | 
			
		||||
  downloadContext_{0},
 | 
			
		||||
  peerConnection_(0),
 | 
			
		||||
  dispatcher_(0),
 | 
			
		||||
  messageFactory_(0)
 | 
			
		||||
  handshakeSent_{false},
 | 
			
		||||
  downloadContext_{nullptr},
 | 
			
		||||
  peerConnection_{nullptr},
 | 
			
		||||
  dispatcher_{nullptr},
 | 
			
		||||
  messageFactory_{nullptr}
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<BtHandshakeMessage>
 | 
			
		||||
std::unique_ptr<BtHandshakeMessage>
 | 
			
		||||
DefaultBtMessageReceiver::receiveHandshake(bool quickReply)
 | 
			
		||||
{
 | 
			
		||||
  A2_LOG_DEBUG
 | 
			
		||||
| 
						 | 
				
			
			@ -69,15 +69,14 @@ DefaultBtMessageReceiver::receiveHandshake(bool quickReply)
 | 
			
		|||
         static_cast<unsigned long>(peerConnection_->getBufferLength())));
 | 
			
		||||
  unsigned char data[BtHandshakeMessage::MESSAGE_LENGTH];
 | 
			
		||||
  size_t dataLength = BtHandshakeMessage::MESSAGE_LENGTH;
 | 
			
		||||
  std::shared_ptr<BtHandshakeMessage> msg;
 | 
			
		||||
  if(handshakeSent_ || !quickReply || peerConnection_->getBufferLength() < 48) {
 | 
			
		||||
    if(peerConnection_->receiveHandshake(data, dataLength)) {
 | 
			
		||||
      msg = messageFactory_->createHandshakeMessage(data, dataLength);
 | 
			
		||||
      auto msg = messageFactory_->createHandshakeMessage(data, dataLength);
 | 
			
		||||
      msg->validate();
 | 
			
		||||
      return msg;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  // Handle tracker's NAT-checking feature
 | 
			
		||||
  if(!handshakeSent_ && quickReply && peerConnection_->getBufferLength() >= 48){
 | 
			
		||||
  } else {
 | 
			
		||||
    // Handle tracker's NAT-checking feature
 | 
			
		||||
    handshakeSent_ = true;
 | 
			
		||||
    // check info_hash
 | 
			
		||||
    if(memcmp(bittorrent::getInfoHash(downloadContext_),
 | 
			
		||||
| 
						 | 
				
			
			@ -90,24 +89,25 @@ DefaultBtMessageReceiver::receiveHandshake(bool quickReply)
 | 
			
		|||
             util::toHex(peerConnection_->getBuffer()+28,
 | 
			
		||||
                         INFO_HASH_LENGTH).c_str()));
 | 
			
		||||
    }
 | 
			
		||||
    if(!msg &&
 | 
			
		||||
       peerConnection_->getBufferLength() ==
 | 
			
		||||
    if(peerConnection_->getBufferLength() ==
 | 
			
		||||
       BtHandshakeMessage::MESSAGE_LENGTH &&
 | 
			
		||||
       peerConnection_->receiveHandshake(data, dataLength)) {
 | 
			
		||||
      msg = messageFactory_->createHandshakeMessage(data, dataLength);
 | 
			
		||||
      auto msg = messageFactory_->createHandshakeMessage(data, dataLength);
 | 
			
		||||
      msg->validate();
 | 
			
		||||
      return msg;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return msg;
 | 
			
		||||
  return nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<BtHandshakeMessage>
 | 
			
		||||
std::unique_ptr<BtHandshakeMessage>
 | 
			
		||||
DefaultBtMessageReceiver::receiveAndSendHandshake()
 | 
			
		||||
{
 | 
			
		||||
  return receiveHandshake(true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DefaultBtMessageReceiver::sendHandshake() {
 | 
			
		||||
void DefaultBtMessageReceiver::sendHandshake()
 | 
			
		||||
{
 | 
			
		||||
  dispatcher_->addMessageToQueue
 | 
			
		||||
    (messageFactory_->createHandshakeMessage
 | 
			
		||||
     (bittorrent::getInfoHash(downloadContext_),
 | 
			
		||||
| 
						 | 
				
			
			@ -115,18 +115,19 @@ void DefaultBtMessageReceiver::sendHandshake() {
 | 
			
		|||
  dispatcher_->sendMessages();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<BtMessage> DefaultBtMessageReceiver::receiveMessage() {
 | 
			
		||||
std::unique_ptr<BtMessage> DefaultBtMessageReceiver::receiveMessage()
 | 
			
		||||
{
 | 
			
		||||
  size_t dataLength = 0;
 | 
			
		||||
  // Give 0 to PeerConnection::receiveMessage() to prevent memcpy.
 | 
			
		||||
  if(!peerConnection_->receiveMessage(0, dataLength)) {
 | 
			
		||||
    return nullptr;
 | 
			
		||||
  }
 | 
			
		||||
  std::shared_ptr<BtMessage> msg =
 | 
			
		||||
  auto msg =
 | 
			
		||||
    messageFactory_->createBtMessage(peerConnection_->getMsgPayloadBuffer(),
 | 
			
		||||
                                     dataLength);
 | 
			
		||||
  msg->validate();
 | 
			
		||||
  if(msg->getId() == BtPieceMessage::ID) {
 | 
			
		||||
    auto piecemsg = std::static_pointer_cast<BtPieceMessage>(msg);
 | 
			
		||||
    auto piecemsg = static_cast<BtPieceMessage*>(msg.get());
 | 
			
		||||
    piecemsg->setMsgPayload(peerConnection_->getMsgPayloadBuffer());
 | 
			
		||||
  }
 | 
			
		||||
  return msg;
 | 
			
		||||
| 
						 | 
				
			
			@ -138,7 +139,8 @@ void DefaultBtMessageReceiver::setDownloadContext
 | 
			
		|||
  downloadContext_ = downloadContext;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DefaultBtMessageReceiver::setPeerConnection(PeerConnection* peerConnection)
 | 
			
		||||
void DefaultBtMessageReceiver::setPeerConnection
 | 
			
		||||
(PeerConnection* peerConnection)
 | 
			
		||||
{
 | 
			
		||||
  peerConnection_ = peerConnection;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,12 +58,12 @@ private:
 | 
			
		|||
public:
 | 
			
		||||
  DefaultBtMessageReceiver();
 | 
			
		||||
 | 
			
		||||
  virtual std::shared_ptr<BtHandshakeMessage> receiveHandshake
 | 
			
		||||
  virtual std::unique_ptr<BtHandshakeMessage> receiveHandshake
 | 
			
		||||
  (bool quickReply = false);
 | 
			
		||||
 | 
			
		||||
  virtual std::shared_ptr<BtHandshakeMessage> receiveAndSendHandshake();
 | 
			
		||||
  virtual std::unique_ptr<BtHandshakeMessage> receiveAndSendHandshake();
 | 
			
		||||
 | 
			
		||||
  virtual std::shared_ptr<BtMessage> receiveMessage();
 | 
			
		||||
  virtual std::unique_ptr<BtMessage> receiveMessage();
 | 
			
		||||
 | 
			
		||||
  void setDownloadContext(DownloadContext* downloadContext);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,6 +47,7 @@
 | 
			
		|||
#include "DownloadContext.h"
 | 
			
		||||
#include "Peer.h"
 | 
			
		||||
#include "BtMessage.h"
 | 
			
		||||
#include "BtHandshakeMessage.h"
 | 
			
		||||
#include "BtRuntime.h"
 | 
			
		||||
#include "PeerStorage.h"
 | 
			
		||||
#include "DefaultBtMessageDispatcher.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -327,8 +328,7 @@ bool PeerInteractionCommand::executeInternal() {
 | 
			
		|||
          break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      std::shared_ptr<BtMessage> handshakeMessage =
 | 
			
		||||
        btInteractive_->receiveHandshake();
 | 
			
		||||
      auto handshakeMessage = btInteractive_->receiveHandshake();
 | 
			
		||||
      if(!handshakeMessage) {
 | 
			
		||||
        done = true;
 | 
			
		||||
        break;
 | 
			
		||||
| 
						 | 
				
			
			@ -338,8 +338,7 @@ bool PeerInteractionCommand::executeInternal() {
 | 
			
		|||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case RECEIVER_WAIT_HANDSHAKE: {
 | 
			
		||||
      std::shared_ptr<BtMessage> handshakeMessage =
 | 
			
		||||
        btInteractive_->receiveAndSendHandshake();
 | 
			
		||||
      auto handshakeMessage = btInteractive_->receiveAndSendHandshake();
 | 
			
		||||
      if(!handshakeMessage) {
 | 
			
		||||
        done = true;
 | 
			
		||||
        break;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue