Index: src/libchcore/TFilesystemFeedbackWrapper.cpp =================================================================== diff -u -N -r4d1f8110906889d56552771fb58a6de86bc54a29 -r89f857792bba8752de98ddd477949e45cef5ba5a --- src/libchcore/TFilesystemFeedbackWrapper.cpp (.../TFilesystemFeedbackWrapper.cpp) (revision 4d1f8110906889d56552771fb58a6de86bc54a29) +++ src/libchcore/TFilesystemFeedbackWrapper.cpp (.../TFilesystemFeedbackWrapper.cpp) (revision 89f857792bba8752de98ddd477949e45cef5ba5a) @@ -21,13 +21,15 @@ #include #include "TFileException.h" #include "TFileInfo.h" +#include "TWorkerThreadController.h" namespace chcore { - TFilesystemFeedbackWrapper::TFilesystemFeedbackWrapper(const IFeedbackHandlerPtr& spFeedbackHandler, const IFilesystemPtr& spFilesystem, icpf::log_file& rLog) : + TFilesystemFeedbackWrapper::TFilesystemFeedbackWrapper(const IFeedbackHandlerPtr& spFeedbackHandler, const IFilesystemPtr& spFilesystem, icpf::log_file& rLog, TWorkerThreadController& rThreadController) : m_spFeedbackHandler(spFeedbackHandler), m_spFilesystem(spFilesystem), - m_rLog(rLog) + m_rLog(rLog), + m_rThreadController(rThreadController) { if (!spFilesystem) THROW_CORE_EXCEPTION_MSG(eErr_InvalidArgument, L"Filesystem not provided"); @@ -75,21 +77,32 @@ return TSubTaskBase::eSubResult_PauseRequest; case EFeedbackResult::eResult_Skip: - break; // just do nothing + return TSubTaskBase::eSubResult_Continue; default: BOOST_ASSERT(FALSE); // unknown result THROW_CORE_EXCEPTION(eErr_UnhandledCase); } + + if(WasKillRequested(frResult)) + return TSubTaskBase::eSubResult_KillRequest; } while (bRetry); return TSubTaskBase::eSubResult_Continue; } + bool TFilesystemFeedbackWrapper::WasKillRequested(const TFeedbackResult& rFeedbackResult) const + { + if(m_rThreadController.KillRequested(rFeedbackResult.IsAutomatedReply() ? m_spFeedbackHandler->GetRetryInterval() : 0)) + return true; + return false; + } + TSubTaskBase::ESubOperationResult TFilesystemFeedbackWrapper::CheckForFreeSpaceFB(const TSmartPath& pathFirstSrc, const TSmartPath& pathDestination, unsigned long long ullNeededSize) { unsigned long long ullAvailableSize = 0; + TFeedbackResult frResult(eResult_Unknown, false); bool bRetry = false; do @@ -119,15 +132,15 @@ strFormat.Replace(_T("%path"), pathDestination.ToString()); m_rLog.loge(strFormat.c_str()); - TFeedbackResult frResult = m_spFeedbackHandler->FileError(pathDestination.ToWString(), TString(), EFileError::eCheckForFreeSpace, dwLastError); + frResult = m_spFeedbackHandler->FileError(pathDestination.ToWString(), TString(), EFileError::eCheckForFreeSpace, dwLastError); switch (frResult.GetResult()) { case EFeedbackResult::eResult_Cancel: return TSubTaskBase::eSubResult_CancelRequest; case EFeedbackResult::eResult_Retry: bRetry = true; - continue; + break; case EFeedbackResult::eResult_Pause: return TSubTaskBase::eSubResult_PauseRequest; @@ -141,14 +154,14 @@ } } - if (ullNeededSize > ullAvailableSize) + if (!bRetry && ullNeededSize > ullAvailableSize) { TString strFormat = _T("Not enough free space on disk - needed %needsize bytes for data, available: %availablesize bytes."); strFormat.Replace(_t("%needsize"), boost::lexical_cast(ullNeededSize).c_str()); strFormat.Replace(_t("%availablesize"), boost::lexical_cast(ullAvailableSize).c_str()); m_rLog.logw(strFormat.c_str()); - TFeedbackResult frResult = m_spFeedbackHandler->NotEnoughSpace(pathFirstSrc.ToWString(), pathDestination.ToWString(), ullNeededSize); + frResult = m_spFeedbackHandler->NotEnoughSpace(pathFirstSrc.ToWString(), pathDestination.ToWString(), ullNeededSize); switch (frResult.GetResult()) { case EFeedbackResult::eResult_Cancel: @@ -169,8 +182,12 @@ THROW_CORE_EXCEPTION(eErr_UnhandledCase); } } - } while (bRetry); + if(bRetry && WasKillRequested(frResult)) + return TSubTaskBase::eSubResult_KillRequest; + } + while (bRetry); + return TSubTaskBase::eSubResult_Continue; } @@ -221,20 +238,24 @@ case EFeedbackResult::eResult_Retry: bRetry = true; - continue; // no fcIndex bump, since we are trying again + break; // no fcIndex bump, since we are trying again case EFeedbackResult::eResult_Pause: return TSubTaskBase::eSubResult_PauseRequest; case EFeedbackResult::eResult_Skip: - break; // just do nothing + TSubTaskBase::eSubResult_Continue; // just do nothing default: BOOST_ASSERT(FALSE); // unknown result THROW_CORE_EXCEPTION(eErr_UnhandledCase); } - } while (bRetry); + if(WasKillRequested(frResult)) + return TSubTaskBase::eSubResult_KillRequest; + } + while (bRetry); + return TSubTaskBase::eSubResult_Continue; } @@ -285,20 +306,24 @@ case EFeedbackResult::eResult_Retry: bRetry = true; - continue; // no fcIndex bump, since we are trying again + break; case EFeedbackResult::eResult_Pause: return TSubTaskBase::eSubResult_PauseRequest; case EFeedbackResult::eResult_Skip: - break; // just do nothing + return TSubTaskBase::eSubResult_Continue; // just do nothing default: BOOST_ASSERT(FALSE); // unknown result THROW_CORE_EXCEPTION(eErr_UnhandledCase); } - } while (bRetry); + if(WasKillRequested(frResult)) + return TSubTaskBase::eSubResult_KillRequest; + } + while(bRetry); + return TSubTaskBase::eSubResult_Continue; } @@ -327,41 +352,43 @@ if (dwLastError == ERROR_ACCESS_DENIED || dwLastError == ERROR_ALREADY_EXISTS || dwLastError == ERROR_NOT_SAME_DEVICE) { bSkip = true; - break; + return TSubTaskBase::eSubResult_Continue; } - else - { - //log - TString strFormat = _T("Error %errno while calling fast move %srcpath -> %dstpath (TSubTaskFastMove)"); - strFormat.Replace(_T("%errno"), boost::lexical_cast(dwLastError).c_str()); - strFormat.Replace(_T("%srcpath"), spFileInfo->GetFullFilePath().ToString()); - strFormat.Replace(_T("%dstpath"), pathDestination.ToString()); - m_rLog.loge(strFormat.c_str()); - TFeedbackResult frResult = m_spFeedbackHandler->FileError(pathSrc.ToWString(), pathDestination.ToWString(), EFileError::eFastMoveError, dwLastError); - switch (frResult.GetResult()) - { - case EFeedbackResult::eResult_Cancel: - return TSubTaskBase::eSubResult_CancelRequest; + //log + TString strFormat = _T("Error %errno while calling fast move %srcpath -> %dstpath (TSubTaskFastMove)"); + strFormat.Replace(_T("%errno"), boost::lexical_cast(dwLastError).c_str()); + strFormat.Replace(_T("%srcpath"), spFileInfo->GetFullFilePath().ToString()); + strFormat.Replace(_T("%dstpath"), pathDestination.ToString()); + m_rLog.loge(strFormat.c_str()); - case EFeedbackResult::eResult_Retry: - bRetry = true; - break; + TFeedbackResult frResult = m_spFeedbackHandler->FileError(pathSrc.ToWString(), pathDestination.ToWString(), EFileError::eFastMoveError, dwLastError); + switch (frResult.GetResult()) + { + case EFeedbackResult::eResult_Cancel: + return TSubTaskBase::eSubResult_CancelRequest; - case EFeedbackResult::eResult_Pause: - return TSubTaskBase::eSubResult_PauseRequest; + case EFeedbackResult::eResult_Retry: + bRetry = true; + break; - case EFeedbackResult::eResult_Skip: - bSkip = true; - break; // just do nothing + case EFeedbackResult::eResult_Pause: + return TSubTaskBase::eSubResult_PauseRequest; - default: - BOOST_ASSERT(FALSE); // unknown result - THROW_CORE_EXCEPTION(eErr_UnhandledCase); - } + case EFeedbackResult::eResult_Skip: + bSkip = true; + return TSubTaskBase::eSubResult_Continue; + + default: + BOOST_ASSERT(FALSE); // unknown result + THROW_CORE_EXCEPTION(eErr_UnhandledCase); } - } while (bRetry); + if(WasKillRequested(frResult)) + return TSubTaskBase::eSubResult_KillRequest; + } + while (bRetry); + return TSubTaskBase::eSubResult_Continue; } @@ -399,15 +426,18 @@ case EFeedbackResult::eResult_Skip: bSkip = true; - break; // just do nothing + return TSubTaskBase::eSubResult_Continue; default: BOOST_ASSERT(FALSE); // unknown result THROW_CORE_EXCEPTION(eErr_UnhandledCase); } - } while (bRetry); + if(WasKillRequested(frResult)) + return TSubTaskBase::eSubResult_KillRequest; + } + while(bRetry); + return TSubTaskBase::eSubResult_Continue; } - }