summaryrefslogtreecommitdiff
path: root/src/CheckIntegrityCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2007-05-31 15:56:20 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2007-05-31 15:56:20 +0000
commitccdd5b31a3dfa07cd13d6f7f0f5eaa3d8ff8a61e (patch)
tree4513f2373675d69e97170388b93a455cbb53b333 /src/CheckIntegrityCommand.cc
parent8eeeac71928919fa5e4fb0c1c389fa229637bea3 (diff)
2007-06-01 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
* src/FileAllocationCommand.cc: Derived from RealtimeCommand. * src/CheckIntegrityCommand.cc: Derived from RealtimeCommand. * src/MetalinkEntry.h (checksum): Changed to ChecksumHandle * src/MetalinkRequestInfo.cc (checksum): Changed to ChecksumHandle * src/File.cc (mkdirs): OPEN_MODE -> DIR_OPEN_MODE * src/common.h (DIR_OPEN_MODE): New definition * src/RequestGroup.cc (prepareForNextAction): Added an argument. * src/message.h (MSG_GOOD_CHECKSUM): New definition (MSG_BAD_CHECKSUM): New definition * src/HttpResponseCommand.cc (handleDefaultEncoding): Continue download sequence in new non-segmented download. * src/FileAllocationEntry.h (_nextDownloadCommand): New variable. * src/DownloadCommand.cc (prepareForNextSegment): Create ChecksumCommand if checksum is available. * src/RealtimeCommand.h, src/RealtimeCommand.cc: New class. * src/IteratableChecksumValidator.h, src/IteratableChecksumValidator.cc: New class. * src/ChecksumCommand.h, src/ChecksumCommand.cc: New class.
Diffstat (limited to 'src/CheckIntegrityCommand.cc')
-rw-r--r--src/CheckIntegrityCommand.cc57
1 files changed, 32 insertions, 25 deletions
diff --git a/src/CheckIntegrityCommand.cc b/src/CheckIntegrityCommand.cc
index 7a4bf430..51df08d3 100644
--- a/src/CheckIntegrityCommand.cc
+++ b/src/CheckIntegrityCommand.cc
@@ -51,20 +51,23 @@ void CheckIntegrityCommand::initValidator()
_validator->init();
}
-bool CheckIntegrityCommand::execute()
+bool CheckIntegrityCommand::executeInternal()
{
- setStatusRealtime();
- _e->noWait = true;
-
- try {
- _validator->validateChunk();
- if(_validator->finished()) {
- if(_requestGroup->downloadFinished()) {
- logger->notice(MSG_DOWNLOAD_ALREADY_COMPLETED, cuid, _requestGroup->getFilePath().c_str());
- return true;
- }
- if(_requestGroup->needsFileAllocation()) {
- _e->_fileAllocationMan->pushFileAllocationEntry(new FileAllocationEntry(cuid, _req, _requestGroup));
+ _validator->validateChunk();
+ if(_validator->finished()) {
+ if(_requestGroup->downloadFinished()) {
+ logger->notice(MSG_DOWNLOAD_ALREADY_COMPLETED, cuid, _requestGroup->getFilePath().c_str());
+ return true;
+ }
+ if(_requestGroup->needsFileAllocation()) {
+ FileAllocationEntryHandle entry = new FileAllocationEntry(cuid, _req, _requestGroup);
+ entry->setNextDownloadCommand(_nextDownloadCommand);
+ _nextDownloadCommand = 0;
+ _e->_fileAllocationMan->pushFileAllocationEntry(entry);
+ } else {
+ if(_nextDownloadCommand) {
+ _e->commands.push_back(_nextDownloadCommand);
+ _nextDownloadCommand = 0;
} else {
int32_t numCommandsToGenerate = 15;
Commands commands = _requestGroup->getNextCommand(_e, numCommandsToGenerate);
@@ -72,19 +75,23 @@ bool CheckIntegrityCommand::execute()
commands.push_front(command);
_e->addCommand(commands);
}
- return true;
- } else {
- _e->commands.push_back(this);
- return false;
}
- } catch(Exception* e) {
- _requestGroup->getSegmentMan()->errors++;
- logger->error("CUID#%d - Exception caught while validating file integrity.", e, cuid);
- delete e;
- logger->error(MSG_DOWNLOAD_NOT_COMPLETE, cuid, _requestGroup->getFilePath().c_str());
- // TODO this is wrong. There may exist invalid chunk data before catching
- // exception. Fix this.
- _requestGroup->markPieceDone(_validator->getCurrentOffset());
return true;
+ } else {
+ _e->commands.push_back(this);
+ return false;
}
}
+
+bool CheckIntegrityCommand::handleException(Exception* e)
+{
+ logger->error("CUID#%d - Exception caught while validating file integrity.", e, cuid);
+ delete e;
+ logger->error(MSG_DOWNLOAD_NOT_COMPLETE, cuid, _requestGroup->getFilePath().c_str());
+ // TODO this is wrong. There may exist invalid chunk data before catching
+ // exception. Fix this.
+ // The one of the solution is having a copy of bitfield before settting its
+ // all bit to 1. If exception is thrown, then assign the copy to the bitfield.
+ _requestGroup->markPieceDone(_validator->getCurrentOffset());
+ return true;
+}