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".
2006-11-05 15:04:17 +00:00
|
|
|
/* <!-- 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 "DefaultPieceStorage.h"
|
|
|
|
#include "LogFactory.h"
|
|
|
|
#include "prefs.h"
|
|
|
|
#include "DirectDiskAdaptor.h"
|
|
|
|
#include "MultiDiskAdaptor.h"
|
|
|
|
#include "CopyDiskAdaptor.h"
|
|
|
|
#include "DefaultDiskWriter.h"
|
|
|
|
#include "MultiDiskWriter.h"
|
|
|
|
#include "PreAllocationDiskWriter.h"
|
|
|
|
#include "DlAbortEx.h"
|
|
|
|
|
|
|
|
DefaultPieceStorage::DefaultPieceStorage(BtContextHandle btContext, const Option* option):
|
|
|
|
btContext(btContext),
|
2006-11-08 16:25:38 +00:00
|
|
|
diskAdaptor(0),
|
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".
2006-11-05 15:04:17 +00:00
|
|
|
endGamePieceNum(END_GAME_PIECE_NUM),
|
|
|
|
option(option)
|
|
|
|
{
|
|
|
|
bitfieldMan = new BitfieldMan(btContext->getPieceLength(),
|
|
|
|
btContext->getTotalLength());
|
|
|
|
logger = LogFactory::getInstance();
|
|
|
|
}
|
|
|
|
|
|
|
|
DefaultPieceStorage::~DefaultPieceStorage() {
|
|
|
|
delete bitfieldMan;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool DefaultPieceStorage::hasMissingPiece(const PeerHandle& peer) {
|
|
|
|
return bitfieldMan->hasMissingPiece(peer->getBitfield(),
|
|
|
|
peer->getBitfieldLength());
|
|
|
|
}
|
|
|
|
|
|
|
|
bool DefaultPieceStorage::isEndGame() {
|
|
|
|
return bitfieldMan->countMissingBlock() <= endGamePieceNum;
|
|
|
|
}
|
|
|
|
|
|
|
|
int DefaultPieceStorage::getMissingPieceIndex(const PeerHandle& peer) {
|
|
|
|
int index = -1;
|
|
|
|
if(isEndGame()) {
|
|
|
|
index = bitfieldMan->getMissingIndex(peer->getBitfield(),
|
|
|
|
peer->getBitfieldLength());
|
|
|
|
} else {
|
|
|
|
index = bitfieldMan->getMissingUnusedIndex(peer->getBitfield(),
|
|
|
|
peer->getBitfieldLength());
|
|
|
|
}
|
|
|
|
return index;
|
|
|
|
}
|
|
|
|
|
|
|
|
Piece DefaultPieceStorage::checkOutPiece(int index) {
|
|
|
|
if(index == -1) {
|
|
|
|
return Piece::nullPiece;
|
|
|
|
}
|
|
|
|
bitfieldMan->setUseBit(index);
|
|
|
|
|
|
|
|
Piece piece = findUsedPiece(index);
|
|
|
|
if(Piece::isNull(piece)) {
|
|
|
|
Piece piece(index, bitfieldMan->getBlockLength(index));
|
|
|
|
addUsedPiece(piece);
|
|
|
|
return piece;
|
|
|
|
} else {
|
|
|
|
return piece;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DefaultPieceStorage::addUsedPiece(const Piece& piece) {
|
|
|
|
// TODO ? if nullPiece
|
|
|
|
usedPieces.push_back(piece);
|
|
|
|
}
|
|
|
|
|
|
|
|
class FindPiece {
|
|
|
|
private:
|
|
|
|
int index;
|
|
|
|
public:
|
|
|
|
FindPiece(int index):index(index) {}
|
|
|
|
|
|
|
|
bool operator()(const Piece& piece) {
|
|
|
|
return piece.getIndex() == index;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Piece DefaultPieceStorage::findUsedPiece(int index) const {
|
|
|
|
Pieces::const_iterator itr = find_if(usedPieces.begin(),
|
|
|
|
usedPieces.end(),
|
|
|
|
FindPiece(index));
|
|
|
|
if(itr == usedPieces.end()) {
|
|
|
|
return Piece::nullPiece;
|
|
|
|
} else {
|
|
|
|
return *itr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Piece DefaultPieceStorage::getMissingPiece(const PeerHandle& peer) {
|
|
|
|
int index = getMissingPieceIndex(peer);
|
|
|
|
return checkOutPiece(index);
|
|
|
|
}
|
|
|
|
|
|
|
|
int DefaultPieceStorage::getMissingFastPieceIndex(const PeerHandle& peer) {
|
|
|
|
int index = -1;
|
|
|
|
if(peer->isFastExtensionEnabled() && peer->countFastSet() > 0) {
|
|
|
|
BitfieldMan tempBitfield(bitfieldMan->getBlockLength(),
|
|
|
|
bitfieldMan->getTotalLength());
|
|
|
|
for(Integers::const_iterator itr = peer->getFastSet().begin();
|
|
|
|
itr != peer->getFastSet().end(); itr++) {
|
|
|
|
if(!bitfieldMan->isBitSet(index) && peer->hasPiece(*itr)) {
|
|
|
|
tempBitfield.setBit(*itr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(isEndGame()) {
|
|
|
|
index = bitfieldMan->getMissingIndex(tempBitfield.getBitfield(),
|
|
|
|
tempBitfield.getBitfieldLength());
|
|
|
|
} else {
|
|
|
|
index = bitfieldMan->getMissingUnusedIndex(tempBitfield.getBitfield(),
|
|
|
|
tempBitfield.getBitfieldLength());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return index;
|
|
|
|
}
|
|
|
|
|
|
|
|
Piece DefaultPieceStorage::getMissingFastPiece(const PeerHandle& peer) {
|
|
|
|
int index = getMissingFastPieceIndex(peer);
|
|
|
|
return checkOutPiece(index);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DefaultPieceStorage::deleteUsedPiece(const Piece& piece) {
|
|
|
|
if(Piece::isNull(piece)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
Pieces::iterator itr = find(usedPieces.begin(), usedPieces.end(), piece);
|
|
|
|
if(itr != usedPieces.end()) {
|
|
|
|
usedPieces.erase(itr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DefaultPieceStorage::reduceUsedPieces(int delMax) {
|
|
|
|
int toDelete = usedPieces.size()-delMax;
|
|
|
|
if(toDelete <= 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
int fillRate = 10;
|
|
|
|
while(fillRate < 50) {
|
|
|
|
int deleted = deleteUsedPiecesByFillRate(fillRate, toDelete);
|
|
|
|
if(deleted == 0) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
toDelete -= deleted;
|
|
|
|
fillRate += 10;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int DefaultPieceStorage::deleteUsedPiecesByFillRate(int fillRate,
|
|
|
|
int toDelete) {
|
|
|
|
int deleted = 0;
|
|
|
|
for(Pieces::iterator itr = usedPieces.begin();
|
|
|
|
itr != usedPieces.end() && deleted < toDelete;) {
|
|
|
|
Piece& piece = *itr;
|
|
|
|
if(!bitfieldMan->isUseBitSet(piece.getIndex()) &&
|
|
|
|
piece.countCompleteBlock() <= piece.countBlock()*(fillRate/100.0)) {
|
|
|
|
logger->debug("Deleting used piece index=%d, fillRate(%%)=%d<=%d",
|
|
|
|
piece.getIndex(),
|
|
|
|
(piece.countCompleteBlock()*100)/piece.countBlock(),
|
|
|
|
fillRate);
|
|
|
|
itr = usedPieces.erase(itr);
|
|
|
|
deleted++;
|
|
|
|
} else {
|
|
|
|
itr++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return deleted;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DefaultPieceStorage::completePiece(const Piece& piece) {
|
|
|
|
if(Piece::isNull(piece)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
deleteUsedPiece(piece);
|
|
|
|
if(!isEndGame()) {
|
|
|
|
reduceUsedPieces(100);
|
|
|
|
}
|
|
|
|
if(downloadFinished()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
bitfieldMan->setBit(piece.getIndex());
|
|
|
|
bitfieldMan->unsetUseBit(piece.getIndex());
|
|
|
|
if(downloadFinished()) {
|
|
|
|
diskAdaptor->onDownloadComplete();
|
|
|
|
if(isSelectiveDownloadingMode()) {
|
|
|
|
logger->notice(_("Download of selected files was complete."));
|
|
|
|
finishSelectiveDownloadingMode();
|
|
|
|
} else {
|
|
|
|
logger->info(_("The download was complete."));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool DefaultPieceStorage::isSelectiveDownloadingMode() {
|
|
|
|
return bitfieldMan->isFilterEnabled();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DefaultPieceStorage::finishSelectiveDownloadingMode() {
|
|
|
|
bitfieldMan->clearFilter();
|
|
|
|
diskAdaptor->addAllDownloadEntry();
|
|
|
|
}
|
|
|
|
|
|
|
|
// not unittested
|
|
|
|
void DefaultPieceStorage::cancelPiece(const Piece& piece) {
|
|
|
|
if(Piece::isNull(piece)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
updatePiece(piece);
|
|
|
|
bitfieldMan->unsetUseBit(piece.getIndex());
|
|
|
|
if(!isEndGame()) {
|
|
|
|
if(piece.countCompleteBlock() == 0) {
|
|
|
|
deleteUsedPiece(piece);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// not unittested
|
|
|
|
void DefaultPieceStorage::updatePiece(const Piece& piece) {
|
|
|
|
if(Piece::isNull(piece)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
Pieces::iterator itr = find(usedPieces.begin(), usedPieces.end(),
|
|
|
|
piece);
|
|
|
|
if(itr != usedPieces.end()) {
|
|
|
|
*itr = piece;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// not unittested
|
|
|
|
void DefaultPieceStorage::syncPiece(Piece& piece) {
|
|
|
|
if(Piece::isNull(piece)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
Pieces::iterator itr = find(usedPieces.begin(), usedPieces.end(),
|
|
|
|
piece);
|
|
|
|
if(itr != usedPieces.end()) {
|
|
|
|
piece = *itr;
|
|
|
|
return;
|
|
|
|
} else {
|
|
|
|
// hasPiece(piece.getIndex()) is true, then set all bit of
|
|
|
|
// piece.bitfield to 1
|
|
|
|
if(hasPiece(piece.getIndex())) {
|
|
|
|
piece.setAllBlock();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool DefaultPieceStorage::hasPiece(int index) {
|
|
|
|
return bitfieldMan->isBitSet(index);
|
|
|
|
}
|
|
|
|
|
|
|
|
long long int DefaultPieceStorage::getTotalLength() {
|
|
|
|
return bitfieldMan->getTotalLength();
|
|
|
|
}
|
|
|
|
|
|
|
|
long long int DefaultPieceStorage::getFilteredTotalLength() {
|
|
|
|
return bitfieldMan->getFilteredTotalLength();
|
|
|
|
}
|
|
|
|
|
|
|
|
long long int DefaultPieceStorage::getCompletedLength() {
|
|
|
|
return bitfieldMan->getCompletedLength();
|
|
|
|
}
|
|
|
|
|
|
|
|
long long int DefaultPieceStorage::getFilteredCompletedLength() {
|
|
|
|
return bitfieldMan->getFilteredCompletedLength();
|
|
|
|
}
|
|
|
|
|
|
|
|
// not unittested
|
|
|
|
void DefaultPieceStorage::setFileFilter(const Strings& filePaths) {
|
|
|
|
if(btContext->getFileMode() != BtContext::MULTI || filePaths.empty()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
diskAdaptor->removeAllDownloadEntry();
|
|
|
|
for(Strings::const_iterator pitr = filePaths.begin();
|
|
|
|
pitr != filePaths.end(); pitr++) {
|
|
|
|
if(!diskAdaptor->addDownloadEntry(*pitr)) {
|
|
|
|
throw new DlAbortEx("No such file entry %s", (*pitr).c_str());
|
|
|
|
}
|
|
|
|
FileEntryHandle fileEntry = diskAdaptor->getFileEntryFromPath(*pitr);
|
|
|
|
bitfieldMan->addFilter(fileEntry->getOffset(), fileEntry->getLength());
|
|
|
|
}
|
|
|
|
bitfieldMan->enableFilter();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DefaultPieceStorage::setFileFilter(const Integers& fileIndexes) {
|
|
|
|
Strings filePaths;
|
|
|
|
const FileEntries& entries = diskAdaptor->getFileEntries();
|
|
|
|
for(int i = 0; i < (int)entries.size(); i++) {
|
|
|
|
if(find(fileIndexes.begin(), fileIndexes.end(), i+1) != fileIndexes.end()) {
|
|
|
|
logger->debug("index=%d is %s", i+1, entries.at(i)->getPath().c_str());
|
|
|
|
filePaths.push_back(entries.at(i)->getPath());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
setFileFilter(filePaths);
|
|
|
|
}
|
|
|
|
|
|
|
|
// not unittested
|
|
|
|
void DefaultPieceStorage::clearFileFilter() {
|
|
|
|
bitfieldMan->clearFilter();
|
|
|
|
diskAdaptor->addAllDownloadEntry();
|
|
|
|
}
|
|
|
|
|
|
|
|
// not unittested
|
|
|
|
bool DefaultPieceStorage::downloadFinished() {
|
|
|
|
return bitfieldMan->isAllBitSet();
|
|
|
|
}
|
|
|
|
|
|
|
|
// not unittested
|
|
|
|
void DefaultPieceStorage::initStorage() {
|
|
|
|
if(diskAdaptor) {
|
|
|
|
delete diskAdaptor;
|
|
|
|
diskAdaptor = 0;
|
|
|
|
}
|
|
|
|
if(option->get(PREF_DIRECT_FILE_MAPPING) == V_TRUE) {
|
|
|
|
if(btContext->getFileMode() == BtContext::SINGLE) {
|
|
|
|
diskAdaptor = new DirectDiskAdaptor(new DefaultDiskWriter(btContext->getTotalLength()));
|
|
|
|
} else {
|
|
|
|
diskAdaptor = new MultiDiskAdaptor(new MultiDiskWriter(btContext->getPieceLength()));
|
2006-11-08 16:25:38 +00:00
|
|
|
((MultiDiskAdaptor*)diskAdaptor)->setTopDir(btContext->getName());
|
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".
2006-11-05 15:04:17 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
diskAdaptor = new CopyDiskAdaptor(new PreAllocationDiskWriter(btContext->getTotalLength()));
|
|
|
|
((CopyDiskAdaptor*)diskAdaptor)->setTempFilename(btContext->getName()+".a2tmp");
|
2006-11-08 16:25:38 +00:00
|
|
|
if(btContext->getFileMode() == BtContext::MULTI) {
|
|
|
|
((CopyDiskAdaptor*)diskAdaptor)->setTopDir(btContext->getName());
|
|
|
|
}
|
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".
2006-11-05 15:04:17 +00:00
|
|
|
}
|
|
|
|
string storeDir = option->get(PREF_DIR);
|
|
|
|
if(storeDir == "") {
|
|
|
|
storeDir = ".";
|
|
|
|
}
|
|
|
|
diskAdaptor->setStoreDir(storeDir);
|
|
|
|
diskAdaptor->setFileEntries(btContext->getFileEntries());
|
|
|
|
}
|
|
|
|
|
|
|
|
void DefaultPieceStorage::setBitfield(const unsigned char* bitfield,
|
|
|
|
int bitfieldLength) {
|
|
|
|
bitfieldMan->setBitfield(bitfield, bitfieldLength);
|
|
|
|
}
|
|
|
|
|
|
|
|
int DefaultPieceStorage::getBitfieldLength() {
|
|
|
|
return bitfieldMan->getBitfieldLength();
|
|
|
|
}
|
|
|
|
|
|
|
|
const unsigned char* DefaultPieceStorage::getBitfield() {
|
|
|
|
return bitfieldMan->getBitfield();
|
|
|
|
}
|
|
|
|
|
|
|
|
DiskAdaptor* DefaultPieceStorage::getDiskAdaptor() {
|
|
|
|
return diskAdaptor;
|
|
|
|
}
|
|
|
|
|
|
|
|
int DefaultPieceStorage::getPieceLength(int index) {
|
|
|
|
return bitfieldMan->getBlockLength(index);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DefaultPieceStorage::advertisePiece(int cuid, int index) {
|
|
|
|
HaveEntry entry(cuid, index);
|
|
|
|
haves.push_front(entry);
|
|
|
|
}
|
|
|
|
|
|
|
|
Integers DefaultPieceStorage::getAdvertisedPieceIndexes(int myCuid,
|
|
|
|
const Time& lastCheckTime) {
|
|
|
|
Integers indexes;
|
|
|
|
for(Haves::const_iterator itr = haves.begin(); itr != haves.end(); itr++) {
|
|
|
|
const Haves::value_type& have = *itr;
|
|
|
|
if(have.getCuid() == myCuid) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if(lastCheckTime.isNewer(have.getRegisteredTime())) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
indexes.push_back(have.getIndex());
|
|
|
|
}
|
|
|
|
return indexes;
|
|
|
|
}
|
|
|
|
|
|
|
|
class FindElapsedHave
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
int elapsed;
|
|
|
|
public:
|
|
|
|
FindElapsedHave(int elapsed):elapsed(elapsed) {}
|
|
|
|
|
|
|
|
bool operator()(const HaveEntry& have) {
|
|
|
|
if(have.getRegisteredTime().elapsed(elapsed)) {
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
void DefaultPieceStorage::removeAdvertisedPiece(int elapsed) {
|
|
|
|
Haves::iterator itr =
|
|
|
|
find_if(haves.begin(), haves.end(), FindElapsedHave(elapsed));
|
|
|
|
if(itr != haves.end()) {
|
|
|
|
logger->debug("Removed %d have entries.", haves.end()-itr);
|
|
|
|
haves.erase(itr, haves.end());
|
|
|
|
}
|
|
|
|
}
|