mirror of https://github.com/aria2/aria2
2009-05-07 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Fixed broken file renaming feature since r1202. * src/FtpNegotiationCommand.cc * src/FtpNegotiationCommand.h * src/HttpResponseCommand.cc * src/RequestGroup.cc * src/RequestGroup.hpull/1/head
parent
4432b68d24
commit
030bc08287
|
@ -1,3 +1,12 @@
|
|||
2009-05-07 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||
|
||||
Fixed broken file renaming feature since r1202.
|
||||
* src/FtpNegotiationCommand.cc
|
||||
* src/FtpNegotiationCommand.h
|
||||
* src/HttpResponseCommand.cc
|
||||
* src/RequestGroup.cc
|
||||
* src/RequestGroup.h
|
||||
|
||||
2009-05-06 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||
|
||||
Removed unused debug log
|
||||
|
|
|
@ -341,16 +341,29 @@ bool FtpNegotiationCommand::onFileSizeDetermined(uint64_t totalLength)
|
|||
} else {
|
||||
sequence = SEQ_PREPARE_SERVER_SOCKET;
|
||||
}
|
||||
_requestGroup->initPieceStorage();
|
||||
if(dctx->knowsTotalLength() &&
|
||||
_requestGroup->downloadFinishedByFileLength()) {
|
||||
|
||||
if(e->option->getAsBool(PREF_DRY_RUN)) {
|
||||
_requestGroup->initPieceStorage();
|
||||
onDryRunFileFound();
|
||||
return false;
|
||||
}
|
||||
|
||||
if(_requestGroup->downloadFinishedByFileLength()) {
|
||||
_requestGroup->initPieceStorage();
|
||||
_requestGroup->getPieceStorage()->markAllPiecesDone();
|
||||
sequence = SEQ_DOWNLOAD_ALREADY_COMPLETED;
|
||||
|
||||
logger->notice(MSG_DOWNLOAD_ALREADY_COMPLETED,
|
||||
_requestGroup->getGID(),
|
||||
_requestGroup->getFilePath().c_str());
|
||||
|
||||
poolConnection();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
_requestGroup->shouldCancelDownloadForSafety();
|
||||
_requestGroup->initPieceStorage();
|
||||
_requestGroup->getPieceStorage()->getDiskAdaptor()->initAndOpenFile();
|
||||
|
||||
if(dctx->knowsTotalLength()) {
|
||||
|
@ -361,19 +374,28 @@ bool FtpNegotiationCommand::onFileSizeDetermined(uint64_t totalLength)
|
|||
|
||||
return true;
|
||||
} else {
|
||||
_requestGroup->adjustFilename
|
||||
(SharedHandle<BtProgressInfoFile>(new DefaultBtProgressInfoFile
|
||||
(_requestGroup->getDownloadContext(),
|
||||
SharedHandle<PieceStorage>(),
|
||||
e->option)));
|
||||
_requestGroup->initPieceStorage();
|
||||
|
||||
if(e->option->getAsBool(PREF_DRY_RUN)) {
|
||||
_requestGroup->getPieceStorage()->markAllPiecesDone();
|
||||
poolConnection();
|
||||
sequence = SEQ_HEAD_OK;
|
||||
onDryRunFileFound();
|
||||
return false;
|
||||
}
|
||||
|
||||
BtProgressInfoFileHandle infoFile(new DefaultBtProgressInfoFile(_requestGroup->getDownloadContext(), _requestGroup->getPieceStorage(), e->option));
|
||||
if(!infoFile->exists() && _requestGroup->downloadFinishedByFileLength()) {
|
||||
_requestGroup->getPieceStorage()->markAllPiecesDone();
|
||||
|
||||
sequence = SEQ_DOWNLOAD_ALREADY_COMPLETED;
|
||||
|
||||
logger->notice(MSG_DOWNLOAD_ALREADY_COMPLETED,
|
||||
_requestGroup->getGID(),
|
||||
_requestGroup->getFilePath().c_str());
|
||||
|
||||
poolConnection();
|
||||
|
||||
return false;
|
||||
|
@ -649,4 +671,11 @@ void FtpNegotiationCommand::poolConnection() const
|
|||
}
|
||||
}
|
||||
|
||||
void FtpNegotiationCommand::onDryRunFileFound()
|
||||
{
|
||||
_requestGroup->getPieceStorage()->markAllPiecesDone();
|
||||
poolConnection();
|
||||
sequence = SEQ_HEAD_OK;
|
||||
}
|
||||
|
||||
} // namespace aria2
|
||||
|
|
|
@ -112,6 +112,8 @@ private:
|
|||
|
||||
bool onFileSizeDetermined(uint64_t totalLength);
|
||||
|
||||
void onDryRunFileFound();
|
||||
|
||||
SharedHandle<SocketCore> dataSocket;
|
||||
SharedHandle<SocketCore> serverSocket;
|
||||
Seq sequence;
|
||||
|
|
|
@ -216,6 +216,11 @@ bool HttpResponseCommand::shouldInflateContentEncoding
|
|||
bool HttpResponseCommand::handleDefaultEncoding(const HttpResponseHandle& httpResponse)
|
||||
{
|
||||
HttpRequestHandle httpRequest = httpResponse->getHttpRequest();
|
||||
_requestGroup->adjustFilename
|
||||
(SharedHandle<BtProgressInfoFile>(new DefaultBtProgressInfoFile
|
||||
(_requestGroup->getDownloadContext(),
|
||||
SharedHandle<PieceStorage>(),
|
||||
e->option)));
|
||||
_requestGroup->initPieceStorage();
|
||||
|
||||
if(e->option->getAsBool(PREF_DRY_RUN)) {
|
||||
|
@ -225,6 +230,12 @@ bool HttpResponseCommand::handleDefaultEncoding(const HttpResponseHandle& httpRe
|
|||
|
||||
BtProgressInfoFileHandle infoFile(new DefaultBtProgressInfoFile(_requestGroup->getDownloadContext(), _requestGroup->getPieceStorage(), e->option));
|
||||
if(!infoFile->exists() && _requestGroup->downloadFinishedByFileLength()) {
|
||||
_requestGroup->getPieceStorage()->markAllPiecesDone();
|
||||
|
||||
logger->notice(MSG_DOWNLOAD_ALREADY_COMPLETED,
|
||||
_requestGroup->getGID(),
|
||||
_requestGroup->getFilePath().c_str());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -308,16 +319,23 @@ bool HttpResponseCommand::handleOtherEncoding(const HttpResponseHandle& httpResp
|
|||
req->setMethod(Request::METHOD_GET);
|
||||
return prepareForRetry(0);
|
||||
}
|
||||
_requestGroup->initPieceStorage();
|
||||
|
||||
// For zero-length file, check existing file comparing its size
|
||||
if(_requestGroup->getDownloadContext()->knowsTotalLength() &&
|
||||
_requestGroup->downloadFinishedByFileLength()) {
|
||||
if(_requestGroup->downloadFinishedByFileLength()) {
|
||||
_requestGroup->initPieceStorage();
|
||||
_requestGroup->getPieceStorage()->markAllPiecesDone();
|
||||
|
||||
logger->notice(MSG_DOWNLOAD_ALREADY_COMPLETED,
|
||||
_requestGroup->getGID(),
|
||||
_requestGroup->getFilePath().c_str());
|
||||
|
||||
poolConnection();
|
||||
return true;
|
||||
}
|
||||
|
||||
_requestGroup->shouldCancelDownloadForSafety();
|
||||
_requestGroup->initPieceStorage();
|
||||
|
||||
_requestGroup->getPieceStorage()->getDiskAdaptor()->initAndOpenFile();
|
||||
|
||||
// In this context, knowsTotalLength() is true only when the file is
|
||||
|
|
|
@ -363,10 +363,19 @@ void RequestGroup::createInitialCommand(std::deque<Command*>& commands,
|
|||
(StringFormat(EX_DUPLICATE_FILE_DOWNLOAD,
|
||||
getFilePath().c_str()).str());
|
||||
}
|
||||
adjustFilename
|
||||
(SharedHandle<BtProgressInfoFile>(new DefaultBtProgressInfoFile
|
||||
(_downloadContext,
|
||||
SharedHandle<PieceStorage>(),
|
||||
_option)));
|
||||
initPieceStorage();
|
||||
BtProgressInfoFileHandle infoFile
|
||||
(new DefaultBtProgressInfoFile(_downloadContext, _pieceStorage, _option));
|
||||
if(infoFile->exists() || !downloadFinishedByFileLength()) {
|
||||
if(!infoFile->exists() && downloadFinishedByFileLength()) {
|
||||
_pieceStorage->markAllPiecesDone();
|
||||
_logger->notice(MSG_DOWNLOAD_ALREADY_COMPLETED,
|
||||
_gid, getFilePath().c_str());
|
||||
} else {
|
||||
loadAndOpenFile(infoFile);
|
||||
SharedHandle<CheckIntegrityEntry> checkIntegrityEntry
|
||||
(new StreamCheckIntegrityEntry(SharedHandle<Request>(), this));
|
||||
|
@ -436,17 +445,46 @@ bool RequestGroup::downloadFinishedByFileLength()
|
|||
!_downloadContext->getPieceHashes().empty())) {
|
||||
return false;
|
||||
}
|
||||
if(!_downloadContext->knowsTotalLength()) {
|
||||
return false;
|
||||
}
|
||||
// TODO consider the case when the getFilePath() returns dir path.
|
||||
File outfile(getFilePath());
|
||||
if(outfile.exists() && getTotalLength() == outfile.size()) {
|
||||
_pieceStorage->markAllPiecesDone();
|
||||
_logger->notice(MSG_DOWNLOAD_ALREADY_COMPLETED, _gid, getFilePath().c_str());
|
||||
if(outfile.exists() && _downloadContext->getTotalLength() == outfile.size()) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void RequestGroup::adjustFilename
|
||||
(const SharedHandle<BtProgressInfoFile>& infoFile)
|
||||
{
|
||||
if(!isPreLocalFileCheckEnabled()) {
|
||||
// OK, no need to care about filename.
|
||||
} else if(infoFile->exists()) {
|
||||
// Use current filename
|
||||
} else if(downloadFinishedByFileLength()) {
|
||||
// File was downloaded already, no need to change file name.
|
||||
} else {
|
||||
File outfile(getFilePath());
|
||||
if(outfile.exists() && _option->getAsBool(PREF_CONTINUE) &&
|
||||
outfile.size() <= _downloadContext->getTotalLength()) {
|
||||
// File exists but user decided to resume it.
|
||||
} else {
|
||||
#ifdef ENABLE_MESSAGE_DIGEST
|
||||
if(outfile.exists() && _option->getAsBool(PREF_CHECK_INTEGRITY)) {
|
||||
// check-integrity existing file
|
||||
} else {
|
||||
#endif // ENABLE_MESSAGE_DIGEST
|
||||
shouldCancelDownloadForSafety();
|
||||
#ifdef ENABLE_MESSAGE_DIGEST
|
||||
}
|
||||
#endif // ENABLE_MESSAGE_DIGEST
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RequestGroup::loadAndOpenFile(const BtProgressInfoFileHandle& progressInfoFile)
|
||||
{
|
||||
try {
|
||||
|
@ -461,41 +499,29 @@ void RequestGroup::loadAndOpenFile(const BtProgressInfoFileHandle& progressInfoF
|
|||
progressInfoFile->getFilename().c_str(),
|
||||
getFilePath().c_str());
|
||||
}
|
||||
while(1) {
|
||||
if(progressInfoFile->exists()) {
|
||||
progressInfoFile->load();
|
||||
|
||||
if(progressInfoFile->exists()) {
|
||||
progressInfoFile->load();
|
||||
_pieceStorage->getDiskAdaptor()->openExistingFile();
|
||||
} else {
|
||||
File outfile(getFilePath());
|
||||
if(outfile.exists() && _option->getAsBool(PREF_CONTINUE) &&
|
||||
outfile.size() <= getTotalLength()) {
|
||||
_pieceStorage->getDiskAdaptor()->openExistingFile();
|
||||
_pieceStorage->markPiecesDone(outfile.size());
|
||||
} else {
|
||||
File outfile(getFilePath());
|
||||
if(outfile.exists() && _option->getAsBool(PREF_CONTINUE) &&
|
||||
outfile.size() <= getTotalLength()) {
|
||||
#ifdef ENABLE_MESSAGE_DIGEST
|
||||
if(outfile.exists() && _option->getAsBool(PREF_CHECK_INTEGRITY)) {
|
||||
_pieceStorage->getDiskAdaptor()->openExistingFile();
|
||||
_pieceStorage->markPiecesDone(outfile.size());
|
||||
} else {
|
||||
#ifdef ENABLE_MESSAGE_DIGEST
|
||||
if(outfile.exists() && _option->getAsBool(PREF_CHECK_INTEGRITY)) {
|
||||
_pieceStorage->getDiskAdaptor()->openExistingFile();
|
||||
} else {
|
||||
#endif // ENABLE_MESSAGE_DIGEST
|
||||
shouldCancelDownloadForSafety();
|
||||
// call updateFilename here in case when filename is renamed
|
||||
// by tryAutoFileRenaming()
|
||||
progressInfoFile->updateFilename();
|
||||
if(progressInfoFile->exists()) {
|
||||
// Close DiskAdaptor here. Renmaed file will be opened in the
|
||||
// next loop .
|
||||
_pieceStorage->getDiskAdaptor()->closeFile();
|
||||
continue;
|
||||
}
|
||||
_pieceStorage->getDiskAdaptor()->initAndOpenFile();
|
||||
_pieceStorage->getDiskAdaptor()->initAndOpenFile();
|
||||
#ifdef ENABLE_MESSAGE_DIGEST
|
||||
}
|
||||
#endif // ENABLE_MESSAGE_DIGEST
|
||||
}
|
||||
#endif // ENABLE_MESSAGE_DIGEST
|
||||
}
|
||||
setProgressInfoFile(progressInfoFile);
|
||||
break;
|
||||
}
|
||||
setProgressInfoFile(progressInfoFile);
|
||||
} catch(RecoverableException& e) {
|
||||
throw DownloadFailureException
|
||||
(StringFormat(EX_DOWNLOAD_ABORTED).str(), e);
|
||||
|
|
|
@ -371,6 +371,8 @@ public:
|
|||
|
||||
void shouldCancelDownloadForSafety();
|
||||
|
||||
void adjustFilename(const SharedHandle<BtProgressInfoFile>& infoFile);
|
||||
|
||||
SharedHandle<DownloadResult> createDownloadResult() const;
|
||||
|
||||
const Option* getOption() const
|
||||
|
|
Loading…
Reference in New Issue