2010-06-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

Removed PeerListProcessor. Its functionality is now moved to
	bittorrent_helper.h
	* src/DefaultBtAnnounce.cc
	* src/Makefile.am
	* src/PeerListProcessor.h: Removed
	* src/UTPexExtensionMessage.cc
	* src/bittorrent_helper.cc
	* src/bittorrent_helper.h
	* test/BittorrentHelperTest.cc
	* test/Makefile.am
	* test/PeerListProcessorTest.cc: Removed
pull/1/head
Tatsuhiro Tsujikawa 2010-06-20 12:12:18 +00:00
parent ad37c0672c
commit 9e9fb885d9
12 changed files with 139 additions and 218 deletions

View File

@ -1,3 +1,17 @@
2010-06-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Removed PeerListProcessor. Its functionality is now moved to
bittorrent_helper.h
* src/DefaultBtAnnounce.cc
* src/Makefile.am
* src/PeerListProcessor.h: Removed
* src/UTPexExtensionMessage.cc
* src/bittorrent_helper.cc
* src/bittorrent_helper.h
* test/BittorrentHelperTest.cc
* test/Makefile.am
* test/PeerListProcessorTest.cc: Removed
2010-06-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Included util.h

View File

@ -35,7 +35,6 @@
#include "DefaultBtAnnounce.h"
#include "LogFactory.h"
#include "Logger.h"
#include "PeerListProcessor.h"
#include "util.h"
#include "prefs.h"
#include "DlAbortEx.h"
@ -277,7 +276,7 @@ DefaultBtAnnounce::processAnnounceResponse(const unsigned char* trackerResponse,
} else {
if(!_btRuntime->isHalt() && _btRuntime->lessThanMinPeers()) {
std::vector<SharedHandle<Peer> > peers;
PeerListProcessor().extractPeer(peerData, std::back_inserter(peers));
bittorrent::extractPeer(peerData, std::back_inserter(peers));
_peerStorage->addPeer(peers);
}
}

View File

@ -293,7 +293,6 @@ SRCS += PeerAbstractCommand.cc PeerAbstractCommand.h\
ShareRatioSeedCriteria.h\
UnionSeedCriteria.h\
SeedCheckCommand.cc SeedCheckCommand.h\
PeerListProcessor.h\
AnnounceTier.h\
AnnounceList.h AnnounceList.cc\
PeerStorage.h\

View File

@ -89,7 +89,6 @@ bin_PROGRAMS = aria2c$(EXEEXT)
@ENABLE_BITTORRENT_TRUE@ ShareRatioSeedCriteria.h\
@ENABLE_BITTORRENT_TRUE@ UnionSeedCriteria.h\
@ENABLE_BITTORRENT_TRUE@ SeedCheckCommand.cc SeedCheckCommand.h\
@ENABLE_BITTORRENT_TRUE@ PeerListProcessor.h\
@ENABLE_BITTORRENT_TRUE@ AnnounceTier.h\
@ENABLE_BITTORRENT_TRUE@ AnnounceList.h AnnounceList.cc\
@ENABLE_BITTORRENT_TRUE@ PeerStorage.h\
@ -479,17 +478,16 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \
PeerChokeCommand.cc PeerChokeCommand.h SeedCriteria.h \
TimeSeedCriteria.h ShareRatioSeedCriteria.h \
UnionSeedCriteria.h SeedCheckCommand.cc SeedCheckCommand.h \
PeerListProcessor.h AnnounceTier.h AnnounceList.h \
AnnounceList.cc PeerStorage.h DefaultPeerStorage.cc \
DefaultPeerStorage.h BtAnnounce.cc BtAnnounce.h \
DefaultBtAnnounce.cc DefaultBtAnnounce.h BtRuntime.h \
BtMessage.h AbstractBtMessage.cc AbstractBtMessage.h \
SimpleBtMessage.cc SimpleBtMessage.h BtAllowedFastMessage.cc \
BtAllowedFastMessage.h BtBitfieldMessage.cc \
BtBitfieldMessage.h BtCancelMessage.cc BtCancelMessage.h \
BtChokeMessage.cc BtChokeMessage.h BtHaveAllMessage.cc \
BtHaveAllMessage.h BtHaveMessage.cc BtHaveMessage.h \
BtHaveNoneMessage.cc BtHaveNoneMessage.h \
AnnounceTier.h AnnounceList.h AnnounceList.cc PeerStorage.h \
DefaultPeerStorage.cc DefaultPeerStorage.h BtAnnounce.cc \
BtAnnounce.h DefaultBtAnnounce.cc DefaultBtAnnounce.h \
BtRuntime.h BtMessage.h AbstractBtMessage.cc \
AbstractBtMessage.h SimpleBtMessage.cc SimpleBtMessage.h \
BtAllowedFastMessage.cc BtAllowedFastMessage.h \
BtBitfieldMessage.cc BtBitfieldMessage.h BtCancelMessage.cc \
BtCancelMessage.h BtChokeMessage.cc BtChokeMessage.h \
BtHaveAllMessage.cc BtHaveAllMessage.h BtHaveMessage.cc \
BtHaveMessage.h BtHaveNoneMessage.cc BtHaveNoneMessage.h \
BtInterestedMessage.cc BtInterestedMessage.h \
BtKeepAliveMessage.cc BtKeepAliveMessage.h \
BtNotInterestedMessage.cc BtNotInterestedMessage.h \

View File

@ -1,118 +0,0 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 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_PEER_LIST_PROCESSOR_H_
#define _D_PEER_LIST_PROCESSOR_H_
#include "common.h"
#include <cstring>
#include "a2netcompat.h"
#include "Peer.h"
#include "ValueBase.h"
namespace aria2 {
class PeerListProcessor {
public:
template<typename OutputIterator>
void extractPeer(const ValueBase* peerData, OutputIterator dest)
{
class PeerListValueBaseVisitor:public ValueBaseVisitor {
private:
OutputIterator dest_;
public:
PeerListValueBaseVisitor(OutputIterator dest):dest_(dest) {}
virtual ~PeerListValueBaseVisitor() {}
virtual void visit(const String& peerData)
{
size_t length = peerData.s().size();
if(length%6 == 0) {
const char* base = peerData.s().data();
for(size_t i = 0; i < length; i += 6) {
struct in_addr in;
memcpy(&in.s_addr, base+i, sizeof(uint32_t));
std::string ipaddr = inet_ntoa(in);
uint16_t port_nworder;
memcpy(&port_nworder, base+i+4, sizeof(uint16_t));
uint16_t port = ntohs(port_nworder);
*dest_ = SharedHandle<Peer>(new Peer(ipaddr, port));
++dest_;
}
}
}
virtual void visit(const Integer& v) {}
virtual void visit(const List& peerData)
{
for(List::ValueType::const_iterator itr = peerData.begin(),
eoi = peerData.end(); itr != eoi; ++itr) {
const Dict* peerDict = asDict(*itr);
if(!peerDict) {
continue;
}
static const std::string IP = "ip";
static const std::string PORT = "port";
const String* ip = asString(peerDict->get(IP));
const Integer* port = asInteger(peerDict->get(PORT));
if(!ip || !port || !(0 < port->i() && port->i() < 65536)) {
continue;
}
*dest_ = SharedHandle<Peer>(new Peer(ip->s(), port->i()));
++dest_;
}
}
virtual void visit(const Dict& v) {}
};
if(peerData) {
PeerListValueBaseVisitor visitor(dest);
peerData->accept(visitor);
}
}
template<typename OutputIterator>
void extractPeer(const SharedHandle<ValueBase>& peerData, OutputIterator dest)
{
return extractPeer(peerData.get(), dest);
}
};
} // namespace aria2
#endif // _D_PEER_LIST_PROCESSOR_H_

View File

@ -37,7 +37,6 @@
#include "util.h"
#include "bittorrent_helper.h"
#include "PeerStorage.h"
#include "PeerListProcessor.h"
#include "DlAbortEx.h"
#include "message.h"
#include "StringFormat.h"
@ -161,14 +160,13 @@ UTPexExtensionMessage::create(const unsigned char* data, size_t len)
SharedHandle<ValueBase> decoded = bencode2::decode(data+1, len-1);
const Dict* dict = asDict(decoded);
if(dict) {
PeerListProcessor proc;
const String* added = asString(dict->get("added"));
if(added) {
proc.extractPeer(added, std::back_inserter(msg->_freshPeers));
bittorrent::extractPeer(added, std::back_inserter(msg->_freshPeers));
}
const String* dropped = asString(dict->get("dropped"));
if(dropped) {
proc.extractPeer(dropped, std::back_inserter(msg->_droppedPeers));
bittorrent::extractPeer(dropped, std::back_inserter(msg->_droppedPeers));
}
}
return msg;

View File

@ -47,13 +47,11 @@
#include "BtConstants.h"
#include "messageDigest.h"
#include "MessageDigestHelper.h"
#include "SimpleRandomizer.h"
#include "a2netcompat.h"
#include "BtConstants.h"
#include "bitfield.h"
#include "base32.h"
#include "magnet.h"
#include "ValueBase.h"
#include "bencode2.h"
#include "TorrentAttribute.h"

View File

@ -37,14 +37,16 @@
#include "common.h"
#include <cstring>
#include <string>
#include <vector>
#include <utility>
#include "SharedHandle.h"
#include "AnnounceTier.h"
#include "util.h"
#include "TorrentAttribute.h"
#include "a2netcompat.h"
#include "Peer.h"
#include "ValueBase.h"
namespace aria2 {
@ -213,6 +215,71 @@ std::string metadata2Torrent
// Constructs BitTorrent Magnet URI using attrs.
std::string torrent2Magnet(const SharedHandle<TorrentAttribute>& attrs);
template<typename OutputIterator>
void extractPeer(const ValueBase* peerData, OutputIterator dest)
{
class PeerListValueBaseVisitor:public ValueBaseVisitor {
private:
OutputIterator dest_;
public:
PeerListValueBaseVisitor(OutputIterator dest):dest_(dest) {}
virtual ~PeerListValueBaseVisitor() {}
virtual void visit(const String& peerData)
{
size_t length = peerData.s().size();
if(length%6 == 0) {
const char* base = peerData.s().data();
for(size_t i = 0; i < length; i += 6) {
struct in_addr in;
memcpy(&in.s_addr, base+i, sizeof(uint32_t));
std::string ipaddr = inet_ntoa(in);
uint16_t port_nworder;
memcpy(&port_nworder, base+i+4, sizeof(uint16_t));
uint16_t port = ntohs(port_nworder);
*dest_ = SharedHandle<Peer>(new Peer(ipaddr, port));
++dest_;
}
}
}
virtual void visit(const Integer& v) {}
virtual void visit(const List& peerData)
{
for(List::ValueType::const_iterator itr = peerData.begin(),
eoi = peerData.end(); itr != eoi; ++itr) {
const Dict* peerDict = asDict(*itr);
if(!peerDict) {
continue;
}
static const std::string IP = "ip";
static const std::string PORT = "port";
const String* ip = asString(peerDict->get(IP));
const Integer* port = asInteger(peerDict->get(PORT));
if(!ip || !port || !(0 < port->i() && port->i() < 65536)) {
continue;
}
*dest_ = SharedHandle<Peer>(new Peer(ip->s(), port->i()));
++dest_;
}
}
virtual void visit(const Dict& v) {}
};
if(peerData) {
PeerListValueBaseVisitor visitor(dest);
peerData->accept(visitor);
}
}
template<typename OutputIterator>
void extractPeer(const SharedHandle<ValueBase>& peerData, OutputIterator dest)
{
return extractPeer(peerData.get(), dest);
}
} // namespace bittorrent
} // namespace aria2

View File

@ -63,6 +63,8 @@ class BittorrentHelperTest:public CppUnit::TestFixture {
CPPUNIT_TEST(testParseMagnet_base32);
CPPUNIT_TEST(testMetadata2Torrent);
CPPUNIT_TEST(testTorrent2Magnet);
CPPUNIT_TEST(testExtractPeerFromList);
CPPUNIT_TEST(testExtract2PeersFromList);
CPPUNIT_TEST_SUITE_END();
public:
void setUp() {
@ -106,6 +108,8 @@ public:
void testParseMagnet_base32();
void testMetadata2Torrent();
void testTorrent2Magnet();
void testExtractPeerFromList();
void testExtract2PeersFromList();
};
@ -756,6 +760,43 @@ void BittorrentHelperTest::testTorrent2Magnet()
torrent2Magnet(getTorrentAttrs(dctx)));
}
void BittorrentHelperTest::testExtractPeerFromList()
{
std::string peersString =
"d5:peersld2:ip11:192.168.0.17:peer id20:aria2-00000000000000"
"4:porti2006eeee";
SharedHandle<ValueBase> dict = bencode2::decode(peersString);
std::deque<SharedHandle<Peer> > peers;
extractPeer(asDict(dict)->get("peers"), std::back_inserter(peers));
CPPUNIT_ASSERT_EQUAL((size_t)1, peers.size());
SharedHandle<Peer> peer = *peers.begin();
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), peer->getIPAddress());
CPPUNIT_ASSERT_EQUAL((uint16_t)2006, peer->getPort());
}
void BittorrentHelperTest::testExtract2PeersFromList()
{
std::string peersString =
"d5:peersld2:ip11:192.168.0.17:peer id20:aria2-00000000000000"
"4:porti65535eed2:ip11:192.168.0.27:peer id20:aria2-00000000000000"
"4:porti2007eeee";
SharedHandle<ValueBase> dict = bencode2::decode(peersString);
std::deque<SharedHandle<Peer> > peers;
extractPeer(asDict(dict)->get("peers"), std::back_inserter(peers));
CPPUNIT_ASSERT_EQUAL((size_t)2, peers.size());
SharedHandle<Peer> peer = *peers.begin();
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), peer->getIPAddress());
CPPUNIT_ASSERT_EQUAL((uint16_t)65535, peer->getPort());
peer = *(peers.begin()+1);
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.2"), peer->getIPAddress());
CPPUNIT_ASSERT_EQUAL((uint16_t)2007, peer->getPort());
}
} // namespace bittorrent
} // namespace aria2

View File

@ -124,7 +124,6 @@ aria2c_SOURCES += BtAllowedFastMessageTest.cc\
MockBtMessage.h\
MockBtMessageDispatcher.h\
MockBtMessageFactory.h\
PeerListProcessorTest.cc\
AnnounceListTest.cc\
DefaultPeerStorageTest.cc\
MockPeerStorage.h\

View File

@ -73,7 +73,6 @@ check_PROGRAMS = $(am__EXEEXT_1)
@ENABLE_BITTORRENT_TRUE@ MockBtMessage.h\
@ENABLE_BITTORRENT_TRUE@ MockBtMessageDispatcher.h\
@ENABLE_BITTORRENT_TRUE@ MockBtMessageFactory.h\
@ENABLE_BITTORRENT_TRUE@ PeerListProcessorTest.cc\
@ENABLE_BITTORRENT_TRUE@ AnnounceListTest.cc\
@ENABLE_BITTORRENT_TRUE@ DefaultPeerStorageTest.cc\
@ENABLE_BITTORRENT_TRUE@ MockPeerStorage.h\
@ -233,9 +232,8 @@ am__aria2c_SOURCES_DIST = AllTest.cc TestUtil.cc TestUtil.h \
DefaultBtMessageDispatcherTest.cc \
DefaultBtRequestFactoryTest.cc MockBtMessage.h \
MockBtMessageDispatcher.h MockBtMessageFactory.h \
PeerListProcessorTest.cc AnnounceListTest.cc \
DefaultPeerStorageTest.cc MockPeerStorage.h \
ByteArrayDiskWriterTest.cc PeerTest.cc \
AnnounceListTest.cc DefaultPeerStorageTest.cc \
MockPeerStorage.h ByteArrayDiskWriterTest.cc PeerTest.cc \
PeerSessionResourceTest.cc ShareRatioSeedCriteriaTest.cc \
BtRegistryTest.cc BtDependencyTest.cc \
BtPostDownloadHandlerTest.cc TimeSeedCriteriaTest.cc \
@ -308,7 +306,6 @@ am__aria2c_SOURCES_DIST = AllTest.cc TestUtil.cc TestUtil.h \
@ENABLE_BITTORRENT_TRUE@ DefaultBtAnnounceTest.$(OBJEXT) \
@ENABLE_BITTORRENT_TRUE@ DefaultBtMessageDispatcherTest.$(OBJEXT) \
@ENABLE_BITTORRENT_TRUE@ DefaultBtRequestFactoryTest.$(OBJEXT) \
@ENABLE_BITTORRENT_TRUE@ PeerListProcessorTest.$(OBJEXT) \
@ENABLE_BITTORRENT_TRUE@ AnnounceListTest.$(OBJEXT) \
@ENABLE_BITTORRENT_TRUE@ DefaultPeerStorageTest.$(OBJEXT) \
@ENABLE_BITTORRENT_TRUE@ ByteArrayDiskWriterTest.$(OBJEXT) \
@ -858,7 +855,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptionTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PStringBuildVisitorTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ParameterizedStringParserTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PeerListProcessorTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PeerSessionResourceTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PeerTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PieceStatManTest.Po@am__quote@

View File

@ -1,70 +0,0 @@
#include "PeerListProcessor.h"
#include <cstdlib>
#include <cppunit/extensions/HelperMacros.h>
#include "Exception.h"
#include "Peer.h"
#include "TimeA2.h"
#include "bencode2.h"
namespace aria2 {
class PeerListProcessorTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(PeerListProcessorTest);
CPPUNIT_TEST(testExtractPeerFromList);
CPPUNIT_TEST(testExtract2PeersFromList);
CPPUNIT_TEST_SUITE_END();
private:
public:
void setUp() {
}
void testExtractPeerFromList();
void testExtract2PeersFromList();
};
CPPUNIT_TEST_SUITE_REGISTRATION( PeerListProcessorTest );
void PeerListProcessorTest::testExtractPeerFromList() {
PeerListProcessor proc;
std::string peersString =
"d5:peersld2:ip11:192.168.0.17:peer id20:aria2-00000000000000"
"4:porti2006eeee";
SharedHandle<ValueBase> dict = bencode2::decode(peersString);
std::deque<SharedHandle<Peer> > peers;
proc.extractPeer(asDict(dict)->get("peers"), std::back_inserter(peers));
CPPUNIT_ASSERT_EQUAL((size_t)1, peers.size());
SharedHandle<Peer> peer = *peers.begin();
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), peer->getIPAddress());
CPPUNIT_ASSERT_EQUAL((uint16_t)2006, peer->getPort());
}
void PeerListProcessorTest::testExtract2PeersFromList() {
PeerListProcessor proc;
std::string peersString =
"d5:peersld2:ip11:192.168.0.17:peer id20:aria2-00000000000000"
"4:porti65535eed2:ip11:192.168.0.27:peer id20:aria2-00000000000000"
"4:porti2007eeee";
SharedHandle<ValueBase> dict = bencode2::decode(peersString);
std::deque<SharedHandle<Peer> > peers;
proc.extractPeer(asDict(dict)->get("peers"), std::back_inserter(peers));
CPPUNIT_ASSERT_EQUAL((size_t)2, peers.size());
SharedHandle<Peer> peer = *peers.begin();
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), peer->getIPAddress());
CPPUNIT_ASSERT_EQUAL((uint16_t)65535, peer->getPort());
peer = *(peers.begin()+1);
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.2"), peer->getIPAddress());
CPPUNIT_ASSERT_EQUAL((uint16_t)2007, peer->getPort());
}
} // namespace aria2