Index: src/libchcore/TSubTaskCopyMove.cpp
===================================================================
diff -u -N -rc66b22f786f8434075a09e92de52bba8a53a85db -r671f4b1792a20d98b186f4e0a9cc6a620dede019
--- src/libchcore/TSubTaskCopyMove.cpp	(.../TSubTaskCopyMove.cpp)	(revision c66b22f786f8434075a09e92de52bba8a53a85db)
+++ src/libchcore/TSubTaskCopyMove.cpp	(.../TSubTaskCopyMove.cpp)	(revision 671f4b1792a20d98b186f4e0a9cc6a620dede019)
@@ -671,15 +671,13 @@
 		{
 			DWORD dwLastError = GetLastError();
 
-			FEEDBACK_FILEERROR feedStruct = { spPathToOpen.ToString(), NULL, eCreateError, dwLastError };
-			IFeedbackHandler::EFeedbackResult frResult = (IFeedbackHandler::EFeedbackResult)spFeedbackHandler->RequestFeedback(IFeedbackHandler::eFT_FileError, &feedStruct);
-
+			EFeedbackResult frResult = spFeedbackHandler->FileError(spPathToOpen.ToWString(), TString(), EFileError::eCreateError, dwLastError);
 			switch(frResult)
 			{
-			case IFeedbackHandler::eResult_Skip:
+			case EFeedbackResult::eResult_Skip:
 				break;	// will return INVALID_HANDLE_VALUE
 
-			case IFeedbackHandler::eResult_Cancel:
+			case EFeedbackResult::eResult_Cancel:
 				{
 					// log
 					TString strFormat = _T("Cancel request [error %errno] while opening source file %path (OpenSourceFileFB)");
@@ -690,10 +688,10 @@
 					return TSubTaskBase::eSubResult_CancelRequest;
 				}
 
-			case IFeedbackHandler::eResult_Pause:
+			case EFeedbackResult::eResult_Pause:
 				return TSubTaskBase::eSubResult_PauseRequest;
 
-			case IFeedbackHandler::eResult_Retry:
+			case EFeedbackResult::eResult_Retry:
 				{
 					// log
 					TString strFormat = _T("Retrying [error %errno] to open source file %path (OpenSourceFileFB)");
@@ -754,23 +752,21 @@
 					THROW_CORE_EXCEPTION_WIN32(eErr_CannotGetFileInfo, GetLastError());
 
 				// src and dst files are the same
-				FEEDBACK_ALREADYEXISTS feedStruct = { spSrcFileInfo, spDstFileInfo };
-				IFeedbackHandler::EFeedbackResult frResult = (IFeedbackHandler::EFeedbackResult)spFeedbackHandler->RequestFeedback(IFeedbackHandler::eFT_FileAlreadyExists, &feedStruct);
-				// check for dialog result
+				EFeedbackResult frResult = spFeedbackHandler->FileAlreadyExists(spSrcFileInfo, spDstFileInfo);
 				switch(frResult)
 				{
-				case IFeedbackHandler::eResult_Overwrite:
+				case EFeedbackResult::eResult_Overwrite:
 					ullSeekTo = 0;
 					break;
 
-				case IFeedbackHandler::eResult_CopyRest:
+				case EFeedbackResult::eResult_CopyRest:
 					ullSeekTo = spDstFileInfo->GetLength64();
 					break;
 
-				case IFeedbackHandler::eResult_Skip:
+				case EFeedbackResult::eResult_Skip:
 					return TSubTaskBase::eSubResult_Continue;
 
-				case IFeedbackHandler::eResult_Cancel:
+				case EFeedbackResult::eResult_Cancel:
 					{
 						// log
 						TString strFormat = _T("Cancel request while checking result of dialog before opening source file %path (CustomCopyFileFB)");
@@ -779,7 +775,7 @@
 
 						return TSubTaskBase::eSubResult_CancelRequest;
 					}
-				case IFeedbackHandler::eResult_Pause:
+				case EFeedbackResult::eResult_Pause:
 					return TSubTaskBase::eSubResult_PauseRequest;
 
 				default:
@@ -789,11 +785,10 @@
 			}
 			else
 			{
-				FEEDBACK_FILEERROR feedStruct = { pathDstFile.ToString(), NULL, eCreateError, dwLastError };
-				IFeedbackHandler::EFeedbackResult frResult = (IFeedbackHandler::EFeedbackResult)spFeedbackHandler->RequestFeedback(IFeedbackHandler::eFT_FileError, &feedStruct);
+				EFeedbackResult frResult = spFeedbackHandler->FileError(pathDstFile.ToWString(), TString(), EFileError::eCreateError, dwLastError);
 				switch(frResult)
 				{
-				case IFeedbackHandler::eResult_Retry:
+				case EFeedbackResult::eResult_Retry:
 					{
 						// log
 						TString strFormat = _T("Retrying [error %errno] to open destination file %path (CustomCopyFileFB)");
@@ -805,7 +800,7 @@
 
 						break;
 					}
-				case IFeedbackHandler::eResult_Cancel:
+				case EFeedbackResult::eResult_Cancel:
 					{
 						// log
 						TString strFormat = _T("Cancel request [error %errno] while opening destination file %path (CustomCopyFileFB)");
@@ -816,10 +811,10 @@
 						return TSubTaskBase::eSubResult_CancelRequest;
 					}
 
-				case IFeedbackHandler::eResult_Skip:
+				case EFeedbackResult::eResult_Skip:
 					break;		// will return invalid handle value
 
-				case IFeedbackHandler::eResult_Pause:
+				case EFeedbackResult::eResult_Pause:
 					return TSubTaskBase::eSubResult_PauseRequest;
 
 				default:
@@ -849,11 +844,11 @@
 		if(!fileDst.OpenExistingForWriting(pathDstFile, bNoBuffering))
 		{
 			DWORD dwLastError = GetLastError();
-			FEEDBACK_FILEERROR feedStruct = { pathDstFile.ToString(), NULL, eCreateError, dwLastError };
-			IFeedbackHandler::EFeedbackResult frResult = (IFeedbackHandler::EFeedbackResult)spFeedbackHandler->RequestFeedback(IFeedbackHandler::eFT_FileError, &feedStruct);
+
+			EFeedbackResult frResult = spFeedbackHandler->FileError(pathDstFile.ToWString(), TString(), EFileError::eCreateError, dwLastError);
 			switch (frResult)
 			{
-			case IFeedbackHandler::eResult_Retry:
+			case EFeedbackResult::eResult_Retry:
 				{
 					// log
 					TString strFormat = _T("Retrying [error %errno] to open destination file %path (CustomCopyFileFB)");
@@ -865,7 +860,7 @@
 
 					break;
 				}
-			case IFeedbackHandler::eResult_Cancel:
+			case EFeedbackResult::eResult_Cancel:
 				{
 					// log
 					TString strFormat = _T("Cancel request [error %errno] while opening destination file %path (CustomCopyFileFB)");
@@ -876,10 +871,10 @@
 					return TSubTaskBase::eSubResult_CancelRequest;
 				}
 
-			case IFeedbackHandler::eResult_Skip:
+			case EFeedbackResult::eResult_Skip:
 				break;		// will return invalid handle value
 
-			case IFeedbackHandler::eResult_Pause:
+			case EFeedbackResult::eResult_Pause:
 				return TSubTaskBase::eSubResult_PauseRequest;
 
 			default:
@@ -914,21 +909,20 @@
 			strFormat.Replace(_t("%pos"), boost::lexical_cast<std::wstring>(llDistance).c_str());
 			rLog.loge(strFormat.c_str());
 
-			FEEDBACK_FILEERROR ferr = { pathFile.ToString(), NULL, eSeekError, dwLastError };
-			IFeedbackHandler::EFeedbackResult frResult = (IFeedbackHandler::EFeedbackResult)spFeedbackHandler->RequestFeedback(IFeedbackHandler::eFT_FileError, &ferr);
+			EFeedbackResult frResult = spFeedbackHandler->FileError(pathFile.ToWString(), TString(), EFileError::eSeekError, dwLastError);
 			switch(frResult)
 			{
-			case IFeedbackHandler::eResult_Cancel:
+			case EFeedbackResult::eResult_Cancel:
 				return TSubTaskBase::eSubResult_CancelRequest;
 
-			case IFeedbackHandler::eResult_Retry:
+			case EFeedbackResult::eResult_Retry:
 				bRetry = true;
 				break;
 
-			case IFeedbackHandler::eResult_Pause:
+			case EFeedbackResult::eResult_Pause:
 				return TSubTaskBase::eSubResult_PauseRequest;
 
-			case IFeedbackHandler::eResult_Skip:
+			case EFeedbackResult::eResult_Skip:
 				bSkip = true;
 				return TSubTaskBase::eSubResult_Continue;
 
@@ -962,20 +956,19 @@
 			strFormat.Replace(_t("%path"), pathFile.ToString());
 			rLog.loge(strFormat.c_str());
 
-			FEEDBACK_FILEERROR ferr = { pathFile.ToString(), NULL, eResizeError, dwLastError };
-			IFeedbackHandler::EFeedbackResult frResult = (IFeedbackHandler::EFeedbackResult)spFeedbackHandler->RequestFeedback(IFeedbackHandler::eFT_FileError, &ferr);
+			EFeedbackResult frResult = spFeedbackHandler->FileError(pathFile.ToWString(), TString(), EFileError::eResizeError, dwLastError);
 			switch(frResult)
 			{
-			case IFeedbackHandler::eResult_Cancel:
+			case EFeedbackResult::eResult_Cancel:
 				return TSubTaskBase::eSubResult_CancelRequest;
 
-			case IFeedbackHandler::eResult_Retry:
+			case EFeedbackResult::eResult_Retry:
 				bRetry = true;
 
-			case IFeedbackHandler::eResult_Pause:
+			case EFeedbackResult::eResult_Pause:
 				return TSubTaskBase::eSubResult_PauseRequest;
 
-			case IFeedbackHandler::eResult_Skip:
+			case EFeedbackResult::eResult_Skip:
 				bSkip = true;
 				return TSubTaskBase::eSubResult_Continue;
 
@@ -1011,21 +1004,20 @@
 			strFormat.Replace(_t("%path"), pathFile.ToString());
 			rLog.loge(strFormat.c_str());
 
-			FEEDBACK_FILEERROR ferr = { pathFile.ToString(), NULL, eReadError, dwLastError };
-			IFeedbackHandler::EFeedbackResult frResult = (IFeedbackHandler::EFeedbackResult)spFeedbackHandler->RequestFeedback(IFeedbackHandler::eFT_FileError, &ferr);
+			EFeedbackResult frResult = spFeedbackHandler->FileError(pathFile.ToWString(), TString(), EFileError::eReadError, dwLastError);
 			switch(frResult)
 			{
-			case IFeedbackHandler::eResult_Cancel:
+			case EFeedbackResult::eResult_Cancel:
 				return TSubTaskBase::eSubResult_CancelRequest;
 
-			case IFeedbackHandler::eResult_Retry:
+			case EFeedbackResult::eResult_Retry:
 				bRetry = true;
 				break;
 
-			case IFeedbackHandler::eResult_Pause:
+			case EFeedbackResult::eResult_Pause:
 				return TSubTaskBase::eSubResult_PauseRequest;
 
-			case IFeedbackHandler::eResult_Skip:
+			case EFeedbackResult::eResult_Skip:
 				bSkip = true;
 				return TSubTaskBase::eSubResult_Continue;
 
@@ -1062,21 +1054,20 @@
 			strFormat.Replace(_t("%path"), pathFile.ToString());
 			rLog.loge(strFormat.c_str());
 
-			FEEDBACK_FILEERROR ferr = { pathFile.ToString(), NULL, eWriteError, dwLastError };
-			IFeedbackHandler::EFeedbackResult frResult = (IFeedbackHandler::EFeedbackResult)spFeedbackHandler->RequestFeedback(IFeedbackHandler::eFT_FileError, &ferr);
+			EFeedbackResult frResult = spFeedbackHandler->FileError(pathFile.ToWString(), TString(), EFileError::eWriteError, dwLastError);
 			switch(frResult)
 			{
-			case IFeedbackHandler::eResult_Cancel:
+			case EFeedbackResult::eResult_Cancel:
 				return TSubTaskBase::eSubResult_CancelRequest;
 
-			case IFeedbackHandler::eResult_Retry:
+			case EFeedbackResult::eResult_Retry:
 				bRetry = true;
 				break;
 
-			case IFeedbackHandler::eResult_Pause:
+			case EFeedbackResult::eResult_Pause:
 				return TSubTaskBase::eSubResult_PauseRequest;
 
-			case IFeedbackHandler::eResult_Skip:
+			case EFeedbackResult::eResult_Skip:
 				bSkip = true;
 				return TSubTaskBase::eSubResult_Continue;
 
@@ -1171,21 +1162,20 @@
 		strFormat.Replace(_T("%path"), pathDirectory.ToString());
 		rLog.loge(strFormat.c_str());
 
-		FEEDBACK_FILEERROR ferr = { pathDirectory.ToString(), NULL, eCreateError, dwLastError };
-		IFeedbackHandler::EFeedbackResult frResult = (IFeedbackHandler::EFeedbackResult)spFeedbackHandler->RequestFeedback(IFeedbackHandler::eFT_FileError, &ferr);
+		EFeedbackResult frResult = spFeedbackHandler->FileError(pathDirectory.ToWString(), TString(), EFileError::eCreateError, dwLastError);
 		switch(frResult)
 		{
-		case IFeedbackHandler::eResult_Cancel:
+		case EFeedbackResult::eResult_Cancel:
 			return TSubTaskBase::eSubResult_CancelRequest;
 
-		case IFeedbackHandler::eResult_Retry:
+		case EFeedbackResult::eResult_Retry:
 			bRetry = false;
 			break;
 
-		case IFeedbackHandler::eResult_Pause:
+		case EFeedbackResult::eResult_Pause:
 			return TSubTaskBase::eSubResult_PauseRequest;
 
-		case IFeedbackHandler::eResult_Skip:
+		case EFeedbackResult::eResult_Skip:
 			bRetry = false;
 			break;		// just do nothing
 
@@ -1228,22 +1218,19 @@
 
 			if(!spSrcPaths->IsEmpty())
 			{
-				FEEDBACK_NOTENOUGHSPACE feedStruct = { ullNeededSize, spSrcPaths->GetAt(0)->GetSrcPath().ToString(), pathDestination.ToString() };
-				IFeedbackHandler::EFeedbackResult frResult = (IFeedbackHandler::EFeedbackResult)spFeedbackHandler->RequestFeedback(IFeedbackHandler::eFT_NotEnoughSpace, &feedStruct);
-
-				// default
+				EFeedbackResult frResult = spFeedbackHandler->NotEnoughSpace(spSrcPaths->GetAt(0)->GetSrcPath().ToWString(), pathDestination.ToWString(), ullNeededSize);
 				switch(frResult)
 				{
-				case IFeedbackHandler::eResult_Cancel:
+				case EFeedbackResult::eResult_Cancel:
 					rLog.logi(_T("Cancel request while checking for free space on disk."));
 					return TSubTaskBase::eSubResult_CancelRequest;
 
-				case IFeedbackHandler::eResult_Retry:
+				case EFeedbackResult::eResult_Retry:
 					rLog.logi(_T("Retrying to read drive's free space..."));
 					bRetry = true;
 					break;
 
-				case IFeedbackHandler::eResult_Ignore:
+				case EFeedbackResult::eResult_Ignore:
 					rLog.logi(_T("Ignored warning about not enough place on disk to copy data."));
 					return TSubTaskBase::eSubResult_Continue;