summaryrefslogtreecommitdiff
path: root/src/DefaultPeerStorage.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2006-11-05 15:04:17 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2006-11-05 15:04:17 +0000
commitec642ad294dd8fe6238b3a47309293c1c77beb68 (patch)
tree148f3116687d3f1cc413810fa067ca52d56aa68e /src/DefaultPeerStorage.cc
parentb8737b0e7c92fb4a5b1c8b6173663381aacca40c (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.cc174
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++;
+ }
+ }
+}