From 048a2cf59737f761876e81a77e8d064c45c752d7 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Thu, 11 Oct 2007 16:58:24 +0000 Subject: 2007-10-12 Tatsuhiro Tsujikawa Implemented BitTorrent/http/ftp integrated download. I've rewritten lots of files and now some headers have forward class declarations to reduce compile time. The implementation is extremely alpha stage, I recommend to use this for testing purpose only. --- src/MultiDiskWriter.cc | 214 ------------------------------------------------- 1 file changed, 214 deletions(-) delete mode 100644 src/MultiDiskWriter.cc (limited to 'src/MultiDiskWriter.cc') diff --git a/src/MultiDiskWriter.cc b/src/MultiDiskWriter.cc deleted file mode 100644 index 89ae72bf..00000000 --- a/src/MultiDiskWriter.cc +++ /dev/null @@ -1,214 +0,0 @@ -/* */ -#include "MultiDiskWriter.h" -#include "DlAbortEx.h" -#include "Util.h" -#include "message.h" -#include - -MultiDiskWriter::MultiDiskWriter(int pieceLength): - pieceLength(pieceLength), - ctx(DIGEST_ALGO_SHA1), - fileAllocator(0) { - ctx.digestInit(); -} - -MultiDiskWriter::~MultiDiskWriter() { - clearEntries(); -} - -void MultiDiskWriter::clearEntries() { - for(DiskWriterEntries::iterator itr = diskWriterEntries.begin(); - itr != diskWriterEntries.end(); itr++) { - delete *itr; - } - diskWriterEntries.clear(); -} - -void MultiDiskWriter::setFileEntries(const FileEntries& fileEntries) { - clearEntries(); - for(FileEntries::const_iterator itr = fileEntries.begin(); - itr != fileEntries.end(); itr++) { - diskWriterEntries.push_back(new DiskWriterEntry(*itr)); - } -} - -void MultiDiskWriter::configureFileAllocator(DiskWriterEntry* entry) { - if(entry->fileEntry->isRequested()) { - entry->diskWriter->setFileAllocator(fileAllocator); - } else { - entry->diskWriter->setFileAllocator(0); - } -} - -void MultiDiskWriter::openFile(const string& filename) { - for(DiskWriterEntries::iterator itr = diskWriterEntries.begin(); - itr != diskWriterEntries.end(); itr++) { - configureFileAllocator(*itr); - (*itr)->diskWriter->openFile(filename+"/"+(*itr)->fileEntry->getPath()); - } -} - -// filename is a directory which is specified by the user in the option. -void MultiDiskWriter::initAndOpenFile(const string& filename) { - for(DiskWriterEntries::iterator itr = diskWriterEntries.begin(); - itr != diskWriterEntries.end(); itr++) { - configureFileAllocator(*itr); - (*itr)->diskWriter->initAndOpenFile(filename+"/"+(*itr)->fileEntry->getPath()); - } -} - -void MultiDiskWriter::closeFile() { - for(DiskWriterEntries::iterator itr = diskWriterEntries.begin(); - itr != diskWriterEntries.end(); itr++) { - (*itr)->diskWriter->closeFile(); - } -} - -void MultiDiskWriter::openExistingFile(const string& filename) { - for(DiskWriterEntries::iterator itr = diskWriterEntries.begin(); - itr != diskWriterEntries.end(); itr++) { - (*itr)->diskWriter->setFileAllocator(0); - (*itr)->diskWriter->openExistingFile(filename+"/"+(*itr)->fileEntry->getPath()); - } -} - -void MultiDiskWriter::writeData(const char* data, int len, long long int offset) { - long long int fileOffset = offset; - bool writing = false; - int rem = len; - for(DiskWriterEntries::iterator itr = diskWriterEntries.begin(); - itr != diskWriterEntries.end() && rem != 0; itr++) { - if(isInRange(*itr, offset) || writing) { - int writeLength = calculateLength(*itr, fileOffset, rem); - (*itr)->diskWriter->writeData(data+(len-rem), writeLength, fileOffset); - rem -= writeLength; - writing = true; - fileOffset = 0; - } else { - fileOffset -= (*itr)->fileEntry->getLength(); - } - } - if(!writing) { - throw new DlAbortEx(EX_FILE_OFFSET_OUT_OF_RANGE, offset); - } -} - -bool MultiDiskWriter::isInRange(const DiskWriterEntry* entry, long long int offset) const { - return entry->fileEntry->getOffset() <= offset && - offset < entry->fileEntry->getOffset()+entry->fileEntry->getLength(); -} - -int MultiDiskWriter::calculateLength(const DiskWriterEntry* entry, long long int fileOffset, int rem) const { - int length; - if(entry->fileEntry->getLength() < fileOffset+rem) { - length = entry->fileEntry->getLength()-fileOffset; - } else { - length = rem; - } - return length; -} - -int MultiDiskWriter::readData(char* data, int len, long long int offset) { - long long int fileOffset = offset; - bool reading = false; - int rem = len; - int totalReadLength = 0; - for(DiskWriterEntries::iterator itr = diskWriterEntries.begin(); - itr != diskWriterEntries.end() && rem != 0; itr++) { - if(isInRange(*itr, offset) || reading) { - int readLength = calculateLength((*itr), fileOffset, rem); - totalReadLength += (*itr)->diskWriter->readData(data+(len-rem), readLength, fileOffset); - rem -= readLength; - reading = true; - fileOffset = 0; - } else { - fileOffset -= (*itr)->fileEntry->getLength(); - } - } - if(!reading) { - throw new DlAbortEx(EX_FILE_OFFSET_OUT_OF_RANGE, offset); - } - return totalReadLength; -} - -void MultiDiskWriter::hashUpdate(DiskWriterEntry* entry, long long int offset, long long int length) { - int BUFSIZE = 16*1024; - char buf[BUFSIZE]; - for(int i = 0; i < length/BUFSIZE; i++) { - if(BUFSIZE != entry->diskWriter->readData(buf, BUFSIZE, offset)) { - throw string("error"); - } - ctx.digestUpdate(buf, BUFSIZE); - offset += BUFSIZE; - } - int r = length%BUFSIZE; - if(r > 0) { - if(r != entry->diskWriter->readData(buf, r, offset)) { - throw string("error"); - } - ctx.digestUpdate(buf, r); - } -} - -string MultiDiskWriter::sha1Sum(long long int offset, long long int length) { - long long int fileOffset = offset; - bool reading = false; - int rem = length; - ctx.digestReset(); - try { - for(DiskWriterEntries::iterator itr = diskWriterEntries.begin(); - itr != diskWriterEntries.end() && rem != 0; itr++) { - if(isInRange(*itr, offset) || reading) { - int readLength = calculateLength((*itr), fileOffset, rem); - hashUpdate(*itr, fileOffset, readLength); - rem -= readLength; - reading = true; - fileOffset = 0; - } else { - fileOffset -= (*itr)->fileEntry->getLength(); - } - } - if(!reading) { - throw new DlAbortEx(EX_FILE_OFFSET_OUT_OF_RANGE, offset); - } - unsigned char hashValue[20]; - ctx.digestFinal(hashValue); - return Util::toHex(hashValue, 20); - } catch(string ex) { - throw new DlAbortEx(EX_FILE_SHA1SUM, "", strerror(errno)); - } -} - -- cgit