mirror of https://github.com/aria2/aria2
				
				
				
			2009-11-21 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Initial support of Extension for Peers to Send Metadata Files(BEP9). Currently aria2 only serves metadata and cannot get metadata from swarm. * src/BtConstants.h * src/DefaultBtInteractive.cc * src/DefaultExtensionMessageFactory.cc * src/DefaultExtensionMessageFactory.h * src/ExtensionMessage.h * src/ExtensionMessageRegistry.h * src/HandshakeExtensionMessage.cc * src/HandshakeExtensionMessage.h * src/Makefile.am * src/PeerConnection.h * src/PeerInteractionCommand.cc * src/UTMetadataDataExtensionMessage.cc * src/UTMetadataDataExtensionMessage.h * src/UTMetadataExtensionMessage.cc * src/UTMetadataExtensionMessage.h * src/UTMetadataRejectExtensionMessage.cc * src/UTMetadataRejectExtensionMessage.h * src/UTMetadataRequestExtensionMessage.cc * src/UTMetadataRequestExtensionMessage.h * src/bittorrent_helper.cc * src/bittorrent_helper.h * test/BittorrentHelperTest.cc * test/DefaultExtensionMessageFactoryTest.cc * test/HandshakeExtensionMessageTest.cc * test/Makefile.am * test/UTMetadataDataExtensionMessageTest.cc * test/UTMetadataRejectExtensionMessageTest.cc * test/UTMetadataRequestExtensionMessageTest.ccpull/1/head
							parent
							
								
									2764b6739d
								
							
						
					
					
						commit
						93968c4fa5
					
				
							
								
								
									
										34
									
								
								ChangeLog
								
								
								
								
							
							
						
						
									
										34
									
								
								ChangeLog
								
								
								
								
							| 
						 | 
				
			
			@ -1,3 +1,37 @@
 | 
			
		|||
2009-11-21  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 | 
			
		||||
 | 
			
		||||
	Initial support of Extension for Peers to Send Metadata
 | 
			
		||||
	Files(BEP9). Currently aria2 only serves metadata and cannot get
 | 
			
		||||
	metadata from swarm.
 | 
			
		||||
	* src/BtConstants.h
 | 
			
		||||
	* src/DefaultBtInteractive.cc
 | 
			
		||||
	* src/DefaultExtensionMessageFactory.cc
 | 
			
		||||
	* src/DefaultExtensionMessageFactory.h
 | 
			
		||||
	* src/ExtensionMessage.h
 | 
			
		||||
	* src/ExtensionMessageRegistry.h
 | 
			
		||||
	* src/HandshakeExtensionMessage.cc
 | 
			
		||||
	* src/HandshakeExtensionMessage.h
 | 
			
		||||
	* src/Makefile.am
 | 
			
		||||
	* src/PeerConnection.h
 | 
			
		||||
	* src/PeerInteractionCommand.cc
 | 
			
		||||
	* src/UTMetadataDataExtensionMessage.cc
 | 
			
		||||
	* src/UTMetadataDataExtensionMessage.h
 | 
			
		||||
	* src/UTMetadataExtensionMessage.cc
 | 
			
		||||
	* src/UTMetadataExtensionMessage.h
 | 
			
		||||
	* src/UTMetadataRejectExtensionMessage.cc
 | 
			
		||||
	* src/UTMetadataRejectExtensionMessage.h
 | 
			
		||||
	* src/UTMetadataRequestExtensionMessage.cc
 | 
			
		||||
	* src/UTMetadataRequestExtensionMessage.h
 | 
			
		||||
	* src/bittorrent_helper.cc
 | 
			
		||||
	* src/bittorrent_helper.h
 | 
			
		||||
	* test/BittorrentHelperTest.cc
 | 
			
		||||
	* test/DefaultExtensionMessageFactoryTest.cc
 | 
			
		||||
	* test/HandshakeExtensionMessageTest.cc
 | 
			
		||||
	* test/Makefile.am
 | 
			
		||||
	* test/UTMetadataDataExtensionMessageTest.cc
 | 
			
		||||
	* test/UTMetadataRejectExtensionMessageTest.cc
 | 
			
		||||
	* test/UTMetadataRequestExtensionMessageTest.cc
 | 
			
		||||
 | 
			
		||||
2009-11-21  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 | 
			
		||||
 | 
			
		||||
	Cancel segment in prepareForRetry() because there is a chance that
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,4 +58,6 @@ typedef std::map<std::string, uint8_t> Extensions;
 | 
			
		|||
// Upper Bound of the number of outstanding request
 | 
			
		||||
#define UB_MAX_OUTSTANDING_REQUEST 24
 | 
			
		||||
 | 
			
		||||
#define METADATA_PIECE_SIZE (16*1024)
 | 
			
		||||
 | 
			
		||||
#endif // _D_BT_CONSTANTS_
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -167,7 +167,10 @@ void DefaultBtInteractive::addHandshakeExtendedMessageToQueue()
 | 
			
		|||
  m->setClientVersion(CLIENT_ARIA2);
 | 
			
		||||
  m->setTCPPort(_btRuntime->getListenPort());
 | 
			
		||||
  m->setExtensions(_extensionMessageRegistry->getExtensions());
 | 
			
		||||
  
 | 
			
		||||
  const BDE& attrs = _downloadContext->getAttribute(bittorrent::BITTORRENT);
 | 
			
		||||
  if(attrs.containsKey(bittorrent::METADATA)) {
 | 
			
		||||
    m->setMetadataSize(attrs[bittorrent::METADATA_SIZE].i());
 | 
			
		||||
  }
 | 
			
		||||
  SharedHandle<BtMessage> msg = messageFactory->createBtExtendedMessage(m);
 | 
			
		||||
  dispatcher->addMessageToQueue(msg);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,6 +42,14 @@
 | 
			
		|||
#include "StringFormat.h"
 | 
			
		||||
#include "PeerStorage.h"
 | 
			
		||||
#include "ExtensionMessageRegistry.h"
 | 
			
		||||
#include "DownloadContext.h"
 | 
			
		||||
#include "BtMessageDispatcher.h"
 | 
			
		||||
#include "BtMessageFactory.h"
 | 
			
		||||
#include "UTMetadataRequestExtensionMessage.h"
 | 
			
		||||
#include "UTMetadataDataExtensionMessage.h"
 | 
			
		||||
#include "UTMetadataRejectExtensionMessage.h"
 | 
			
		||||
#include "message.h"
 | 
			
		||||
#include "bencode.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -65,6 +73,7 @@ DefaultExtensionMessageFactory::createMessage(const unsigned char* data, size_t
 | 
			
		|||
    // handshake
 | 
			
		||||
    HandshakeExtensionMessageHandle m = HandshakeExtensionMessage::create(data, length);
 | 
			
		||||
    m->setPeer(_peer);
 | 
			
		||||
    m->setDownloadContext(_dctx);
 | 
			
		||||
    return m;
 | 
			
		||||
  } else {
 | 
			
		||||
    std::string extensionName = _registry->getExtensionName(extensionMessageID);
 | 
			
		||||
| 
						 | 
				
			
			@ -79,6 +88,75 @@ DefaultExtensionMessageFactory::createMessage(const unsigned char* data, size_t
 | 
			
		|||
	UTPexExtensionMessage::create(data, length);
 | 
			
		||||
      m->setPeerStorage(_peerStorage);
 | 
			
		||||
      return m;
 | 
			
		||||
    } else if(extensionName == "ut_metadata") {
 | 
			
		||||
      if(length == 0) {
 | 
			
		||||
	throw DL_ABORT_EX(StringFormat(MSG_TOO_SMALL_PAYLOAD_SIZE,
 | 
			
		||||
				       "ut_metadata", length).str());
 | 
			
		||||
      }
 | 
			
		||||
      std::string listdata;
 | 
			
		||||
      listdata += 'l';
 | 
			
		||||
      listdata += std::string(&data[1], &data[length]);
 | 
			
		||||
      listdata += 'e';
 | 
			
		||||
 | 
			
		||||
      const BDE& list = bencode::decode(listdata);
 | 
			
		||||
      if(!list.isList() || list.empty()) {
 | 
			
		||||
	throw DL_ABORT_EX("Bad ut_metadata");
 | 
			
		||||
      }
 | 
			
		||||
      const BDE& dict = list[0];
 | 
			
		||||
      if(!dict.isDict()) {
 | 
			
		||||
	throw DL_ABORT_EX("Bad ut_metadata: dictionary not found");
 | 
			
		||||
      }
 | 
			
		||||
      const BDE& msgType = dict["msg_type"];
 | 
			
		||||
      if(!msgType.isInteger()) {
 | 
			
		||||
	throw DL_ABORT_EX("Bad ut_metadata: msg_type not found");
 | 
			
		||||
      }
 | 
			
		||||
      const BDE& index = dict["piece"];
 | 
			
		||||
      if(!index.isInteger()) {
 | 
			
		||||
	throw DL_ABORT_EX("Bad ut_metadata: piece not found");
 | 
			
		||||
      }
 | 
			
		||||
      switch(msgType.i()) {
 | 
			
		||||
      case 0: {
 | 
			
		||||
	SharedHandle<UTMetadataRequestExtensionMessage> m
 | 
			
		||||
	  (new UTMetadataRequestExtensionMessage(extensionMessageID));
 | 
			
		||||
	m->setIndex(index.i());
 | 
			
		||||
	m->setDownloadContext(_dctx);
 | 
			
		||||
	m->setPeer(_peer);
 | 
			
		||||
	m->setBtMessageFactory(_messageFactory);
 | 
			
		||||
	m->setBtMessageDispatcher(_dispatcher);
 | 
			
		||||
	return m;
 | 
			
		||||
      }
 | 
			
		||||
      case 1: {
 | 
			
		||||
	if(list.size() != 2) {
 | 
			
		||||
	  throw DL_ABORT_EX("Bad ut_metadata data: data not found");
 | 
			
		||||
	}
 | 
			
		||||
	const BDE& pieceData = list[1];
 | 
			
		||||
	if(!pieceData.isString()) {
 | 
			
		||||
	  throw DL_ABORT_EX("Bad ut_metadata data: data is not string");
 | 
			
		||||
	}
 | 
			
		||||
	const BDE& totalSize = dict["total_size"];
 | 
			
		||||
	if(!totalSize.isInteger()) {
 | 
			
		||||
	  throw DL_ABORT_EX("Bad ut_metadata data: total_size not found");
 | 
			
		||||
	}
 | 
			
		||||
	SharedHandle<UTMetadataDataExtensionMessage> m
 | 
			
		||||
	  (new UTMetadataDataExtensionMessage(extensionMessageID));
 | 
			
		||||
	m->setIndex(index.i());
 | 
			
		||||
	m->setTotalSize(totalSize.i());
 | 
			
		||||
	m->setData(pieceData.s());
 | 
			
		||||
	// set tracker
 | 
			
		||||
	// set piecestorage
 | 
			
		||||
	return m;
 | 
			
		||||
      }
 | 
			
		||||
      case 2: {
 | 
			
		||||
	SharedHandle<UTMetadataRejectExtensionMessage> m
 | 
			
		||||
	  (new UTMetadataRejectExtensionMessage(extensionMessageID));
 | 
			
		||||
	m->setIndex(index.i());
 | 
			
		||||
	// set tracker if disconnecing peer on receive.
 | 
			
		||||
	return m;
 | 
			
		||||
      }
 | 
			
		||||
      default:
 | 
			
		||||
	throw DL_ABORT_EX(StringFormat("Bad ut_metadata: unknown msg_type=%u",
 | 
			
		||||
				       msgType.i()).str());
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      throw DL_ABORT_EX
 | 
			
		||||
	(StringFormat("Unsupported extension message received. extensionMessageID=%u, extensionName=%s",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,6 +43,9 @@ class PeerStorage;
 | 
			
		|||
class Peer;
 | 
			
		||||
class Logger;
 | 
			
		||||
class ExtensionMessageRegistry;
 | 
			
		||||
class DownloadContext;
 | 
			
		||||
class BtMessageFactory;
 | 
			
		||||
class BtMessageDispatcher;
 | 
			
		||||
 | 
			
		||||
class DefaultExtensionMessageFactory:public ExtensionMessageFactory {
 | 
			
		||||
private:
 | 
			
		||||
| 
						 | 
				
			
			@ -52,6 +55,12 @@ private:
 | 
			
		|||
 | 
			
		||||
  SharedHandle<ExtensionMessageRegistry> _registry;
 | 
			
		||||
 | 
			
		||||
  SharedHandle<DownloadContext> _dctx;
 | 
			
		||||
 | 
			
		||||
  WeakHandle<BtMessageFactory> _messageFactory;
 | 
			
		||||
 | 
			
		||||
  WeakHandle<BtMessageDispatcher> _dispatcher;
 | 
			
		||||
 | 
			
		||||
  Logger* _logger;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
| 
						 | 
				
			
			@ -75,6 +84,21 @@ public:
 | 
			
		|||
  {
 | 
			
		||||
    _registry = registry;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void setDownloadContext(const SharedHandle<DownloadContext>& dctx)
 | 
			
		||||
  {
 | 
			
		||||
    _dctx = dctx;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void setBtMessageFactory(const WeakHandle<BtMessageFactory>& factory)
 | 
			
		||||
  {
 | 
			
		||||
    _messageFactory = factory;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void setBtMessageDispatcher(const WeakHandle<BtMessageDispatcher>& disp)
 | 
			
		||||
  {
 | 
			
		||||
    _dispatcher = disp;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef SharedHandle<DefaultExtensionMessageFactory> DefaultExtensionMessageFactoryHandle;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,9 +36,11 @@
 | 
			
		|||
#define _D_EXTENSION_MESSAGE_H_
 | 
			
		||||
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#include "SharedHandle.h"
 | 
			
		||||
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#include "SharedHandle.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
class ExtensionMessage {
 | 
			
		||||
public:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,6 +51,8 @@ public:
 | 
			
		|||
  ExtensionMessageRegistry()
 | 
			
		||||
  {
 | 
			
		||||
    _extensions["ut_pex"] = 8;
 | 
			
		||||
    // http://www.bittorrent.org/beps/bep_0009.html
 | 
			
		||||
    _extensions["ut_metadata"] = 9;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const Extensions& getExtensions() const
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
/*
 | 
			
		||||
 * aria2 - The high speed download utility
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2006 Tatsuhiro Tsujikawa
 | 
			
		||||
 * Copyright (C) 2009 Tatsuhiro Tsujikawa
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
| 
						 | 
				
			
			@ -41,6 +41,8 @@
 | 
			
		|||
#include "message.h"
 | 
			
		||||
#include "StringFormat.h"
 | 
			
		||||
#include "bencode.h"
 | 
			
		||||
#include "DownloadContext.h"
 | 
			
		||||
#include "bittorrent_helper.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -48,6 +50,7 @@ const std::string HandshakeExtensionMessage::EXTENSION_NAME = "handshake";
 | 
			
		|||
 | 
			
		||||
HandshakeExtensionMessage::HandshakeExtensionMessage():
 | 
			
		||||
  _tcpPort(0),
 | 
			
		||||
  _metadataSize(0),
 | 
			
		||||
  _logger(LogFactory::getInstance()) {}
 | 
			
		||||
 | 
			
		||||
HandshakeExtensionMessage::~HandshakeExtensionMessage() {}
 | 
			
		||||
| 
						 | 
				
			
			@ -68,6 +71,9 @@ std::string HandshakeExtensionMessage::getBencodedData()
 | 
			
		|||
    extDict[vt.first] = vt.second;
 | 
			
		||||
  }
 | 
			
		||||
  dict["m"] = extDict;
 | 
			
		||||
  if(_metadataSize) {
 | 
			
		||||
    dict["metadata_size"] = _metadataSize;
 | 
			
		||||
  }
 | 
			
		||||
  return bencode::encode(dict);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -80,6 +86,9 @@ std::string HandshakeExtensionMessage::toString() const
 | 
			
		|||
  if(_tcpPort > 0) {
 | 
			
		||||
    strappend(s, ", tcpPort=", util::uitos(_tcpPort));
 | 
			
		||||
  }
 | 
			
		||||
  if(_metadataSize) {
 | 
			
		||||
    strappend(s, ", metadataSize=", util::uitos(_metadataSize));
 | 
			
		||||
  }
 | 
			
		||||
  for(std::map<std::string, uint8_t>::const_iterator itr = _extensions.begin();
 | 
			
		||||
      itr != _extensions.end(); ++itr) {
 | 
			
		||||
    const std::map<std::string, uint8_t>::value_type& vt = *itr;
 | 
			
		||||
| 
						 | 
				
			
			@ -99,6 +108,12 @@ void HandshakeExtensionMessage::doReceivedAction()
 | 
			
		|||
    const std::map<std::string, uint8_t>::value_type& vt = *itr;
 | 
			
		||||
    _peer->setExtension(vt.first, vt.second);
 | 
			
		||||
  }
 | 
			
		||||
  if(_metadataSize > 0) {
 | 
			
		||||
    BDE& attrs = _dctx->getAttribute(bittorrent::BITTORRENT);
 | 
			
		||||
    if(!attrs.containsKey(bittorrent::METADATA_SIZE)) {
 | 
			
		||||
      attrs[bittorrent::METADATA_SIZE] = _metadataSize;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HandshakeExtensionMessage::setPeer(const PeerHandle& peer)
 | 
			
		||||
| 
						 | 
				
			
			@ -148,6 +163,11 @@ HandshakeExtensionMessage::create(const unsigned char* data, size_t length)
 | 
			
		|||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  const BDE& metadataSize = dict["metadata_size"];
 | 
			
		||||
  // Only accept metadata smaller than 1MiB
 | 
			
		||||
  if(metadataSize.isInteger() && metadataSize.i() <= 1024*1024) {
 | 
			
		||||
    msg->_metadataSize = metadataSize.i();
 | 
			
		||||
  }
 | 
			
		||||
  return msg;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
/*
 | 
			
		||||
 * aria2 - The high speed download utility
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2006 Tatsuhiro Tsujikawa
 | 
			
		||||
 * Copyright (C) 2009 Tatsuhiro Tsujikawa
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
| 
						 | 
				
			
			@ -46,6 +46,7 @@ namespace aria2 {
 | 
			
		|||
class Peer;
 | 
			
		||||
class Logger;
 | 
			
		||||
class HandshakeExtensionMessage;
 | 
			
		||||
class DownloadContext;
 | 
			
		||||
typedef SharedHandle<HandshakeExtensionMessage> HandshakeExtensionMessageHandle;
 | 
			
		||||
 | 
			
		||||
class HandshakeExtensionMessage:public ExtensionMessage {
 | 
			
		||||
| 
						 | 
				
			
			@ -54,8 +55,12 @@ private:
 | 
			
		|||
 | 
			
		||||
  uint16_t _tcpPort;
 | 
			
		||||
 | 
			
		||||
  size_t _metadataSize;
 | 
			
		||||
 | 
			
		||||
  std::map<std::string, uint8_t> _extensions;
 | 
			
		||||
 | 
			
		||||
  SharedHandle<DownloadContext> _dctx;
 | 
			
		||||
 | 
			
		||||
  SharedHandle<Peer> _peer;
 | 
			
		||||
 | 
			
		||||
  Logger* _logger;
 | 
			
		||||
| 
						 | 
				
			
			@ -103,6 +108,21 @@ public:
 | 
			
		|||
    return _tcpPort;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  size_t getMetadataSize()
 | 
			
		||||
  {
 | 
			
		||||
    return _metadataSize;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void setMetadataSize(size_t size)
 | 
			
		||||
  {
 | 
			
		||||
    _metadataSize = size;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void setDownloadContext(const SharedHandle<DownloadContext>& dctx)
 | 
			
		||||
  {
 | 
			
		||||
    _dctx = dctx;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void setExtension(const std::string& name, uint8_t id)
 | 
			
		||||
  {
 | 
			
		||||
    _extensions[name] = id;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -346,6 +346,11 @@ SRCS += PeerAbstractCommand.cc PeerAbstractCommand.h\
 | 
			
		|||
	DefaultExtensionMessageFactory.cc DefaultExtensionMessageFactory.h\
 | 
			
		||||
	HandshakeExtensionMessage.cc HandshakeExtensionMessage.h\
 | 
			
		||||
	UTPexExtensionMessage.cc UTPexExtensionMessage.h\
 | 
			
		||||
	UTMetadataExtensionMessage.cc UTMetadataExtensionMessage.h\
 | 
			
		||||
	UTMetadataRequestExtensionMessage.cc\
 | 
			
		||||
	UTMetadataRequestExtensionMessage.h\
 | 
			
		||||
	UTMetadataRejectExtensionMessage.cc UTMetadataRejectExtensionMessage.h\
 | 
			
		||||
	UTMetadataDataExtensionMessage.cc UTMetadataDataExtensionMessage.h\
 | 
			
		||||
	DHTNode.cc DHTNode.h\
 | 
			
		||||
	DHTBucket.cc DHTBucket.h\
 | 
			
		||||
	DHTRoutingTable.cc DHTRoutingTable.h\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -145,6 +145,11 @@ bin_PROGRAMS = aria2c$(EXEEXT)
 | 
			
		|||
@ENABLE_BITTORRENT_TRUE@	DefaultExtensionMessageFactory.cc DefaultExtensionMessageFactory.h\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	HandshakeExtensionMessage.cc HandshakeExtensionMessage.h\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTPexExtensionMessage.cc UTPexExtensionMessage.h\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTMetadataExtensionMessage.cc UTMetadataExtensionMessage.h\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTMetadataRequestExtensionMessage.cc\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTMetadataRequestExtensionMessage.h\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTMetadataRejectExtensionMessage.cc UTMetadataRejectExtensionMessage.h\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTMetadataDataExtensionMessage.cc UTMetadataDataExtensionMessage.h\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	DHTNode.cc DHTNode.h\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	DHTBucket.cc DHTBucket.h\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	DHTRoutingTable.cc DHTRoutingTable.h\
 | 
			
		||||
| 
						 | 
				
			
			@ -489,8 +494,15 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \
 | 
			
		|||
	ExtensionMessageFactory.h DefaultExtensionMessageFactory.cc \
 | 
			
		||||
	DefaultExtensionMessageFactory.h HandshakeExtensionMessage.cc \
 | 
			
		||||
	HandshakeExtensionMessage.h UTPexExtensionMessage.cc \
 | 
			
		||||
	UTPexExtensionMessage.h DHTNode.cc DHTNode.h DHTBucket.cc \
 | 
			
		||||
	DHTBucket.h DHTRoutingTable.cc DHTRoutingTable.h \
 | 
			
		||||
	UTPexExtensionMessage.h UTMetadataExtensionMessage.cc \
 | 
			
		||||
	UTMetadataExtensionMessage.h \
 | 
			
		||||
	UTMetadataRequestExtensionMessage.cc \
 | 
			
		||||
	UTMetadataRequestExtensionMessage.h \
 | 
			
		||||
	UTMetadataRejectExtensionMessage.cc \
 | 
			
		||||
	UTMetadataRejectExtensionMessage.h \
 | 
			
		||||
	UTMetadataDataExtensionMessage.cc \
 | 
			
		||||
	UTMetadataDataExtensionMessage.h DHTNode.cc DHTNode.h \
 | 
			
		||||
	DHTBucket.cc DHTBucket.h DHTRoutingTable.cc DHTRoutingTable.h \
 | 
			
		||||
	DHTMessageEntry.cc DHTMessageEntry.h DHTMessageDispatcher.h \
 | 
			
		||||
	DHTMessageDispatcherImpl.cc DHTMessageDispatcherImpl.h \
 | 
			
		||||
	DHTMessageReceiver.cc DHTMessageReceiver.h \
 | 
			
		||||
| 
						 | 
				
			
			@ -644,6 +656,10 @@ am__objects_6 =
 | 
			
		|||
@ENABLE_BITTORRENT_TRUE@	DefaultExtensionMessageFactory.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	HandshakeExtensionMessage.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTPexExtensionMessage.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTMetadataExtensionMessage.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTMetadataRequestExtensionMessage.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTMetadataRejectExtensionMessage.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTMetadataDataExtensionMessage.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	DHTNode.$(OBJEXT) DHTBucket.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	DHTRoutingTable.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	DHTMessageEntry.$(OBJEXT) \
 | 
			
		||||
| 
						 | 
				
			
			@ -1511,6 +1527,10 @@ distclean-compile:
 | 
			
		|||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TrackerWatcherCommand.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TransferStat.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/URIResult.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UTMetadataDataExtensionMessage.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UTMetadataExtensionMessage.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UTMetadataRejectExtensionMessage.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UTMetadataRequestExtensionMessage.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UTPexExtensionMessage.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UnknownLengthPieceStorage.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UriListParser.Po@am__quote@
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,9 +47,9 @@ class SocketCore;
 | 
			
		|||
class ARC4Encryptor;
 | 
			
		||||
class ARC4Decryptor;
 | 
			
		||||
 | 
			
		||||
// we assume maximum length of incoming message is "piece" message with 16KB
 | 
			
		||||
// data. Messages beyond that size are dropped.
 | 
			
		||||
#define MAX_PAYLOAD_LEN (9+16*1024)
 | 
			
		||||
// The maximum length of payload. Messages beyond that length are
 | 
			
		||||
// dropped.
 | 
			
		||||
#define MAX_PAYLOAD_LEN (16*1024+128)
 | 
			
		||||
 | 
			
		||||
class PeerConnection {
 | 
			
		||||
private:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -109,6 +109,8 @@ PeerInteractionCommand::PeerInteractionCommand
 | 
			
		|||
  SharedHandle<DefaultExtensionMessageFactory> extensionMessageFactory
 | 
			
		||||
    (new DefaultExtensionMessageFactory(peer, exMsgRegistry));
 | 
			
		||||
  extensionMessageFactory->setPeerStorage(peerStorage);
 | 
			
		||||
  extensionMessageFactory->setDownloadContext
 | 
			
		||||
    (_requestGroup->getDownloadContext());
 | 
			
		||||
 | 
			
		||||
  SharedHandle<DefaultBtMessageFactory> factory(new DefaultBtMessageFactory());
 | 
			
		||||
  factory->setCuid(cuid);
 | 
			
		||||
| 
						 | 
				
			
			@ -189,6 +191,9 @@ PeerInteractionCommand::PeerInteractionCommand
 | 
			
		|||
  factory->setBtRequestFactory(reqFactory);
 | 
			
		||||
  factory->setPeerConnection(peerConnection);
 | 
			
		||||
 | 
			
		||||
  extensionMessageFactory->setBtMessageDispatcher(dispatcher);
 | 
			
		||||
  extensionMessageFactory->setBtMessageFactory(factory);
 | 
			
		||||
 | 
			
		||||
  peer->allocateSessionResource
 | 
			
		||||
    (_requestGroup->getDownloadContext()->getPieceLength(),
 | 
			
		||||
     _requestGroup->getDownloadContext()->getTotalLength());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,77 @@
 | 
			
		|||
/* <!-- copyright */
 | 
			
		||||
/*
 | 
			
		||||
 * aria2 - The high speed download utility
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2009 Tatsuhiro Tsujikawa
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
			
		||||
 *
 | 
			
		||||
 * In addition, as a special exception, the copyright holders give
 | 
			
		||||
 * permission to link the code of portions of this program with the
 | 
			
		||||
 * OpenSSL library under certain conditions as described in each
 | 
			
		||||
 * individual source file, and distribute linked combinations
 | 
			
		||||
 * including the two.
 | 
			
		||||
 * You must obey the GNU General Public License in all respects
 | 
			
		||||
 * for all of the code used other than OpenSSL.  If you modify
 | 
			
		||||
 * file(s) with this exception, you may extend this exception to your
 | 
			
		||||
 * version of the file(s), but you are not obligated to do so.  If you
 | 
			
		||||
 * do not wish to do so, delete this exception statement from your
 | 
			
		||||
 * version.  If you delete this exception statement from all source
 | 
			
		||||
 * files in the program, then also delete it here.
 | 
			
		||||
 */
 | 
			
		||||
/* copyright --> */
 | 
			
		||||
#include "UTMetadataDataExtensionMessage.h"
 | 
			
		||||
#include "BDE.h"
 | 
			
		||||
#include "bencode.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "a2functional.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
UTMetadataDataExtensionMessage::UTMetadataDataExtensionMessage
 | 
			
		||||
(uint8_t extensionMessageID):UTMetadataExtensionMessage(extensionMessageID) {}
 | 
			
		||||
 | 
			
		||||
std::string UTMetadataDataExtensionMessage::getBencodedData()
 | 
			
		||||
{
 | 
			
		||||
  BDE list = BDE::list();
 | 
			
		||||
 | 
			
		||||
  BDE dict = BDE::dict();
 | 
			
		||||
  dict["msg_type"] = 1;
 | 
			
		||||
  dict["piece"] = _index;
 | 
			
		||||
  dict["total_size"] = _totalSize;
 | 
			
		||||
 | 
			
		||||
  BDE data = _data;
 | 
			
		||||
 | 
			
		||||
  list << dict;
 | 
			
		||||
  list << data;
 | 
			
		||||
 | 
			
		||||
  std::string encodedList = bencode::encode(list);
 | 
			
		||||
  // Remove first 'l' and last 'e' and return.
 | 
			
		||||
  return std::string(encodedList.begin()+1, encodedList.end()-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string UTMetadataDataExtensionMessage::toString() const
 | 
			
		||||
{
 | 
			
		||||
  return strconcat("ut_metadata data piece=", util::uitos(_index));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UTMetadataDataExtensionMessage::doReceivedAction()
 | 
			
		||||
{
 | 
			
		||||
  // Update tracker
 | 
			
		||||
 | 
			
		||||
  // Write to pieceStorage
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,79 @@
 | 
			
		|||
/* <!-- copyright */
 | 
			
		||||
/*
 | 
			
		||||
 * aria2 - The high speed download utility
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2009 Tatsuhiro Tsujikawa
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
			
		||||
 *
 | 
			
		||||
 * In addition, as a special exception, the copyright holders give
 | 
			
		||||
 * permission to link the code of portions of this program with the
 | 
			
		||||
 * OpenSSL library under certain conditions as described in each
 | 
			
		||||
 * individual source file, and distribute linked combinations
 | 
			
		||||
 * including the two.
 | 
			
		||||
 * You must obey the GNU General Public License in all respects
 | 
			
		||||
 * for all of the code used other than OpenSSL.  If you modify
 | 
			
		||||
 * file(s) with this exception, you may extend this exception to your
 | 
			
		||||
 * version of the file(s), but you are not obligated to do so.  If you
 | 
			
		||||
 * do not wish to do so, delete this exception statement from your
 | 
			
		||||
 * version.  If you delete this exception statement from all source
 | 
			
		||||
 * files in the program, then also delete it here.
 | 
			
		||||
 */
 | 
			
		||||
/* copyright --> */
 | 
			
		||||
#ifndef _D_UT_METADATA_DATA_EXTENSION_MESSAGE_H_
 | 
			
		||||
#define _D_UT_METADATA_DATA_EXTENSION_MESSAGE_H_
 | 
			
		||||
 | 
			
		||||
#include "UTMetadataExtensionMessage.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
class UTMetadataDataExtensionMessage:public UTMetadataExtensionMessage {
 | 
			
		||||
private:
 | 
			
		||||
  size_t _totalSize;
 | 
			
		||||
 | 
			
		||||
  std::string _data;
 | 
			
		||||
public:
 | 
			
		||||
  UTMetadataDataExtensionMessage(uint8_t extensionMessageID);
 | 
			
		||||
 | 
			
		||||
  virtual std::string getBencodedData();
 | 
			
		||||
 | 
			
		||||
  virtual std::string toString() const;
 | 
			
		||||
 | 
			
		||||
  virtual void doReceivedAction();
 | 
			
		||||
 | 
			
		||||
  void setTotalSize(size_t totalSize)
 | 
			
		||||
  {
 | 
			
		||||
    _totalSize = totalSize;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  size_t getTotalSize() const
 | 
			
		||||
  {
 | 
			
		||||
    return _totalSize;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void setData(const std::string& data)
 | 
			
		||||
  {
 | 
			
		||||
    _data = data;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const std::string& getData() const
 | 
			
		||||
  {
 | 
			
		||||
    return _data;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
 | 
			
		||||
#endif // _D_UT_METADATA_DATA_EXTENSION_MESSAGE_H_
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,46 @@
 | 
			
		|||
/* <!-- copyright */
 | 
			
		||||
/*
 | 
			
		||||
 * aria2 - The high speed download utility
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2009 Tatsuhiro Tsujikawa
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
			
		||||
 *
 | 
			
		||||
 * In addition, as a special exception, the copyright holders give
 | 
			
		||||
 * permission to link the code of portions of this program with the
 | 
			
		||||
 * OpenSSL library under certain conditions as described in each
 | 
			
		||||
 * individual source file, and distribute linked combinations
 | 
			
		||||
 * including the two.
 | 
			
		||||
 * You must obey the GNU General Public License in all respects
 | 
			
		||||
 * for all of the code used other than OpenSSL.  If you modify
 | 
			
		||||
 * file(s) with this exception, you may extend this exception to your
 | 
			
		||||
 * version of the file(s), but you are not obligated to do so.  If you
 | 
			
		||||
 * do not wish to do so, delete this exception statement from your
 | 
			
		||||
 * version.  If you delete this exception statement from all source
 | 
			
		||||
 * files in the program, then also delete it here.
 | 
			
		||||
 */
 | 
			
		||||
/* copyright --> */
 | 
			
		||||
#include "UTMetadataExtensionMessage.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
const std::string UTMetadataExtensionMessage::EXTENSION_NAME = "ut_metadata";
 | 
			
		||||
 | 
			
		||||
UTMetadataExtensionMessage::UTMetadataExtensionMessage
 | 
			
		||||
(uint8_t extensionMessageID):
 | 
			
		||||
  _extensionMessageID(extensionMessageID),
 | 
			
		||||
  _index(0) {}
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,75 @@
 | 
			
		|||
/* <!-- copyright */
 | 
			
		||||
/*
 | 
			
		||||
 * aria2 - The high speed download utility
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2009 Tatsuhiro Tsujikawa
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
			
		||||
 *
 | 
			
		||||
 * In addition, as a special exception, the copyright holders give
 | 
			
		||||
 * permission to link the code of portions of this program with the
 | 
			
		||||
 * OpenSSL library under certain conditions as described in each
 | 
			
		||||
 * individual source file, and distribute linked combinations
 | 
			
		||||
 * including the two.
 | 
			
		||||
 * You must obey the GNU General Public License in all respects
 | 
			
		||||
 * for all of the code used other than OpenSSL.  If you modify
 | 
			
		||||
 * file(s) with this exception, you may extend this exception to your
 | 
			
		||||
 * version of the file(s), but you are not obligated to do so.  If you
 | 
			
		||||
 * do not wish to do so, delete this exception statement from your
 | 
			
		||||
 * version.  If you delete this exception statement from all source
 | 
			
		||||
 * files in the program, then also delete it here.
 | 
			
		||||
 */
 | 
			
		||||
/* copyright --> */
 | 
			
		||||
#ifndef _D_UT_METADATA_EXTENSION_MESSAGE_H_
 | 
			
		||||
#define _D_UT_METADATA_EXTENSION_MESSAGE_H_
 | 
			
		||||
 | 
			
		||||
#include "ExtensionMessage.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
class UTMetadataExtensionMessage:public ExtensionMessage {
 | 
			
		||||
protected:
 | 
			
		||||
  uint8_t _extensionMessageID;
 | 
			
		||||
 | 
			
		||||
  size_t _index;
 | 
			
		||||
public:
 | 
			
		||||
  UTMetadataExtensionMessage(uint8_t extensionMessageID);
 | 
			
		||||
 | 
			
		||||
  virtual uint8_t getExtensionMessageID()
 | 
			
		||||
  {
 | 
			
		||||
    return _extensionMessageID;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  virtual const std::string& getExtensionName() const
 | 
			
		||||
  {
 | 
			
		||||
    return EXTENSION_NAME;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static const std::string EXTENSION_NAME;
 | 
			
		||||
 | 
			
		||||
  void setIndex(size_t index)
 | 
			
		||||
  {
 | 
			
		||||
    _index = index;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  size_t getIndex()
 | 
			
		||||
  {
 | 
			
		||||
    return _index;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
 | 
			
		||||
#endif // _D_UT_METADATA_EXTENSION_MESSAGE_H_
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,66 @@
 | 
			
		|||
/* <!-- copyright */
 | 
			
		||||
/*
 | 
			
		||||
 * aria2 - The high speed download utility
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2009 Tatsuhiro Tsujikawa
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
			
		||||
 *
 | 
			
		||||
 * In addition, as a special exception, the copyright holders give
 | 
			
		||||
 * permission to link the code of portions of this program with the
 | 
			
		||||
 * OpenSSL library under certain conditions as described in each
 | 
			
		||||
 * individual source file, and distribute linked combinations
 | 
			
		||||
 * including the two.
 | 
			
		||||
 * You must obey the GNU General Public License in all respects
 | 
			
		||||
 * for all of the code used other than OpenSSL.  If you modify
 | 
			
		||||
 * file(s) with this exception, you may extend this exception to your
 | 
			
		||||
 * version of the file(s), but you are not obligated to do so.  If you
 | 
			
		||||
 * do not wish to do so, delete this exception statement from your
 | 
			
		||||
 * version.  If you delete this exception statement from all source
 | 
			
		||||
 * files in the program, then also delete it here.
 | 
			
		||||
 */
 | 
			
		||||
/* copyright --> */
 | 
			
		||||
#include "UTMetadataRejectExtensionMessage.h"
 | 
			
		||||
#include "BDE.h"
 | 
			
		||||
#include "a2functional.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "bencode.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
UTMetadataRejectExtensionMessage::UTMetadataRejectExtensionMessage
 | 
			
		||||
(uint8_t extensionMessageID):
 | 
			
		||||
  UTMetadataExtensionMessage(extensionMessageID) {}
 | 
			
		||||
 | 
			
		||||
std::string UTMetadataRejectExtensionMessage::getBencodedData()
 | 
			
		||||
{
 | 
			
		||||
  BDE dict = BDE::dict();
 | 
			
		||||
  dict["msg_type"] = 2;
 | 
			
		||||
  dict["piece"] = _index;
 | 
			
		||||
  return bencode::encode(dict);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string UTMetadataRejectExtensionMessage::toString() const
 | 
			
		||||
{
 | 
			
		||||
  return strconcat("ut_metadata reject piece=", util::uitos(_index));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UTMetadataRejectExtensionMessage::doReceivedAction()
 | 
			
		||||
{
 | 
			
		||||
  // TODO Remove outstanding metadata request from tracker.
 | 
			
		||||
  // OR drop connection.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,55 @@
 | 
			
		|||
/* <!-- copyright */
 | 
			
		||||
/*
 | 
			
		||||
 * aria2 - The high speed download utility
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2009 Tatsuhiro Tsujikawa
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
			
		||||
 *
 | 
			
		||||
 * In addition, as a special exception, the copyright holders give
 | 
			
		||||
 * permission to link the code of portions of this program with the
 | 
			
		||||
 * OpenSSL library under certain conditions as described in each
 | 
			
		||||
 * individual source file, and distribute linked combinations
 | 
			
		||||
 * including the two.
 | 
			
		||||
 * You must obey the GNU General Public License in all respects
 | 
			
		||||
 * for all of the code used other than OpenSSL.  If you modify
 | 
			
		||||
 * file(s) with this exception, you may extend this exception to your
 | 
			
		||||
 * version of the file(s), but you are not obligated to do so.  If you
 | 
			
		||||
 * do not wish to do so, delete this exception statement from your
 | 
			
		||||
 * version.  If you delete this exception statement from all source
 | 
			
		||||
 * files in the program, then also delete it here.
 | 
			
		||||
 */
 | 
			
		||||
/* copyright --> */
 | 
			
		||||
#ifndef _D_UT_METADATA_REJECT_EXTENSION_MESSAGE_H_
 | 
			
		||||
#define _D_UT_METADATA_REJECT_EXTENSION_MESSAGE_H_
 | 
			
		||||
 | 
			
		||||
#include "UTMetadataExtensionMessage.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
class UTMetadataRejectExtensionMessage:public UTMetadataExtensionMessage {
 | 
			
		||||
public:
 | 
			
		||||
  UTMetadataRejectExtensionMessage(uint8_t extensionMessageID);
 | 
			
		||||
 | 
			
		||||
  virtual std::string getBencodedData();
 | 
			
		||||
 | 
			
		||||
  virtual std::string toString() const;
 | 
			
		||||
 | 
			
		||||
  virtual void doReceivedAction();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
 | 
			
		||||
#endif // _D_UT_METADATA_REJECT_EXTENSION_MESSAGE_H_
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,101 @@
 | 
			
		|||
/* <!-- copyright */
 | 
			
		||||
/*
 | 
			
		||||
 * aria2 - The high speed download utility
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2009 Tatsuhiro Tsujikawa
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
			
		||||
 *
 | 
			
		||||
 * In addition, as a special exception, the copyright holders give
 | 
			
		||||
 * permission to link the code of portions of this program with the
 | 
			
		||||
 * OpenSSL library under certain conditions as described in each
 | 
			
		||||
 * individual source file, and distribute linked combinations
 | 
			
		||||
 * including the two.
 | 
			
		||||
 * You must obey the GNU General Public License in all respects
 | 
			
		||||
 * for all of the code used other than OpenSSL.  If you modify
 | 
			
		||||
 * file(s) with this exception, you may extend this exception to your
 | 
			
		||||
 * version of the file(s), but you are not obligated to do so.  If you
 | 
			
		||||
 * do not wish to do so, delete this exception statement from your
 | 
			
		||||
 * version.  If you delete this exception statement from all source
 | 
			
		||||
 * files in the program, then also delete it here.
 | 
			
		||||
 */
 | 
			
		||||
/* copyright --> */
 | 
			
		||||
#include "UTMetadataRequestExtensionMessage.h"
 | 
			
		||||
#include "BDE.h"
 | 
			
		||||
#include "bencode.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "a2functional.h"
 | 
			
		||||
#include "bittorrent_helper.h"
 | 
			
		||||
#include "DlAbortEx.h"
 | 
			
		||||
#include "StringFormat.h"
 | 
			
		||||
#include "BtMessageFactory.h"
 | 
			
		||||
#include "BtMessageDispatcher.h"
 | 
			
		||||
#include "Peer.h"
 | 
			
		||||
#include "UTMetadataRejectExtensionMessage.h"
 | 
			
		||||
#include "UTMetadataDataExtensionMessage.h"
 | 
			
		||||
#include "BtConstants.h"
 | 
			
		||||
#include "DownloadContext.h"
 | 
			
		||||
#include "BtMessage.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
UTMetadataRequestExtensionMessage::UTMetadataRequestExtensionMessage
 | 
			
		||||
(uint8_t extensionMessageID):UTMetadataExtensionMessage(extensionMessageID) {}
 | 
			
		||||
 | 
			
		||||
std::string UTMetadataRequestExtensionMessage::getBencodedData()
 | 
			
		||||
{
 | 
			
		||||
  BDE dict = BDE::dict();
 | 
			
		||||
  dict["msg_type"] = 0;
 | 
			
		||||
  dict["piece"] = _index;
 | 
			
		||||
  return bencode::encode(dict);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string UTMetadataRequestExtensionMessage::toString() const
 | 
			
		||||
{
 | 
			
		||||
  return strconcat("ut_metadata request piece=", util::uitos(_index));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UTMetadataRequestExtensionMessage::doReceivedAction()
 | 
			
		||||
{
 | 
			
		||||
  const BDE& attrs = _dctx->getAttribute(bittorrent::BITTORRENT);
 | 
			
		||||
  uint8_t id = _peer->getExtensionMessageID("ut_metadata");
 | 
			
		||||
  if(!attrs.containsKey(bittorrent::METADATA)) {
 | 
			
		||||
    SharedHandle<UTMetadataRejectExtensionMessage> m
 | 
			
		||||
      (new UTMetadataRejectExtensionMessage(id));
 | 
			
		||||
    m->setIndex(_index);
 | 
			
		||||
    SharedHandle<BtMessage> msg = _messageFactory->createBtExtendedMessage(m);
 | 
			
		||||
    _dispatcher->addMessageToQueue(msg);
 | 
			
		||||
  }else if(_index*METADATA_PIECE_SIZE <
 | 
			
		||||
	   (size_t)attrs[bittorrent::METADATA_SIZE].i()){
 | 
			
		||||
    SharedHandle<UTMetadataDataExtensionMessage> m
 | 
			
		||||
      (new UTMetadataDataExtensionMessage(id));
 | 
			
		||||
    m->setIndex(_index);
 | 
			
		||||
    m->setTotalSize(attrs[bittorrent::METADATA_SIZE].i());
 | 
			
		||||
    const BDE& metadata = attrs[bittorrent::METADATA];
 | 
			
		||||
    std::string::const_iterator begin =
 | 
			
		||||
      metadata.s().begin()+_index*METADATA_PIECE_SIZE;
 | 
			
		||||
    std::string::const_iterator end =
 | 
			
		||||
      (_index+1)*METADATA_PIECE_SIZE <= metadata.s().size()?
 | 
			
		||||
      metadata.s().begin()+(_index+1)*METADATA_PIECE_SIZE:metadata.s().end();
 | 
			
		||||
    m->setData(std::string(begin, end));
 | 
			
		||||
    SharedHandle<BtMessage> msg = _messageFactory->createBtExtendedMessage(m);
 | 
			
		||||
    _dispatcher->addMessageToQueue(msg);
 | 
			
		||||
  } else {
 | 
			
		||||
    throw DL_ABORT_EX
 | 
			
		||||
      (StringFormat("Metadata piece index is too big. piece=%d", _index).str());
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,88 @@
 | 
			
		|||
/* <!-- copyright */
 | 
			
		||||
/*
 | 
			
		||||
 * aria2 - The high speed download utility
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2009 Tatsuhiro Tsujikawa
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
			
		||||
 *
 | 
			
		||||
 * In addition, as a special exception, the copyright holders give
 | 
			
		||||
 * permission to link the code of portions of this program with the
 | 
			
		||||
 * OpenSSL library under certain conditions as described in each
 | 
			
		||||
 * individual source file, and distribute linked combinations
 | 
			
		||||
 * including the two.
 | 
			
		||||
 * You must obey the GNU General Public License in all respects
 | 
			
		||||
 * for all of the code used other than OpenSSL.  If you modify
 | 
			
		||||
 * file(s) with this exception, you may extend this exception to your
 | 
			
		||||
 * version of the file(s), but you are not obligated to do so.  If you
 | 
			
		||||
 * do not wish to do so, delete this exception statement from your
 | 
			
		||||
 * version.  If you delete this exception statement from all source
 | 
			
		||||
 * files in the program, then also delete it here.
 | 
			
		||||
 */
 | 
			
		||||
/* copyright --> */
 | 
			
		||||
#ifndef _D_UT_METADATA_REQUEST_EXTENSION_MESSAGE_H_
 | 
			
		||||
#define _D_UT_METADATA_REQUEST_EXTENSION_MESSAGE_H_
 | 
			
		||||
 | 
			
		||||
#include "UTMetadataExtensionMessage.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
class DownloadContext;
 | 
			
		||||
class BtMessageDispatcher;
 | 
			
		||||
class BtMessageFactory;
 | 
			
		||||
class Peer;
 | 
			
		||||
 | 
			
		||||
class UTMetadataRequestExtensionMessage:public UTMetadataExtensionMessage {
 | 
			
		||||
private:
 | 
			
		||||
  SharedHandle<DownloadContext> _dctx;
 | 
			
		||||
 | 
			
		||||
  SharedHandle<Peer> _peer;
 | 
			
		||||
 | 
			
		||||
  WeakHandle<BtMessageDispatcher> _dispatcher;
 | 
			
		||||
 | 
			
		||||
  WeakHandle<BtMessageFactory> _messageFactory;
 | 
			
		||||
public:
 | 
			
		||||
  UTMetadataRequestExtensionMessage(uint8_t extensionMessageID);
 | 
			
		||||
 | 
			
		||||
  virtual std::string getBencodedData();
 | 
			
		||||
 | 
			
		||||
  virtual std::string toString() const;
 | 
			
		||||
 | 
			
		||||
  virtual void doReceivedAction();
 | 
			
		||||
 | 
			
		||||
  void setDownloadContext(const SharedHandle<DownloadContext>& dctx)
 | 
			
		||||
  {
 | 
			
		||||
    _dctx = dctx;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void setBtMessageDispatcher(const WeakHandle<BtMessageDispatcher>& disp)
 | 
			
		||||
  {
 | 
			
		||||
    _dispatcher = disp;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void setBtMessageFactory(const WeakHandle<BtMessageFactory>& factory)
 | 
			
		||||
  {
 | 
			
		||||
    _messageFactory = factory;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void setPeer(const SharedHandle<Peer>& peer)
 | 
			
		||||
  {
 | 
			
		||||
    _peer = peer;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
 | 
			
		||||
#endif // _D_UT_METADATA_REQUEST_EXTENSION_MESSAGE_H_
 | 
			
		||||
| 
						 | 
				
			
			@ -125,6 +125,10 @@ const std::string MULTI("multi");
 | 
			
		|||
 | 
			
		||||
const std::string SINGLE("single");
 | 
			
		||||
 | 
			
		||||
const std::string METADATA_SIZE("metadataSize");
 | 
			
		||||
 | 
			
		||||
const std::string METADATA("metadata");
 | 
			
		||||
 | 
			
		||||
static void extractPieceHash(const SharedHandle<DownloadContext>& ctx,
 | 
			
		||||
			     const std::string& hashData,
 | 
			
		||||
			     size_t hashLength,
 | 
			
		||||
| 
						 | 
				
			
			@ -364,6 +368,8 @@ static void processRootDictionary
 | 
			
		|||
			      encodedInfoDict.data(),
 | 
			
		||||
			      encodedInfoDict.size());
 | 
			
		||||
  torrent[INFO_HASH] = std::string(&infoHash[0], &infoHash[INFO_HASH_LENGTH]);
 | 
			
		||||
  torrent[METADATA] = encodedInfoDict;
 | 
			
		||||
  torrent[METADATA_SIZE] = encodedInfoDict.size();
 | 
			
		||||
 | 
			
		||||
  // calculate the number of pieces
 | 
			
		||||
  const BDE& piecesData = infoDict[C_PIECES];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -84,6 +84,10 @@ extern const std::string MULTI;
 | 
			
		|||
 | 
			
		||||
extern const std::string BITTORRENT;
 | 
			
		||||
 | 
			
		||||
extern const std::string METADATA_SIZE;
 | 
			
		||||
 | 
			
		||||
extern const std::string METADATA;
 | 
			
		||||
 | 
			
		||||
void load(const std::string& torrentFile,
 | 
			
		||||
	  const SharedHandle<DownloadContext>& ctx,
 | 
			
		||||
	  const std::string& overrideName = "");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,8 @@
 | 
			
		|||
#include "array_fun.h"
 | 
			
		||||
#include "messageDigest.h"
 | 
			
		||||
#include "a2netcompat.h"
 | 
			
		||||
#include "bencode.h"
 | 
			
		||||
#include "TestUtil.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -52,9 +54,10 @@ class BittorrentHelperTest:public CppUnit::TestFixture {
 | 
			
		|||
  CPPUNIT_TEST(testSetFileFilter_single);
 | 
			
		||||
  CPPUNIT_TEST(testSetFileFilter_multi);
 | 
			
		||||
  CPPUNIT_TEST(testUTF8Torrent);
 | 
			
		||||
  CPPUNIT_TEST(testMetaData);
 | 
			
		||||
  CPPUNIT_TEST(testEtc);
 | 
			
		||||
  CPPUNIT_TEST(testCreatecompact);
 | 
			
		||||
  CPPUNIT_TEST(testCheckBitfield);
 | 
			
		||||
  CPPUNIT_TEST(testMetadata);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
public:
 | 
			
		||||
  void setUp() {
 | 
			
		||||
| 
						 | 
				
			
			@ -90,9 +93,10 @@ public:
 | 
			
		|||
  void testSetFileFilter_single();
 | 
			
		||||
  void testSetFileFilter_multi();
 | 
			
		||||
  void testUTF8Torrent();
 | 
			
		||||
  void testMetaData();
 | 
			
		||||
  void testEtc();
 | 
			
		||||
  void testCreatecompact();
 | 
			
		||||
  void testCheckBitfield();
 | 
			
		||||
  void testMetadata();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -634,7 +638,7 @@ void BittorrentHelperTest::testUTF8Torrent()
 | 
			
		|||
		       dctx->getAttribute(BITTORRENT)[COMMENT].s());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void BittorrentHelperTest::testMetaData()
 | 
			
		||||
void BittorrentHelperTest::testEtc()
 | 
			
		||||
{
 | 
			
		||||
  SharedHandle<DownloadContext> dctx(new DownloadContext());
 | 
			
		||||
  load("test.torrent", dctx);
 | 
			
		||||
| 
						 | 
				
			
			@ -678,6 +682,19 @@ void BittorrentHelperTest::testCheckBitfield()
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void BittorrentHelperTest::testMetadata() {
 | 
			
		||||
  SharedHandle<DownloadContext> dctx(new DownloadContext());
 | 
			
		||||
  load("test.torrent", dctx);
 | 
			
		||||
  std::string torrentData = readFile("test.torrent");
 | 
			
		||||
  BDE tr = bencode::decode(torrentData);
 | 
			
		||||
  BDE infoDic = tr["info"];
 | 
			
		||||
  std::string metadata = bencode::encode(infoDic);
 | 
			
		||||
  const BDE& attrs = dctx->getAttribute(bittorrent::BITTORRENT);
 | 
			
		||||
  CPPUNIT_ASSERT(metadata == attrs[bittorrent::METADATA].s());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(metadata.size(),
 | 
			
		||||
		       (size_t)attrs[bittorrent::METADATA_SIZE].i());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace bittorrent
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,6 +12,15 @@
 | 
			
		|||
#include "Exception.h"
 | 
			
		||||
#include "FileEntry.h"
 | 
			
		||||
#include "ExtensionMessageRegistry.h"
 | 
			
		||||
#include "DownloadContext.h"
 | 
			
		||||
#include "MockBtMessageDispatcher.h"
 | 
			
		||||
#include "MockBtMessageFactory.h"
 | 
			
		||||
#include "DownloadContext.h"
 | 
			
		||||
#include "BtHandshakeMessage.h"
 | 
			
		||||
#include "StringFormat.h"
 | 
			
		||||
#include "UTMetadataRequestExtensionMessage.h"
 | 
			
		||||
#include "UTMetadataDataExtensionMessage.h"
 | 
			
		||||
#include "UTMetadataRejectExtensionMessage.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -21,12 +30,18 @@ class DefaultExtensionMessageFactoryTest:public CppUnit::TestFixture {
 | 
			
		|||
  CPPUNIT_TEST(testCreateMessage_unknown);
 | 
			
		||||
  CPPUNIT_TEST(testCreateMessage_Handshake);
 | 
			
		||||
  CPPUNIT_TEST(testCreateMessage_UTPex);
 | 
			
		||||
  CPPUNIT_TEST(testCreateMessage_UTMetadataRequest);
 | 
			
		||||
  CPPUNIT_TEST(testCreateMessage_UTMetadataData);
 | 
			
		||||
  CPPUNIT_TEST(testCreateMessage_UTMetadataReject);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
private:
 | 
			
		||||
  SharedHandle<MockPeerStorage> _peerStorage;
 | 
			
		||||
  SharedHandle<Peer> _peer;
 | 
			
		||||
  SharedHandle<DefaultExtensionMessageFactory> _factory;
 | 
			
		||||
  SharedHandle<ExtensionMessageRegistry> _registry;
 | 
			
		||||
  SharedHandle<MockBtMessageDispatcher> _dispatcher;
 | 
			
		||||
  SharedHandle<MockBtMessageFactory> _messageFactory;
 | 
			
		||||
  SharedHandle<DownloadContext> _dctx;
 | 
			
		||||
public:
 | 
			
		||||
  void setUp()
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -38,15 +53,41 @@ public:
 | 
			
		|||
 | 
			
		||||
    _registry.reset(new ExtensionMessageRegistry());
 | 
			
		||||
 | 
			
		||||
    _dispatcher.reset(new MockBtMessageDispatcher());
 | 
			
		||||
 | 
			
		||||
    _messageFactory.reset(new MockBtMessageFactory());
 | 
			
		||||
 | 
			
		||||
    _dctx.reset(new DownloadContext());
 | 
			
		||||
 | 
			
		||||
    _factory.reset(new DefaultExtensionMessageFactory());
 | 
			
		||||
    _factory->setPeerStorage(_peerStorage);
 | 
			
		||||
    _factory->setPeer(_peer);
 | 
			
		||||
    _factory->setExtensionMessageRegistry(_registry);
 | 
			
		||||
    _factory->setBtMessageDispatcher(_dispatcher);
 | 
			
		||||
    _factory->setBtMessageFactory(_messageFactory);
 | 
			
		||||
    _factory->setDownloadContext(_dctx);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  std::string getExtensionMessageID(const std::string& name)
 | 
			
		||||
  {
 | 
			
		||||
    char id[1] = { _registry->getExtensionMessageID(name) };
 | 
			
		||||
    return std::string(&id[0], &id[1]);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template<typename T>
 | 
			
		||||
  SharedHandle<T> createMessage(const std::string& data)
 | 
			
		||||
  {
 | 
			
		||||
    return dynamic_pointer_cast<T>
 | 
			
		||||
      (_factory->createMessage
 | 
			
		||||
       (reinterpret_cast<const unsigned char*>(data.c_str()), data.size()));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void testCreateMessage_unknown();
 | 
			
		||||
  void testCreateMessage_Handshake();
 | 
			
		||||
  void testCreateMessage_UTPex();
 | 
			
		||||
  void testCreateMessage_UTMetadataRequest();
 | 
			
		||||
  void testCreateMessage_UTMetadataData();
 | 
			
		||||
  void testCreateMessage_UTMetadataReject();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -74,10 +115,8 @@ void DefaultExtensionMessageFactoryTest::testCreateMessage_Handshake()
 | 
			
		|||
  char id[1] = { 0 };
 | 
			
		||||
 | 
			
		||||
  std::string data = std::string(&id[0], &id[1])+"d1:v5:aria2e";
 | 
			
		||||
  SharedHandle<HandshakeExtensionMessage> m
 | 
			
		||||
    (dynamic_pointer_cast<HandshakeExtensionMessage>
 | 
			
		||||
     (_factory->createMessage
 | 
			
		||||
      (reinterpret_cast<const unsigned char*>(data.c_str()), data.size())));
 | 
			
		||||
  SharedHandle<HandshakeExtensionMessage> m =
 | 
			
		||||
    createMessage<HandshakeExtensionMessage>(data);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("aria2"), m->getClientVersion());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -92,20 +131,45 @@ void DefaultExtensionMessageFactoryTest::testCreateMessage_UTPex()
 | 
			
		|||
  bittorrent::createcompact(c3, "192.168.0.2", 6882);
 | 
			
		||||
  bittorrent::createcompact(c4, "10.1.1.3",10000);
 | 
			
		||||
 | 
			
		||||
  char id[1] = { _registry->getExtensionMessageID("ut_pex") };
 | 
			
		||||
 | 
			
		||||
  std::string data = std::string(&id[0], &id[1])+"d5:added12:"+
 | 
			
		||||
  std::string data = getExtensionMessageID("ut_pex")+"d5:added12:"+
 | 
			
		||||
    std::string(&c1[0], &c1[6])+std::string(&c2[0], &c2[6])+
 | 
			
		||||
    "7:added.f2:207:dropped12:"+
 | 
			
		||||
    std::string(&c3[0], &c3[6])+std::string(&c4[0], &c4[6])+
 | 
			
		||||
    "e";
 | 
			
		||||
 | 
			
		||||
  SharedHandle<UTPexExtensionMessage> m
 | 
			
		||||
    (dynamic_pointer_cast<UTPexExtensionMessage>
 | 
			
		||||
     (_factory->createMessage
 | 
			
		||||
      (reinterpret_cast<const unsigned char*>(data.c_str()), data.size())));
 | 
			
		||||
  SharedHandle<UTPexExtensionMessage> m =
 | 
			
		||||
    createMessage<UTPexExtensionMessage>(data);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(_registry->getExtensionMessageID("ut_pex"),
 | 
			
		||||
		       m->getExtensionMessageID());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DefaultExtensionMessageFactoryTest::testCreateMessage_UTMetadataRequest()
 | 
			
		||||
{
 | 
			
		||||
  std::string data = getExtensionMessageID("ut_metadata")+
 | 
			
		||||
    "d8:msg_typei0e5:piecei1ee";
 | 
			
		||||
  SharedHandle<UTMetadataRequestExtensionMessage> m =
 | 
			
		||||
    createMessage<UTMetadataRequestExtensionMessage>(data);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((size_t)1, m->getIndex());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DefaultExtensionMessageFactoryTest::testCreateMessage_UTMetadataData()
 | 
			
		||||
{
 | 
			
		||||
  std::string data = getExtensionMessageID("ut_metadata")+
 | 
			
		||||
    "d8:msg_typei1e5:piecei1e10:total_sizei300ee10:0000000000";
 | 
			
		||||
  SharedHandle<UTMetadataDataExtensionMessage> m =
 | 
			
		||||
    createMessage<UTMetadataDataExtensionMessage>(data);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((size_t)1, m->getIndex());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((size_t)300, m->getTotalSize());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string(10, '0'), m->getData());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DefaultExtensionMessageFactoryTest::testCreateMessage_UTMetadataReject()
 | 
			
		||||
{
 | 
			
		||||
  std::string data = getExtensionMessageID("ut_metadata")+
 | 
			
		||||
    "d8:msg_typei2e5:piecei1ee";
 | 
			
		||||
  SharedHandle<UTMetadataRejectExtensionMessage> m =
 | 
			
		||||
    createMessage<UTMetadataRejectExtensionMessage>(data);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((size_t)1, m->getIndex());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,8 @@
 | 
			
		|||
#include "Peer.h"
 | 
			
		||||
#include "Exception.h"
 | 
			
		||||
#include "FileEntry.h"
 | 
			
		||||
#include "DownloadContext.h"
 | 
			
		||||
#include "bittorrent_helper.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -57,11 +59,18 @@ void HandshakeExtensionMessageTest::testGetBencodedData()
 | 
			
		|||
  msg.setTCPPort(6889);
 | 
			
		||||
  msg.setExtension("ut_pex", 1);
 | 
			
		||||
  msg.setExtension("a2_dht", 2);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("d"
 | 
			
		||||
				   "1:md6:a2_dhti2e6:ut_pexi1ee"
 | 
			
		||||
				   "1:pi6889e"
 | 
			
		||||
				   "1:v5:aria2"
 | 
			
		||||
				   "e"), msg.getBencodedData());
 | 
			
		||||
  msg.setMetadataSize(1024);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL
 | 
			
		||||
    (std::string("d"
 | 
			
		||||
		 "1:md6:a2_dhti2e6:ut_pexi1ee"
 | 
			
		||||
		 "13:metadata_sizei1024e"
 | 
			
		||||
		 "1:pi6889e"
 | 
			
		||||
		 "1:v5:aria2"
 | 
			
		||||
		 "e"), msg.getBencodedData());
 | 
			
		||||
 | 
			
		||||
  msg.setMetadataSize(0);
 | 
			
		||||
  CPPUNIT_ASSERT
 | 
			
		||||
    (msg.getBencodedData().find("metadata_size") == std::string::npos);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HandshakeExtensionMessageTest::testToString()
 | 
			
		||||
| 
						 | 
				
			
			@ -71,11 +80,18 @@ void HandshakeExtensionMessageTest::testToString()
 | 
			
		|||
  msg.setTCPPort(6889);
 | 
			
		||||
  msg.setExtension("ut_pex", 1);
 | 
			
		||||
  msg.setExtension("a2_dht", 2);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("handshake client=aria2, tcpPort=6889, a2_dht=2, ut_pex=1"), msg.toString());
 | 
			
		||||
  msg.setMetadataSize(1024);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL
 | 
			
		||||
    (std::string("handshake client=aria2, tcpPort=6889, metadataSize=1024,"
 | 
			
		||||
		 " a2_dht=2, ut_pex=1"), msg.toString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HandshakeExtensionMessageTest::testDoReceivedAction()
 | 
			
		||||
{
 | 
			
		||||
  SharedHandle<DownloadContext> ctx(new DownloadContext());
 | 
			
		||||
  BDE attrs = BDE::dict();
 | 
			
		||||
  ctx->setAttribute(bittorrent::BITTORRENT, attrs);
 | 
			
		||||
 | 
			
		||||
  SharedHandle<Peer> peer(new Peer("192.168.0.1", 0));
 | 
			
		||||
  peer->allocateSessionResource(1024, 1024*1024);
 | 
			
		||||
  HandshakeExtensionMessage msg;
 | 
			
		||||
| 
						 | 
				
			
			@ -83,25 +99,29 @@ void HandshakeExtensionMessageTest::testDoReceivedAction()
 | 
			
		|||
  msg.setTCPPort(6889);
 | 
			
		||||
  msg.setExtension("ut_pex", 1);
 | 
			
		||||
  msg.setExtension("a2_dht", 2);
 | 
			
		||||
  msg.setMetadataSize(1024);
 | 
			
		||||
  msg.setPeer(peer);
 | 
			
		||||
  msg.setDownloadContext(ctx);
 | 
			
		||||
 | 
			
		||||
  msg.doReceivedAction();
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((uint16_t)6889, peer->port);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((uint8_t)1, peer->getExtensionMessageID("ut_pex"));
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((uint8_t)2, peer->getExtensionMessageID("a2_dht"));
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((int64_t)1024, attrs[bittorrent::METADATA_SIZE].i());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HandshakeExtensionMessageTest::testCreate()
 | 
			
		||||
{
 | 
			
		||||
  std::string in = "0d1:pi6881e1:v5:aria21:md6:ut_pexi1eee";
 | 
			
		||||
  std::string in = 
 | 
			
		||||
    "0d1:pi6881e1:v5:aria21:md6:ut_pexi1ee13:metadata_sizei1024ee";
 | 
			
		||||
  SharedHandle<HandshakeExtensionMessage> m =
 | 
			
		||||
    HandshakeExtensionMessage::create(reinterpret_cast<const unsigned char*>(in.c_str()),
 | 
			
		||||
				      in.size());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("aria2"), m->getClientVersion());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((uint16_t)6881, m->getTCPPort());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID("ut_pex"));
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((size_t)1024, m->getMetadataSize());
 | 
			
		||||
  try {
 | 
			
		||||
    // bad payload format
 | 
			
		||||
    std::string in = "011:hello world";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -136,6 +136,9 @@ aria2c_SOURCES += BtAllowedFastMessageTest.cc\
 | 
			
		|||
	BtExtendedMessageTest.cc\
 | 
			
		||||
	HandshakeExtensionMessageTest.cc\
 | 
			
		||||
	UTPexExtensionMessageTest.cc\
 | 
			
		||||
	UTMetadataRequestExtensionMessageTest.cc\
 | 
			
		||||
	UTMetadataDataExtensionMessageTest.cc\
 | 
			
		||||
	UTMetadataRejectExtensionMessageTest.cc\
 | 
			
		||||
	DefaultBtMessageFactoryTest.cc\
 | 
			
		||||
	DefaultExtensionMessageFactoryTest.cc\
 | 
			
		||||
	DHTNodeTest.cc\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -86,6 +86,9 @@ check_PROGRAMS = $(am__EXEEXT_1)
 | 
			
		|||
@ENABLE_BITTORRENT_TRUE@	BtExtendedMessageTest.cc\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	HandshakeExtensionMessageTest.cc\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTPexExtensionMessageTest.cc\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTMetadataRequestExtensionMessageTest.cc\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTMetadataDataExtensionMessageTest.cc\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTMetadataRejectExtensionMessageTest.cc\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	DefaultBtMessageFactoryTest.cc\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	DefaultExtensionMessageFactoryTest.cc\
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	DHTNodeTest.cc\
 | 
			
		||||
| 
						 | 
				
			
			@ -224,7 +227,11 @@ am__aria2c_SOURCES_DIST = AllTest.cc TestUtil.cc TestUtil.h \
 | 
			
		|||
	BtRegistryTest.cc BtDependencyTest.cc \
 | 
			
		||||
	BtPostDownloadHandlerTest.cc TimeSeedCriteriaTest.cc \
 | 
			
		||||
	BtExtendedMessageTest.cc HandshakeExtensionMessageTest.cc \
 | 
			
		||||
	UTPexExtensionMessageTest.cc DefaultBtMessageFactoryTest.cc \
 | 
			
		||||
	UTPexExtensionMessageTest.cc \
 | 
			
		||||
	UTMetadataRequestExtensionMessageTest.cc \
 | 
			
		||||
	UTMetadataDataExtensionMessageTest.cc \
 | 
			
		||||
	UTMetadataRejectExtensionMessageTest.cc \
 | 
			
		||||
	DefaultBtMessageFactoryTest.cc \
 | 
			
		||||
	DefaultExtensionMessageFactoryTest.cc DHTNodeTest.cc \
 | 
			
		||||
	DHTBucketTest.cc DHTRoutingTableTest.cc \
 | 
			
		||||
	DHTMessageTrackerEntryTest.cc DHTMessageTrackerTest.cc \
 | 
			
		||||
| 
						 | 
				
			
			@ -296,6 +303,9 @@ am__aria2c_SOURCES_DIST = AllTest.cc TestUtil.cc TestUtil.h \
 | 
			
		|||
@ENABLE_BITTORRENT_TRUE@	BtExtendedMessageTest.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	HandshakeExtensionMessageTest.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTPexExtensionMessageTest.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTMetadataRequestExtensionMessageTest.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTMetadataDataExtensionMessageTest.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	UTMetadataRejectExtensionMessageTest.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	DefaultBtMessageFactoryTest.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	DefaultExtensionMessageFactoryTest.$(OBJEXT) \
 | 
			
		||||
@ENABLE_BITTORRENT_TRUE@	DHTNodeTest.$(OBJEXT) \
 | 
			
		||||
| 
						 | 
				
			
			@ -840,6 +850,9 @@ distclean-compile:
 | 
			
		|||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TestUtil.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TimeSeedCriteriaTest.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TimeTest.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UTMetadataDataExtensionMessageTest.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UTMetadataRejectExtensionMessageTest.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UTMetadataRequestExtensionMessageTest.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UTPexExtensionMessageTest.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UriListParserTest.Po@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UtilTest.Po@am__quote@
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,60 @@
 | 
			
		|||
#include "UTMetadataDataExtensionMessage.h"
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
 | 
			
		||||
#include "BtConstants.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
class UTMetadataDataExtensionMessageTest:public CppUnit::TestFixture {
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_TEST_SUITE(UTMetadataDataExtensionMessageTest);
 | 
			
		||||
  CPPUNIT_TEST(testGetExtensionMessageID);
 | 
			
		||||
  CPPUNIT_TEST(testGetBencodedData);
 | 
			
		||||
  CPPUNIT_TEST(testToString);
 | 
			
		||||
  CPPUNIT_TEST(testDoReceivedAction);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
public:
 | 
			
		||||
  void testGetExtensionMessageID();
 | 
			
		||||
  void testGetBencodedData();
 | 
			
		||||
  void testToString();
 | 
			
		||||
  void testDoReceivedAction();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CPPUNIT_TEST_SUITE_REGISTRATION(UTMetadataDataExtensionMessageTest);
 | 
			
		||||
 | 
			
		||||
void UTMetadataDataExtensionMessageTest::testGetExtensionMessageID()
 | 
			
		||||
{
 | 
			
		||||
  UTMetadataDataExtensionMessage msg(1);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((uint8_t)1, msg.getExtensionMessageID());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UTMetadataDataExtensionMessageTest::testGetBencodedData()
 | 
			
		||||
{
 | 
			
		||||
  std::string data(METADATA_PIECE_SIZE, '0');
 | 
			
		||||
 | 
			
		||||
  UTMetadataDataExtensionMessage msg(1);
 | 
			
		||||
  msg.setIndex(1);
 | 
			
		||||
  msg.setTotalSize(data.size());
 | 
			
		||||
  msg.setData(data);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL
 | 
			
		||||
    (std::string("d8:msg_typei1e5:piecei1e10:total_sizei16384ee16384:")+data,
 | 
			
		||||
     msg.getBencodedData());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UTMetadataDataExtensionMessageTest::testToString()
 | 
			
		||||
{
 | 
			
		||||
  UTMetadataDataExtensionMessage msg(1);
 | 
			
		||||
  msg.setIndex(100);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata data piece=100"),
 | 
			
		||||
		       msg.toString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UTMetadataDataExtensionMessageTest::testDoReceivedAction()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,55 @@
 | 
			
		|||
#include "UTMetadataRejectExtensionMessage.h"
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
 | 
			
		||||
#include "BtConstants.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
class UTMetadataRejectExtensionMessageTest:public CppUnit::TestFixture {
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_TEST_SUITE(UTMetadataRejectExtensionMessageTest);
 | 
			
		||||
  CPPUNIT_TEST(testGetExtensionMessageID);
 | 
			
		||||
  CPPUNIT_TEST(testGetBencodedReject);
 | 
			
		||||
  CPPUNIT_TEST(testToString);
 | 
			
		||||
  CPPUNIT_TEST(testDoReceivedAction);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
public:
 | 
			
		||||
  void testGetExtensionMessageID();
 | 
			
		||||
  void testGetBencodedReject();
 | 
			
		||||
  void testToString();
 | 
			
		||||
  void testDoReceivedAction();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CPPUNIT_TEST_SUITE_REGISTRATION(UTMetadataRejectExtensionMessageTest);
 | 
			
		||||
 | 
			
		||||
void UTMetadataRejectExtensionMessageTest::testGetExtensionMessageID()
 | 
			
		||||
{
 | 
			
		||||
  UTMetadataRejectExtensionMessage msg(1);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((uint8_t)1, msg.getExtensionMessageID());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UTMetadataRejectExtensionMessageTest::testGetBencodedReject()
 | 
			
		||||
{
 | 
			
		||||
  UTMetadataRejectExtensionMessage msg(1);
 | 
			
		||||
  msg.setIndex(1);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL
 | 
			
		||||
    (std::string("d8:msg_typei2e5:piecei1ee"), msg.getBencodedData());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UTMetadataRejectExtensionMessageTest::testToString()
 | 
			
		||||
{
 | 
			
		||||
  UTMetadataRejectExtensionMessage msg(1);
 | 
			
		||||
  msg.setIndex(100);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata reject piece=100"),
 | 
			
		||||
		       msg.toString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UTMetadataRejectExtensionMessageTest::testDoReceivedAction()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,186 @@
 | 
			
		|||
#include "UTMetadataRequestExtensionMessage.h"
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
 | 
			
		||||
#include "Peer.h"
 | 
			
		||||
#include "DownloadContext.h"
 | 
			
		||||
#include "MockBtMessage.h"
 | 
			
		||||
#include "MockBtMessageDispatcher.h"
 | 
			
		||||
#include "MockBtMessageFactory.h"
 | 
			
		||||
#include "bittorrent_helper.h"
 | 
			
		||||
#include "BtHandshakeMessage.h"
 | 
			
		||||
#include "UTMetadataRejectExtensionMessage.h"
 | 
			
		||||
#include "UTMetadataDataExtensionMessage.h"
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
class UTMetadataRequestExtensionMessageTest:public CppUnit::TestFixture {
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_TEST_SUITE(UTMetadataRequestExtensionMessageTest);
 | 
			
		||||
  CPPUNIT_TEST(testGetExtensionMessageID);
 | 
			
		||||
  CPPUNIT_TEST(testGetExtensionName);
 | 
			
		||||
  CPPUNIT_TEST(testGetBencodedData);
 | 
			
		||||
  CPPUNIT_TEST(testToString);
 | 
			
		||||
  CPPUNIT_TEST(testDoReceivedAction_reject);
 | 
			
		||||
  CPPUNIT_TEST(testDoReceivedAction_data);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
public:
 | 
			
		||||
  class MockExtensionMessage:public MockBtMessage {
 | 
			
		||||
  public:
 | 
			
		||||
    SharedHandle<ExtensionMessage> _m;
 | 
			
		||||
    
 | 
			
		||||
    MockExtensionMessage(const SharedHandle<ExtensionMessage>& m):_m(m) {}
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  class MockBtMessageFactory2:public MockBtMessageFactory {
 | 
			
		||||
  public:
 | 
			
		||||
    virtual SharedHandle<BtMessage>
 | 
			
		||||
    createBtExtendedMessage(const SharedHandle<ExtensionMessage>& extmsg)
 | 
			
		||||
    {
 | 
			
		||||
      return SharedHandle<BtMessage>(new MockExtensionMessage(extmsg));
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  SharedHandle<DownloadContext> _dctx;
 | 
			
		||||
  SharedHandle<MockBtMessageFactory2> _messageFactory;
 | 
			
		||||
  SharedHandle<MockBtMessageDispatcher> _dispatcher;
 | 
			
		||||
  SharedHandle<Peer> _peer;
 | 
			
		||||
 | 
			
		||||
  void setUp()
 | 
			
		||||
  {
 | 
			
		||||
    _messageFactory.reset(new MockBtMessageFactory2());
 | 
			
		||||
    _dispatcher.reset(new MockBtMessageDispatcher());
 | 
			
		||||
    _dctx.reset(new DownloadContext());
 | 
			
		||||
    BDE attrs = BDE::dict();
 | 
			
		||||
    _dctx->setAttribute(bittorrent::BITTORRENT, attrs);
 | 
			
		||||
    _peer.reset(new Peer("host", 6880));
 | 
			
		||||
    _peer->allocateSessionResource(0, 0);
 | 
			
		||||
    _peer->setExtension("ut_metadata", 1);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template<typename T>
 | 
			
		||||
  SharedHandle<T> getFirstDispatchedMessage()
 | 
			
		||||
  {
 | 
			
		||||
    SharedHandle<MockExtensionMessage> wrapmsg =
 | 
			
		||||
      dynamic_pointer_cast<MockExtensionMessage>
 | 
			
		||||
      (_dispatcher->messageQueue.front());
 | 
			
		||||
    
 | 
			
		||||
    SharedHandle<T> msg = dynamic_pointer_cast<T>(wrapmsg->_m);
 | 
			
		||||
    return msg;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void testGetExtensionMessageID();
 | 
			
		||||
  void testGetExtensionName();
 | 
			
		||||
  void testGetBencodedData();
 | 
			
		||||
  void testToString();
 | 
			
		||||
  void testDoReceivedAction_reject();
 | 
			
		||||
  void testDoReceivedAction_data();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CPPUNIT_TEST_SUITE_REGISTRATION(UTMetadataRequestExtensionMessageTest);
 | 
			
		||||
 | 
			
		||||
void UTMetadataRequestExtensionMessageTest::testGetExtensionMessageID()
 | 
			
		||||
{
 | 
			
		||||
  UTMetadataRequestExtensionMessage msg(1);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((uint8_t)1, msg.getExtensionMessageID());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UTMetadataRequestExtensionMessageTest::testGetExtensionName()
 | 
			
		||||
{
 | 
			
		||||
  UTMetadataRequestExtensionMessage msg(1);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata"), msg.getExtensionName());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UTMetadataRequestExtensionMessageTest::testGetBencodedData()
 | 
			
		||||
{
 | 
			
		||||
  UTMetadataRequestExtensionMessage msg(1);
 | 
			
		||||
  msg.setIndex(99);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL
 | 
			
		||||
    (std::string("d8:msg_typei0e5:piecei99ee"), msg.getBencodedData());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UTMetadataRequestExtensionMessageTest::testToString()
 | 
			
		||||
{
 | 
			
		||||
  UTMetadataRequestExtensionMessage msg(1);
 | 
			
		||||
  msg.setIndex(100);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata request piece=100"),
 | 
			
		||||
		       msg.toString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UTMetadataRequestExtensionMessageTest::testDoReceivedAction_reject()
 | 
			
		||||
{
 | 
			
		||||
  UTMetadataRequestExtensionMessage msg(1);
 | 
			
		||||
  msg.setIndex(10);
 | 
			
		||||
  msg.setDownloadContext(_dctx);
 | 
			
		||||
  msg.setPeer(_peer);
 | 
			
		||||
  msg.setBtMessageFactory(_messageFactory);
 | 
			
		||||
  msg.setBtMessageDispatcher(_dispatcher);
 | 
			
		||||
  msg.doReceivedAction();
 | 
			
		||||
 | 
			
		||||
  SharedHandle<UTMetadataRejectExtensionMessage> m =
 | 
			
		||||
    getFirstDispatchedMessage<UTMetadataRejectExtensionMessage>();
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT(!m.isNull());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((size_t)10, m->getIndex());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UTMetadataRequestExtensionMessageTest::testDoReceivedAction_data()
 | 
			
		||||
{
 | 
			
		||||
  UTMetadataRequestExtensionMessage msg(1);
 | 
			
		||||
  msg.setIndex(1);
 | 
			
		||||
  msg.setDownloadContext(_dctx);
 | 
			
		||||
  msg.setPeer(_peer);
 | 
			
		||||
  msg.setBtMessageFactory(_messageFactory);
 | 
			
		||||
  msg.setBtMessageDispatcher(_dispatcher);
 | 
			
		||||
 | 
			
		||||
  size_t metadataSize = METADATA_PIECE_SIZE*2;
 | 
			
		||||
  BDE& attrs = _dctx->getAttribute(bittorrent::BITTORRENT);
 | 
			
		||||
  std::string first(METADATA_PIECE_SIZE, '0');
 | 
			
		||||
  std::string second(METADATA_PIECE_SIZE, '1');
 | 
			
		||||
  attrs[bittorrent::METADATA] = first+second;
 | 
			
		||||
  attrs[bittorrent::METADATA_SIZE] = metadataSize;
 | 
			
		||||
 | 
			
		||||
  msg.doReceivedAction();
 | 
			
		||||
 | 
			
		||||
  SharedHandle<UTMetadataDataExtensionMessage> m =
 | 
			
		||||
    getFirstDispatchedMessage<UTMetadataDataExtensionMessage>();
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT(!m.isNull());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((size_t)1, m->getIndex());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(second, m->getData());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(metadataSize, m->getTotalSize());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID());
 | 
			
		||||
 | 
			
		||||
  _dispatcher->messageQueue.clear();
 | 
			
		||||
 | 
			
		||||
  msg.setIndex(2);
 | 
			
		||||
 | 
			
		||||
  metadataSize += 100;
 | 
			
		||||
  std::string third(100, '2');
 | 
			
		||||
  attrs[bittorrent::METADATA] = attrs[bittorrent::METADATA].s()+third;
 | 
			
		||||
  attrs[bittorrent::METADATA_SIZE] = metadataSize;
 | 
			
		||||
 | 
			
		||||
  msg.doReceivedAction();
 | 
			
		||||
 | 
			
		||||
  m = getFirstDispatchedMessage<UTMetadataDataExtensionMessage>();
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT(!m.isNull());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((size_t)2, m->getIndex());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(third, m->getData());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(metadataSize, m->getTotalSize());
 | 
			
		||||
 | 
			
		||||
  msg.setIndex(3);
 | 
			
		||||
 | 
			
		||||
  try {
 | 
			
		||||
    msg.doReceivedAction();
 | 
			
		||||
    CPPUNIT_FAIL("exception must be thrown.");
 | 
			
		||||
  } catch(DlAbortEx& e) {
 | 
			
		||||
    // success
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
		Loading…
	
		Reference in New Issue