Index: src/ch/MainWnd.cpp =================================================================== diff -u -r22bbc4a87fa0b249e1e02ba385f28da9d77a4aa1 -r4a3c74a38b00e7793d1e61107a824060e6c2ea95 --- src/ch/MainWnd.cpp (.../MainWnd.cpp) (revision 22bbc4a87fa0b249e1e02ba385f28da9d77a4aa1) +++ src/ch/MainWnd.cpp (.../MainWnd.cpp) (revision 4a3c74a38b00e7793d1e61107a824060e6c2ea95) @@ -649,7 +649,7 @@ { case WM_MINIVIEWDBLCLK: { - CTaskPtr spTask = m_tasks.GetTaskBySessionUniqueID(lParam); + CTaskPtr spTask = m_tasks.GetTaskBySessionUniqueID(lParam); ShowStatusWindow(spTask); break; } Index: src/ch/MiniViewDlg.cpp =================================================================== diff -u -r22573f5fa8bfbf68a19deb7631962e026f028045 -r4a3c74a38b00e7793d1e61107a824060e6c2ea95 --- src/ch/MiniViewDlg.cpp (.../MiniViewDlg.cpp) (revision 22573f5fa8bfbf68a19deb7631962e026f028045) +++ src/ch/MiniViewDlg.cpp (.../MiniViewDlg.cpp) (revision 4a3c74a38b00e7793d1e61107a824060e6c2ea95) @@ -805,9 +805,11 @@ if(iSel == LB_ERR || (size_t)iSel >= m_ctlStatus.m_vItems.size()) return; - CTaskPtr spTask = m_ctlStatus.m_vItems.at(iSel)->m_spTask; - - GetParent()->PostMessage(WM_MINIVIEWDBLCLK, 0, (LPARAM)spTask->GetSessionUniqueID()); + CTaskPtr spTask = m_ctlStatus.m_vItems.at(iSel)->m_spTask; + if(spTask) + GetParent()->PostMessage(WM_MINIVIEWDBLCLK, 0, (LPARAM)spTask->GetSessionUniqueID()); + else + GetParent()->PostMessage(WM_MINIVIEWDBLCLK, 0, (LPARAM)NO_TASK_SESSION_UNIQUE_ID); } void CMiniViewDlg::OnLanguageChanged() Index: src/ch/task.cpp =================================================================== diff -u -r22573f5fa8bfbf68a19deb7631962e026f028045 -r4a3c74a38b00e7793d1e61107a824060e6c2ea95 --- src/ch/task.cpp (.../task.cpp) (revision 22573f5fa8bfbf68a19deb7631962e026f028045) +++ src/ch/task.cpp (.../task.cpp) (revision 4a3c74a38b00e7793d1e61107a824060e6c2ea95) @@ -1373,30 +1373,33 @@ bool bIgnoreDirs = (GetStatus(ST_SPECIAL_MASK) & ST_IGNORE_DIRS) != 0; bool bForceDirectories = (GetStatus(ST_SPECIAL_MASK) & ST_FORCE_DIRS) != 0; bool bMove = GetStatus(ST_OPERATION_MASK) == ST_MOVE; - CFileInfoPtr spFileInfo(boost::make_shared()); - spFileInfo->SetClipboard(GetClipboard()); // add everything ictranslate::CFormat fmt; bool bRetry = true; bool bSkipInputPath = false; - for(size_t i = 0; i < stSize ; i++) + for(size_t stIndex = 0; stIndex < stSize ; stIndex++) { + CFileInfoPtr spFileInfo; + bSkipInputPath = false; bRetry = false; // try to get some info about the input path; let user know if the path does not exist. do { // read attributes of src file/folder - bool bExists = spFileInfo->Create(GetClipboardData(i)->GetPath(), i); + spFileInfo.reset(new CFileInfo()); + spFileInfo->SetClipboard(GetClipboard()); + + bool bExists = spFileInfo->Create(GetClipboardData(stIndex)->GetPath(), stIndex); if(!bExists) { chcore::IFeedbackHandler* piFeedbackHandler = GetFeedbackHandler(); BOOST_ASSERT(piFeedbackHandler); - CString strSrcFile = GetClipboardData(i)->GetPath(); + CString strSrcFile = GetClipboardData(stIndex)->GetPath(); FEEDBACK_FILEERROR ferr = { (PCTSTR)strSrcFile, NULL, eFastMoveError, ERROR_FILE_NOT_FOUND }; CFeedbackHandler::EFeedbackResult frResult = (CFeedbackHandler::EFeedbackResult)piFeedbackHandler->RequestFeedback(CFeedbackHandler::eFT_FileError, &ferr); switch(frResult) @@ -1429,21 +1432,21 @@ // log fmt.SetFormat(_T("Adding file/folder (clipboard) : %path ...")); - fmt.SetParam(_t("%path"), GetClipboardData(i)->GetPath()); + fmt.SetParam(_t("%path"), GetClipboardData(stIndex)->GetPath()); m_log.logi(fmt); // found file/folder - check if the dest name has been generated - if(GetClipboardData(i)->GetDestinationPathsCount() == 0) + if(GetClipboardData(stIndex)->GetDestinationPathsCount() == 0) { // generate something - if dest folder == src folder - search for copy if(GetDestPath().GetPath() == spFileInfo->GetFileRoot()) { CString strSubst; FindFreeSubstituteName(spFileInfo->GetFullFilePath(), GetDestPath().GetPath(), &strSubst); - GetClipboardData(i)->AddDestinationPath(strSubst); + GetClipboardData(stIndex)->AddDestinationPath(strSubst); } else - GetClipboardData(i)->AddDestinationPath(spFileInfo->GetFileName()); + GetClipboardData(stIndex)->AddDestinationPath(spFileInfo->GetFileName()); } // add if needed @@ -1470,9 +1473,9 @@ m_log.logi(fmt); // no movefile possibility - use CustomCopyFile - GetClipboardData(i)->SetMove(false); + GetClipboardData(stIndex)->SetMove(false); - FilesAddDir(spFileInfo->GetFullFilePath(), i, true, !bIgnoreDirs || bForceDirectories); + FilesAddDir(spFileInfo->GetFullFilePath(), stIndex, true, !bIgnoreDirs || bForceDirectories); } // check for kill need @@ -1493,7 +1496,7 @@ spFileInfo->SetLength64(0); } else - GetClipboardData(i)->SetMove(false); // no MoveFile + GetClipboardData(stIndex)->SetMove(false); // no MoveFile FilesAdd(spFileInfo); // file - add @@ -2527,7 +2530,7 @@ // CTaskArray members CTaskArray::CTaskArray() : m_piFeedbackFactory(NULL), - m_stNextSessionUniqueID(0) + m_stNextSessionUniqueID(NO_TASK_SESSION_UNIQUE_ID + 1) { } @@ -2552,8 +2555,14 @@ chcore::IFeedbackHandler* piHandler = m_piFeedbackFactory->Create(); if(!piHandler) return CTaskPtr(); - - CTaskPtr spTask(new CTask(piHandler, m_stNextSessionUniqueID++)); + + BOOST_ASSERT(m_stNextSessionUniqueID != NO_TASK_SESSION_UNIQUE_ID); + CTaskPtr spTask(boost::make_shared(piHandler, m_stNextSessionUniqueID++)); + + // NO_TASK_SESSION_UNIQUE_ID is a special value so it should not be used to identify tasks + if(m_stNextSessionUniqueID == NO_TASK_SESSION_UNIQUE_ID) + ++m_stNextSessionUniqueID; + return spTask; } @@ -2576,8 +2585,11 @@ CTaskPtr CTaskArray::GetTaskBySessionUniqueID(size_t stSessionUniqueID) const { + if(stSessionUniqueID == NO_TASK_SESSION_UNIQUE_ID) + return CTaskPtr(); + CTaskPtr spFoundTask; - + boost::shared_lock lock(m_lock); BOOST_FOREACH(const CTaskPtr& spTask, m_vTasks) { Index: src/ch/task.h =================================================================== diff -u -r22573f5fa8bfbf68a19deb7631962e026f028045 -r4a3c74a38b00e7793d1e61107a824060e6c2ea95 --- src/ch/task.h (.../task.h) (revision 22573f5fa8bfbf68a19deb7631962e026f028045) +++ src/ch/task.h (.../task.h) (revision 4a3c74a38b00e7793d1e61107a824060e6c2ea95) @@ -69,6 +69,9 @@ #define E_CANCEL 0x02 #define E_PAUSE 0x03 +// special value representing no task +#define NO_TASK_SESSION_UNIQUE_ID 0 + // structure for getting status of a task struct TASK_DISPLAY_DATA {