diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2006-11-05 15:04:17 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2006-11-05 15:04:17 +0000 |
| commit | ec642ad294dd8fe6238b3a47309293c1c77beb68 (patch) | |
| tree | 148f3116687d3f1cc413810fa067ca52d56aa68e /src/DefaultPeerStorage.cc | |
| parent | b8737b0e7c92fb4a5b1c8b6173663381aacca40c (diff) | |
2006-11-05 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
To divide TorrentMan into 6 classes: BtContext, BtRuntime,
PeerStorage, PieceStorage, BtAnnounce and BtProgressInfoFile
* src/TrackerWatcherComand.h: Made subclass of
BtContextAwareCommand.
* src/SeedCheckCommand.cc: Use pieceStorage, btRuntime
* src/PeerAbstractCommand.h: Made subclass of
BtContextAwareCommand.
* src/PeerAbstractCommand.cc: Use btRuntime.
* src/BtContextAwareCommand.h: New class.
* src/FileEntry.h: Added accessor methods for following
variables.
(path): Made private.
(length): Made private.
(offset): Made private.
(extracted): Made private.
(requested): Made private.
(FileEntries): New definition.
(FileEntryHandle): New definition.
* src/FileEntry.cc: New file.
* src/HaveEraseCommand.h: Made subclass of
BtContextAwareCommand.
* src/HaveEraseCommand.cc: Use btRuntime, pieceStorage.
* src/PeerChokeCommand.h: Made subclass of
BtContextAwareCommand.
* src/PeerChokeCommand.cc: Use btRuntime, peerStorage,
pieceStorage.
* src/PieceStorage.h: New file.
* src/PeerInteractionCommand.h: Use btContext.
* src/PeerInteractionCommand.cc: Use pieceStorage, peerStorage,
btRuntime.
* src/DefaultBtProgressInfoFile.h: New file.
* src/DefaultBtProgressInfoFile.cc: New file.
* src/File.cc
(Util.h): New include.
(mkdirs): New function.
* src/MultiDiskAdaptor.h
(mkdir): New function.
* src/PeerListProcessor.h
(Peers): Removed.
* src/PeerInteraction.h
(torrentMan): Removed.
(btContext): New variable.
(peerStorage): New variable.
(pieceStorage): New variable.
(btAnnounce): New variable.
(getTorrentMan): Removed.
(getBtContext): New function.
* src/PeerInteraction.cc: Use btContext, peerStorage,
pieceStorage,
btAnnounce.
* src/HandshakeMessage.h
(TorrentMan.h): Removed.
* src/HandshakeMessage.cc: Use btContext.
* src/DefaultBtAnnounce.cc: New file.
* src/MultiDiskWriter.cc: Use the accessor methods of FileEntry.
* src/DefaultPieceStorage.cc: New file.
* src/DefaultBtContext.h: New file.
* src/TorrentRequestInfo.cc: Use btContext, pieceStorage.
Use the accessor methods of FileEntry.
* src/CookieBox.cc: Updated to use Util::slice().
* src/PieceMessage.cc: Use btContext, pieceStorage.
* src/common.h (SharedHandle.h): New include.
* src/PeerMessage.cc (PeerMessage): Added btContext,
peerStorage,
pieceStorage.
* src/TorrentAutoSaveCommand.h: Made subclass of
BtContextAwareCommand.
* src/DiskAdaptor.h
(topDir): Removed.
(getFileEntryFromPath): Changed the return type to
FileEntryHandle.
(setTopDir): Removed.
(getTopDir): Removed.
* src/BtContext.h: New file.
* src/DefaultPeerStorage.h: New file.
* src/PieceMessage.h (TorrentMan.h): Removed.
* src/RequestMessage.h (TorrentMan.h): Removed.
* src/TorrentDownloadEngine.h
(uploadLength): New variable.
(btContext): New variable.
(btRuntime): New variable.
(pieceStorage): New variable.
(peerStorage): New variable.
(btAnnounce): New variable.
(btProgressInfoFile): New variable.
(torrentMan): Removed.
(setBtContext): New function.
* src/TorrentDownloadEngine.cc: Use BtContext, BtRuntime,
pieceStorage,
peerStorage, btAnnounce, btProgressInfoFile.
* src/Piece.h
(toString): New function.
(Pieces): New type definition.
* src/Peer.h
(active): New variable.
(Peer): Added active.
(activate): Set active to true.
(deactivate): Set active to false.
(isActive): New function.
(Peers): New type definition.
* src/DirectDiskAdaptor.cc
(getFilePath): Use the accessor methods of FileEntry.
* src/TorrentConsoleDownloadEngine.h
(afterEachIteration): New function.
* src/TorrentConsoleDownloadEngine.cc
(haltRequested): New variable.
(sendStatistics): Use pieceStorage, btRuntime.
(afterEachIteration): New function.
* src/AnnounceList: AnnounceTier->AnnounceTierHandle.
* src/Directry.h
(Directory): New function.
(DirectoryHandle): New type definition.
* src/BtProgressInfoFile.h: New file.
* src/RequestMessage.cc: Use pieceStorage.
* src/BtRuntime.h: New file.
* src/DefaultBtContext.cc: New file.
* src/BitfieldMan.h
(getCompletedLength): New function(private).
(getCompletedLength): New function.
(getFilteredCompletedLength): New function.
* src/BitfieldMan.h
(getCompletedLength): New function(private).
(getCompletedLength): New function.
(getFilteredCompletedLength): New function.
* src/MultiDiskAdaptor.cc
(mkdir): New function.
(openFile): Call mkdir().
(initAndOpenFile): Call mkdir().
* src/CancelMessage.h
(TorrentMan.h): Removed.
* src/RejectMessage.h
(TorrentMan.h): Removed.
* src/DownloadEngineFactory.cc
(DefaultPieceStorage.h): New include.
(DefaultPeerStorage.h): New include.
(DefaultBtAnnounce.h): New include.
(DefaultBtProgressInfoFile.h): New include.
(newTorrentConsoleEngine): Rewritten.
* src/ShareRatioSeedCriteria.h
(torrentMan): Removed.
(btContext): New variable.
(peerStorage): New variable.
(btRuntime): New variable.
(evaluate): Use btContext, btRuntime, peerStorage.
* src/AnnounceTier.h: New file.
* src/BtAnnounce.h: New file.
* src/BtRegistry.h: New file.
* src/PeerInitiateConnectionCommand.h: Added btContext.
* src/PeerConnection.h (TorrentMan.h): Removed.
* src/PeerMessageFactory.cc: Use btContext, pieceStorage.
* src/Util.h
(slice): Added an argument.
* src/Util.cc
(slice): Added an argument to control whether trim is made or
not.
* src/PeerStorage.h: New file.
* src/BtRegistry.cc: New file.
* src/TrackerUpdateCommand.h: Made subclass of
BtContextAwareCommand.
* src/CopyDiskAdaptor.cc: Use the accessor methods of FileEntry.
* src/MultiDiskWriter.h: FileEntry -> FileEntryHandle
* src/PeerListenCommand.cc: Use btRuntime, peerStorage,
btContext.
* src/TorrentRequestInfo.h
(e): Removed.
(showFileEntry): Added an argument.
(getDownloadEngine): Return 0.
* src/DefaultBtAnnounce.h: New file.
* src/TorrentAutoSaveCommand.cc: Use btRuntime,
btProgressInfoFile.
* src/TrackerWatcherComand.cc: Use btRuntime, btAnnounce,
* src/PeerMessageFactory.h
(btContext): New variable.
(pieceStorage): New variable.
* src/TrackerUpdateCommand.cc: Use btRuntime, peerStorage,
btContext,
btAnnounce.
* src/DiskAdaptor.cc
(DiskAdaptor): Removed topDir.
(~DiskAdaptor): Removed topDir.
* src/PeerListenCommand.h: Made subclass of
BtContextAwareCommand.
* src/SeedCheckCommand.h: Made subclass of
BtContextAwareCommand.
* src/File.h (mkdirs): New function.
* src/DefaultPeerStorage): New file.
* src/DownloadEngineFactory.h
(newTorrentConsoleEngine): Use btContext.
* src/BtContextAwareCommand.cc: New file.
* src/PeerInitiateConnectionCommand.cc: Use btRuntime,
peerStorage.
* src/PeerMessage.h
(btContext): New variable.
(peerStorage): New variable.
(pieceStorage): New variable.
(setBtContext): New function.
* src/Directry.cc
(Directory): New function.
(createDir): Do nothing if name.size() == 0.
* src/AnnounceList.h
(AnnounceTier): Removed.
(AnnounceTiers): Removed.
* src/DefaultPieceStorage.h: New file.
* src/Piece.cc (toString): New function.
To fix typo:
* src/main.cc (showVersion): Fixed typo.
To fix compile warning:
* src/DelegatingPeerListProcessor.cc
(canHandle): Added "return false".
Diffstat (limited to 'src/DefaultPeerStorage.cc')
| -rw-r--r-- | src/DefaultPeerStorage.cc | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/src/DefaultPeerStorage.cc b/src/DefaultPeerStorage.cc new file mode 100644 index 00000000..456f99f2 --- /dev/null +++ b/src/DefaultPeerStorage.cc @@ -0,0 +1,174 @@ +/* <!-- 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 "DefaultPeerStorage.h" +#include "LogFactory.h" +#include "BtRegistry.h" + +extern PeerHandle nullPeer; + +DefaultPeerStorage::DefaultPeerStorage(BtContextHandle btContext, + const Option* option): + btContext(btContext), + option(option), + maxPeerListSize(MAX_PEER_LIST_SIZE), + peerEntryIdCounter(0), + btRuntime(BT_RUNTIME(btContext)) +{ + logger = LogFactory::getInstance(); +} + +DefaultPeerStorage::~DefaultPeerStorage() {} + +bool DefaultPeerStorage::addPeer(const PeerHandle& peer) { + Peers::iterator itr = find(peers.begin(), peers.end(), peer); + if(itr == peers.end()) { + if(peers.size() >= (size_t)maxPeerListSize) { + deleteUnusedPeer(peers.size()-maxPeerListSize+1); + } + ++peerEntryIdCounter; + peer->entryId = peerEntryIdCounter; + peers.push_back(peer); + return true; + } else { + const PeerHandle& peer = *itr; + if(peer->error >= MAX_PEER_ERROR || peer->cuid != 0) { + return false; + } else { + *itr = peer; + return true; + } + } +} + +void DefaultPeerStorage::addPeer(const Peers& peers) { + for(Peers::const_iterator itr = peers.begin(); + itr != peers.end(); itr++) { + const PeerHandle& peer = *itr; + if(addPeer(peer)) { + logger->debug("Adding peer %s:%d", + peer->ipaddr.c_str(), peer->port); + } + } +} + +const Peers& DefaultPeerStorage::getPeers() { + return peers; +} + +class FindFinePeer { +public: + bool operator()(const PeerHandle& peer) const { + return peer->cuid == 0 && peer->error < MAX_PEER_ERROR; + } +}; + +PeerHandle DefaultPeerStorage::getUnusedPeer() { + Peers::const_iterator itr = find_if(peers.begin(), peers.end(), + FindFinePeer()); + if(itr == peers.end()) { + return nullPeer; + } else { + return *itr; + } +} + +class FindPeer { +private: + string ipaddr; + int port; +public: + FindPeer(const string& ipaddr, int port):ipaddr(ipaddr), port(port) {} + + bool operator()(const PeerHandle& peer) const { + return ipaddr == peer->ipaddr && port == peer->port; + } +}; + +PeerHandle DefaultPeerStorage::getPeer(const string& ipaddr, + int port) const { + Peers::const_iterator itr = find_if(peers.begin(), peers.end(), + FindPeer(ipaddr, port)); + if(itr == peers.end()) { + return nullPeer; + } else { + return *itr; + } +} + +int DefaultPeerStorage::countPeer() const { + return peers.size(); +} + +bool DefaultPeerStorage::isPeerAvailable() { + return getUnusedPeer() != nullPeer; +} + +Peers DefaultPeerStorage::getActivePeers() { + Peers activePeers; + for(Peers::iterator itr = peers.begin(); itr != peers.end(); itr++) { + PeerHandle& peer = *itr; + if(peer->isActive()) { + activePeers.push_back(peer); + } + } + return activePeers; +} + +TransferStat DefaultPeerStorage::calculateStat() { + TransferStat stat; + Peers activePeers = getActivePeers(); + for(Peers::iterator itr = activePeers.begin(); + itr != activePeers.end(); itr++) { + PeerHandle& peer = *itr; + stat.downloadSpeed += peer->calculateDownloadSpeed(); + stat.uploadSpeed += peer->calculateUploadSpeed(); + stat.sessionDownloadLength += peer->getSessionDownloadLength(); + stat.sessionUploadLength += peer->getSessionUploadLength(); + } + return stat; +} + +void DefaultPeerStorage::deleteUnusedPeer(int delSize) { + for(Peers::iterator itr = peers.begin(); + itr != peers.end() && delSize > 0;) { + const PeerHandle& p = *itr; + if(p->cuid == 0) { + itr = peers.erase(itr); + delSize--; + } else { + itr++; + } + } +} |
