summaryrefslogtreecommitdiff
path: root/src/DHTAbstractNodeLookupTask.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-06-13 11:25:21 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-06-13 11:25:21 +0000
commit3dfbec0f9ff13c660252d20dce17c88041280019 (patch)
treef8197ebb95b99bb861e81236334d268e45d571a7 /src/DHTAbstractNodeLookupTask.cc
parent532fc3724d5ece7a7a02cbe3b8db24d85da69626 (diff)
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
Diffstat (limited to 'src/DHTAbstractNodeLookupTask.cc')
-rw-r--r--src/DHTAbstractNodeLookupTask.cc182
1 files changed, 0 insertions, 182 deletions
diff --git a/src/DHTAbstractNodeLookupTask.cc b/src/DHTAbstractNodeLookupTask.cc
deleted file mode 100644
index dd3bf302..00000000
--- a/src/DHTAbstractNodeLookupTask.cc
+++ /dev/null
@@ -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