mirror of https://github.com/aria2/aria2
2010-06-13 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Rewritten DHTMessageCallback using Visitor pattern. Eliminated dynamic_pointer_cast. * src/DHTMessageCallbackImpl.cc: Removed * src/DHTMessageReceiver.cc * src/DHTAbstractNodeLookupTask.h * src/DHTAnnouncePeerReplyMessage.h * src/DHTReplaceNodeTask.h * src/DHTFindNodeReplyMessage.cc * src/DHTGetPeersReplyMessage.h * src/DHTPeerLookupTask.h * src/DHTMessageCallbackImpl.h: Removed * src/DHTMessageFactory.h * src/DHTNodeLookupTaskCallback.h * src/DHTMessageTracker.h * src/DHTMessageCallbackListener.h: Removed * src/DHTGetPeersReplyMessage.cc * src/DHTMessageCallback.h * src/DHTAnnouncePeerReplyMessage.cc * src/DHTNodeLookupTask.h * src/DHTReplaceNodeTask.cc * src/DHTPeerLookupTaskCallback.cc * src/DHTMessageTracker.cc * src/DHTPingReplyMessage.cc * src/DHTPingTask.cc * src/DHTMessageFactoryImpl.h * src/Makefile.am * src/DHTNodeLookupTask.cc * src/DHTPeerLookupTaskCallback.h * src/DHTPeerLookupTask.cc * src/DHTMessageReceiver.h * src/DHTMessageFactoryImpl.cc * src/DHTResponseMessage.h * src/DHTFindNodeReplyMessage.h * src/DHTPingReplyMessageCallback.h * src/Makefile.in * src/DHTBucketRefreshTask.cc * src/DHTNodeLookupTaskCallback.cc * src/DHTPingTask.h * src/DHTPingReplyMessage.h * src/DHTAbstractNodeLookupTask.cc: Removed * test/DHTMessageTrackerTest.cc * test/DHTPingMessageTest.cc * test/DHTGetPeersMessageTest.cc * test/MockDHTMessage.h * test/MockDHTMessageFactory.h * test/DHTFindNodeMessageTest.cc * test/MockDHTMessageCallback.h * test/DHTAnnouncePeerMessageTest.ccpull/1/head
parent
532fc3724d
commit
3dfbec0f9f
51
ChangeLog
51
ChangeLog
|
@ -1,3 +1,54 @@
|
||||||
|
2010-06-13 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
|
Rewritten DHTMessageCallback using Visitor pattern. Eliminated
|
||||||
|
dynamic_pointer_cast.
|
||||||
|
* src/DHTMessageCallbackImpl.cc: Removed
|
||||||
|
* src/DHTMessageReceiver.cc
|
||||||
|
* src/DHTAbstractNodeLookupTask.h
|
||||||
|
* src/DHTAnnouncePeerReplyMessage.h
|
||||||
|
* src/DHTReplaceNodeTask.h
|
||||||
|
* src/DHTFindNodeReplyMessage.cc
|
||||||
|
* src/DHTGetPeersReplyMessage.h
|
||||||
|
* src/DHTPeerLookupTask.h
|
||||||
|
* src/DHTMessageCallbackImpl.h: Removed
|
||||||
|
* src/DHTMessageFactory.h
|
||||||
|
* src/DHTNodeLookupTaskCallback.h
|
||||||
|
* src/DHTMessageTracker.h
|
||||||
|
* src/DHTMessageCallbackListener.h: Removed
|
||||||
|
* src/DHTGetPeersReplyMessage.cc
|
||||||
|
* src/DHTMessageCallback.h
|
||||||
|
* src/DHTAnnouncePeerReplyMessage.cc
|
||||||
|
* src/DHTNodeLookupTask.h
|
||||||
|
* src/DHTReplaceNodeTask.cc
|
||||||
|
* src/DHTPeerLookupTaskCallback.cc
|
||||||
|
* src/DHTMessageTracker.cc
|
||||||
|
* src/DHTPingReplyMessage.cc
|
||||||
|
* src/DHTPingTask.cc
|
||||||
|
* src/DHTMessageFactoryImpl.h
|
||||||
|
* src/Makefile.am
|
||||||
|
* src/DHTNodeLookupTask.cc
|
||||||
|
* src/DHTPeerLookupTaskCallback.h
|
||||||
|
* src/DHTPeerLookupTask.cc
|
||||||
|
* src/DHTMessageReceiver.h
|
||||||
|
* src/DHTMessageFactoryImpl.cc
|
||||||
|
* src/DHTResponseMessage.h
|
||||||
|
* src/DHTFindNodeReplyMessage.h
|
||||||
|
* src/DHTPingReplyMessageCallback.h
|
||||||
|
* src/Makefile.in
|
||||||
|
* src/DHTBucketRefreshTask.cc
|
||||||
|
* src/DHTNodeLookupTaskCallback.cc
|
||||||
|
* src/DHTPingTask.h
|
||||||
|
* src/DHTPingReplyMessage.h
|
||||||
|
* src/DHTAbstractNodeLookupTask.cc: Removed
|
||||||
|
* test/DHTMessageTrackerTest.cc
|
||||||
|
* test/DHTPingMessageTest.cc
|
||||||
|
* test/DHTGetPeersMessageTest.cc
|
||||||
|
* test/MockDHTMessage.h
|
||||||
|
* test/MockDHTMessageFactory.h
|
||||||
|
* test/DHTFindNodeMessageTest.cc
|
||||||
|
* test/MockDHTMessageCallback.h
|
||||||
|
* test/DHTAnnouncePeerMessageTest.cc
|
||||||
|
|
||||||
2010-06-13 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
2010-06-13 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
Replaced dynamic_pointer_cast with static_pointer_cast
|
Replaced dynamic_pointer_cast with static_pointer_cast
|
||||||
|
|
|
@ -1,182 +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 --> */
|
|
||||||
#include "DHTAbstractNodeLookupTask.h"
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
#include "DHTRoutingTable.h"
|
|
||||||
#include "DHTMessageDispatcher.h"
|
|
||||||
#include "DHTMessageFactory.h"
|
|
||||||
#include "DHTMessage.h"
|
|
||||||
#include "DHTNode.h"
|
|
||||||
#include "DHTMessageCallbackImpl.h"
|
|
||||||
#include "DHTBucket.h"
|
|
||||||
#include "LogFactory.h"
|
|
||||||
#include "Logger.h"
|
|
||||||
#include "util.h"
|
|
||||||
#include "DHTIDCloser.h"
|
|
||||||
|
|
||||||
namespace aria2 {
|
|
||||||
|
|
||||||
DHTAbstractNodeLookupTask::DHTAbstractNodeLookupTask
|
|
||||||
(const unsigned char* targetID):
|
|
||||||
_inFlightMessage(0)
|
|
||||||
{
|
|
||||||
memcpy(_targetID, targetID, DHT_ID_LENGTH);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DHTAbstractNodeLookupTask::onReceived
|
|
||||||
(const SharedHandle<DHTMessage>& message)
|
|
||||||
{
|
|
||||||
--_inFlightMessage;
|
|
||||||
onReceivedInternal(message);
|
|
||||||
std::vector<SharedHandle<DHTNode> > nodes;
|
|
||||||
getNodesFromMessage(nodes, message);
|
|
||||||
std::vector<SharedHandle<DHTNodeLookupEntry> > newEntries;
|
|
||||||
toEntries(newEntries, nodes);
|
|
||||||
|
|
||||||
size_t count = 0;
|
|
||||||
for(std::vector<SharedHandle<DHTNodeLookupEntry> >::const_iterator i =
|
|
||||||
newEntries.begin(), eoi = newEntries.end(); i != eoi; ++i) {
|
|
||||||
if(memcmp(getLocalNode()->getID(), (*i)->node->getID(),
|
|
||||||
DHT_ID_LENGTH) != 0) {
|
|
||||||
_entries.push_front(*i);
|
|
||||||
++count;
|
|
||||||
if(getLogger()->debug()) {
|
|
||||||
getLogger()->debug("Received nodes: id=%s, ip=%s",
|
|
||||||
util::toHex((*i)->node->getID(),
|
|
||||||
DHT_ID_LENGTH).c_str(),
|
|
||||||
(*i)->node->getIPAddress().c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(getLogger()->debug()) {
|
|
||||||
getLogger()->debug("%u node lookup entries added.", count);
|
|
||||||
}
|
|
||||||
std::stable_sort(_entries.begin(), _entries.end(), DHTIDCloser(_targetID));
|
|
||||||
_entries.erase(std::unique(_entries.begin(), _entries.end()), _entries.end());
|
|
||||||
if(getLogger()->debug()) {
|
|
||||||
getLogger()->debug("%u node lookup entries are unique.", _entries.size());
|
|
||||||
}
|
|
||||||
if(_entries.size() > DHTBucket::K) {
|
|
||||||
_entries.erase(_entries.begin()+DHTBucket::K, _entries.end());
|
|
||||||
}
|
|
||||||
sendMessageAndCheckFinish();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DHTAbstractNodeLookupTask::onTimeout(const SharedHandle<DHTNode>& node)
|
|
||||||
{
|
|
||||||
if(getLogger()->debug()) {
|
|
||||||
getLogger()->debug("node lookup message timeout for node ID=%s",
|
|
||||||
util::toHex(node->getID(), DHT_ID_LENGTH).c_str());
|
|
||||||
}
|
|
||||||
--_inFlightMessage;
|
|
||||||
for(std::deque<SharedHandle<DHTNodeLookupEntry> >::iterator i =
|
|
||||||
_entries.begin(), eoi = _entries.end(); i != eoi; ++i) {
|
|
||||||
if((*i)->node == node) {
|
|
||||||
_entries.erase(i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sendMessageAndCheckFinish();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DHTAbstractNodeLookupTask::sendMessageAndCheckFinish()
|
|
||||||
{
|
|
||||||
if(needsAdditionalOutgoingMessage()) {
|
|
||||||
sendMessage();
|
|
||||||
}
|
|
||||||
if(_inFlightMessage == 0) {
|
|
||||||
if(getLogger()->debug()) {
|
|
||||||
getLogger()->debug("Finished node_lookup for node ID %s",
|
|
||||||
util::toHex(_targetID, DHT_ID_LENGTH).c_str());
|
|
||||||
}
|
|
||||||
onFinish();
|
|
||||||
updateBucket();
|
|
||||||
setFinished(true);
|
|
||||||
} else {
|
|
||||||
if(getLogger()->debug()) {
|
|
||||||
getLogger()->debug("%d in flight message for node ID %s",
|
|
||||||
_inFlightMessage,
|
|
||||||
util::toHex(_targetID, DHT_ID_LENGTH).c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DHTAbstractNodeLookupTask::sendMessage()
|
|
||||||
{
|
|
||||||
for(std::deque<SharedHandle<DHTNodeLookupEntry> >::iterator i =
|
|
||||||
_entries.begin(), eoi = _entries.end();
|
|
||||||
i != eoi && _inFlightMessage < ALPHA; ++i) {
|
|
||||||
if((*i)->used == false) {
|
|
||||||
++_inFlightMessage;
|
|
||||||
(*i)->used = true;
|
|
||||||
SharedHandle<DHTMessage> m = createMessage((*i)->node);
|
|
||||||
WeakHandle<DHTMessageCallbackListener> listener(this);
|
|
||||||
SharedHandle<DHTMessageCallback> callback
|
|
||||||
(new DHTMessageCallbackImpl(listener));
|
|
||||||
getMessageDispatcher()->addMessageToQueue(m, callback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DHTAbstractNodeLookupTask::updateBucket()
|
|
||||||
{
|
|
||||||
// TODO we have to something here?
|
|
||||||
}
|
|
||||||
|
|
||||||
void DHTAbstractNodeLookupTask::startup()
|
|
||||||
{
|
|
||||||
std::vector<SharedHandle<DHTNode> > nodes;
|
|
||||||
getRoutingTable()->getClosestKNodes(nodes, _targetID);
|
|
||||||
_entries.clear();
|
|
||||||
toEntries(_entries, nodes);
|
|
||||||
if(_entries.empty()) {
|
|
||||||
setFinished(true);
|
|
||||||
} else {
|
|
||||||
// TODO use RTT here
|
|
||||||
_inFlightMessage = 0;
|
|
||||||
sendMessage();
|
|
||||||
if(_inFlightMessage == 0) {
|
|
||||||
if(getLogger()->debug()) {
|
|
||||||
getLogger()->debug("No message was sent in this lookup stage. Finished.");
|
|
||||||
}
|
|
||||||
setFinished(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace aria2
|
|
|
@ -37,20 +37,31 @@
|
||||||
|
|
||||||
#include "DHTAbstractTask.h"
|
#include "DHTAbstractTask.h"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "DHTMessageCallbackListener.h"
|
|
||||||
#include "DHTConstants.h"
|
#include "DHTConstants.h"
|
||||||
#include "DHTNodeLookupEntry.h"
|
#include "DHTNodeLookupEntry.h"
|
||||||
|
#include "DHTRoutingTable.h"
|
||||||
|
#include "DHTMessageDispatcher.h"
|
||||||
|
#include "DHTMessageFactory.h"
|
||||||
|
#include "DHTMessage.h"
|
||||||
|
#include "DHTNode.h"
|
||||||
|
#include "DHTBucket.h"
|
||||||
|
#include "LogFactory.h"
|
||||||
|
#include "Logger.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "DHTIDCloser.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class DHTNode;
|
class DHTNode;
|
||||||
class DHTMessage;
|
class DHTMessage;
|
||||||
|
|
||||||
class DHTAbstractNodeLookupTask:public DHTAbstractTask,
|
template<class ResponseMessage>
|
||||||
public DHTMessageCallbackListener {
|
class DHTAbstractNodeLookupTask:public DHTAbstractTask {
|
||||||
private:
|
private:
|
||||||
unsigned char _targetID[DHT_ID_LENGTH];
|
unsigned char _targetID[DHT_ID_LENGTH];
|
||||||
|
|
||||||
|
@ -69,11 +80,44 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendMessage();
|
void sendMessage()
|
||||||
|
{
|
||||||
|
for(std::deque<SharedHandle<DHTNodeLookupEntry> >::iterator i =
|
||||||
|
_entries.begin(), eoi = _entries.end();
|
||||||
|
i != eoi && _inFlightMessage < ALPHA; ++i) {
|
||||||
|
if((*i)->used == false) {
|
||||||
|
++_inFlightMessage;
|
||||||
|
(*i)->used = true;
|
||||||
|
SharedHandle<DHTMessage> m = createMessage((*i)->node);
|
||||||
|
SharedHandle<DHTMessageCallback> callback(createCallback());
|
||||||
|
getMessageDispatcher()->addMessageToQueue(m, callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void updateBucket();
|
void sendMessageAndCheckFinish()
|
||||||
|
{
|
||||||
|
if(needsAdditionalOutgoingMessage()) {
|
||||||
|
sendMessage();
|
||||||
|
}
|
||||||
|
if(_inFlightMessage == 0) {
|
||||||
|
if(getLogger()->debug()) {
|
||||||
|
getLogger()->debug("Finished node_lookup for node ID %s",
|
||||||
|
util::toHex(_targetID, DHT_ID_LENGTH).c_str());
|
||||||
|
}
|
||||||
|
onFinish();
|
||||||
|
updateBucket();
|
||||||
|
setFinished(true);
|
||||||
|
} else {
|
||||||
|
if(getLogger()->debug()) {
|
||||||
|
getLogger()->debug("%d in flight message for node ID %s",
|
||||||
|
_inFlightMessage,
|
||||||
|
util::toHex(_targetID, DHT_ID_LENGTH).c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void sendMessageAndCheckFinish();
|
void updateBucket() {}
|
||||||
protected:
|
protected:
|
||||||
const unsigned char* getTargetID() const
|
const unsigned char* getTargetID() const
|
||||||
{
|
{
|
||||||
|
@ -84,21 +128,13 @@ protected:
|
||||||
{
|
{
|
||||||
return _entries;
|
return _entries;
|
||||||
}
|
}
|
||||||
public:
|
|
||||||
DHTAbstractNodeLookupTask(const unsigned char* targetID);
|
|
||||||
|
|
||||||
static const size_t ALPHA = 3;
|
virtual void getNodesFromMessage
|
||||||
|
(std::vector<SharedHandle<DHTNode> >& nodes,
|
||||||
|
const ResponseMessage* message) = 0;
|
||||||
|
|
||||||
virtual void startup();
|
virtual void onReceivedInternal
|
||||||
|
(const ResponseMessage* message) {}
|
||||||
virtual void onReceived(const SharedHandle<DHTMessage>& message);
|
|
||||||
|
|
||||||
virtual void onTimeout(const SharedHandle<DHTNode>& node);
|
|
||||||
|
|
||||||
virtual void getNodesFromMessage(std::vector<SharedHandle<DHTNode> >& nodes,
|
|
||||||
const SharedHandle<DHTMessage>& message) = 0;
|
|
||||||
|
|
||||||
virtual void onReceivedInternal(const SharedHandle<DHTMessage>& message) {}
|
|
||||||
|
|
||||||
virtual bool needsAdditionalOutgoingMessage() { return true; }
|
virtual bool needsAdditionalOutgoingMessage() { return true; }
|
||||||
|
|
||||||
|
@ -106,6 +142,92 @@ public:
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage> createMessage
|
virtual SharedHandle<DHTMessage> createMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode) = 0;
|
(const SharedHandle<DHTNode>& remoteNode) = 0;
|
||||||
|
|
||||||
|
virtual SharedHandle<DHTMessageCallback> createCallback() = 0;
|
||||||
|
public:
|
||||||
|
DHTAbstractNodeLookupTask(const unsigned char* targetID):
|
||||||
|
_inFlightMessage(0)
|
||||||
|
{
|
||||||
|
memcpy(_targetID, targetID, DHT_ID_LENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const size_t ALPHA = 3;
|
||||||
|
|
||||||
|
virtual void startup()
|
||||||
|
{
|
||||||
|
std::vector<SharedHandle<DHTNode> > nodes;
|
||||||
|
getRoutingTable()->getClosestKNodes(nodes, _targetID);
|
||||||
|
_entries.clear();
|
||||||
|
toEntries(_entries, nodes);
|
||||||
|
if(_entries.empty()) {
|
||||||
|
setFinished(true);
|
||||||
|
} else {
|
||||||
|
// TODO use RTT here
|
||||||
|
_inFlightMessage = 0;
|
||||||
|
sendMessage();
|
||||||
|
if(_inFlightMessage == 0) {
|
||||||
|
if(getLogger()->debug()) {
|
||||||
|
getLogger()->debug("No message was sent in this lookup stage. Finished.");
|
||||||
|
}
|
||||||
|
setFinished(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void onReceived(const ResponseMessage* message)
|
||||||
|
{
|
||||||
|
--_inFlightMessage;
|
||||||
|
onReceivedInternal(message);
|
||||||
|
std::vector<SharedHandle<DHTNode> > nodes;
|
||||||
|
getNodesFromMessage(nodes, message);
|
||||||
|
std::vector<SharedHandle<DHTNodeLookupEntry> > newEntries;
|
||||||
|
toEntries(newEntries, nodes);
|
||||||
|
|
||||||
|
size_t count = 0;
|
||||||
|
for(std::vector<SharedHandle<DHTNodeLookupEntry> >::const_iterator i =
|
||||||
|
newEntries.begin(), eoi = newEntries.end(); i != eoi; ++i) {
|
||||||
|
if(memcmp(getLocalNode()->getID(), (*i)->node->getID(),
|
||||||
|
DHT_ID_LENGTH) != 0) {
|
||||||
|
_entries.push_front(*i);
|
||||||
|
++count;
|
||||||
|
if(getLogger()->debug()) {
|
||||||
|
getLogger()->debug("Received nodes: id=%s, ip=%s",
|
||||||
|
util::toHex((*i)->node->getID(),
|
||||||
|
DHT_ID_LENGTH).c_str(),
|
||||||
|
(*i)->node->getIPAddress().c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(getLogger()->debug()) {
|
||||||
|
getLogger()->debug("%u node lookup entries added.", count);
|
||||||
|
}
|
||||||
|
std::stable_sort(_entries.begin(), _entries.end(), DHTIDCloser(_targetID));
|
||||||
|
_entries.erase(std::unique(_entries.begin(), _entries.end()), _entries.end());
|
||||||
|
if(getLogger()->debug()) {
|
||||||
|
getLogger()->debug("%u node lookup entries are unique.", _entries.size());
|
||||||
|
}
|
||||||
|
if(_entries.size() > DHTBucket::K) {
|
||||||
|
_entries.erase(_entries.begin()+DHTBucket::K, _entries.end());
|
||||||
|
}
|
||||||
|
sendMessageAndCheckFinish();
|
||||||
|
}
|
||||||
|
|
||||||
|
void onTimeout(const SharedHandle<DHTNode>& node)
|
||||||
|
{
|
||||||
|
if(getLogger()->debug()) {
|
||||||
|
getLogger()->debug("node lookup message timeout for node ID=%s",
|
||||||
|
util::toHex(node->getID(), DHT_ID_LENGTH).c_str());
|
||||||
|
}
|
||||||
|
--_inFlightMessage;
|
||||||
|
for(std::deque<SharedHandle<DHTNodeLookupEntry> >::iterator i =
|
||||||
|
_entries.begin(), eoi = _entries.end(); i != eoi; ++i) {
|
||||||
|
if((*i)->node == node) {
|
||||||
|
_entries.erase(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sendMessageAndCheckFinish();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include "DHTAnnouncePeerReplyMessage.h"
|
#include "DHTAnnouncePeerReplyMessage.h"
|
||||||
#include "DHTNode.h"
|
#include "DHTNode.h"
|
||||||
#include "bencode.h"
|
#include "bencode.h"
|
||||||
|
#include "DHTMessageCallback.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -62,4 +63,9 @@ const std::string& DHTAnnouncePeerReplyMessage::getMessageType() const
|
||||||
return ANNOUNCE_PEER;
|
return ANNOUNCE_PEER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DHTAnnouncePeerReplyMessage::accept(DHTMessageCallback* callback)
|
||||||
|
{
|
||||||
|
callback->visit(this);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -53,6 +53,8 @@ public:
|
||||||
|
|
||||||
virtual const std::string& getMessageType() const;
|
virtual const std::string& getMessageType() const;
|
||||||
|
|
||||||
|
virtual void accept(DHTMessageCallback* callback);
|
||||||
|
|
||||||
static const std::string ANNOUNCE_PEER;
|
static const std::string ANNOUNCE_PEER;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include "DHTNodeLookupEntry.h"
|
#include "DHTNodeLookupEntry.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
|
#include "DHTMessageCallback.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
|
|
@ -96,6 +96,11 @@ const std::string& DHTFindNodeReplyMessage::getMessageType() const
|
||||||
return FIND_NODE;
|
return FIND_NODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DHTFindNodeReplyMessage::accept(DHTMessageCallback* callback)
|
||||||
|
{
|
||||||
|
callback->visit(this);
|
||||||
|
}
|
||||||
|
|
||||||
void DHTFindNodeReplyMessage::setClosestKNodes
|
void DHTFindNodeReplyMessage::setClosestKNodes
|
||||||
(const std::vector<SharedHandle<DHTNode> >& closestKNodes)
|
(const std::vector<SharedHandle<DHTNode> >& closestKNodes)
|
||||||
{
|
{
|
||||||
|
|
|
@ -58,6 +58,8 @@ public:
|
||||||
|
|
||||||
virtual const std::string& getMessageType() const;
|
virtual const std::string& getMessageType() const;
|
||||||
|
|
||||||
|
virtual void accept(DHTMessageCallback* callback);
|
||||||
|
|
||||||
const std::vector<SharedHandle<DHTNode> >& getClosestKNodes() const
|
const std::vector<SharedHandle<DHTNode> >& getClosestKNodes() const
|
||||||
{
|
{
|
||||||
return _closestKNodes;
|
return _closestKNodes;
|
||||||
|
|
|
@ -134,6 +134,11 @@ const std::string& DHTGetPeersReplyMessage::getMessageType() const
|
||||||
return GET_PEERS;
|
return GET_PEERS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DHTGetPeersReplyMessage::accept(DHTMessageCallback* callback)
|
||||||
|
{
|
||||||
|
callback->visit(this);
|
||||||
|
}
|
||||||
|
|
||||||
std::string DHTGetPeersReplyMessage::toStringOptional() const
|
std::string DHTGetPeersReplyMessage::toStringOptional() const
|
||||||
{
|
{
|
||||||
return strconcat("token=", util::toHex(_token),
|
return strconcat("token=", util::toHex(_token),
|
||||||
|
|
|
@ -68,6 +68,8 @@ public:
|
||||||
|
|
||||||
virtual const std::string& getMessageType() const;
|
virtual const std::string& getMessageType() const;
|
||||||
|
|
||||||
|
virtual void accept(DHTMessageCallback* callback);
|
||||||
|
|
||||||
const std::vector<SharedHandle<DHTNode> >& getClosestKNodes() const
|
const std::vector<SharedHandle<DHTNode> >& getClosestKNodes() const
|
||||||
{
|
{
|
||||||
return _closestKNodes;
|
return _closestKNodes;
|
||||||
|
|
|
@ -37,17 +37,32 @@
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "SharedHandle.h"
|
#include "SharedHandle.h"
|
||||||
|
#include "DHTResponseMessage.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class DHTMessage;
|
|
||||||
class DHTNode;
|
class DHTNode;
|
||||||
|
class DHTAnnouncePeerReplyMessage;
|
||||||
|
class DHTFindNodeReplyMessage;
|
||||||
|
class DHTGetPeersReplyMessage;
|
||||||
|
class DHTPingReplyMessage;
|
||||||
|
|
||||||
class DHTMessageCallback {
|
class DHTMessageCallback {
|
||||||
public:
|
public:
|
||||||
virtual ~DHTMessageCallback() {}
|
virtual ~DHTMessageCallback() {}
|
||||||
|
|
||||||
virtual void onReceived(const SharedHandle<DHTMessage>& message) = 0;
|
void onReceived(const SharedHandle<DHTResponseMessage>& message)
|
||||||
|
{
|
||||||
|
message->accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void visit(const DHTAnnouncePeerReplyMessage* message) = 0;
|
||||||
|
|
||||||
|
virtual void visit(const DHTFindNodeReplyMessage* message) = 0;
|
||||||
|
|
||||||
|
virtual void visit(const DHTGetPeersReplyMessage* message) = 0;
|
||||||
|
|
||||||
|
virtual void visit(const DHTPingReplyMessage* message) = 0;
|
||||||
|
|
||||||
virtual void onTimeout(const SharedHandle<DHTNode>& remoteNode) = 0;
|
virtual void onTimeout(const SharedHandle<DHTNode>& remoteNode) = 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -46,6 +46,8 @@
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class DHTMessage;
|
class DHTMessage;
|
||||||
|
class DHTQueryMessage;
|
||||||
|
class DHTResponseMessage;
|
||||||
class DHTNode;
|
class DHTNode;
|
||||||
class Peer;
|
class Peer;
|
||||||
class BDE;
|
class BDE;
|
||||||
|
@ -54,62 +56,62 @@ class DHTMessageFactory {
|
||||||
public:
|
public:
|
||||||
virtual ~DHTMessageFactory() {}
|
virtual ~DHTMessageFactory() {}
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTQueryMessage>
|
||||||
createQueryMessage(const BDE& dict,
|
createQueryMessage(const BDE& dict,
|
||||||
const std::string& ipaddr, uint16_t port) = 0;
|
const std::string& ipaddr, uint16_t port) = 0;
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createResponseMessage(const std::string& messageType,
|
createResponseMessage(const std::string& messageType,
|
||||||
const BDE& dict,
|
const BDE& dict,
|
||||||
const std::string& ipaddr, uint16_t port) = 0;
|
const std::string& ipaddr, uint16_t port) = 0;
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTQueryMessage>
|
||||||
createPingMessage(const SharedHandle<DHTNode>& remoteNode,
|
createPingMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::string& transactionID = A2STR::NIL) = 0;
|
const std::string& transactionID = A2STR::NIL) = 0;
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createPingReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
createPingReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* id,
|
const unsigned char* id,
|
||||||
const std::string& transactionID) = 0;
|
const std::string& transactionID) = 0;
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTQueryMessage>
|
||||||
createFindNodeMessage(const SharedHandle<DHTNode>& remoteNode,
|
createFindNodeMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* targetNodeID,
|
const unsigned char* targetNodeID,
|
||||||
const std::string& transactionID = A2STR::NIL) = 0;
|
const std::string& transactionID = A2STR::NIL) = 0;
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createFindNodeReplyMessage
|
createFindNodeReplyMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
||||||
const std::string& transactionID) = 0;
|
const std::string& transactionID) = 0;
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTQueryMessage>
|
||||||
createGetPeersMessage(const SharedHandle<DHTNode>& remoteNode,
|
createGetPeersMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* infoHash,
|
const unsigned char* infoHash,
|
||||||
const std::string& transactionID = A2STR::NIL) = 0;
|
const std::string& transactionID = A2STR::NIL) = 0;
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createGetPeersReplyMessage
|
createGetPeersReplyMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
||||||
const std::string& token,
|
const std::string& token,
|
||||||
const std::string& transactionID) = 0;
|
const std::string& transactionID) = 0;
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createGetPeersReplyMessage
|
createGetPeersReplyMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::vector<SharedHandle<Peer> >& peers,
|
const std::vector<SharedHandle<Peer> >& peers,
|
||||||
const std::string& token,
|
const std::string& token,
|
||||||
const std::string& transactionID) = 0;
|
const std::string& transactionID) = 0;
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTQueryMessage>
|
||||||
createAnnouncePeerMessage(const SharedHandle<DHTNode>& remoteNode,
|
createAnnouncePeerMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* infoHash,
|
const unsigned char* infoHash,
|
||||||
uint16_t tcpPort,
|
uint16_t tcpPort,
|
||||||
const std::string& token,
|
const std::string& token,
|
||||||
const std::string& transactionID = A2STR::NIL) = 0;
|
const std::string& transactionID = A2STR::NIL) = 0;
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createAnnouncePeerReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
createAnnouncePeerReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::string& transactionID) = 0;
|
const std::string& transactionID) = 0;
|
||||||
|
|
||||||
|
|
|
@ -71,7 +71,8 @@ DHTMessageFactoryImpl::DHTMessageFactoryImpl():
|
||||||
DHTMessageFactoryImpl::~DHTMessageFactoryImpl() {}
|
DHTMessageFactoryImpl::~DHTMessageFactoryImpl() {}
|
||||||
|
|
||||||
SharedHandle<DHTNode>
|
SharedHandle<DHTNode>
|
||||||
DHTMessageFactoryImpl::getRemoteNode(const unsigned char* id, const std::string& ipaddr, uint16_t port) const
|
DHTMessageFactoryImpl::getRemoteNode
|
||||||
|
(const unsigned char* id, const std::string& ipaddr, uint16_t port) const
|
||||||
{
|
{
|
||||||
SharedHandle<DHTNode> node = _routingTable->getNode(id, ipaddr, port);
|
SharedHandle<DHTNode> node = _routingTable->getNode(id, ipaddr, port);
|
||||||
if(node.isNull()) {
|
if(node.isNull()) {
|
||||||
|
@ -184,10 +185,8 @@ static void setVersion(const SharedHandle<DHTMessage>& msg, const BDE& dict)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage> DHTMessageFactoryImpl::createQueryMessage
|
SharedHandle<DHTQueryMessage> DHTMessageFactoryImpl::createQueryMessage
|
||||||
(const BDE& dict,
|
(const BDE& dict, const std::string& ipaddr, uint16_t port)
|
||||||
const std::string& ipaddr,
|
|
||||||
uint16_t port)
|
|
||||||
{
|
{
|
||||||
const BDE& messageType = getString(dict, DHTQueryMessage::Q);
|
const BDE& messageType = getString(dict, DHTQueryMessage::Q);
|
||||||
const BDE& transactionID = getString(dict, DHTMessage::T);
|
const BDE& transactionID = getString(dict, DHTMessage::T);
|
||||||
|
@ -199,7 +198,7 @@ SharedHandle<DHTMessage> DHTMessageFactoryImpl::createQueryMessage
|
||||||
const BDE& id = getString(aDict, DHTMessage::ID);
|
const BDE& id = getString(aDict, DHTMessage::ID);
|
||||||
validateID(id);
|
validateID(id);
|
||||||
SharedHandle<DHTNode> remoteNode = getRemoteNode(id.uc(), ipaddr, port);
|
SharedHandle<DHTNode> remoteNode = getRemoteNode(id.uc(), ipaddr, port);
|
||||||
SharedHandle<DHTMessage> msg;
|
SharedHandle<DHTQueryMessage> msg;
|
||||||
if(messageType.s() == DHTPingMessage::PING) {
|
if(messageType.s() == DHTPingMessage::PING) {
|
||||||
msg = createPingMessage(remoteNode, transactionID.s());
|
msg = createPingMessage(remoteNode, transactionID.s());
|
||||||
} else if(messageType.s() == DHTFindNodeMessage::FIND_NODE) {
|
} else if(messageType.s() == DHTFindNodeMessage::FIND_NODE) {
|
||||||
|
@ -233,8 +232,9 @@ SharedHandle<DHTMessage> DHTMessageFactoryImpl::createQueryMessage
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTResponseMessage>
|
||||||
DHTMessageFactoryImpl::createResponseMessage(const std::string& messageType,
|
DHTMessageFactoryImpl::createResponseMessage
|
||||||
|
(const std::string& messageType,
|
||||||
const BDE& dict,
|
const BDE& dict,
|
||||||
const std::string& ipaddr,
|
const std::string& ipaddr,
|
||||||
uint16_t port)
|
uint16_t port)
|
||||||
|
@ -265,7 +265,7 @@ DHTMessageFactoryImpl::createResponseMessage(const std::string& messageType,
|
||||||
const BDE& id = getString(rDict, DHTMessage::ID);
|
const BDE& id = getString(rDict, DHTMessage::ID);
|
||||||
validateID(id);
|
validateID(id);
|
||||||
SharedHandle<DHTNode> remoteNode = getRemoteNode(id.uc(), ipaddr, port);
|
SharedHandle<DHTNode> remoteNode = getRemoteNode(id.uc(), ipaddr, port);
|
||||||
SharedHandle<DHTMessage> msg;
|
SharedHandle<DHTResponseMessage> msg;
|
||||||
if(messageType == DHTPingReplyMessage::PING) {
|
if(messageType == DHTPingReplyMessage::PING) {
|
||||||
msg = createPingReplyMessage(remoteNode, id.uc(), transactionID.s());
|
msg = createPingReplyMessage(remoteNode, id.uc(), transactionID.s());
|
||||||
} else if(messageType == DHTFindNodeReplyMessage::FIND_NODE) {
|
} else if(messageType == DHTFindNodeReplyMessage::FIND_NODE) {
|
||||||
|
@ -317,34 +317,38 @@ void DHTMessageFactoryImpl::setCommonProperty(const SharedHandle<DHTAbstractMess
|
||||||
m->setVersion(getDefaultVersion());
|
m->setVersion(getDefaultVersion());
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage> DHTMessageFactoryImpl::createPingMessage(const SharedHandle<DHTNode>& remoteNode, const std::string& transactionID)
|
SharedHandle<DHTQueryMessage> DHTMessageFactoryImpl::createPingMessage
|
||||||
|
(const SharedHandle<DHTNode>& remoteNode, const std::string& transactionID)
|
||||||
{
|
{
|
||||||
SharedHandle<DHTPingMessage> m(new DHTPingMessage(_localNode, remoteNode, transactionID));
|
SharedHandle<DHTPingMessage> m(new DHTPingMessage(_localNode, remoteNode, transactionID));
|
||||||
setCommonProperty(m);
|
setCommonProperty(m);
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTResponseMessage> DHTMessageFactoryImpl::createPingReplyMessage
|
||||||
DHTMessageFactoryImpl::createPingReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* id,
|
const unsigned char* id,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
SharedHandle<DHTPingReplyMessage> m(new DHTPingReplyMessage(_localNode, remoteNode, id, transactionID));
|
SharedHandle<DHTPingReplyMessage> m
|
||||||
|
(new DHTPingReplyMessage(_localNode, remoteNode, id, transactionID));
|
||||||
setCommonProperty(m);
|
setCommonProperty(m);
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTQueryMessage> DHTMessageFactoryImpl::createFindNodeMessage
|
||||||
DHTMessageFactoryImpl::createFindNodeMessage(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* targetNodeID,
|
const unsigned char* targetNodeID,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
SharedHandle<DHTFindNodeMessage> m(new DHTFindNodeMessage(_localNode, remoteNode, targetNodeID, transactionID));
|
SharedHandle<DHTFindNodeMessage> m
|
||||||
|
(new DHTFindNodeMessage
|
||||||
|
(_localNode, remoteNode, targetNodeID, transactionID));
|
||||||
setCommonProperty(m);
|
setCommonProperty(m);
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTResponseMessage>
|
||||||
DHTMessageFactoryImpl::createFindNodeReplyMessage
|
DHTMessageFactoryImpl::createFindNodeReplyMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
||||||
|
@ -378,7 +382,7 @@ DHTMessageFactoryImpl::extractNodes(const unsigned char* src, size_t length)
|
||||||
return nodes;
|
return nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTResponseMessage>
|
||||||
DHTMessageFactoryImpl::createFindNodeReplyMessage
|
DHTMessageFactoryImpl::createFindNodeReplyMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const BDE& dict,
|
const BDE& dict,
|
||||||
|
@ -392,22 +396,21 @@ DHTMessageFactoryImpl::createFindNodeReplyMessage
|
||||||
return createFindNodeReplyMessage(remoteNode, nodes, transactionID);
|
return createFindNodeReplyMessage(remoteNode, nodes, transactionID);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTQueryMessage>
|
||||||
DHTMessageFactoryImpl::createGetPeersMessage(const SharedHandle<DHTNode>& remoteNode,
|
DHTMessageFactoryImpl::createGetPeersMessage
|
||||||
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* infoHash,
|
const unsigned char* infoHash,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
SharedHandle<DHTGetPeersMessage> m(new DHTGetPeersMessage(_localNode,
|
SharedHandle<DHTGetPeersMessage> m
|
||||||
remoteNode,
|
(new DHTGetPeersMessage(_localNode, remoteNode, infoHash, transactionID));
|
||||||
infoHash,
|
|
||||||
transactionID));
|
|
||||||
m->setPeerAnnounceStorage(_peerAnnounceStorage);
|
m->setPeerAnnounceStorage(_peerAnnounceStorage);
|
||||||
m->setTokenTracker(_tokenTracker);
|
m->setTokenTracker(_tokenTracker);
|
||||||
setCommonProperty(m);
|
setCommonProperty(m);
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTResponseMessage>
|
||||||
DHTMessageFactoryImpl::createGetPeersReplyMessageWithNodes
|
DHTMessageFactoryImpl::createGetPeersReplyMessageWithNodes
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const BDE& dict,
|
const BDE& dict,
|
||||||
|
@ -423,7 +426,7 @@ DHTMessageFactoryImpl::createGetPeersReplyMessageWithNodes
|
||||||
transactionID);
|
transactionID);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTResponseMessage>
|
||||||
DHTMessageFactoryImpl::createGetPeersReplyMessage
|
DHTMessageFactoryImpl::createGetPeersReplyMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
||||||
|
@ -437,7 +440,7 @@ DHTMessageFactoryImpl::createGetPeersReplyMessage
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTResponseMessage>
|
||||||
DHTMessageFactoryImpl::createGetPeersReplyMessageWithValues
|
DHTMessageFactoryImpl::createGetPeersReplyMessageWithValues
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const BDE& dict,
|
const BDE& dict,
|
||||||
|
@ -462,37 +465,40 @@ DHTMessageFactoryImpl::createGetPeersReplyMessageWithValues
|
||||||
transactionID);
|
transactionID);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTResponseMessage>
|
||||||
DHTMessageFactoryImpl::createGetPeersReplyMessage
|
DHTMessageFactoryImpl::createGetPeersReplyMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::vector<SharedHandle<Peer> >& values,
|
const std::vector<SharedHandle<Peer> >& values,
|
||||||
const std::string& token,
|
const std::string& token,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
SharedHandle<DHTGetPeersReplyMessage> m(new DHTGetPeersReplyMessage(_localNode, remoteNode, token, transactionID));
|
SharedHandle<DHTGetPeersReplyMessage> m
|
||||||
|
(new DHTGetPeersReplyMessage(_localNode, remoteNode, token, transactionID));
|
||||||
m->setValues(values);
|
m->setValues(values);
|
||||||
setCommonProperty(m);
|
setCommonProperty(m);
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTQueryMessage>
|
||||||
DHTMessageFactoryImpl::createAnnouncePeerMessage(const SharedHandle<DHTNode>& remoteNode,
|
DHTMessageFactoryImpl::createAnnouncePeerMessage
|
||||||
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* infoHash,
|
const unsigned char* infoHash,
|
||||||
uint16_t tcpPort,
|
uint16_t tcpPort,
|
||||||
const std::string& token,
|
const std::string& token,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
SharedHandle<DHTAnnouncePeerMessage> m
|
SharedHandle<DHTAnnouncePeerMessage> m
|
||||||
(new DHTAnnouncePeerMessage(_localNode, remoteNode, infoHash, tcpPort, token, transactionID));
|
(new DHTAnnouncePeerMessage
|
||||||
|
(_localNode, remoteNode, infoHash, tcpPort, token, transactionID));
|
||||||
m->setPeerAnnounceStorage(_peerAnnounceStorage);
|
m->setPeerAnnounceStorage(_peerAnnounceStorage);
|
||||||
m->setTokenTracker(_tokenTracker);
|
m->setTokenTracker(_tokenTracker);
|
||||||
setCommonProperty(m);
|
setCommonProperty(m);
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTResponseMessage>
|
||||||
DHTMessageFactoryImpl::createAnnouncePeerReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
DHTMessageFactoryImpl::createAnnouncePeerReplyMessage
|
||||||
const std::string& transactionID)
|
(const SharedHandle<DHTNode>& remoteNode, const std::string& transactionID)
|
||||||
{
|
{
|
||||||
SharedHandle<DHTAnnouncePeerReplyMessage> m
|
SharedHandle<DHTAnnouncePeerReplyMessage> m
|
||||||
(new DHTAnnouncePeerReplyMessage(_localNode, remoteNode, transactionID));
|
(new DHTAnnouncePeerReplyMessage(_localNode, remoteNode, transactionID));
|
||||||
|
@ -501,7 +507,8 @@ DHTMessageFactoryImpl::createAnnouncePeerReplyMessage(const SharedHandle<DHTNode
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTMessage>
|
||||||
DHTMessageFactoryImpl::createUnknownMessage(const unsigned char* data, size_t length,
|
DHTMessageFactoryImpl::createUnknownMessage
|
||||||
|
(const unsigned char* data, size_t length,
|
||||||
const std::string& ipaddr, uint16_t port)
|
const std::string& ipaddr, uint16_t port)
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -510,32 +517,38 @@ DHTMessageFactoryImpl::createUnknownMessage(const unsigned char* data, size_t le
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DHTMessageFactoryImpl::setRoutingTable(const WeakHandle<DHTRoutingTable>& routingTable)
|
void DHTMessageFactoryImpl::setRoutingTable
|
||||||
|
(const WeakHandle<DHTRoutingTable>& routingTable)
|
||||||
{
|
{
|
||||||
_routingTable = routingTable;
|
_routingTable = routingTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DHTMessageFactoryImpl::setConnection(const WeakHandle<DHTConnection>& connection)
|
void DHTMessageFactoryImpl::setConnection
|
||||||
|
(const WeakHandle<DHTConnection>& connection)
|
||||||
{
|
{
|
||||||
_connection = connection;
|
_connection = connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DHTMessageFactoryImpl::setMessageDispatcher(const WeakHandle<DHTMessageDispatcher>& dispatcher)
|
void DHTMessageFactoryImpl::setMessageDispatcher
|
||||||
|
(const WeakHandle<DHTMessageDispatcher>& dispatcher)
|
||||||
{
|
{
|
||||||
_dispatcher = dispatcher;
|
_dispatcher = dispatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DHTMessageFactoryImpl::setPeerAnnounceStorage(const WeakHandle<DHTPeerAnnounceStorage>& storage)
|
void DHTMessageFactoryImpl::setPeerAnnounceStorage
|
||||||
|
(const WeakHandle<DHTPeerAnnounceStorage>& storage)
|
||||||
{
|
{
|
||||||
_peerAnnounceStorage = storage;
|
_peerAnnounceStorage = storage;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DHTMessageFactoryImpl::setTokenTracker(const WeakHandle<DHTTokenTracker>& tokenTracker)
|
void DHTMessageFactoryImpl::setTokenTracker
|
||||||
|
(const WeakHandle<DHTTokenTracker>& tokenTracker)
|
||||||
{
|
{
|
||||||
_tokenTracker = tokenTracker;
|
_tokenTracker = tokenTracker;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DHTMessageFactoryImpl::setLocalNode(const SharedHandle<DHTNode>& localNode)
|
void DHTMessageFactoryImpl::setLocalNode
|
||||||
|
(const SharedHandle<DHTNode>& localNode)
|
||||||
{
|
{
|
||||||
_localNode = localNode;
|
_localNode = localNode;
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,7 +66,8 @@ private:
|
||||||
Logger* _logger;
|
Logger* _logger;
|
||||||
|
|
||||||
// search node in routingTable. If it is not found, create new one.
|
// search node in routingTable. If it is not found, create new one.
|
||||||
SharedHandle<DHTNode> getRemoteNode(const unsigned char* id, const std::string& ipaddr, uint16_t port) const;
|
SharedHandle<DHTNode> getRemoteNode
|
||||||
|
(const unsigned char* id, const std::string& ipaddr, uint16_t port) const;
|
||||||
|
|
||||||
void validateID(const BDE& id) const;
|
void validateID(const BDE& id) const;
|
||||||
|
|
||||||
|
@ -82,78 +83,78 @@ public:
|
||||||
|
|
||||||
virtual ~DHTMessageFactoryImpl();
|
virtual ~DHTMessageFactoryImpl();
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTQueryMessage>
|
||||||
createQueryMessage(const BDE& dict,
|
createQueryMessage(const BDE& dict,
|
||||||
const std::string& ipaddr, uint16_t port);
|
const std::string& ipaddr, uint16_t port);
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createResponseMessage(const std::string& messageType,
|
createResponseMessage(const std::string& messageType,
|
||||||
const BDE& dict,
|
const BDE& dict,
|
||||||
const std::string& ipaddr, uint16_t port);
|
const std::string& ipaddr, uint16_t port);
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTQueryMessage>
|
||||||
createPingMessage(const SharedHandle<DHTNode>& remoteNode,
|
createPingMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::string& transactionID = A2STR::NIL);
|
const std::string& transactionID = A2STR::NIL);
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createPingReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
createPingReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* id,
|
const unsigned char* id,
|
||||||
const std::string& transactionID);
|
const std::string& transactionID);
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTQueryMessage>
|
||||||
createFindNodeMessage(const SharedHandle<DHTNode>& remoteNode,
|
createFindNodeMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* targetNodeID,
|
const unsigned char* targetNodeID,
|
||||||
const std::string& transactionID = A2STR::NIL);
|
const std::string& transactionID = A2STR::NIL);
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTResponseMessage>
|
||||||
createFindNodeReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
createFindNodeReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const BDE& dict,
|
const BDE& dict,
|
||||||
const std::string& transactionID);
|
const std::string& transactionID);
|
||||||
|
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createFindNodeReplyMessage
|
createFindNodeReplyMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
||||||
const std::string& transactionID);
|
const std::string& transactionID);
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTQueryMessage>
|
||||||
createGetPeersMessage(const SharedHandle<DHTNode>& remoteNode,
|
createGetPeersMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* infoHash,
|
const unsigned char* infoHash,
|
||||||
const std::string& transactionID = A2STR::NIL);
|
const std::string& transactionID = A2STR::NIL);
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createGetPeersReplyMessage
|
createGetPeersReplyMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
||||||
const std::string& token,
|
const std::string& token,
|
||||||
const std::string& transactionID);
|
const std::string& transactionID);
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTResponseMessage>
|
||||||
createGetPeersReplyMessageWithNodes(const SharedHandle<DHTNode>& remoteNode,
|
createGetPeersReplyMessageWithNodes(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const BDE& dict,
|
const BDE& dict,
|
||||||
const std::string& transactionID);
|
const std::string& transactionID);
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createGetPeersReplyMessage
|
createGetPeersReplyMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::vector<SharedHandle<Peer> >& peers,
|
const std::vector<SharedHandle<Peer> >& peers,
|
||||||
const std::string& token,
|
const std::string& token,
|
||||||
const std::string& transactionID);
|
const std::string& transactionID);
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTResponseMessage>
|
||||||
createGetPeersReplyMessageWithValues(const SharedHandle<DHTNode>& remoteNode,
|
createGetPeersReplyMessageWithValues(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const BDE& dict,
|
const BDE& dict,
|
||||||
const std::string& transactionID);
|
const std::string& transactionID);
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTQueryMessage>
|
||||||
createAnnouncePeerMessage(const SharedHandle<DHTNode>& remoteNode,
|
createAnnouncePeerMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* infoHash,
|
const unsigned char* infoHash,
|
||||||
uint16_t tcpPort,
|
uint16_t tcpPort,
|
||||||
const std::string& token,
|
const std::string& token,
|
||||||
const std::string& transactionID = A2STR::NIL);
|
const std::string& transactionID = A2STR::NIL);
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createAnnouncePeerReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
createAnnouncePeerReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::string& transactionID);
|
const std::string& transactionID);
|
||||||
|
|
||||||
|
@ -167,7 +168,8 @@ public:
|
||||||
|
|
||||||
void setMessageDispatcher(const WeakHandle<DHTMessageDispatcher>& dispatcher);
|
void setMessageDispatcher(const WeakHandle<DHTMessageDispatcher>& dispatcher);
|
||||||
|
|
||||||
void setPeerAnnounceStorage(const WeakHandle<DHTPeerAnnounceStorage>& storage);
|
void setPeerAnnounceStorage
|
||||||
|
(const WeakHandle<DHTPeerAnnounceStorage>& storage);
|
||||||
|
|
||||||
void setTokenTracker(const WeakHandle<DHTTokenTracker>& tokenTracker);
|
void setTokenTracker(const WeakHandle<DHTTokenTracker>& tokenTracker);
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include "DHTMessageTracker.h"
|
#include "DHTMessageTracker.h"
|
||||||
#include "DHTConnection.h"
|
#include "DHTConnection.h"
|
||||||
#include "DHTMessage.h"
|
#include "DHTMessage.h"
|
||||||
|
#include "DHTQueryMessage.h"
|
||||||
#include "DHTResponseMessage.h"
|
#include "DHTResponseMessage.h"
|
||||||
#include "DHTUnknownMessage.h"
|
#include "DHTUnknownMessage.h"
|
||||||
#include "DHTMessageFactory.h"
|
#include "DHTMessageFactory.h"
|
||||||
|
@ -91,25 +92,39 @@ SharedHandle<DHTMessage> DHTMessageReceiver::receiveMessage()
|
||||||
" From:%s:%u", remoteAddr.c_str(), remotePort);
|
" From:%s:%u", remoteAddr.c_str(), remotePort);
|
||||||
return handleUnknownMessage(data, sizeof(data), remoteAddr, remotePort);
|
return handleUnknownMessage(data, sizeof(data), remoteAddr, remotePort);
|
||||||
}
|
}
|
||||||
SharedHandle<DHTMessage> message;
|
|
||||||
SharedHandle<DHTMessageCallback> callback;
|
|
||||||
if(isReply) {
|
if(isReply) {
|
||||||
std::pair<SharedHandle<DHTMessage>, SharedHandle<DHTMessageCallback> > p =
|
std::pair<SharedHandle<DHTResponseMessage>,
|
||||||
|
SharedHandle<DHTMessageCallback> > p =
|
||||||
_tracker->messageArrived(dict, remoteAddr, remotePort);
|
_tracker->messageArrived(dict, remoteAddr, remotePort);
|
||||||
message = p.first;
|
if(p.first.isNull()) {
|
||||||
callback = p.second;
|
|
||||||
if(message.isNull()) {
|
|
||||||
// timeout or malicious? message
|
// timeout or malicious? message
|
||||||
return handleUnknownMessage(data, sizeof(data), remoteAddr, remotePort);
|
return handleUnknownMessage(data, sizeof(data), remoteAddr, remotePort);
|
||||||
}
|
}
|
||||||
|
onMessageReceived(p.first);
|
||||||
|
if(!p.second.isNull()) {
|
||||||
|
p.second->onReceived(p.first);
|
||||||
|
}
|
||||||
|
return p.first;
|
||||||
} else {
|
} else {
|
||||||
message = _factory->createQueryMessage(dict, remoteAddr, remotePort);
|
SharedHandle<DHTQueryMessage> message =
|
||||||
|
_factory->createQueryMessage(dict, remoteAddr, remotePort);
|
||||||
if(message->getLocalNode() == message->getRemoteNode()) {
|
if(message->getLocalNode() == message->getRemoteNode()) {
|
||||||
// drop message from localnode
|
// drop message from localnode
|
||||||
_logger->info("Received DHT message from localnode.");
|
_logger->info("Received DHT message from localnode.");
|
||||||
return handleUnknownMessage(data, sizeof(data), remoteAddr, remotePort);
|
return handleUnknownMessage(data, sizeof(data), remoteAddr, remotePort);
|
||||||
}
|
}
|
||||||
|
onMessageReceived(message);
|
||||||
|
return message;
|
||||||
}
|
}
|
||||||
|
} catch(RecoverableException& e) {
|
||||||
|
_logger->info("Exception thrown while receiving DHT message.", e);
|
||||||
|
return handleUnknownMessage(data, sizeof(data), remoteAddr, remotePort);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DHTMessageReceiver::onMessageReceived
|
||||||
|
(const SharedHandle<DHTMessage>& message)
|
||||||
|
{
|
||||||
if(_logger->info()) {
|
if(_logger->info()) {
|
||||||
_logger->info("Message received: %s", message->toString().c_str());
|
_logger->info("Message received: %s", message->toString().c_str());
|
||||||
}
|
}
|
||||||
|
@ -118,14 +133,6 @@ SharedHandle<DHTMessage> DHTMessageReceiver::receiveMessage()
|
||||||
message->getRemoteNode()->markGood();
|
message->getRemoteNode()->markGood();
|
||||||
message->getRemoteNode()->updateLastContact();
|
message->getRemoteNode()->updateLastContact();
|
||||||
_routingTable->addGoodNode(message->getRemoteNode());
|
_routingTable->addGoodNode(message->getRemoteNode());
|
||||||
if(!callback.isNull()) {
|
|
||||||
callback->onReceived(message);
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
} catch(RecoverableException& e) {
|
|
||||||
_logger->info("Exception thrown while receiving DHT message.", e);
|
|
||||||
return handleUnknownMessage(data, sizeof(data), remoteAddr, remotePort);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DHTMessageReceiver::handleTimeout()
|
void DHTMessageReceiver::handleTimeout()
|
||||||
|
|
|
@ -63,6 +63,8 @@ private:
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTMessage>
|
||||||
handleUnknownMessage(const unsigned char* data, size_t length,
|
handleUnknownMessage(const unsigned char* data, size_t length,
|
||||||
const std::string& remoteAddr, uint16_t remotePort);
|
const std::string& remoteAddr, uint16_t remotePort);
|
||||||
|
|
||||||
|
void onMessageReceived(const SharedHandle<DHTMessage>& message);
|
||||||
public:
|
public:
|
||||||
DHTMessageReceiver(const SharedHandle<DHTMessageTracker>& tracker);
|
DHTMessageReceiver(const SharedHandle<DHTMessageTracker>& tracker);
|
||||||
|
|
||||||
|
|
|
@ -63,9 +63,9 @@ void DHTMessageTracker::addMessage(const SharedHandle<DHTMessage>& message, time
|
||||||
_entries.push_back(e);
|
_entries.push_back(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<SharedHandle<DHTMessage>, SharedHandle<DHTMessageCallback> >
|
std::pair<SharedHandle<DHTResponseMessage>, SharedHandle<DHTMessageCallback> >
|
||||||
DHTMessageTracker::messageArrived(const BDE& dict,
|
DHTMessageTracker::messageArrived
|
||||||
const std::string& ipaddr, uint16_t port)
|
(const BDE& dict, const std::string& ipaddr, uint16_t port)
|
||||||
{
|
{
|
||||||
const BDE& tid = dict[DHTMessage::T];
|
const BDE& tid = dict[DHTMessage::T];
|
||||||
if(!tid.isString()) {
|
if(!tid.isString()) {
|
||||||
|
@ -86,7 +86,7 @@ DHTMessageTracker::messageArrived(const BDE& dict,
|
||||||
}
|
}
|
||||||
SharedHandle<DHTNode> targetNode = entry->getTargetNode();
|
SharedHandle<DHTNode> targetNode = entry->getTargetNode();
|
||||||
|
|
||||||
SharedHandle<DHTMessage> message =
|
SharedHandle<DHTResponseMessage> message =
|
||||||
_factory->createResponseMessage(entry->getMessageType(), dict,
|
_factory->createResponseMessage(entry->getMessageType(), dict,
|
||||||
targetNode->getIPAddress(),
|
targetNode->getIPAddress(),
|
||||||
targetNode->getPort());
|
targetNode->getPort());
|
||||||
|
@ -103,7 +103,8 @@ DHTMessageTracker::messageArrived(const BDE& dict,
|
||||||
if(_logger->debug()) {
|
if(_logger->debug()) {
|
||||||
_logger->debug("Tracker entry not found.");
|
_logger->debug("Tracker entry not found.");
|
||||||
}
|
}
|
||||||
return std::pair<SharedHandle<DHTMessage>, SharedHandle<DHTMessageCallback> >();
|
return std::pair<SharedHandle<DHTResponseMessage>,
|
||||||
|
SharedHandle<DHTMessageCallback> >();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DHTMessageTracker::handleTimeout()
|
void DHTMessageTracker::handleTimeout()
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class DHTMessage;
|
class DHTMessage;
|
||||||
|
class DHTResponseMessage;
|
||||||
class DHTMessageCallback;
|
class DHTMessageCallback;
|
||||||
class DHTRoutingTable;
|
class DHTRoutingTable;
|
||||||
class DHTMessageFactory;
|
class DHTMessageFactory;
|
||||||
|
@ -72,13 +73,14 @@ public:
|
||||||
const SharedHandle<DHTMessageCallback>& callback =
|
const SharedHandle<DHTMessageCallback>& callback =
|
||||||
SharedHandle<DHTMessageCallback>());
|
SharedHandle<DHTMessageCallback>());
|
||||||
|
|
||||||
std::pair<SharedHandle<DHTMessage>, SharedHandle<DHTMessageCallback> >
|
std::pair<SharedHandle<DHTResponseMessage>, SharedHandle<DHTMessageCallback> >
|
||||||
messageArrived(const BDE& dict,
|
messageArrived(const BDE& dict,
|
||||||
const std::string& ipaddr, uint16_t port);
|
const std::string& ipaddr, uint16_t port);
|
||||||
|
|
||||||
void handleTimeout();
|
void handleTimeout();
|
||||||
|
|
||||||
SharedHandle<DHTMessageTrackerEntry> getEntryFor(const SharedHandle<DHTMessage>& message) const;
|
SharedHandle<DHTMessageTrackerEntry> getEntryFor
|
||||||
|
(const SharedHandle<DHTMessage>& message) const;
|
||||||
|
|
||||||
size_t countEntry() const;
|
size_t countEntry() const;
|
||||||
|
|
||||||
|
|
|
@ -39,25 +39,24 @@
|
||||||
#include "DHTNodeLookupEntry.h"
|
#include "DHTNodeLookupEntry.h"
|
||||||
#include "LogFactory.h"
|
#include "LogFactory.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include "DHTNodeLookupTaskCallback.h"
|
||||||
|
#include "DHTQueryMessage.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
DHTNodeLookupTask::DHTNodeLookupTask(const unsigned char* targetNodeID):
|
DHTNodeLookupTask::DHTNodeLookupTask(const unsigned char* targetNodeID):
|
||||||
DHTAbstractNodeLookupTask(targetNodeID)
|
DHTAbstractNodeLookupTask<DHTFindNodeReplyMessage>(targetNodeID)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void
|
void
|
||||||
DHTNodeLookupTask::getNodesFromMessage
|
DHTNodeLookupTask::getNodesFromMessage
|
||||||
(std::vector<SharedHandle<DHTNode> >& nodes,
|
(std::vector<SharedHandle<DHTNode> >& nodes,
|
||||||
const SharedHandle<DHTMessage>& message)
|
const DHTFindNodeReplyMessage* message)
|
||||||
{
|
{
|
||||||
SharedHandle<DHTFindNodeReplyMessage> m
|
const std::vector<SharedHandle<DHTNode> >& knodes =
|
||||||
(dynamic_pointer_cast<DHTFindNodeReplyMessage>(message));
|
message->getClosestKNodes();
|
||||||
if(!m.isNull()) {
|
|
||||||
const std::vector<SharedHandle<DHTNode> >& knodes = m->getClosestKNodes();
|
|
||||||
nodes.insert(nodes.end(), knodes.begin(), knodes.end());
|
nodes.insert(nodes.end(), knodes.begin(), knodes.end());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
SharedHandle<DHTMessage>
|
SharedHandle<DHTMessage>
|
||||||
DHTNodeLookupTask::createMessage(const SharedHandle<DHTNode>& remoteNode)
|
DHTNodeLookupTask::createMessage(const SharedHandle<DHTNode>& remoteNode)
|
||||||
|
@ -65,4 +64,10 @@ DHTNodeLookupTask::createMessage(const SharedHandle<DHTNode>& remoteNode)
|
||||||
return getMessageFactory()->createFindNodeMessage(remoteNode, getTargetID());
|
return getMessageFactory()->createFindNodeMessage(remoteNode, getTargetID());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SharedHandle<DHTMessageCallback> DHTNodeLookupTask::createCallback()
|
||||||
|
{
|
||||||
|
return SharedHandle<DHTNodeLookupTaskCallback>
|
||||||
|
(new DHTNodeLookupTaskCallback(this));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -39,15 +39,21 @@
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class DHTNodeLookupTask:public DHTAbstractNodeLookupTask {
|
class DHTFindNodeReplyMessage;
|
||||||
|
|
||||||
|
class DHTNodeLookupTask:
|
||||||
|
public DHTAbstractNodeLookupTask<DHTFindNodeReplyMessage> {
|
||||||
public:
|
public:
|
||||||
DHTNodeLookupTask(const unsigned char* targetNodeID);
|
DHTNodeLookupTask(const unsigned char* targetNodeID);
|
||||||
|
|
||||||
virtual void getNodesFromMessage(std::vector<SharedHandle<DHTNode> >& nodes,
|
virtual void getNodesFromMessage
|
||||||
const SharedHandle<DHTMessage>& message);
|
(std::vector<SharedHandle<DHTNode> >& nodes,
|
||||||
|
const DHTFindNodeReplyMessage* message);
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage> createMessage
|
virtual SharedHandle<DHTMessage> createMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode);
|
(const SharedHandle<DHTNode>& remoteNode);
|
||||||
|
|
||||||
|
virtual SharedHandle<DHTMessageCallback> createCallback();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
/*
|
/*
|
||||||
* aria2 - The high speed download utility
|
* aria2 - The high speed download utility
|
||||||
*
|
*
|
||||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
* Copyright (C) 2010 Tatsuhiro Tsujikawa
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -32,26 +32,23 @@
|
||||||
* files in the program, then also delete it here.
|
* files in the program, then also delete it here.
|
||||||
*/
|
*/
|
||||||
/* copyright --> */
|
/* copyright --> */
|
||||||
#ifndef _D_DHT_MESSAGE_CALLBACK_LISTENER_H_
|
#include "DHTNodeLookupTaskCallback.h"
|
||||||
#define _D_DHT_MESSAGE_CALLBACK_LISTENER_H_
|
#include "DHTNodeLookupTask.h"
|
||||||
|
|
||||||
#include "common.h"
|
|
||||||
#include "SharedHandle.h"
|
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class DHTMessage;
|
DHTNodeLookupTaskCallback::DHTNodeLookupTaskCallback(DHTNodeLookupTask* task):
|
||||||
class DHTNode;
|
_task(task) {}
|
||||||
|
|
||||||
class DHTMessageCallbackListener {
|
void DHTNodeLookupTaskCallback::visit(const DHTFindNodeReplyMessage* message)
|
||||||
public:
|
{
|
||||||
virtual ~DHTMessageCallbackListener() {}
|
_task->onReceived(message);
|
||||||
|
}
|
||||||
|
|
||||||
virtual void onReceived(const SharedHandle<DHTMessage>& message) = 0;
|
void DHTNodeLookupTaskCallback::onTimeout
|
||||||
|
(const SharedHandle<DHTNode>& remoteNode)
|
||||||
virtual void onTimeout(const SharedHandle<DHTNode>& remoteNode) = 0;
|
{
|
||||||
};
|
_task->onTimeout(remoteNode);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
||||||
#endif // _D_DHT_MESSAGE_CALLBACK_LISTENER_H_
|
|
|
@ -2,7 +2,7 @@
|
||||||
/*
|
/*
|
||||||
* aria2 - The high speed download utility
|
* aria2 - The high speed download utility
|
||||||
*
|
*
|
||||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
* Copyright (C) 2010 Tatsuhiro Tsujikawa
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -32,29 +32,32 @@
|
||||||
* files in the program, then also delete it here.
|
* files in the program, then also delete it here.
|
||||||
*/
|
*/
|
||||||
/* copyright --> */
|
/* copyright --> */
|
||||||
#ifndef _D_DHT_MESSAGE_CALLBACK_IMPL_H_
|
#ifndef _D_DHT_NODE_LOOKUP_TASK_CALLBACK_H_
|
||||||
#define _D_DHT_MESSAGE_CALLBACK_IMPL_H_
|
#define _D_DHT_NODE_LOOKUP_TASK_CALLBACK_H_
|
||||||
|
|
||||||
#include "DHTMessageCallback.h"
|
#include "DHTMessageCallback.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class DHTMessageCallbackListener;
|
class DHTNodeLookupTask;
|
||||||
|
|
||||||
class DHTMessageCallbackImpl:public DHTMessageCallback {
|
class DHTNodeLookupTaskCallback:public DHTMessageCallback {
|
||||||
private:
|
private:
|
||||||
WeakHandle<DHTMessageCallbackListener> _listener;
|
DHTNodeLookupTask* _task;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DHTMessageCallbackImpl(const WeakHandle<DHTMessageCallbackListener>& listener);
|
DHTNodeLookupTaskCallback(DHTNodeLookupTask* task);
|
||||||
|
|
||||||
virtual ~DHTMessageCallbackImpl();
|
virtual void visit(const DHTAnnouncePeerReplyMessage* message) {}
|
||||||
|
|
||||||
virtual void onReceived(const SharedHandle<DHTMessage>& message);
|
virtual void visit(const DHTFindNodeReplyMessage* message);
|
||||||
|
|
||||||
|
virtual void visit(const DHTGetPeersReplyMessage* message) {}
|
||||||
|
|
||||||
|
virtual void visit(const DHTPingReplyMessage* message) {}
|
||||||
|
|
||||||
virtual void onTimeout(const SharedHandle<DHTNode>& remoteNode);
|
virtual void onTimeout(const SharedHandle<DHTNode>& remoteNode);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
||||||
#endif // _D_DHT_MESSAGE_CALLBACK_IMPL_H_
|
#endif // _D_DHT_NODE_LOOKUP_TASK_CALLBACK_H_
|
|
@ -46,47 +46,50 @@
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "DHTBucket.h"
|
#include "DHTBucket.h"
|
||||||
#include "bittorrent_helper.h"
|
#include "bittorrent_helper.h"
|
||||||
|
#include "DHTPeerLookupTaskCallback.h"
|
||||||
|
#include "DHTQueryMessage.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
DHTPeerLookupTask::DHTPeerLookupTask
|
DHTPeerLookupTask::DHTPeerLookupTask
|
||||||
(const SharedHandle<DownloadContext>& downloadContext):
|
(const SharedHandle<DownloadContext>& downloadContext):
|
||||||
DHTAbstractNodeLookupTask(bittorrent::getInfoHash(downloadContext)) {}
|
DHTAbstractNodeLookupTask<DHTGetPeersReplyMessage>
|
||||||
|
(bittorrent::getInfoHash(downloadContext)) {}
|
||||||
|
|
||||||
void
|
void
|
||||||
DHTPeerLookupTask::getNodesFromMessage
|
DHTPeerLookupTask::getNodesFromMessage
|
||||||
(std::vector<SharedHandle<DHTNode> >& nodes,
|
(std::vector<SharedHandle<DHTNode> >& nodes,
|
||||||
const SharedHandle<DHTMessage>& message)
|
const DHTGetPeersReplyMessage* message)
|
||||||
{
|
{
|
||||||
SharedHandle<DHTGetPeersReplyMessage> m
|
const std::vector<SharedHandle<DHTNode> >& knodes =
|
||||||
(dynamic_pointer_cast<DHTGetPeersReplyMessage>(message));
|
message->getClosestKNodes();
|
||||||
if(!m.isNull()) {
|
|
||||||
const std::vector<SharedHandle<DHTNode> >& knodes = m->getClosestKNodes();
|
|
||||||
nodes.insert(nodes.end(), knodes.begin(), knodes.end());
|
nodes.insert(nodes.end(), knodes.begin(), knodes.end());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void DHTPeerLookupTask::onReceivedInternal
|
void DHTPeerLookupTask::onReceivedInternal
|
||||||
(const SharedHandle<DHTMessage>& message)
|
(const DHTGetPeersReplyMessage* message)
|
||||||
{
|
{
|
||||||
SharedHandle<DHTGetPeersReplyMessage> m
|
SharedHandle<DHTNode> remoteNode = message->getRemoteNode();
|
||||||
(dynamic_pointer_cast<DHTGetPeersReplyMessage>(message));
|
|
||||||
if(m.isNull()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
SharedHandle<DHTNode> remoteNode = m->getRemoteNode();
|
|
||||||
_tokenStorage[util::toHex(remoteNode->getID(), DHT_ID_LENGTH)] =
|
_tokenStorage[util::toHex(remoteNode->getID(), DHT_ID_LENGTH)] =
|
||||||
m->getToken();
|
message->getToken();
|
||||||
_peerStorage->addPeer(m->getValues());
|
_peerStorage->addPeer(message->getValues());
|
||||||
_peers.insert(_peers.end(), m->getValues().begin(), m->getValues().end());
|
_peers.insert(_peers.end(),
|
||||||
getLogger()->info("Received %u peers.", m->getValues().size());
|
message->getValues().begin(), message->getValues().end());
|
||||||
|
getLogger()->info("Received %u peers.", message->getValues().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<DHTMessage> DHTPeerLookupTask::createMessage(const SharedHandle<DHTNode>& remoteNode)
|
SharedHandle<DHTMessage> DHTPeerLookupTask::createMessage
|
||||||
|
(const SharedHandle<DHTNode>& remoteNode)
|
||||||
{
|
{
|
||||||
return getMessageFactory()->createGetPeersMessage(remoteNode, getTargetID());
|
return getMessageFactory()->createGetPeersMessage(remoteNode, getTargetID());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SharedHandle<DHTMessageCallback> DHTPeerLookupTask::createCallback()
|
||||||
|
{
|
||||||
|
return SharedHandle<DHTPeerLookupTaskCallback>
|
||||||
|
(new DHTPeerLookupTaskCallback(this));
|
||||||
|
}
|
||||||
|
|
||||||
void DHTPeerLookupTask::onFinish()
|
void DHTPeerLookupTask::onFinish()
|
||||||
{
|
{
|
||||||
// send announce_peer message to K closest nodes
|
// send announce_peer message to K closest nodes
|
||||||
|
|
|
@ -44,8 +44,10 @@ class DownloadContext;
|
||||||
class Peer;
|
class Peer;
|
||||||
class PeerStorage;
|
class PeerStorage;
|
||||||
class BtRuntime;
|
class BtRuntime;
|
||||||
|
class DHTGetPeersReplyMessage;
|
||||||
|
|
||||||
class DHTPeerLookupTask:public DHTAbstractNodeLookupTask {
|
class DHTPeerLookupTask:
|
||||||
|
public DHTAbstractNodeLookupTask<DHTGetPeersReplyMessage> {
|
||||||
private:
|
private:
|
||||||
std::map<std::string, std::string> _tokenStorage;
|
std::map<std::string, std::string> _tokenStorage;
|
||||||
|
|
||||||
|
@ -57,14 +59,17 @@ private:
|
||||||
public:
|
public:
|
||||||
DHTPeerLookupTask(const SharedHandle<DownloadContext>& downloadContext);
|
DHTPeerLookupTask(const SharedHandle<DownloadContext>& downloadContext);
|
||||||
|
|
||||||
virtual void getNodesFromMessage(std::vector<SharedHandle<DHTNode> >& nodes,
|
virtual void getNodesFromMessage
|
||||||
const SharedHandle<DHTMessage>& message);
|
(std::vector<SharedHandle<DHTNode> >& nodes,
|
||||||
|
const DHTGetPeersReplyMessage* message);
|
||||||
|
|
||||||
virtual void onReceivedInternal(const SharedHandle<DHTMessage>& message);
|
virtual void onReceivedInternal(const DHTGetPeersReplyMessage* message);
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage> createMessage
|
virtual SharedHandle<DHTMessage> createMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode);
|
(const SharedHandle<DHTNode>& remoteNode);
|
||||||
|
|
||||||
|
virtual SharedHandle<DHTMessageCallback> createCallback();
|
||||||
|
|
||||||
virtual void onFinish();
|
virtual void onFinish();
|
||||||
|
|
||||||
const std::vector<SharedHandle<Peer> >& getPeers() const
|
const std::vector<SharedHandle<Peer> >& getPeers() const
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
/*
|
/*
|
||||||
* aria2 - The high speed download utility
|
* aria2 - The high speed download utility
|
||||||
*
|
*
|
||||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
* Copyright (C) 2010 Tatsuhiro Tsujikawa
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -32,29 +32,23 @@
|
||||||
* files in the program, then also delete it here.
|
* files in the program, then also delete it here.
|
||||||
*/
|
*/
|
||||||
/* copyright --> */
|
/* copyright --> */
|
||||||
#include "DHTMessageCallbackImpl.h"
|
#include "DHTPeerLookupTaskCallback.h"
|
||||||
#include "DHTMessage.h"
|
#include "DHTPeerLookupTask.h"
|
||||||
#include "DHTNode.h"
|
|
||||||
#include "DHTMessageCallbackListener.h"
|
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
DHTMessageCallbackImpl::DHTMessageCallbackImpl(const WeakHandle<DHTMessageCallbackListener>& listener):_listener(listener) {}
|
DHTPeerLookupTaskCallback::DHTPeerLookupTaskCallback(DHTPeerLookupTask* task):
|
||||||
|
_task(task) {}
|
||||||
|
|
||||||
DHTMessageCallbackImpl::~DHTMessageCallbackImpl() {}
|
void DHTPeerLookupTaskCallback::visit(const DHTGetPeersReplyMessage* message)
|
||||||
|
|
||||||
void DHTMessageCallbackImpl::onReceived(const SharedHandle<DHTMessage>& message)
|
|
||||||
{
|
{
|
||||||
if(!_listener.isNull()) {
|
_task->onReceived(message);
|
||||||
_listener->onReceived(message);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DHTMessageCallbackImpl::onTimeout(const SharedHandle<DHTNode>& remoteNode)
|
void DHTPeerLookupTaskCallback::onTimeout
|
||||||
|
(const SharedHandle<DHTNode>& remoteNode)
|
||||||
{
|
{
|
||||||
if(!_listener.isNull()) {
|
_task->onTimeout(remoteNode);
|
||||||
_listener->onTimeout(remoteNode);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
|
@ -0,0 +1,63 @@
|
||||||
|
/* <!-- copyright */
|
||||||
|
/*
|
||||||
|
* aria2 - The high speed download utility
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 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_DHT_PEER_LOOKUP_TASK_CALLBACK_H_
|
||||||
|
#define _D_DHT_PEER_LOOKUP_TASK_CALLBACK_H_
|
||||||
|
|
||||||
|
#include "DHTMessageCallback.h"
|
||||||
|
|
||||||
|
namespace aria2 {
|
||||||
|
|
||||||
|
class DHTPeerLookupTask;
|
||||||
|
|
||||||
|
class DHTPeerLookupTaskCallback:public DHTMessageCallback {
|
||||||
|
private:
|
||||||
|
DHTPeerLookupTask* _task;
|
||||||
|
public:
|
||||||
|
DHTPeerLookupTaskCallback(DHTPeerLookupTask* task);
|
||||||
|
|
||||||
|
virtual void visit(const DHTAnnouncePeerReplyMessage* message) {}
|
||||||
|
|
||||||
|
virtual void visit(const DHTFindNodeReplyMessage* message) {}
|
||||||
|
|
||||||
|
virtual void visit(const DHTGetPeersReplyMessage* message);
|
||||||
|
|
||||||
|
virtual void visit(const DHTPingReplyMessage* message) {}
|
||||||
|
|
||||||
|
virtual void onTimeout(const SharedHandle<DHTNode>& remoteNode);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace aria2
|
||||||
|
|
||||||
|
#endif // _D_DHT_PEER_LOOKUP_TASK_CALLBACK_H_
|
|
@ -38,6 +38,7 @@
|
||||||
|
|
||||||
#include "DHTNode.h"
|
#include "DHTNode.h"
|
||||||
#include "bencode.h"
|
#include "bencode.h"
|
||||||
|
#include "DHTMessageCallback.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -68,4 +69,9 @@ const std::string& DHTPingReplyMessage::getMessageType() const
|
||||||
return PING;
|
return PING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DHTPingReplyMessage::accept(DHTMessageCallback* callback)
|
||||||
|
{
|
||||||
|
callback->visit(this);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -57,6 +57,8 @@ public:
|
||||||
|
|
||||||
virtual const std::string& getMessageType() const;
|
virtual const std::string& getMessageType() const;
|
||||||
|
|
||||||
|
virtual void accept(DHTMessageCallback* callback);
|
||||||
|
|
||||||
const unsigned char* getRemoteID()
|
const unsigned char* getRemoteID()
|
||||||
{
|
{
|
||||||
return _id;
|
return _id;
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
/* <!-- copyright */
|
||||||
|
/*
|
||||||
|
* aria2 - The high speed download utility
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 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_DHT_PING_REPLY_MESSAGE_CALLBACK_H_
|
||||||
|
#define _D_DHT_PING_REPLY_MESSAGE_CALLBACK_H_
|
||||||
|
|
||||||
|
#include "DHTMessageCallback.h"
|
||||||
|
|
||||||
|
namespace aria2 {
|
||||||
|
|
||||||
|
template<class Task>
|
||||||
|
class DHTPingReplyMessageCallback:public DHTMessageCallback {
|
||||||
|
private:
|
||||||
|
Task* _task;
|
||||||
|
public:
|
||||||
|
DHTPingReplyMessageCallback(Task* task):_task(task) {}
|
||||||
|
|
||||||
|
virtual void visit(const DHTAnnouncePeerReplyMessage* message) {}
|
||||||
|
|
||||||
|
virtual void visit(const DHTFindNodeReplyMessage* message) {}
|
||||||
|
|
||||||
|
virtual void visit(const DHTGetPeersReplyMessage* message) {}
|
||||||
|
|
||||||
|
virtual void visit(const DHTPingReplyMessage* message)
|
||||||
|
{
|
||||||
|
_task->onReceived(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void onTimeout(const SharedHandle<DHTNode>& remoteNode)
|
||||||
|
{
|
||||||
|
_task->onTimeout(remoteNode);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace aria2
|
||||||
|
|
||||||
|
#endif // _D_DHT_PING_REPLY_MESSAGE_CALLBACK_H_
|
|
@ -33,12 +33,13 @@
|
||||||
*/
|
*/
|
||||||
/* copyright --> */
|
/* copyright --> */
|
||||||
#include "DHTPingTask.h"
|
#include "DHTPingTask.h"
|
||||||
#include "DHTMessageCallbackImpl.h"
|
|
||||||
#include "DHTMessage.h"
|
#include "DHTMessage.h"
|
||||||
#include "DHTMessageFactory.h"
|
#include "DHTMessageFactory.h"
|
||||||
#include "DHTMessageDispatcher.h"
|
#include "DHTMessageDispatcher.h"
|
||||||
#include "DHTNode.h"
|
#include "DHTNode.h"
|
||||||
#include "DHTConstants.h"
|
#include "DHTConstants.h"
|
||||||
|
#include "DHTPingReplyMessageCallback.h"
|
||||||
|
#include "DHTQueryMessage.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -53,17 +54,21 @@ DHTPingTask::DHTPingTask
|
||||||
|
|
||||||
DHTPingTask::~DHTPingTask() {}
|
DHTPingTask::~DHTPingTask() {}
|
||||||
|
|
||||||
void DHTPingTask::startup()
|
void DHTPingTask::addMessage()
|
||||||
{
|
{
|
||||||
SharedHandle<DHTMessage> m =
|
SharedHandle<DHTMessage> m =
|
||||||
getMessageFactory()->createPingMessage(_remoteNode);
|
getMessageFactory()->createPingMessage(_remoteNode);
|
||||||
WeakHandle<DHTMessageCallbackListener> listener(this);
|
|
||||||
SharedHandle<DHTMessageCallback> callback
|
SharedHandle<DHTMessageCallback> callback
|
||||||
(new DHTMessageCallbackImpl(listener));
|
(new DHTPingReplyMessageCallback<DHTPingTask>(this));
|
||||||
getMessageDispatcher()->addMessageToQueue(m, _timeout, callback);
|
getMessageDispatcher()->addMessageToQueue(m, _timeout, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DHTPingTask::onReceived(const SharedHandle<DHTMessage>& message)
|
void DHTPingTask::startup()
|
||||||
|
{
|
||||||
|
addMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DHTPingTask::onReceived(const DHTPingReplyMessage* message)
|
||||||
{
|
{
|
||||||
_pingSuccessful = true;
|
_pingSuccessful = true;
|
||||||
setFinished(true);
|
setFinished(true);
|
||||||
|
@ -76,12 +81,7 @@ void DHTPingTask::onTimeout(const SharedHandle<DHTNode>& node)
|
||||||
_pingSuccessful = false;
|
_pingSuccessful = false;
|
||||||
setFinished(true);
|
setFinished(true);
|
||||||
} else {
|
} else {
|
||||||
SharedHandle<DHTMessage> m =
|
addMessage();
|
||||||
getMessageFactory()->createPingMessage(_remoteNode);
|
|
||||||
WeakHandle<DHTMessageCallbackListener> listener(this);
|
|
||||||
SharedHandle<DHTMessageCallback> callback
|
|
||||||
(new DHTMessageCallbackImpl(listener));
|
|
||||||
getMessageDispatcher()->addMessageToQueue(m, _timeout, callback);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,12 +36,13 @@
|
||||||
#define _D_DHT_PING_TASK_H_
|
#define _D_DHT_PING_TASK_H_
|
||||||
|
|
||||||
#include "DHTAbstractTask.h"
|
#include "DHTAbstractTask.h"
|
||||||
#include "DHTMessageCallbackListener.h"
|
|
||||||
#include "a2time.h"
|
#include "a2time.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class DHTPingTask:public DHTAbstractTask, public DHTMessageCallbackListener {
|
class DHTPingReplyMessage;
|
||||||
|
|
||||||
|
class DHTPingTask:public DHTAbstractTask {
|
||||||
private:
|
private:
|
||||||
SharedHandle<DHTNode> _remoteNode;
|
SharedHandle<DHTNode> _remoteNode;
|
||||||
|
|
||||||
|
@ -52,6 +53,8 @@ private:
|
||||||
bool _pingSuccessful;
|
bool _pingSuccessful;
|
||||||
|
|
||||||
time_t _timeout;
|
time_t _timeout;
|
||||||
|
|
||||||
|
void addMessage();
|
||||||
public:
|
public:
|
||||||
DHTPingTask(const SharedHandle<DHTNode>& remoteNode, size_t numMaxRetry = 0);
|
DHTPingTask(const SharedHandle<DHTNode>& remoteNode, size_t numMaxRetry = 0);
|
||||||
|
|
||||||
|
@ -59,9 +62,9 @@ public:
|
||||||
|
|
||||||
virtual void startup();
|
virtual void startup();
|
||||||
|
|
||||||
virtual void onReceived(const SharedHandle<DHTMessage>& message);
|
void onReceived(const DHTPingReplyMessage* message);
|
||||||
|
|
||||||
virtual void onTimeout(const SharedHandle<DHTNode>& node);
|
void onTimeout(const SharedHandle<DHTNode>& node);
|
||||||
|
|
||||||
void setTimeout(time_t timeout)
|
void setTimeout(time_t timeout)
|
||||||
{
|
{
|
||||||
|
|
|
@ -35,11 +35,12 @@
|
||||||
#include "DHTReplaceNodeTask.h"
|
#include "DHTReplaceNodeTask.h"
|
||||||
#include "DHTBucket.h"
|
#include "DHTBucket.h"
|
||||||
#include "DHTNode.h"
|
#include "DHTNode.h"
|
||||||
#include "DHTMessage.h"
|
#include "DHTPingReplyMessage.h"
|
||||||
#include "DHTMessageFactory.h"
|
#include "DHTMessageFactory.h"
|
||||||
#include "DHTMessageDispatcher.h"
|
#include "DHTMessageDispatcher.h"
|
||||||
#include "DHTMessageCallbackImpl.h"
|
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
|
#include "DHTPingReplyMessageCallback.h"
|
||||||
|
#include "DHTQueryMessage.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -66,14 +67,13 @@ void DHTReplaceNodeTask::sendMessage()
|
||||||
} else {
|
} else {
|
||||||
SharedHandle<DHTMessage> m =
|
SharedHandle<DHTMessage> m =
|
||||||
getMessageFactory()->createPingMessage(questionableNode);
|
getMessageFactory()->createPingMessage(questionableNode);
|
||||||
WeakHandle<DHTMessageCallbackListener> listener(this);
|
|
||||||
SharedHandle<DHTMessageCallback> callback
|
SharedHandle<DHTMessageCallback> callback
|
||||||
(new DHTMessageCallbackImpl(listener));
|
(new DHTPingReplyMessageCallback<DHTReplaceNodeTask>(this));
|
||||||
getMessageDispatcher()->addMessageToQueue(m, _timeout, callback);
|
getMessageDispatcher()->addMessageToQueue(m, _timeout, callback);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DHTReplaceNodeTask::onReceived(const SharedHandle<DHTMessage>& message)
|
void DHTReplaceNodeTask::onReceived(const DHTPingReplyMessage* message)
|
||||||
{
|
{
|
||||||
getLogger()->info("ReplaceNode: Ping reply received from %s.",
|
getLogger()->info("ReplaceNode: Ping reply received from %s.",
|
||||||
message->getRemoteNode()->toString().c_str());
|
message->getRemoteNode()->toString().c_str());
|
||||||
|
|
|
@ -36,15 +36,14 @@
|
||||||
#define _D_DHT_REPLACE_NODE_TASK_H_
|
#define _D_DHT_REPLACE_NODE_TASK_H_
|
||||||
|
|
||||||
#include "DHTAbstractTask.h"
|
#include "DHTAbstractTask.h"
|
||||||
#include "DHTMessageCallbackListener.h"
|
|
||||||
#include "a2time.h"
|
#include "a2time.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class DHTBucket;
|
class DHTBucket;
|
||||||
|
class DHTPingReplyMessage;
|
||||||
|
|
||||||
class DHTReplaceNodeTask:public DHTAbstractTask,
|
class DHTReplaceNodeTask:public DHTAbstractTask {
|
||||||
public DHTMessageCallbackListener {
|
|
||||||
private:
|
private:
|
||||||
SharedHandle<DHTBucket> _bucket;
|
SharedHandle<DHTBucket> _bucket;
|
||||||
|
|
||||||
|
@ -65,9 +64,9 @@ public:
|
||||||
|
|
||||||
virtual void startup();
|
virtual void startup();
|
||||||
|
|
||||||
virtual void onReceived(const SharedHandle<DHTMessage>& message);
|
void onReceived(const DHTPingReplyMessage* message);
|
||||||
|
|
||||||
virtual void onTimeout(const SharedHandle<DHTNode>& node);
|
void onTimeout(const SharedHandle<DHTNode>& node);
|
||||||
|
|
||||||
void setTimeout(time_t timeout)
|
void setTimeout(time_t timeout)
|
||||||
{
|
{
|
||||||
|
|
|
@ -40,6 +40,8 @@
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
class DHTMessageCallback;
|
||||||
|
|
||||||
class DHTResponseMessage:public DHTAbstractMessage {
|
class DHTResponseMessage:public DHTAbstractMessage {
|
||||||
protected:
|
protected:
|
||||||
virtual std::string toStringOptional() const { return A2STR::NIL; }
|
virtual std::string toStringOptional() const { return A2STR::NIL; }
|
||||||
|
@ -60,6 +62,8 @@ public:
|
||||||
|
|
||||||
virtual std::string toString() const;
|
virtual std::string toString() const;
|
||||||
|
|
||||||
|
virtual void accept(DHTMessageCallback* callback) = 0;
|
||||||
|
|
||||||
static const std::string R;
|
static const std::string R;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -388,15 +388,16 @@ SRCS += PeerAbstractCommand.cc PeerAbstractCommand.h\
|
||||||
DHTNodeLookupEntry.cc DHTNodeLookupEntry.h\
|
DHTNodeLookupEntry.cc DHTNodeLookupEntry.h\
|
||||||
BNode.cc BNode.h\
|
BNode.cc BNode.h\
|
||||||
DHTMessageCallback.h\
|
DHTMessageCallback.h\
|
||||||
DHTMessageCallbackImpl.cc DHTMessageCallbackImpl.h\
|
DHTNodeLookupTaskCallback.cc DHTNodeLookupTaskCallback.h\
|
||||||
DHTMessageCallbackListener.h\
|
DHTPingReplyMessageCallback.h\
|
||||||
|
DHTPeerLookupTaskCallback.cc DHTPeerLookupTaskCallback.h\
|
||||||
DHTAbstractTask.cc DHTAbstractTask.h\
|
DHTAbstractTask.cc DHTAbstractTask.h\
|
||||||
DHTTask.h\
|
DHTTask.h\
|
||||||
DHTPingTask.cc DHTPingTask.h\
|
DHTPingTask.cc DHTPingTask.h\
|
||||||
DHTTaskQueue.h\
|
DHTTaskQueue.h\
|
||||||
DHTTaskQueueImpl.cc DHTTaskQueueImpl.h\
|
DHTTaskQueueImpl.cc DHTTaskQueueImpl.h\
|
||||||
DHTBucketRefreshTask.cc DHTBucketRefreshTask.h\
|
DHTBucketRefreshTask.cc DHTBucketRefreshTask.h\
|
||||||
DHTAbstractNodeLookupTask.cc DHTAbstractNodeLookupTask.h\
|
DHTAbstractNodeLookupTask.h\
|
||||||
DHTPeerLookupTask.cc DHTPeerLookupTask.h\
|
DHTPeerLookupTask.cc DHTPeerLookupTask.h\
|
||||||
DHTSetup.cc DHTSetup.h\
|
DHTSetup.cc DHTSetup.h\
|
||||||
DHTTaskFactory.h\
|
DHTTaskFactory.h\
|
||||||
|
|
|
@ -186,15 +186,16 @@ bin_PROGRAMS = aria2c$(EXEEXT)
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTNodeLookupEntry.cc DHTNodeLookupEntry.h\
|
@ENABLE_BITTORRENT_TRUE@ DHTNodeLookupEntry.cc DHTNodeLookupEntry.h\
|
||||||
@ENABLE_BITTORRENT_TRUE@ BNode.cc BNode.h\
|
@ENABLE_BITTORRENT_TRUE@ BNode.cc BNode.h\
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTMessageCallback.h\
|
@ENABLE_BITTORRENT_TRUE@ DHTMessageCallback.h\
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTMessageCallbackImpl.cc DHTMessageCallbackImpl.h\
|
@ENABLE_BITTORRENT_TRUE@ DHTNodeLookupTaskCallback.cc DHTNodeLookupTaskCallback.h\
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTMessageCallbackListener.h\
|
@ENABLE_BITTORRENT_TRUE@ DHTPingReplyMessageCallback.h\
|
||||||
|
@ENABLE_BITTORRENT_TRUE@ DHTPeerLookupTaskCallback.cc DHTPeerLookupTaskCallback.h\
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTAbstractTask.cc DHTAbstractTask.h\
|
@ENABLE_BITTORRENT_TRUE@ DHTAbstractTask.cc DHTAbstractTask.h\
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTTask.h\
|
@ENABLE_BITTORRENT_TRUE@ DHTTask.h\
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTPingTask.cc DHTPingTask.h\
|
@ENABLE_BITTORRENT_TRUE@ DHTPingTask.cc DHTPingTask.h\
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTTaskQueue.h\
|
@ENABLE_BITTORRENT_TRUE@ DHTTaskQueue.h\
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTTaskQueueImpl.cc DHTTaskQueueImpl.h\
|
@ENABLE_BITTORRENT_TRUE@ DHTTaskQueueImpl.cc DHTTaskQueueImpl.h\
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTBucketRefreshTask.cc DHTBucketRefreshTask.h\
|
@ENABLE_BITTORRENT_TRUE@ DHTBucketRefreshTask.cc DHTBucketRefreshTask.h\
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTAbstractNodeLookupTask.cc DHTAbstractNodeLookupTask.h\
|
@ENABLE_BITTORRENT_TRUE@ DHTAbstractNodeLookupTask.h\
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTPeerLookupTask.cc DHTPeerLookupTask.h\
|
@ENABLE_BITTORRENT_TRUE@ DHTPeerLookupTask.cc DHTPeerLookupTask.h\
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTSetup.cc DHTSetup.h\
|
@ENABLE_BITTORRENT_TRUE@ DHTSetup.cc DHTSetup.h\
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTTaskFactory.h\
|
@ENABLE_BITTORRENT_TRUE@ DHTTaskFactory.h\
|
||||||
|
@ -347,8 +348,8 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \
|
||||||
DefaultDiskWriterFactory.cc DefaultDiskWriterFactory.h File.cc \
|
DefaultDiskWriterFactory.cc DefaultDiskWriterFactory.h File.cc \
|
||||||
File.h Option.cc Option.h Base64.cc Base64.h base32.cc \
|
File.h Option.cc Option.h Base64.cc Base64.h base32.cc \
|
||||||
base32.h LogFactory.cc LogFactory.h TimerA2.cc TimerA2.h \
|
base32.h LogFactory.cc LogFactory.h TimerA2.cc TimerA2.h \
|
||||||
TimeA2.cc TimeA2.h SharedHandle.h HandleRegistry.h \
|
TimeA2.cc TimeA2.h SharedHandle.h FeatureConfig.cc \
|
||||||
FeatureConfig.cc FeatureConfig.h DownloadEngineFactory.cc \
|
FeatureConfig.h DownloadEngineFactory.cc \
|
||||||
DownloadEngineFactory.h SpeedCalc.cc SpeedCalc.h PeerStat.h \
|
DownloadEngineFactory.h SpeedCalc.cc SpeedCalc.h PeerStat.h \
|
||||||
BitfieldMan.cc BitfieldMan.h Randomizer.h SimpleRandomizer.cc \
|
BitfieldMan.cc BitfieldMan.h Randomizer.h SimpleRandomizer.cc \
|
||||||
SimpleRandomizer.h HttpResponse.cc HttpResponse.h \
|
SimpleRandomizer.h HttpResponse.cc HttpResponse.h \
|
||||||
|
@ -547,24 +548,24 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \
|
||||||
DHTMessageFactoryImpl.cc DHTMessageFactoryImpl.h \
|
DHTMessageFactoryImpl.cc DHTMessageFactoryImpl.h \
|
||||||
DHTNodeLookupTask.cc DHTNodeLookupTask.h DHTNodeLookupEntry.cc \
|
DHTNodeLookupTask.cc DHTNodeLookupTask.h DHTNodeLookupEntry.cc \
|
||||||
DHTNodeLookupEntry.h BNode.cc BNode.h DHTMessageCallback.h \
|
DHTNodeLookupEntry.h BNode.cc BNode.h DHTMessageCallback.h \
|
||||||
DHTMessageCallbackImpl.cc DHTMessageCallbackImpl.h \
|
DHTNodeLookupTaskCallback.cc DHTNodeLookupTaskCallback.h \
|
||||||
DHTMessageCallbackListener.h DHTAbstractTask.cc \
|
DHTPingReplyMessageCallback.h DHTPeerLookupTaskCallback.cc \
|
||||||
|
DHTPeerLookupTaskCallback.h DHTAbstractTask.cc \
|
||||||
DHTAbstractTask.h DHTTask.h DHTPingTask.cc DHTPingTask.h \
|
DHTAbstractTask.h DHTTask.h DHTPingTask.cc DHTPingTask.h \
|
||||||
DHTTaskQueue.h DHTTaskQueueImpl.cc DHTTaskQueueImpl.h \
|
DHTTaskQueue.h DHTTaskQueueImpl.cc DHTTaskQueueImpl.h \
|
||||||
DHTBucketRefreshTask.cc DHTBucketRefreshTask.h \
|
DHTBucketRefreshTask.cc DHTBucketRefreshTask.h \
|
||||||
DHTAbstractNodeLookupTask.cc DHTAbstractNodeLookupTask.h \
|
DHTAbstractNodeLookupTask.h DHTPeerLookupTask.cc \
|
||||||
DHTPeerLookupTask.cc DHTPeerLookupTask.h DHTSetup.cc \
|
DHTPeerLookupTask.h DHTSetup.cc DHTSetup.h DHTTaskFactory.h \
|
||||||
DHTSetup.h DHTTaskFactory.h DHTTaskFactoryImpl.cc \
|
DHTTaskFactoryImpl.cc DHTTaskFactoryImpl.h \
|
||||||
DHTTaskFactoryImpl.h DHTInteractionCommand.cc \
|
DHTInteractionCommand.cc DHTInteractionCommand.h \
|
||||||
DHTInteractionCommand.h DHTPeerAnnounceEntry.cc \
|
DHTPeerAnnounceEntry.cc DHTPeerAnnounceEntry.h \
|
||||||
DHTPeerAnnounceEntry.h DHTPeerAnnounceStorage.cc \
|
DHTPeerAnnounceStorage.cc DHTPeerAnnounceStorage.h \
|
||||||
DHTPeerAnnounceStorage.h DHTTokenTracker.cc DHTTokenTracker.h \
|
DHTTokenTracker.cc DHTTokenTracker.h DHTGetPeersCommand.cc \
|
||||||
DHTGetPeersCommand.cc DHTGetPeersCommand.h \
|
DHTGetPeersCommand.h DHTTokenUpdateCommand.cc \
|
||||||
DHTTokenUpdateCommand.cc DHTTokenUpdateCommand.h \
|
DHTTokenUpdateCommand.h DHTBucketRefreshCommand.cc \
|
||||||
DHTBucketRefreshCommand.cc DHTBucketRefreshCommand.h \
|
DHTBucketRefreshCommand.h DHTPeerAnnounceCommand.cc \
|
||||||
DHTPeerAnnounceCommand.cc DHTPeerAnnounceCommand.h \
|
DHTPeerAnnounceCommand.h DHTReplaceNodeTask.cc \
|
||||||
DHTReplaceNodeTask.cc DHTReplaceNodeTask.h \
|
DHTReplaceNodeTask.h DHTEntryPointNameResolveCommand.cc \
|
||||||
DHTEntryPointNameResolveCommand.cc \
|
|
||||||
DHTEntryPointNameResolveCommand.h DHTRoutingTableSerializer.cc \
|
DHTEntryPointNameResolveCommand.h DHTRoutingTableSerializer.cc \
|
||||||
DHTRoutingTableSerializer.h DHTRoutingTableDeserializer.cc \
|
DHTRoutingTableSerializer.h DHTRoutingTableDeserializer.cc \
|
||||||
DHTRoutingTableDeserializer.h DHTAutoSaveCommand.cc \
|
DHTRoutingTableDeserializer.h DHTAutoSaveCommand.cc \
|
||||||
|
@ -725,12 +726,12 @@ am__objects_6 =
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTNodeLookupTask.$(OBJEXT) \
|
@ENABLE_BITTORRENT_TRUE@ DHTNodeLookupTask.$(OBJEXT) \
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTNodeLookupEntry.$(OBJEXT) \
|
@ENABLE_BITTORRENT_TRUE@ DHTNodeLookupEntry.$(OBJEXT) \
|
||||||
@ENABLE_BITTORRENT_TRUE@ BNode.$(OBJEXT) \
|
@ENABLE_BITTORRENT_TRUE@ BNode.$(OBJEXT) \
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTMessageCallbackImpl.$(OBJEXT) \
|
@ENABLE_BITTORRENT_TRUE@ DHTNodeLookupTaskCallback.$(OBJEXT) \
|
||||||
|
@ENABLE_BITTORRENT_TRUE@ DHTPeerLookupTaskCallback.$(OBJEXT) \
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTAbstractTask.$(OBJEXT) \
|
@ENABLE_BITTORRENT_TRUE@ DHTAbstractTask.$(OBJEXT) \
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTPingTask.$(OBJEXT) \
|
@ENABLE_BITTORRENT_TRUE@ DHTPingTask.$(OBJEXT) \
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTTaskQueueImpl.$(OBJEXT) \
|
@ENABLE_BITTORRENT_TRUE@ DHTTaskQueueImpl.$(OBJEXT) \
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTBucketRefreshTask.$(OBJEXT) \
|
@ENABLE_BITTORRENT_TRUE@ DHTBucketRefreshTask.$(OBJEXT) \
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTAbstractNodeLookupTask.$(OBJEXT) \
|
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTPeerLookupTask.$(OBJEXT) \
|
@ENABLE_BITTORRENT_TRUE@ DHTPeerLookupTask.$(OBJEXT) \
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTSetup.$(OBJEXT) \
|
@ENABLE_BITTORRENT_TRUE@ DHTSetup.$(OBJEXT) \
|
||||||
@ENABLE_BITTORRENT_TRUE@ DHTTaskFactoryImpl.$(OBJEXT) \
|
@ENABLE_BITTORRENT_TRUE@ DHTTaskFactoryImpl.$(OBJEXT) \
|
||||||
|
@ -1123,8 +1124,8 @@ SRCS = Socket.h SocketCore.cc SocketCore.h BinaryStream.h Command.cc \
|
||||||
DefaultDiskWriterFactory.cc DefaultDiskWriterFactory.h File.cc \
|
DefaultDiskWriterFactory.cc DefaultDiskWriterFactory.h File.cc \
|
||||||
File.h Option.cc Option.h Base64.cc Base64.h base32.cc \
|
File.h Option.cc Option.h Base64.cc Base64.h base32.cc \
|
||||||
base32.h LogFactory.cc LogFactory.h TimerA2.cc TimerA2.h \
|
base32.h LogFactory.cc LogFactory.h TimerA2.cc TimerA2.h \
|
||||||
TimeA2.cc TimeA2.h SharedHandle.h HandleRegistry.h \
|
TimeA2.cc TimeA2.h SharedHandle.h FeatureConfig.cc \
|
||||||
FeatureConfig.cc FeatureConfig.h DownloadEngineFactory.cc \
|
FeatureConfig.h DownloadEngineFactory.cc \
|
||||||
DownloadEngineFactory.h SpeedCalc.cc SpeedCalc.h PeerStat.h \
|
DownloadEngineFactory.h SpeedCalc.cc SpeedCalc.h PeerStat.h \
|
||||||
BitfieldMan.cc BitfieldMan.h Randomizer.h SimpleRandomizer.cc \
|
BitfieldMan.cc BitfieldMan.h Randomizer.h SimpleRandomizer.cc \
|
||||||
SimpleRandomizer.h HttpResponse.cc HttpResponse.h \
|
SimpleRandomizer.h HttpResponse.cc HttpResponse.h \
|
||||||
|
@ -1389,7 +1390,6 @@ distclean-compile:
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CookieStorage.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CookieStorage.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CreateRequestCommand.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CreateRequestCommand.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTAbstractMessage.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTAbstractMessage.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTAbstractNodeLookupTask.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTAbstractTask.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTAbstractTask.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTAnnouncePeerMessage.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTAnnouncePeerMessage.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTAnnouncePeerReplyMessage.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTAnnouncePeerReplyMessage.Po@am__quote@
|
||||||
|
@ -1406,7 +1406,6 @@ distclean-compile:
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTGetPeersReplyMessage.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTGetPeersReplyMessage.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTInteractionCommand.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTInteractionCommand.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTMessage.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTMessage.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTMessageCallbackImpl.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTMessageDispatcherImpl.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTMessageDispatcherImpl.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTMessageEntry.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTMessageEntry.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTMessageFactoryImpl.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTMessageFactoryImpl.Po@am__quote@
|
||||||
|
@ -1416,10 +1415,12 @@ distclean-compile:
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTNode.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTNode.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTNodeLookupEntry.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTNodeLookupEntry.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTNodeLookupTask.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTNodeLookupTask.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTNodeLookupTaskCallback.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTPeerAnnounceCommand.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTPeerAnnounceCommand.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTPeerAnnounceEntry.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTPeerAnnounceEntry.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTPeerAnnounceStorage.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTPeerAnnounceStorage.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTPeerLookupTask.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTPeerLookupTask.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTPeerLookupTaskCallback.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTPingMessage.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTPingMessage.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTPingReplyMessage.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTPingReplyMessage.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTPingTask.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DHTPingTask.Po@am__quote@
|
||||||
|
|
|
@ -28,11 +28,13 @@ public:
|
||||||
void testDoReceivedAction();
|
void testDoReceivedAction();
|
||||||
|
|
||||||
class MockDHTMessageFactory2:public MockDHTMessageFactory {
|
class MockDHTMessageFactory2:public MockDHTMessageFactory {
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createAnnouncePeerReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
createAnnouncePeerReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
return SharedHandle<DHTMessage>(new MockDHTMessage(_localNode, remoteNode, "announce_peer", transactionID));
|
return SharedHandle<DHTResponseMessage>
|
||||||
|
(new MockDHTResponseMessage
|
||||||
|
(_localNode, remoteNode, "announce_peer", transactionID));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -106,8 +108,9 @@ void DHTAnnouncePeerMessageTest::testDoReceivedAction()
|
||||||
msg.doReceivedAction();
|
msg.doReceivedAction();
|
||||||
|
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)1, dispatcher._messageQueue.size());
|
CPPUNIT_ASSERT_EQUAL((size_t)1, dispatcher._messageQueue.size());
|
||||||
SharedHandle<MockDHTMessage> m
|
SharedHandle<MockDHTResponseMessage> m
|
||||||
(dynamic_pointer_cast<MockDHTMessage>(dispatcher._messageQueue[0]._message));
|
(dynamic_pointer_cast<MockDHTResponseMessage>
|
||||||
|
(dispatcher._messageQueue[0]._message));
|
||||||
CPPUNIT_ASSERT(localNode == m->getLocalNode());
|
CPPUNIT_ASSERT(localNode == m->getLocalNode());
|
||||||
CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
|
CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("announce_peer"), m->getMessageType());
|
CPPUNIT_ASSERT_EQUAL(std::string("announce_peer"), m->getMessageType());
|
||||||
|
|
|
@ -29,14 +29,15 @@ public:
|
||||||
|
|
||||||
class MockDHTMessageFactory2:public MockDHTMessageFactory {
|
class MockDHTMessageFactory2:public MockDHTMessageFactory {
|
||||||
public:
|
public:
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createFindNodeReplyMessage
|
createFindNodeReplyMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
SharedHandle<MockDHTMessage> m
|
SharedHandle<MockDHTResponseMessage> m
|
||||||
(new MockDHTMessage(_localNode, remoteNode, "find_node", transactionID));
|
(new MockDHTResponseMessage
|
||||||
|
(_localNode, remoteNode, "find_node", transactionID));
|
||||||
m->_nodes = closestKNodes;
|
m->_nodes = closestKNodes;
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
@ -99,8 +100,9 @@ void DHTFindNodeMessageTest::testDoReceivedAction()
|
||||||
msg.doReceivedAction();
|
msg.doReceivedAction();
|
||||||
|
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)1, dispatcher._messageQueue.size());
|
CPPUNIT_ASSERT_EQUAL((size_t)1, dispatcher._messageQueue.size());
|
||||||
SharedHandle<MockDHTMessage> m
|
SharedHandle<MockDHTResponseMessage> m
|
||||||
(dynamic_pointer_cast<MockDHTMessage>(dispatcher._messageQueue[0]._message));
|
(dynamic_pointer_cast<MockDHTResponseMessage>
|
||||||
|
(dispatcher._messageQueue[0]._message));
|
||||||
CPPUNIT_ASSERT(localNode == m->getLocalNode());
|
CPPUNIT_ASSERT(localNode == m->getLocalNode());
|
||||||
CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
|
CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("find_node"), m->getMessageType());
|
CPPUNIT_ASSERT_EQUAL(std::string("find_node"), m->getMessageType());
|
||||||
|
|
|
@ -31,28 +31,30 @@ public:
|
||||||
|
|
||||||
class MockDHTMessageFactory2:public MockDHTMessageFactory {
|
class MockDHTMessageFactory2:public MockDHTMessageFactory {
|
||||||
public:
|
public:
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createGetPeersReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
createGetPeersReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::vector<SharedHandle<Peer> >& peers,
|
const std::vector<SharedHandle<Peer> >& peers,
|
||||||
const std::string& token,
|
const std::string& token,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
SharedHandle<MockDHTMessage> m
|
SharedHandle<MockDHTResponseMessage> m
|
||||||
(new MockDHTMessage(_localNode, remoteNode, "get_peers", transactionID));
|
(new MockDHTResponseMessage
|
||||||
|
(_localNode, remoteNode, "get_peers", transactionID));
|
||||||
m->_peers = peers;
|
m->_peers = peers;
|
||||||
m->_token = token;
|
m->_token = token;
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createGetPeersReplyMessage
|
createGetPeersReplyMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
||||||
const std::string& token,
|
const std::string& token,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
SharedHandle<MockDHTMessage> m
|
SharedHandle<MockDHTResponseMessage> m
|
||||||
(new MockDHTMessage(_localNode, remoteNode, "get_peers", transactionID));
|
(new MockDHTResponseMessage
|
||||||
|
(_localNode, remoteNode, "get_peers", transactionID));
|
||||||
m->_nodes = closestKNodes;
|
m->_nodes = closestKNodes;
|
||||||
m->_token = token;
|
m->_token = token;
|
||||||
return m;
|
return m;
|
||||||
|
@ -133,8 +135,9 @@ void DHTGetPeersMessageTest::testDoReceivedAction()
|
||||||
msg.doReceivedAction();
|
msg.doReceivedAction();
|
||||||
|
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)1, dispatcher._messageQueue.size());
|
CPPUNIT_ASSERT_EQUAL((size_t)1, dispatcher._messageQueue.size());
|
||||||
SharedHandle<MockDHTMessage> m
|
SharedHandle<MockDHTResponseMessage> m
|
||||||
(dynamic_pointer_cast<MockDHTMessage>(dispatcher._messageQueue[0]._message));
|
(dynamic_pointer_cast<MockDHTResponseMessage>
|
||||||
|
(dispatcher._messageQueue[0]._message));
|
||||||
CPPUNIT_ASSERT(localNode == m->getLocalNode());
|
CPPUNIT_ASSERT(localNode == m->getLocalNode());
|
||||||
CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
|
CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("get_peers"), m->getMessageType());
|
CPPUNIT_ASSERT_EQUAL(std::string("get_peers"), m->getMessageType());
|
||||||
|
@ -169,8 +172,9 @@ void DHTGetPeersMessageTest::testDoReceivedAction()
|
||||||
msg.doReceivedAction();
|
msg.doReceivedAction();
|
||||||
|
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)1, dispatcher._messageQueue.size());
|
CPPUNIT_ASSERT_EQUAL((size_t)1, dispatcher._messageQueue.size());
|
||||||
SharedHandle<MockDHTMessage> m
|
SharedHandle<MockDHTResponseMessage> m
|
||||||
(dynamic_pointer_cast<MockDHTMessage>(dispatcher._messageQueue[0]._message));
|
(dynamic_pointer_cast<MockDHTResponseMessage>
|
||||||
|
(dispatcher._messageQueue[0]._message));
|
||||||
CPPUNIT_ASSERT(localNode == m->getLocalNode());
|
CPPUNIT_ASSERT(localNode == m->getLocalNode());
|
||||||
CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
|
CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("get_peers"), m->getMessageType());
|
CPPUNIT_ASSERT_EQUAL(std::string("get_peers"), m->getMessageType());
|
||||||
|
|
|
@ -28,18 +28,6 @@ public:
|
||||||
void testMessageArrived();
|
void testMessageArrived();
|
||||||
|
|
||||||
void testHandleTimeout();
|
void testHandleTimeout();
|
||||||
|
|
||||||
class MockDHTMessageCallback2:public MockDHTMessageCallback {
|
|
||||||
public:
|
|
||||||
uint32_t _countOnRecivedCalled;
|
|
||||||
|
|
||||||
MockDHTMessageCallback2():_countOnRecivedCalled(0) {}
|
|
||||||
|
|
||||||
virtual void onReceived(const SharedHandle<DHTMessage>& message)
|
|
||||||
{
|
|
||||||
++_countOnRecivedCalled;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -66,13 +54,11 @@ void DHTMessageTrackerTest::testMessageArrived()
|
||||||
m3->getRemoteNode()->setIPAddress("192.168.0.3");
|
m3->getRemoteNode()->setIPAddress("192.168.0.3");
|
||||||
m3->getRemoteNode()->setPort(6883);
|
m3->getRemoteNode()->setPort(6883);
|
||||||
|
|
||||||
SharedHandle<MockDHTMessageCallback2> c2(new MockDHTMessageCallback2());
|
|
||||||
|
|
||||||
DHTMessageTracker tracker;
|
DHTMessageTracker tracker;
|
||||||
tracker.setRoutingTable(routingTable);
|
tracker.setRoutingTable(routingTable);
|
||||||
tracker.setMessageFactory(factory);
|
tracker.setMessageFactory(factory);
|
||||||
tracker.addMessage(m1, DHT_MESSAGE_TIMEOUT);
|
tracker.addMessage(m1, DHT_MESSAGE_TIMEOUT);
|
||||||
tracker.addMessage(m2, DHT_MESSAGE_TIMEOUT, c2);
|
tracker.addMessage(m2, DHT_MESSAGE_TIMEOUT);
|
||||||
tracker.addMessage(m3, DHT_MESSAGE_TIMEOUT);
|
tracker.addMessage(m3, DHT_MESSAGE_TIMEOUT);
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -85,7 +71,6 @@ void DHTMessageTrackerTest::testMessageArrived()
|
||||||
SharedHandle<DHTMessage> reply = p.first;
|
SharedHandle<DHTMessage> reply = p.first;
|
||||||
|
|
||||||
CPPUNIT_ASSERT(!reply.isNull());
|
CPPUNIT_ASSERT(!reply.isNull());
|
||||||
CPPUNIT_ASSERT_EQUAL((uint32_t)0, c2->_countOnRecivedCalled);
|
|
||||||
CPPUNIT_ASSERT(tracker.getEntryFor(m2).isNull());
|
CPPUNIT_ASSERT(tracker.getEntryFor(m2).isNull());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)2, tracker.countEntry());
|
CPPUNIT_ASSERT_EQUAL((size_t)2, tracker.countEntry());
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,13 +28,13 @@ public:
|
||||||
|
|
||||||
class MockDHTMessageFactory2:public MockDHTMessageFactory {
|
class MockDHTMessageFactory2:public MockDHTMessageFactory {
|
||||||
public:
|
public:
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createPingReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
createPingReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* remoteNodeID,
|
const unsigned char* remoteNodeID,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
return SharedHandle<DHTMessage>
|
return SharedHandle<MockDHTResponseMessage>
|
||||||
(new MockDHTMessage(_localNode, remoteNode, "ping_reply",
|
(new MockDHTResponseMessage(_localNode, remoteNode, "ping_reply",
|
||||||
transactionID));
|
transactionID));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -89,8 +89,9 @@ void DHTPingMessageTest::testDoReceivedAction()
|
||||||
msg.doReceivedAction();
|
msg.doReceivedAction();
|
||||||
|
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)1, dispatcher._messageQueue.size());
|
CPPUNIT_ASSERT_EQUAL((size_t)1, dispatcher._messageQueue.size());
|
||||||
SharedHandle<MockDHTMessage> m
|
SharedHandle<MockDHTResponseMessage> m
|
||||||
(dynamic_pointer_cast<MockDHTMessage>(dispatcher._messageQueue[0]._message));
|
(dynamic_pointer_cast<MockDHTResponseMessage>
|
||||||
|
(dispatcher._messageQueue[0]._message));
|
||||||
CPPUNIT_ASSERT(localNode == m->getLocalNode());
|
CPPUNIT_ASSERT(localNode == m->getLocalNode());
|
||||||
CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
|
CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("ping_reply"), m->getMessageType());
|
CPPUNIT_ASSERT_EQUAL(std::string("ping_reply"), m->getMessageType());
|
||||||
|
|
|
@ -2,14 +2,19 @@
|
||||||
#define _D_MOCK_DHT_MESSAGE_H_
|
#define _D_MOCK_DHT_MESSAGE_H_
|
||||||
|
|
||||||
#include "DHTMessage.h"
|
#include "DHTMessage.h"
|
||||||
|
#include "DHTQueryMessage.h"
|
||||||
|
#include "DHTResponseMessage.h"
|
||||||
|
|
||||||
#include <deque>
|
#include <deque>
|
||||||
|
|
||||||
#include "DHTNode.h"
|
#include "DHTNode.h"
|
||||||
#include "Peer.h"
|
#include "Peer.h"
|
||||||
|
#include "BDE.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
class DHTMessageCallback;
|
||||||
|
|
||||||
class MockDHTMessage:public DHTMessage {
|
class MockDHTMessage:public DHTMessage {
|
||||||
public:
|
public:
|
||||||
bool _isReply;
|
bool _isReply;
|
||||||
|
@ -43,6 +48,72 @@ public:
|
||||||
virtual std::string toString() const { return "MockDHTMessage"; }
|
virtual std::string toString() const { return "MockDHTMessage"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class MockDHTQueryMessage:public DHTQueryMessage {
|
||||||
|
public:
|
||||||
|
std::string _messageType;
|
||||||
|
|
||||||
|
std::vector<SharedHandle<DHTNode> > _nodes;
|
||||||
|
|
||||||
|
std::vector<SharedHandle<Peer> > _peers;
|
||||||
|
|
||||||
|
std::string _token;
|
||||||
|
public:
|
||||||
|
MockDHTQueryMessage(const SharedHandle<DHTNode>& localNode,
|
||||||
|
const SharedHandle<DHTNode>& remoteNode,
|
||||||
|
const std::string& messageType = "mock",
|
||||||
|
const std::string& transactionID = ""):
|
||||||
|
DHTQueryMessage(localNode, remoteNode, transactionID),
|
||||||
|
_messageType(messageType) {}
|
||||||
|
|
||||||
|
virtual ~MockDHTQueryMessage() {}
|
||||||
|
|
||||||
|
virtual void doReceivedAction() {}
|
||||||
|
|
||||||
|
virtual bool send() { return true; }
|
||||||
|
|
||||||
|
virtual bool isReply() const { return false; }
|
||||||
|
|
||||||
|
virtual const std::string& getMessageType() const { return _messageType; }
|
||||||
|
|
||||||
|
virtual std::string toString() const { return "MockDHTMessage"; }
|
||||||
|
|
||||||
|
virtual BDE getArgument() { return BDE::dict(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
class MockDHTResponseMessage:public DHTResponseMessage {
|
||||||
|
public:
|
||||||
|
std::string _messageType;
|
||||||
|
|
||||||
|
std::vector<SharedHandle<DHTNode> > _nodes;
|
||||||
|
|
||||||
|
std::vector<SharedHandle<Peer> > _peers;
|
||||||
|
|
||||||
|
std::string _token;
|
||||||
|
public:
|
||||||
|
MockDHTResponseMessage(const SharedHandle<DHTNode>& localNode,
|
||||||
|
const SharedHandle<DHTNode>& remoteNode,
|
||||||
|
const std::string& messageType = "mock",
|
||||||
|
const std::string& transactionID = ""):
|
||||||
|
DHTResponseMessage(localNode, remoteNode, transactionID),
|
||||||
|
_messageType(messageType) {}
|
||||||
|
|
||||||
|
virtual ~MockDHTResponseMessage() {}
|
||||||
|
|
||||||
|
virtual void doReceivedAction() {}
|
||||||
|
|
||||||
|
virtual bool send() { return true; }
|
||||||
|
|
||||||
|
virtual bool isReply() const { return true; }
|
||||||
|
|
||||||
|
virtual const std::string& getMessageType() const { return _messageType; }
|
||||||
|
|
||||||
|
virtual std::string toString() const { return "MockDHTMessage"; }
|
||||||
|
|
||||||
|
virtual BDE getResponse() { return BDE::dict(); }
|
||||||
|
|
||||||
|
virtual void accept(DHTMessageCallback* callback) {}
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
||||||
#endif // _D_MOCK_DHT_MESSAGE_H_
|
#endif // _D_MOCK_DHT_MESSAGE_H_
|
||||||
|
|
|
@ -11,7 +11,13 @@ public:
|
||||||
|
|
||||||
virtual ~MockDHTMessageCallback() {}
|
virtual ~MockDHTMessageCallback() {}
|
||||||
|
|
||||||
virtual void onReceived(const SharedHandle<DHTMessage>& message) {}
|
virtual void visit(const DHTAnnouncePeerReplyMessage* message) {}
|
||||||
|
|
||||||
|
virtual void visit(const DHTFindNodeReplyMessage* message) {}
|
||||||
|
|
||||||
|
virtual void visit(const DHTGetPeersReplyMessage* message) {}
|
||||||
|
|
||||||
|
virtual void visit(const DHTPingReplyMessage* message) {}
|
||||||
|
|
||||||
virtual void onTimeout(const SharedHandle<DHTNode>& remoteNode) {}
|
virtual void onTimeout(const SharedHandle<DHTNode>& remoteNode) {}
|
||||||
};
|
};
|
||||||
|
|
|
@ -16,14 +16,14 @@ public:
|
||||||
|
|
||||||
virtual ~MockDHTMessageFactory() {}
|
virtual ~MockDHTMessageFactory() {}
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTQueryMessage>
|
||||||
createQueryMessage(const BDE& dict,
|
createQueryMessage(const BDE& dict,
|
||||||
const std::string& ipaddr, uint16_t port)
|
const std::string& ipaddr, uint16_t port)
|
||||||
{
|
{
|
||||||
return SharedHandle<DHTMessage>();
|
return SharedHandle<DHTQueryMessage>();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createResponseMessage(const std::string& messageType,
|
createResponseMessage(const std::string& messageType,
|
||||||
const BDE& dict,
|
const BDE& dict,
|
||||||
const std::string& ipaddr, uint16_t port)
|
const std::string& ipaddr, uint16_t port)
|
||||||
|
@ -32,87 +32,86 @@ public:
|
||||||
// TODO At this point, removeNode's ID is random.
|
// TODO At this point, removeNode's ID is random.
|
||||||
remoteNode->setIPAddress(ipaddr);
|
remoteNode->setIPAddress(ipaddr);
|
||||||
remoteNode->setPort(port);
|
remoteNode->setPort(port);
|
||||||
SharedHandle<MockDHTMessage> m
|
SharedHandle<MockDHTResponseMessage> m
|
||||||
(new MockDHTMessage(_localNode, remoteNode, dict["t"].s()));
|
(new MockDHTResponseMessage(_localNode, remoteNode, dict["t"].s()));
|
||||||
m->setReply(true);
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTQueryMessage>
|
||||||
createPingMessage(const SharedHandle<DHTNode>& remoteNode,
|
createPingMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::string& transactionID = "")
|
const std::string& transactionID = "")
|
||||||
{
|
{
|
||||||
return SharedHandle<DHTMessage>();
|
return SharedHandle<DHTQueryMessage>();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createPingReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
createPingReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* remoteNodeID,
|
const unsigned char* remoteNodeID,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
return SharedHandle<DHTMessage>();
|
return SharedHandle<DHTResponseMessage>();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTQueryMessage>
|
||||||
createFindNodeMessage(const SharedHandle<DHTNode>& remoteNode,
|
createFindNodeMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* targetNodeID,
|
const unsigned char* targetNodeID,
|
||||||
const std::string& transactionID = "")
|
const std::string& transactionID = "")
|
||||||
{
|
{
|
||||||
return SharedHandle<DHTMessage>();
|
return SharedHandle<DHTQueryMessage>();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createFindNodeReplyMessage
|
createFindNodeReplyMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
return SharedHandle<DHTMessage>();
|
return SharedHandle<DHTResponseMessage>();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTQueryMessage>
|
||||||
createGetPeersMessage(const SharedHandle<DHTNode>& remoteNode,
|
createGetPeersMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* infoHash,
|
const unsigned char* infoHash,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
return SharedHandle<DHTMessage>();
|
return SharedHandle<DHTQueryMessage>();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createGetPeersReplyMessage
|
createGetPeersReplyMessage
|
||||||
(const SharedHandle<DHTNode>& remoteNode,
|
(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
const std::vector<SharedHandle<DHTNode> >& closestKNodes,
|
||||||
const std::string& token,
|
const std::string& token,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
return SharedHandle<DHTMessage>();
|
return SharedHandle<DHTResponseMessage>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createGetPeersReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
createGetPeersReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::vector<SharedHandle<Peer> >& peers,
|
const std::vector<SharedHandle<Peer> >& peers,
|
||||||
const std::string& token,
|
const std::string& token,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
return SharedHandle<DHTMessage>();
|
return SharedHandle<DHTResponseMessage>();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTQueryMessage>
|
||||||
createAnnouncePeerMessage(const SharedHandle<DHTNode>& remoteNode,
|
createAnnouncePeerMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const unsigned char* infoHash,
|
const unsigned char* infoHash,
|
||||||
uint16_t tcpPort,
|
uint16_t tcpPort,
|
||||||
const std::string& token,
|
const std::string& token,
|
||||||
const std::string& transactionID = "")
|
const std::string& transactionID = "")
|
||||||
{
|
{
|
||||||
return SharedHandle<DHTMessage>();
|
return SharedHandle<DHTQueryMessage>();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTResponseMessage>
|
||||||
createAnnouncePeerReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
createAnnouncePeerReplyMessage(const SharedHandle<DHTNode>& remoteNode,
|
||||||
const std::string& transactionID)
|
const std::string& transactionID)
|
||||||
{
|
{
|
||||||
return SharedHandle<DHTMessage>();
|
return SharedHandle<DHTResponseMessage>();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual SharedHandle<DHTMessage>
|
virtual SharedHandle<DHTMessage>
|
||||||
|
|
Loading…
Reference in New Issue