diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-06-13 11:25:21 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-06-13 11:25:21 +0000 |
| commit | 3dfbec0f9ff13c660252d20dce17c88041280019 (patch) | |
| tree | f8197ebb95b99bb861e81236334d268e45d571a7 /src/DHTAbstractNodeLookupTask.cc | |
| parent | 532fc3724d5ece7a7a02cbe3b8db24d85da69626 (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.cc | 182 |
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 |
