Index: src/libchcore/TFilesystemFileFeedbackWrapper.cpp =================================================================== diff -u -N -r4d1f8110906889d56552771fb58a6de86bc54a29 -r89f857792bba8752de98ddd477949e45cef5ba5a --- src/libchcore/TFilesystemFileFeedbackWrapper.cpp (.../TFilesystemFileFeedbackWrapper.cpp) (revision 4d1f8110906889d56552771fb58a6de86bc54a29) +++ src/libchcore/TFilesystemFileFeedbackWrapper.cpp (.../TFilesystemFileFeedbackWrapper.cpp) (revision 89f857792bba8752de98ddd477949e45cef5ba5a) @@ -22,12 +22,14 @@ #include #include #include "TFileInfo.h" +#include "TWorkerThreadController.h" namespace chcore { - TFilesystemFileFeedbackWrapper::TFilesystemFileFeedbackWrapper(const IFeedbackHandlerPtr& spFeedbackHandler, icpf::log_file& rLog) : + TFilesystemFileFeedbackWrapper::TFilesystemFileFeedbackWrapper(const IFeedbackHandlerPtr& spFeedbackHandler, icpf::log_file& rLog, TWorkerThreadController& rThreadController) : m_spFeedbackHandler(spFeedbackHandler), - m_rLog(rLog) + m_rLog(rLog), + m_rThreadController(rThreadController) { } @@ -57,7 +59,7 @@ switch (frResult.GetResult()) { case EFeedbackResult::eResult_Skip: - break; // will return INVALID_HANDLE_VALUE + return TSubTaskBase::eSubResult_Continue; case EFeedbackResult::eResult_Cancel: { @@ -89,6 +91,9 @@ BOOST_ASSERT(FALSE); // unknown result THROW_CORE_EXCEPTION(eErr_UnhandledCase); } + + if(WasKillRequested(frResult)) + return TSubTaskBase::eSubResult_KillRequest; } while(bRetry); @@ -128,7 +133,6 @@ m_rLog.loge(strFormat.c_str()); bRetry = true; - break; } case EFeedbackResult::eResult_Cancel: @@ -143,7 +147,7 @@ } case EFeedbackResult::eResult_Skip: - break; // will return invalid handle value + return TSubTaskBase::eSubResult_Continue; case EFeedbackResult::eResult_Pause: return TSubTaskBase::eSubResult_PauseRequest; @@ -152,16 +156,23 @@ 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; } TSubTaskBase::ESubOperationResult TFilesystemFileFeedbackWrapper::OpenDestinationFileFB(const IFilesystemFilePtr& fileDst, const TFileInfoPtr& spSrcFileInfo, - unsigned long long& ullSeekTo, bool& bFreshlyCreated) + unsigned long long& ullSeekTo, + bool& bFreshlyCreated, + bool& bSkip) { bool bRetry = false; + bSkip = false; ullSeekTo = 0; bFreshlyCreated = true; @@ -191,7 +202,10 @@ if (eResult != TSubTaskBase::eSubResult_Continue) return eResult; else if (!fileDst->IsOpen()) + { + bSkip = true; return TSubTaskBase::eSubResult_Continue; + } // read info about the existing destination file, TFileInfoPtr spDstFileInfo(boost::make_shared()); @@ -203,13 +217,14 @@ { case EFeedbackResult::eResult_Overwrite: ullSeekTo = 0; - break; + return TSubTaskBase::eSubResult_Continue; case EFeedbackResult::eResult_CopyRest: ullSeekTo = spDstFileInfo->GetLength64(); - break; + return TSubTaskBase::eSubResult_Continue; case EFeedbackResult::eResult_Skip: + bSkip = true; return TSubTaskBase::eSubResult_Continue; case EFeedbackResult::eResult_Cancel: @@ -229,47 +244,50 @@ THROW_CORE_EXCEPTION(eErr_UnhandledCase); } } - else + + TFeedbackResult frResult = m_spFeedbackHandler->FileError(fileDst->GetFilePath().ToWString(), TString(), EFileError::eCreateError, dwLastError); + switch (frResult.GetResult()) { - TFeedbackResult frResult = m_spFeedbackHandler->FileError(fileDst->GetFilePath().ToWString(), TString(), EFileError::eCreateError, dwLastError); - switch (frResult.GetResult()) - { - case EFeedbackResult::eResult_Retry: - { - // log - TString strFormat = _T("Retrying [error %errno] to open destination file %path (CustomCopyFileFB)"); - strFormat.Replace(_T("%errno"), boost::lexical_cast(dwLastError).c_str()); - strFormat.Replace(_T("%path"), fileDst->GetFilePath().ToString()); - m_rLog.loge(strFormat.c_str()); + case EFeedbackResult::eResult_Retry: + { + // log + TString strFormat = _T("Retrying [error %errno] to open destination file %path (CustomCopyFileFB)"); + strFormat.Replace(_T("%errno"), boost::lexical_cast(dwLastError).c_str()); + strFormat.Replace(_T("%path"), fileDst->GetFilePath().ToString()); + m_rLog.loge(strFormat.c_str()); - bRetry = true; + bRetry = true; - break; - } - case EFeedbackResult::eResult_Cancel: - { - // log - TString strFormat = _T("Cancel request [error %errno] while opening destination file %path (CustomCopyFileFB)"); - strFormat.Replace(_T("%errno"), boost::lexical_cast(dwLastError).c_str()); - strFormat.Replace(_T("%path"), fileDst->GetFilePath().ToString()); - m_rLog.loge(strFormat.c_str()); + break; + } + case EFeedbackResult::eResult_Cancel: + { + // log + TString strFormat = _T("Cancel request [error %errno] while opening destination file %path (CustomCopyFileFB)"); + strFormat.Replace(_T("%errno"), boost::lexical_cast(dwLastError).c_str()); + strFormat.Replace(_T("%path"), fileDst->GetFilePath().ToString()); + m_rLog.loge(strFormat.c_str()); - return TSubTaskBase::eSubResult_CancelRequest; - } + return TSubTaskBase::eSubResult_CancelRequest; + } - case EFeedbackResult::eResult_Skip: - break; // will return invalid handle value + case EFeedbackResult::eResult_Skip: + bSkip = true; + return TSubTaskBase::eSubResult_Continue; - case EFeedbackResult::eResult_Pause: - return TSubTaskBase::eSubResult_PauseRequest; + case EFeedbackResult::eResult_Pause: + return TSubTaskBase::eSubResult_PauseRequest; - default: - BOOST_ASSERT(FALSE); // unknown result - THROW_CORE_EXCEPTION(eErr_UnhandledCase); - } + 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; } @@ -318,8 +336,12 @@ 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; } @@ -370,8 +392,12 @@ 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; } @@ -423,8 +449,12 @@ 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; } @@ -475,8 +505,19 @@ 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; } + + bool TFilesystemFileFeedbackWrapper::WasKillRequested(const TFeedbackResult& rFeedbackResult) const + { + if(m_rThreadController.KillRequested(rFeedbackResult.IsAutomatedReply() ? m_spFeedbackHandler->GetRetryInterval() : 0)) + return true; + return false; + } }