mirror of
https://github.com/aria2/aria2.git
synced 2026-04-13 08:18:46 +00:00
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".
170 lines
5.1 KiB
C++
170 lines
5.1 KiB
C++
/* <!-- 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 "PeerAbstractCommand.h"
|
|
#include "DlAbortEx.h"
|
|
#include "DlRetryEx.h"
|
|
#include "Util.h"
|
|
#include "message.h"
|
|
#include "prefs.h"
|
|
|
|
PeerAbstractCommand::PeerAbstractCommand(int cuid, const PeerHandle& peer,
|
|
TorrentDownloadEngine* e,
|
|
const BtContextHandle& btContext,
|
|
const SocketHandle& s)
|
|
:BtContextAwareCommand(cuid, btContext), e(e), socket(s), peer(peer),
|
|
checkSocketIsReadable(false), checkSocketIsWritable(false),
|
|
uploadLimitCheck(false), uploadLimit(0), noCheck(false)
|
|
{
|
|
setReadCheckSocket(socket);
|
|
timeout = e->option->getAsInt(PREF_TIMEOUT);
|
|
btRuntime->increaseConnections();
|
|
}
|
|
|
|
PeerAbstractCommand::~PeerAbstractCommand() {
|
|
disableReadCheckSocket();
|
|
disableWriteCheckSocket();
|
|
btRuntime->decreaseConnections();
|
|
}
|
|
|
|
bool PeerAbstractCommand::execute() {
|
|
if(btRuntime->isHalt()) {
|
|
return true;
|
|
}
|
|
try {
|
|
if(noCheck ||
|
|
/*
|
|
uploadLimitCheck && (uploadLimit == 0 ||
|
|
e->getUploadSpeed() <= uploadLimit*1024) ||
|
|
*/
|
|
checkSocketIsReadable && readCheckTarget->isReadable(0) ||
|
|
checkSocketIsWritable && writeCheckTarget->isWritable(0)) {
|
|
checkPoint.reset();
|
|
}
|
|
if(checkPoint.elapsed(timeout)) {
|
|
throw new DlRetryEx(EX_TIME_OUT);
|
|
}
|
|
return executeInternal();
|
|
} catch(Exception* err) {
|
|
logger->error(MSG_DOWNLOAD_ABORTED, err, cuid);
|
|
logger->debug("CUID#%d - Peer %s:%d banned.",
|
|
cuid, peer->ipaddr.c_str(), peer->port);
|
|
onAbort(err);
|
|
delete err;
|
|
return prepareForNextPeer(0);
|
|
}
|
|
}
|
|
|
|
// TODO this method removed when PeerBalancerCommand is implemented
|
|
bool PeerAbstractCommand::prepareForNextPeer(int wait) {
|
|
return true;
|
|
}
|
|
|
|
bool PeerAbstractCommand::prepareForRetry(int wait) {
|
|
return true;
|
|
}
|
|
|
|
void PeerAbstractCommand::onAbort(Exception* ex) {
|
|
if(peer->isSeeder()) {
|
|
peer->error++;
|
|
} else {
|
|
peer->error += MAX_PEER_ERROR;
|
|
}
|
|
peer->resetStatus();
|
|
}
|
|
|
|
void PeerAbstractCommand::disableReadCheckSocket() {
|
|
if(checkSocketIsReadable) {
|
|
e->deleteSocketForReadCheck(readCheckTarget, this);
|
|
checkSocketIsReadable = false;
|
|
readCheckTarget = SocketHandle();
|
|
}
|
|
}
|
|
|
|
void PeerAbstractCommand::setReadCheckSocket(const SocketHandle& socket) {
|
|
if(!socket->isOpen()) {
|
|
disableReadCheckSocket();
|
|
} else {
|
|
if(checkSocketIsReadable) {
|
|
if(readCheckTarget != socket) {
|
|
e->deleteSocketForReadCheck(readCheckTarget, this);
|
|
e->addSocketForReadCheck(socket, this);
|
|
readCheckTarget = socket;
|
|
}
|
|
} else {
|
|
e->addSocketForReadCheck(socket, this);
|
|
checkSocketIsReadable = true;
|
|
readCheckTarget = socket;
|
|
}
|
|
}
|
|
}
|
|
|
|
void PeerAbstractCommand::disableWriteCheckSocket() {
|
|
if(checkSocketIsWritable) {
|
|
e->deleteSocketForWriteCheck(writeCheckTarget, this);
|
|
checkSocketIsWritable = false;
|
|
writeCheckTarget = SocketHandle();
|
|
}
|
|
}
|
|
|
|
void PeerAbstractCommand::setWriteCheckSocket(const SocketHandle& socket) {
|
|
if(!socket->isOpen()) {
|
|
disableWriteCheckSocket();
|
|
} else {
|
|
if(checkSocketIsWritable) {
|
|
if(writeCheckTarget != socket) {
|
|
e->deleteSocketForWriteCheck(writeCheckTarget, this);
|
|
e->addSocketForWriteCheck(socket, this);
|
|
writeCheckTarget = socket;
|
|
}
|
|
} else {
|
|
e->addSocketForWriteCheck(socket, this);
|
|
checkSocketIsWritable = true;
|
|
writeCheckTarget = socket;
|
|
}
|
|
}
|
|
}
|
|
|
|
void PeerAbstractCommand::setUploadLimit(int uploadLimit) {
|
|
this->uploadLimit = uploadLimit;
|
|
}
|
|
|
|
void PeerAbstractCommand::setUploadLimitCheck(bool check) {
|
|
this->uploadLimitCheck = check;
|
|
}
|
|
|
|
void PeerAbstractCommand::setNoCheck(bool check) {
|
|
this->noCheck = check;
|
|
}
|