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/DefaultBtProgressInfoFile.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/DefaultBtProgressInfoFile.cc')
| -rw-r--r-- | src/DefaultBtProgressInfoFile.cc | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/src/DefaultBtProgressInfoFile.cc b/src/DefaultBtProgressInfoFile.cc new file mode 100644 index 00000000..a524a589 --- /dev/null +++ b/src/DefaultBtProgressInfoFile.cc @@ -0,0 +1,172 @@ +/* <!-- 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 "DefaultBtProgressInfoFile.h" +#include "BtRegistry.h" +#include "LogFactory.h" +#include "prefs.h" +#include "DlAbortEx.h" +#include "message.h" +#include "File.h" +#include "Util.h" +#include <errno.h> + +DefaultBtProgressInfoFile::DefaultBtProgressInfoFile(const BtContextHandle& btContext, + const Option* option): + btContext(btContext), + option(option), + pieceStorage(PIECE_STORAGE(btContext)), + btRuntime(BT_RUNTIME(btContext)), + peerStorage(PEER_STORAGE(btContext)) +{ + logger = LogFactory::getInstance(); + string storeDir = option->get(PREF_DIR); + filename = storeDir+"/"+btContext->getName()+".aria2"; +} + +DefaultBtProgressInfoFile::~DefaultBtProgressInfoFile() {} + +void DefaultBtProgressInfoFile::save() { + logger->info(MSG_SAVING_SEGMENT_FILE, filename.c_str()); + FILE* file = openFile(filename, "w"); + try { + if(fwrite(btContext->getInfoHash(), + btContext->getInfoHashLength(), 1, file) < 1) { + throw string("writeError:info hash"); + } + if(fwrite(pieceStorage->getBitfield(), + pieceStorage->getBitfieldLength(), 1, file) < 1) { + throw string("writeError:bitfield"); + } + TransferStat stat = peerStorage->calculateStat(); + long long int allTimeDownloadLength = pieceStorage->getCompletedLength(); + if(fwrite(&allTimeDownloadLength, + sizeof(allTimeDownloadLength), 1, file) < 1) { + throw string("writeError:download length"); + } + long long int allTimeUploadLength = + btRuntime->getUploadLengthAtStartup()+ + stat.getSessionUploadLength(); + if(fwrite(&allTimeUploadLength, + sizeof(allTimeUploadLength), 1, file) < 1) { + throw string("writeError:upload length"); + } + fclose(file); + logger->info(MSG_SAVED_SEGMENT_FILE); + } catch(string ex) { + fclose(file); + throw new DlAbortEx(EX_SEGMENT_FILE_WRITE, + filename.c_str(), strerror(errno)); + } +} + +void DefaultBtProgressInfoFile::load() { + logger->info(MSG_LOADING_SEGMENT_FILE, filename.c_str()); + FILE* file = openFile(filename, "r+"); + unsigned char* savedInfoHash = 0; + unsigned char* savedBitfield = 0; + try { + savedInfoHash = new unsigned char[btContext->getInfoHashLength()]; + savedBitfield = new unsigned char[pieceStorage->getBitfieldLength()]; + if(fread(savedInfoHash, btContext->getInfoHashLength(), 1, file) < 1) { + throw string("readError"); + } + if(Util::toHex(savedInfoHash, btContext->getInfoHashLength()) != + btContext->getInfoHashAsString()) { + throw new DlAbortEx("Incorrect infoHash."); + } + if(fread(savedBitfield, pieceStorage->getBitfieldLength(), 1, file) < 1) { + throw string("readError"); + } + pieceStorage->setBitfield(savedBitfield, + pieceStorage->getBitfieldLength()); + // allTimeDownloadLength exists for only a compatibility reason. + long long int allTimeDownloadLength; + if(fread(&allTimeDownloadLength, + sizeof(allTimeDownloadLength), 1, file) < 1) { + throw string("readError"); + } + long long int allTimeUploadLength; + if(fread(&allTimeUploadLength, + sizeof(allTimeUploadLength), 1, file) < 1) { + throw string("readError"); + } + btRuntime->setUploadLengthAtStartup(allTimeUploadLength); + delete [] savedBitfield; + savedBitfield = 0; + delete [] savedInfoHash; + savedInfoHash = 0; + fclose(file); + } catch(string ex) { + if(savedBitfield) { + delete [] savedBitfield; + } + if(savedInfoHash) { + delete [] savedInfoHash; + } + fclose(file); + throw new DlAbortEx(EX_SEGMENT_FILE_READ, + filename.c_str(), strerror(errno)); + } + logger->info(MSG_LOADED_SEGMENT_FILE); +} + +void DefaultBtProgressInfoFile::removeFile() { + if(exists()) { + File f(filename); + f.remove(); + } +} + +FILE* DefaultBtProgressInfoFile::openFile(const string& filename, + const string& mode) const +{ + FILE* file = fopen(filename.c_str(), mode.c_str()); + if(!file) { + throw new DlAbortEx(EX_SEGMENT_FILE_OPEN, + filename.c_str(), strerror(errno)); + } + return file; +} + +bool DefaultBtProgressInfoFile::exists() { + File f(filename); + if(f.isFile()) { + logger->info(MSG_SEGMENT_FILE_EXISTS, filename.c_str()); + return true; + } else { + logger->info(MSG_SEGMENT_FILE_DOES_NOT_EXIST, filename.c_str()); + return false; + } +} |
