summaryrefslogtreecommitdiff
path: root/src/DefaultBtProgressInfoFile.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/DefaultBtProgressInfoFile.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/DefaultBtProgressInfoFile.cc')
-rw-r--r--src/DefaultBtProgressInfoFile.cc172
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;
+ }
+}