summaryrefslogtreecommitdiff
path: root/FreeFileSync.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'FreeFileSync.cpp')
-rw-r--r--FreeFileSync.cpp426
1 files changed, 221 insertions, 205 deletions
diff --git a/FreeFileSync.cpp b/FreeFileSync.cpp
index 9781e102..a994aab8 100644
--- a/FreeFileSync.cpp
+++ b/FreeFileSync.cpp
@@ -4,9 +4,9 @@
#include "FreeFileSync.h"
#include "library/globalFunctions.h"
#include <wx/filename.h>
-#include <fstream>
#include "library/resources.h"
#include <sys/stat.h>
+#include <wx/ffile.h>
#ifdef FFS_WIN
#include <windows.h>
@@ -19,8 +19,8 @@
using namespace globalFunctions;
-const wxString FreeFileSync::FFS_ConfigFileID = "FFS_CONFIG";
-const wxString FreeFileSync::FFS_LastConfigFile = "LastRun.ffs";
+const string FreeFileSync::FfsConfigFileID = "FFS_CONFIG";
+const wxString FreeFileSync::FfsLastConfigFile = wxT("LastRun.ffs");
inline
wxString formatTime(unsigned int number)
@@ -41,7 +41,7 @@ wxString formatTime(unsigned int number)
{
wxString result;
if (result.Printf(wxT("%d"), number) < 0)
- throw std::runtime_error("Error when converting int to wxString");
+ throw RuntimeException(_("Error when converting int to wxString"));
return result;
}
}
@@ -56,7 +56,7 @@ void FreeFileSync::getFileInformation(FileInfo& output, const wxString& filename
HANDLE fileHandle;
if ((fileHandle = FindFirstFile(filename.c_str(), &winFileInfo)) == INVALID_HANDLE_VALUE)
- throw FileError(wxString(_("Could not retrieve file info for: ")) + "\"" + filename + "\"");
+ throw FileError(wxString(_("Could not retrieve file info for: ")) + wxT("\"") + filename + wxT("\""));
FindClose(fileHandle);
@@ -64,20 +64,19 @@ void FreeFileSync::getFileInformation(FileInfo& output, const wxString& filename
&winFileInfo.ftLastWriteTime, // pointer to UTC file time to convert
&localFileTime // pointer to converted file time
) == 0)
- throw std::runtime_error(_("Error converting FILETIME to local FILETIME"));
-
+ throw RuntimeException(_("Error converting FILETIME to local FILETIME"));
if (FileTimeToSystemTime(
&localFileTime, // pointer to file time to convert
&time // pointer to structure to receive system time
) == 0)
- throw std::runtime_error(_("Error converting FILETIME to SYSTEMTIME"));
+ throw RuntimeException(_("Error converting FILETIME to SYSTEMTIME"));
- output.lastWriteTime = numberToWxString(time.wYear) + "-" +
- formatTime(time.wMonth) + "-" +
- formatTime(time.wDay) + " " +
- formatTime(time.wHour) + ":" +
- formatTime(time.wMinute) + ":" +
+ output.lastWriteTime = numberToWxString(time.wYear) + wxT("-") +
+ formatTime(time.wMonth) + wxT("-") +
+ formatTime(time.wDay) + wxT(" ") +
+ formatTime(time.wHour) + wxT(":") +
+ formatTime(time.wMinute) + wxT(":") +
formatTime(time.wSecond);
//UTC time
@@ -122,7 +121,7 @@ struct MemoryAllocator
delete [] buffer2;
}
- static const unsigned int bufferSize = 1024*256; //256 kb seems to be the perfect buffer size
+ static const unsigned int bufferSize = 1024 * 256; //256 kb seems to be the perfect buffer size
unsigned char* buffer1;
unsigned char* buffer2;
};
@@ -132,41 +131,31 @@ bool filesHaveSameContent(const wxString& filename1, const wxString& filename2)
{
static MemoryAllocator memory;
- FILE* file1 = fopen(filename1.c_str(), "rb");
- if (!file1)
- throw FileError(wxString(_("Could not open file: ")) + "\"" + filename1 + "\"");
+ wxFFile file1(filename1.c_str(), wxT("rb"));
+ if (!file1.IsOpened())
+ throw FileError(wxString(_("Could not open file: ")) + wxT("\"") + filename1 + wxT("\""));
- FILE* file2 = fopen(filename2.c_str(), "rb");
- if (!file2)
- {
- fclose(file1); //NEVER forget clean-up
- throw FileError(wxString(_("Could not open file: ")) + "\"" + filename2 + "\"");
- }
+ wxFFile file2(filename2.c_str(), wxT("rb"));
+ if (!file2.IsOpened()) //NO cleanup necessary for wxFFile
+ throw FileError(wxString(_("Could not open file: ")) + wxT("\"") + filename2 + wxT("\""));
- bool returnValue = true;
do
{
- unsigned int length1 = fread(memory.buffer1, 1, memory.bufferSize, file1);
- if (ferror(file1)) throw FileError(wxString(_("Error reading file: ")) + "\"" + filename1 + "\"");
+ size_t length1 = file1.Read(memory.buffer1, memory.bufferSize);
+ if (file1.Error()) throw FileError(wxString(_("Error reading file: ")) + wxT("\"") + filename1 + wxT("\""));
- unsigned int length2 = fread(memory.buffer2, 1, memory.bufferSize, file2);
- if (ferror(file2)) throw FileError(wxString(_("Error reading file: ")) + "\"" + filename2 + "\"");
+ size_t length2 = file2.Read(memory.buffer2, memory.bufferSize);
+ if (file2.Error()) throw FileError(wxString(_("Error reading file: ")) + wxT("\"") + filename2 + wxT("\""));
if (length1 != length2 || memcmp(memory.buffer1, memory.buffer2, length1) != 0)
- {
- returnValue = false;
- break;
- }
+ return false;
}
- while (!feof(file1));
-
- if (!feof(file2))
- returnValue = false;
+ while (!file1.Eof());
- fclose(file1);
- fclose(file2);
+ if (!file2.Eof())
+ return false;
- return returnValue;
+ return true;
}
@@ -174,12 +163,27 @@ void FreeFileSync::generateFileAndFolderDescriptions(DirectoryDescrType& output,
{
assert (updateClass);
- output.clear();
+ while (true)
+ {
+ output.clear();
+
+ //get all files and folders from directory (and subdirectories) + information
+ GetAllFilesFull traverser(output, getFormattedDirectoryName(directory), updateClass);
+ wxDir dir(directory);
- //get all files and folders from directory (and subdirectories) + information
- GetAllFilesFull traverser(output, getFormattedDirectoryName(directory), updateClass);
- wxDir dir(directory);
- dir.Traverse(traverser);
+ if (dir.Traverse(traverser) != (size_t)-1)
+ break; //traversed successfully
+ else
+ {
+ int rv = updateClass->reportError(wxString(_("Error traversing directory ")) + wxT("\"") + directory + wxT("\""));
+ if (rv == StatusUpdater::continueNext)
+ break;
+ else if (rv == StatusUpdater::retry)
+ ; //continue with loop
+ else
+ assert (false);
+ }
+ }
}
@@ -251,6 +255,8 @@ void calcTotalDataForCompare(int& objectsTotal, double& dataTotal, const FileCom
void FreeFileSync::startCompareProcess(FileCompareResult& output, const wxString& dirLeft, const wxString& dirRight, CompareVariant cmpVar, StatusUpdater* statusUpdater)
{
+ wxLogNull dummy; //hide wxWidgets log messages
+
assert (statusUpdater);
//################################################################################################################################################
@@ -274,7 +280,7 @@ void FreeFileSync::startCompareProcess(FileCompareResult& output, const wxString
FileCompareLine newline;
set<int> delayedContentCompare; //compare of file content happens AFTER finding corresponding files
- //in order to separate into two processe (needed by progress indicators)
+ //in order to separate into two processes (needed by progress indicators)
//find files/folders that exist in left file model but not in right model
for (DirectoryDescrType::iterator i = directoryLeft.begin(); i != directoryLeft.end(); ++i)
@@ -283,7 +289,7 @@ void FreeFileSync::startCompareProcess(FileCompareResult& output, const wxString
newline.fileDescrLeft = *i;
newline.fileDescrRight = FileDescrLine();
newline.fileDescrRight.directory = dirRight;
- newline.cmpResult = fileOnLeftSideOnly;
+ newline.cmpResult = FILE_LEFT_SIDE_ONLY;
output_tmp.push_back(newline);
}
@@ -295,19 +301,19 @@ void FreeFileSync::startCompareProcess(FileCompareResult& output, const wxString
if ((i = directoryLeft.find(*j)) == directoryLeft.end())
{
newline.fileDescrLeft = FileDescrLine();
- newline.fileDescrLeft.directory = dirLeft;
+ newline.fileDescrLeft.directory = dirLeft; //directory info is needed when creating new directories
newline.fileDescrRight = *j;
- newline.cmpResult = fileOnRightSideOnly;
+ newline.cmpResult = FILE_RIGHT_SIDE_ONLY;
output_tmp.push_back(newline);
}
//find files that exist in left and right file model
else
- { //objType != isNothing
- if (i->objType == isDirectory && j->objType == isDirectory)
+ { //objType != TYPE_NOTHING
+ if (i->objType == TYPE_DIRECTORY && j->objType == TYPE_DIRECTORY)
{
newline.fileDescrLeft = *i;
newline.fileDescrRight = *j;
- newline.cmpResult = filesEqual;
+ newline.cmpResult = FILE_EQUAL;
output_tmp.push_back(newline);
}
//if we have a nameclash between a file and a directory: split into separate rows
@@ -316,40 +322,44 @@ void FreeFileSync::startCompareProcess(FileCompareResult& output, const wxString
newline.fileDescrLeft = *i;
newline.fileDescrRight = FileDescrLine();
newline.fileDescrRight.directory = dirRight;
- newline.cmpResult = fileOnLeftSideOnly;
+ newline.cmpResult = FILE_LEFT_SIDE_ONLY;
output_tmp.push_back(newline);
newline.fileDescrLeft = FileDescrLine();
newline.fileDescrLeft.directory = dirLeft;
newline.fileDescrRight = *j;
- newline.cmpResult = fileOnRightSideOnly;
+ newline.cmpResult = FILE_RIGHT_SIDE_ONLY;
output_tmp.push_back(newline);
}
- else if (cmpVar == compareByTimeAndSize)
+ else if (cmpVar == CMP_BY_TIME_SIZE)
{ //check files that exist in left and right model but have different properties
- if (i->lastWriteTimeRaw != j->lastWriteTimeRaw ||
- i->fileSize != j->fileSize)
- {
- newline.fileDescrLeft = *i;
- newline.fileDescrRight = *j;
- if (i->lastWriteTimeRaw == j->lastWriteTimeRaw)
- newline.cmpResult = filesDifferent;
- else if (i->lastWriteTimeRaw < j->lastWriteTimeRaw)
- newline.cmpResult = rightFileNewer;
+ //last write time may differ up to 2 seconds (NTFS vs FAT32)
+ bool sameWriteTime;
+ if (i->lastWriteTimeRaw < j->lastWriteTimeRaw)
+ sameWriteTime = (j->lastWriteTimeRaw - i->lastWriteTimeRaw <= 2);
+ else
+ sameWriteTime = (i->lastWriteTimeRaw - j->lastWriteTimeRaw <= 2);
+
+ newline.fileDescrLeft = *i;
+ newline.fileDescrRight = *j;
+ if (sameWriteTime)
+ {
+ if (i->fileSize == j->fileSize)
+ newline.cmpResult = FILE_EQUAL;
else
- newline.cmpResult = leftFileNewer;
- output_tmp.push_back(newline);
+ newline.cmpResult = FILE_DIFFERENT;
}
else
{
- newline.fileDescrLeft = *i;
- newline.fileDescrRight = *j;
- newline.cmpResult = filesEqual;
- output_tmp.push_back(newline);
+ if (i->lastWriteTimeRaw < j->lastWriteTimeRaw)
+ newline.cmpResult = FILE_RIGHT_NEWER;
+ else
+ newline.cmpResult = FILE_LEFT_NEWER;
}
+ output_tmp.push_back(newline);
}
- else if (cmpVar == compareByContent)
+ else if (cmpVar == CMP_BY_CONTENT)
{ //check files that exist in left and right model but have different content
//check filesize first!
@@ -367,7 +377,7 @@ void FreeFileSync::startCompareProcess(FileCompareResult& output, const wxString
{
newline.fileDescrLeft = *i;
newline.fileDescrRight = *j;
- newline.cmpResult = filesDifferent;
+ newline.cmpResult = FILE_DIFFERENT;
output_tmp.push_back(newline);
}
}
@@ -380,7 +390,7 @@ void FreeFileSync::startCompareProcess(FileCompareResult& output, const wxString
//compare file contents and set value "cmpResult"
//unsigned int startTime3 = GetTickCount();
- if (cmpVar == compareByContent)
+ if (cmpVar == CMP_BY_CONTENT)
{
int objectsTotal = 0;
double dataTotal = 0;
@@ -394,7 +404,7 @@ void FreeFileSync::startCompareProcess(FileCompareResult& output, const wxString
{
FileCompareLine& gridline = output_tmp[*i];
- statusUpdater->updateStatusText(wxString(_("Comparing content of files ")) + "\"" + gridline.fileDescrLeft.relFilename + "\"");
+ statusUpdater->updateStatusText(wxString(_("Comparing content of files ")) + wxT("\"") + gridline.fileDescrLeft.relFilename + wxT("\""));
//check files that exist in left and right model but have different content
while (true)
@@ -405,9 +415,9 @@ void FreeFileSync::startCompareProcess(FileCompareResult& output, const wxString
try
{
if (filesHaveSameContentMultithreaded(gridline.fileDescrLeft.filename, gridline.fileDescrRight.filename, statusUpdater))
- gridline.cmpResult = filesEqual;
+ gridline.cmpResult = FILE_EQUAL;
else
- gridline.cmpResult = filesDifferent;
+ gridline.cmpResult = FILE_DIFFERENT;
statusUpdater->updateProcessedData(2, (gridline.fileDescrLeft.fileSize + gridline.fileDescrRight.fileSize).ToDouble());
break;
@@ -416,7 +426,7 @@ void FreeFileSync::startCompareProcess(FileCompareResult& output, const wxString
{
//if (updateClass) -> is mandatory
int rv = statusUpdater->reportError(error.show());
- if ( rv == StatusUpdater::continueNext)
+ if (rv == StatusUpdater::continueNext)
{
rowsToDelete.insert(*i);
break;
@@ -437,9 +447,9 @@ void FreeFileSync::startCompareProcess(FileCompareResult& output, const wxString
statusUpdater->triggerUI_Refresh();
}
- catch (std::runtime_error& theException)
+ catch (const RuntimeException& theException)
{
- wxMessageBox(_(theException.what()), _("An exception occured!"), wxOK | wxICON_ERROR);
+ wxMessageBox(theException.show(), _("An exception occured!"), wxOK | wxICON_ERROR);
return;
}
@@ -455,14 +465,14 @@ void FreeFileSync::swapGrids(FileCompareResult& grid)
for (FileCompareResult::iterator i = grid.begin(); i != grid.end(); ++i)
{
//swap compare result
- if (i->cmpResult == fileOnLeftSideOnly)
- i->cmpResult = fileOnRightSideOnly;
- else if (i->cmpResult == fileOnRightSideOnly)
- i->cmpResult = fileOnLeftSideOnly;
- else if (i->cmpResult == rightFileNewer)
- i->cmpResult = leftFileNewer;
- else if (i->cmpResult == leftFileNewer)
- i->cmpResult = rightFileNewer;
+ if (i->cmpResult == FILE_LEFT_SIDE_ONLY)
+ i->cmpResult = FILE_RIGHT_SIDE_ONLY;
+ else if (i->cmpResult == FILE_RIGHT_SIDE_ONLY)
+ i->cmpResult = FILE_LEFT_SIDE_ONLY;
+ else if (i->cmpResult == FILE_RIGHT_NEWER)
+ i->cmpResult = FILE_LEFT_NEWER;
+ else if (i->cmpResult == FILE_LEFT_NEWER)
+ i->cmpResult = FILE_RIGHT_NEWER;
//swap file descriptors
tmp = i->fileDescrLeft;
@@ -508,11 +518,11 @@ wxDirTraverseResult GetAllFilesFull::OnFile(const wxString& filename)
fileDescr.lastWriteTime = currentFileInfo.lastWriteTime;
fileDescr.lastWriteTimeRaw = currentFileInfo.lastWriteTimeRaw;
fileDescr.fileSize = currentFileInfo.fileSize;
- fileDescr.objType = isFile;
+ fileDescr.objType = TYPE_FILE;
m_output.insert(fileDescr);
//update UI/commandline status information
- statusUpdater->updateStatusText(wxString(_("Scanning ")) + "\"" + filename + "\""); // NO performance issue at all
+ statusUpdater->updateStatusText(wxString(_("Scanning ")) + wxT("\"") + filename + wxT("\"")); // NO performance issue at all
//add 1 element to the progress indicator
statusUpdater->updateProcessedData(1, 0); // NO performance issue at all
//trigger display refresh
@@ -524,8 +534,8 @@ wxDirTraverseResult GetAllFilesFull::OnFile(const wxString& filename)
wxDirTraverseResult GetAllFilesFull::OnDir(const wxString& dirname)
{
- if (dirname.EndsWith("\\RECYCLER") ||
- dirname.EndsWith("\\System Volume Information"))
+ if (dirname.EndsWith(wxT("\\RECYCLER")) ||
+ dirname.EndsWith(wxT("\\System Volume Information")))
return wxDIR_IGNORE;
fileDescr.filename = dirname;
@@ -553,11 +563,11 @@ wxDirTraverseResult GetAllFilesFull::OnDir(const wxString& dirname)
fileDescr.lastWriteTime = currentFileInfo.lastWriteTime;
fileDescr.lastWriteTimeRaw = currentFileInfo.lastWriteTimeRaw;
fileDescr.fileSize = wxULongLong(0); //currentFileInfo.fileSize should be "0" as well, but just to be sure... currently used by getBytesToTransfer
- fileDescr.objType = isDirectory;
+ fileDescr.objType = TYPE_DIRECTORY;
m_output.insert(fileDescr);
//update UI/commandline status information
- statusUpdater->updateStatusText(wxString(_("Scanning ")) + "\"" + dirname + "\""); // NO performance issue at all
+ statusUpdater->updateStatusText(wxString(_("Scanning ")) + wxT("\"") + dirname + wxT("\"")); // NO performance issue at all
//add 1 element to the progress indicator
statusUpdater->updateProcessedData(1, 0); // NO performance issue at all
//trigger display refresh
@@ -622,7 +632,7 @@ public:
{
#ifdef FFS_WIN
// Get a handle to the DLL module containing Recycle Bin functionality
- hinstShell = LoadLibrary("shell32.dll");
+ hinstShell = LoadLibrary(wxT("shell32.dll"));
if (hinstShell != NULL)
{
fileOperation = (DllFileOP)GetProcAddress(hinstShell, "SHFileOperation");
@@ -653,12 +663,12 @@ public:
void moveToRecycleBin(const wxString& filename)
{
if (!recycleBinAvailable) //this method should ONLY be called if recycle bin is available
- throw std::runtime_error("Initialization of Recycle Bin failed! It cannot be used!");
+ throw RuntimeException(_("Initialization of Recycle Bin failed! It cannot be used!"));
#ifdef FFS_WIN
SHFILEOPSTRUCT fileOp;
- wxString filenameDoubleNull = filename + char(0);
+ wxString filenameDoubleNull = filename + wxChar(0);
fileOp.hwnd = NULL;
fileOp.wFunc = FO_DELETE;
@@ -670,7 +680,7 @@ public:
fileOp.lpszProgressTitle = NULL;
if (fileOperation(&fileOp //pointer to an SHFILEOPSTRUCT structure that contains information the function needs to carry out
- ) != 0 || fileOp.fAnyOperationsAborted) throw FileError(wxString(_("Error moving file ")) + "\"" + filename + "\"" + _(" to recycle bin!"));
+ ) != 0 || fileOp.fAnyOperationsAborted) throw FileError(wxString(_("Error moving file ")) + wxT("\"") + filename + wxT("\"") + _(" to recycle bin!"));
#endif // FFS_WIN
}
@@ -702,11 +712,11 @@ void FreeFileSync::removeFile(const wxString& filename)
if (!SetFileAttributes(
filename.c_str(), // address of filename
FILE_ATTRIBUTE_NORMAL // attributes to set
- )) throw FileError(wxString(_("Error deleting file ")) + "\"" + filename + "\"");
+ )) throw FileError(wxString(_("Error deleting file ")) + wxT("\"") + filename + wxT("\""));
#endif // FFS_WIN
if (!wxRemoveFile(filename))
- throw FileError(wxString(_("Error deleting file ")) + "\"" + filename + "\"");
+ throw FileError(wxString(_("Error deleting file ")) + wxT("\"") + filename + wxT("\""));
}
@@ -728,7 +738,8 @@ void FreeFileSync::removeDirectory(const wxString& directory)
//get all files and directories from current directory (and subdirectories)
GetAllFilesSimple traverser(fileList, dirList);
- dir.Traverse(traverser);
+ if (dir.Traverse(traverser) == (size_t)-1)
+ throw FileError(wxString(_("Error deleting directory ")) + wxT("\"") + directory + wxT("\""));
}
for (unsigned int j = 0; j < fileList.GetCount(); ++j)
@@ -742,11 +753,11 @@ void FreeFileSync::removeDirectory(const wxString& directory)
if (!SetFileAttributes(
dirList[j].c_str(), // address of directory name
FILE_ATTRIBUTE_NORMAL // attributes to set
- )) throw FileError(wxString(_("Error deleting directory ")) + "\"" + dirList[j] + "\"");
+ )) throw FileError(wxString(_("Error deleting directory ")) + wxT("\"") + dirList[j] + wxT("\""));
#endif // FFS_WIN
if (!wxRmdir(dirList[j]))
- throw FileError(wxString(_("Error deleting directory ")) + "\"" + dirList[j] + "\"");
+ throw FileError(wxString(_("Error deleting directory ")) + wxT("\"") + dirList[j] + wxT("\""));
}
}
@@ -774,7 +785,7 @@ void FreeFileSync::createDirectory(const wxString& directory, int level)
if (!wxMkdir(directory))
{
if (level == 0)
- throw FileError(wxString(_("Error creating directory ")) + "\"" + directory + "\"");
+ throw FileError(wxString(_("Error creating directory ")) + wxT("\"") + directory + wxT("\""));
}
}
@@ -814,7 +825,7 @@ private:
if (!wxCopyFile(source, target, false)) //abort if file exists
{
success = false;
- errorMessage = wxString(_("Error copying file ")) + "\"" + source + "\"" + _(" to ") + "\"" + target + "\"";
+ errorMessage = wxString(_("Error copying file ")) + wxT("\"") + source + wxT("\"") + _(" to ") + wxT("\"") + target + wxT("\"");
return;
}
@@ -823,7 +834,7 @@ private:
if (stat(source.c_str(), &fileInfo) != 0) //read modification time from source file
{
success = false;
- errorMessage = wxString(_("Could not retrieve file info for: ")) + "\"" + source + "\"";
+ errorMessage = wxString(_("Could not retrieve file info for: ")) + wxT("\"") + source + wxT("\"");
return;
}
@@ -834,7 +845,7 @@ private:
if (utime(target.c_str(), &newTimes) != 0)
{
success = false;
- errorMessage = wxString(_("Error adapting modification time of file ")) + "\"" + target + "\"";
+ errorMessage = wxString(_("Error adapting modification time of file ")) + wxT("\"") + target + wxT("\"");
return;
}
#endif // FFS_LINUX
@@ -889,30 +900,30 @@ SyncDirection getSyncDirection(const CompareFilesResult cmpResult, const SyncCon
{
switch (cmpResult)
{
- case fileOnLeftSideOnly:
+ case FILE_LEFT_SIDE_ONLY:
return config.exLeftSideOnly;
break;
- case fileOnRightSideOnly:
+ case FILE_RIGHT_SIDE_ONLY:
return config.exRightSideOnly;
break;
- case rightFileNewer:
+ case FILE_RIGHT_NEWER:
return config.rightNewer;
break;
- case leftFileNewer:
+ case FILE_LEFT_NEWER:
return config.leftNewer;
break;
- case filesDifferent:
+ case FILE_DIFFERENT:
return config.different;
break;
default:
assert (false);
}
- return syncDirNone;
+ return SYNC_DIR_NONE;
}
@@ -936,59 +947,59 @@ bool getBytesToTransfer(int& objectsToCreate,
switch (fileCmpLine.cmpResult)
{
- case fileOnLeftSideOnly:
+ case FILE_LEFT_SIDE_ONLY:
//get data to process
switch (getSyncDirection(fileCmpLine.cmpResult, config))
{
- case syncDirLeft: //delete file on left
+ case SYNC_DIR_LEFT: //delete file on left
dataToProcess = 0;
objectsToDelete = 1;
break;
- case syncDirRight: //copy from left to right
+ case SYNC_DIR_RIGHT: //copy from left to right
dataToProcess = fileCmpLine.fileDescrLeft.fileSize.ToDouble();
objectsToCreate = 1;
break;
- case syncDirNone:
+ case SYNC_DIR_NONE:
return false;
}
break;
- case fileOnRightSideOnly:
+ case FILE_RIGHT_SIDE_ONLY:
switch (getSyncDirection(fileCmpLine.cmpResult, config))
{
- case syncDirLeft: //copy from right to left
+ case SYNC_DIR_LEFT: //copy from right to left
dataToProcess = fileCmpLine.fileDescrRight.fileSize.ToDouble();;
objectsToCreate = 1;
break;
- case syncDirRight: //delete file on right
+ case SYNC_DIR_RIGHT: //delete file on right
dataToProcess = 0;
objectsToDelete = 1;
break;
- case syncDirNone:
+ case SYNC_DIR_NONE:
return false;
}
break;
- case leftFileNewer:
- case rightFileNewer:
- case filesDifferent:
+ case FILE_LEFT_NEWER:
+ case FILE_RIGHT_NEWER:
+ case FILE_DIFFERENT:
//get data to process
switch (getSyncDirection(fileCmpLine.cmpResult, config))
{
- case syncDirLeft: //copy from right to left
+ case SYNC_DIR_LEFT: //copy from right to left
dataToProcess = fileCmpLine.fileDescrRight.fileSize.ToDouble();
objectsToOverwrite = 1;
break;
- case syncDirRight: //copy from left to right
+ case SYNC_DIR_RIGHT: //copy from left to right
dataToProcess = fileCmpLine.fileDescrLeft.fileSize.ToDouble();
objectsToOverwrite = 1;
break;
- case syncDirNone:
+ case SYNC_DIR_NONE:
return false;
}
break;
- case filesEqual:
+ case FILE_EQUAL:
return false;
};
@@ -1037,75 +1048,75 @@ bool FreeFileSync::synchronizeFile(const FileCompareLine& filename, const SyncCo
//synchronize file:
switch (filename.cmpResult)
{
- case fileOnLeftSideOnly:
+ case FILE_LEFT_SIDE_ONLY:
switch (config.exLeftSideOnly)
{
- case syncDirLeft: //delete files on left
- statusUpdater->updateStatusText(wxString(_("Deleting file ")) + "\"" + filename.fileDescrLeft.filename + "\"");
+ case SYNC_DIR_LEFT: //delete files on left
+ statusUpdater->updateStatusText(wxString(_("Deleting file ")) + wxT("\"") + filename.fileDescrLeft.filename + wxT("\""));
removeFile(filename.fileDescrLeft.filename);
break;
- case syncDirRight: //copy files to right
+ case SYNC_DIR_RIGHT: //copy files to right
target = filename.fileDescrRight.directory + filename.fileDescrLeft.relFilename;
- statusUpdater->updateStatusText(wxString(_("Copying file ")) + "\"" + filename.fileDescrLeft.filename + "\"" +
- _(" to ") + "\"" + target + "\"");
+ statusUpdater->updateStatusText(wxString(_("Copying file ")) + wxT("\"") + filename.fileDescrLeft.filename + wxT("\"") +
+ _(" to ") + wxT("\"") + target + wxT("\""));
copyfileMultithreaded(filename.fileDescrLeft.filename, target, statusUpdater);
break;
- case syncDirNone:
+ case SYNC_DIR_NONE:
return false;
default:
assert (false);
}
break;
- case fileOnRightSideOnly:
+ case FILE_RIGHT_SIDE_ONLY:
switch (config.exRightSideOnly)
{
- case syncDirLeft: //copy files to left
+ case SYNC_DIR_LEFT: //copy files to left
target = filename.fileDescrLeft.directory + filename.fileDescrRight.relFilename;
- statusUpdater->updateStatusText(wxString(_("Copying file ")) + "\"" + filename.fileDescrRight.filename + "\"" +
- _(" to ") + "\"" + target + "\"");
+ statusUpdater->updateStatusText(wxString(_("Copying file ")) + wxT("\"") + filename.fileDescrRight.filename + wxT("\"") +
+ _(" to ") + wxT("\"") + target + wxT("\""));
copyfileMultithreaded(filename.fileDescrRight.filename, target, statusUpdater);
break;
- case syncDirRight: //delete files on right
- statusUpdater->updateStatusText(wxString(_("Deleting file ")) + "\"" + filename.fileDescrRight.filename + "\"");
+ case SYNC_DIR_RIGHT: //delete files on right
+ statusUpdater->updateStatusText(wxString(_("Deleting file ")) + wxT("\"") + filename.fileDescrRight.filename + wxT("\""));
removeFile(filename.fileDescrRight.filename);
break;
- case syncDirNone:
+ case SYNC_DIR_NONE:
return false;
default:
assert (false);
}
break;
- case leftFileNewer:
- case rightFileNewer:
- case filesDifferent:
+ case FILE_LEFT_NEWER:
+ case FILE_RIGHT_NEWER:
+ case FILE_DIFFERENT:
switch (getSyncDirection(filename.cmpResult, config))
{
- case syncDirLeft: //copy from right to left
- statusUpdater->updateStatusText(wxString(_("Copying file ")) + "\"" + filename.fileDescrRight.filename + "\"" +
- _(" overwriting ") + "\"" + filename.fileDescrLeft.filename + "\"");
+ case SYNC_DIR_LEFT: //copy from right to left
+ statusUpdater->updateStatusText(wxString(_("Copying file ")) + wxT("\"") + filename.fileDescrRight.filename + wxT("\"") +
+ _(" overwriting ") + wxT("\"") + filename.fileDescrLeft.filename + wxT("\""));
removeFile(filename.fileDescrLeft.filename); //only used if switch activated by user, else file is simply deleted
copyfileMultithreaded(filename.fileDescrRight.filename, filename.fileDescrLeft.filename, statusUpdater);
break;
- case syncDirRight: //copy from left to right
- statusUpdater->updateStatusText(wxString(_("Copying file ")) + "\"" + filename.fileDescrLeft.filename + "\"" +
- _(" overwriting ") + "\"" + filename.fileDescrRight.filename + "\"");
+ case SYNC_DIR_RIGHT: //copy from left to right
+ statusUpdater->updateStatusText(wxString(_("Copying file ")) + wxT("\"") + filename.fileDescrLeft.filename + wxT("\"") +
+ _(" overwriting ") + wxT("\"") + filename.fileDescrRight.filename + wxT("\""));
removeFile(filename.fileDescrRight.filename); //only used if switch activated by user, else file is simply deleted
copyfileMultithreaded(filename.fileDescrLeft.filename, filename.fileDescrRight.filename, statusUpdater);
break;
- case syncDirNone:
+ case SYNC_DIR_NONE:
return false;
default:
assert (false);
}
break;
- case filesEqual:
+ case FILE_EQUAL:
return false;
default:
@@ -1126,57 +1137,57 @@ bool FreeFileSync::synchronizeFolder(const FileCompareLine& filename, const Sync
//synchronize folders:
switch (filename.cmpResult)
{
- case fileOnLeftSideOnly:
+ case FILE_LEFT_SIDE_ONLY:
switch (config.exLeftSideOnly)
{
- case syncDirLeft: //delete folders on left
- statusUpdater->updateStatusText(wxString(_("Deleting folder ")) + "\"" + filename.fileDescrLeft.filename + "\"");
+ case SYNC_DIR_LEFT: //delete folders on left
+ statusUpdater->updateStatusText(wxString(_("Deleting folder ")) + wxT("\"") + filename.fileDescrLeft.filename + wxT("\""));
removeDirectory(filename.fileDescrLeft.filename);
break;
- case syncDirRight: //create folders on right
+ case SYNC_DIR_RIGHT: //create folders on right
target = filename.fileDescrRight.directory + filename.fileDescrLeft.relFilename;
- statusUpdater->updateStatusText(wxString(_("Creating folder ")) + "\"" + target + "\"");
+ statusUpdater->updateStatusText(wxString(_("Creating folder ")) + wxT("\"") + target + wxT("\""));
//some check to catch the error that directory on source has been deleted externally after the "compare"...
if (!wxDirExists(filename.fileDescrLeft.filename))
- throw FileError(wxString(_("Error: Source directory does not exist anymore: ")) + "\"" + filename.fileDescrLeft.filename + "\"");
+ throw FileError(wxString(_("Error: Source directory does not exist anymore: ")) + wxT("\"") + filename.fileDescrLeft.filename + wxT("\""));
createDirectory(target);
break;
- case syncDirNone:
+ case SYNC_DIR_NONE:
return false;
default:
assert (false);
}
break;
- case fileOnRightSideOnly:
+ case FILE_RIGHT_SIDE_ONLY:
switch (config.exRightSideOnly)
{
- case syncDirLeft: //create folders on left
+ case SYNC_DIR_LEFT: //create folders on left
target = filename.fileDescrLeft.directory + filename.fileDescrRight.relFilename;
- statusUpdater->updateStatusText(wxString(_("Creating folder ")) + "\"" + target + "\"");
+ statusUpdater->updateStatusText(wxString(_("Creating folder ")) + wxT("\"") + target + wxT("\""));
//some check to catch the error that directory on source has been deleted externally after the "compare"...
if (!wxDirExists(filename.fileDescrRight.filename))
- throw FileError(wxString(_("Error: Source directory does not exist anymore: ")) + "\"" + filename.fileDescrRight.filename + "\"");
+ throw FileError(wxString(_("Error: Source directory does not exist anymore: ")) + wxT("\"") + filename.fileDescrRight.filename + wxT("\""));
createDirectory(target);
break;
- case syncDirRight: //delete folders on right
- statusUpdater->updateStatusText(wxString(_("Deleting folder ")) + "\"" + filename.fileDescrRight.filename + "\"");
+ case SYNC_DIR_RIGHT: //delete folders on right
+ statusUpdater->updateStatusText(wxString(_("Deleting folder ")) + wxT("\"") + filename.fileDescrRight.filename + wxT("\""));
removeDirectory(filename.fileDescrRight.filename);
break;
- case syncDirNone:
+ case SYNC_DIR_NONE:
return false;
default:
assert (false);
}
break;
- case filesEqual:
+ case FILE_EQUAL:
return false;
- case rightFileNewer:
- case leftFileNewer:
- case filesDifferent:
+ case FILE_RIGHT_NEWER:
+ case FILE_LEFT_NEWER:
+ case FILE_DIFFERENT:
default:
assert (false);
}
@@ -1194,27 +1205,27 @@ wxString FreeFileSync::formatFilesizeToShortString(const double filesize)
{
double nrOfBytes = filesize;
- wxString unit = " Byte";
+ wxString unit = wxT(" Byte");
if (nrOfBytes > 999)
{
nrOfBytes/= 1024;
- unit = " kB";
+ unit = wxT(" kB");
if (nrOfBytes > 999)
{
nrOfBytes/= 1024;
- unit = " MB";
+ unit = wxT(" MB");
if (nrOfBytes > 999)
{
nrOfBytes/= 1024;
- unit = " GB";
+ unit = wxT(" GB");
if (nrOfBytes > 999)
{
nrOfBytes/= 1024;
- unit = " TB";
+ unit = wxT(" TB");
if (nrOfBytes > 999)
{
nrOfBytes/= 1024;
- unit = " PB";
+ unit = wxT(" PB");
}
}
}
@@ -1222,13 +1233,11 @@ wxString FreeFileSync::formatFilesizeToShortString(const double filesize)
}
wxString temp;
- if (unit == " Byte") //no decimal places in case of bytes
+ if (unit == wxT(" Byte")) //no decimal places in case of bytes
{
double integer = 0;
modf(nrOfBytes, &integer); //get integer part of nrOfBytes
temp = numberToWxString(int(integer));
- // if (!temp.Len()) //if nrOfBytes is zero GMP returns an empty string
- // temp = "0";
}
else
{
@@ -1243,13 +1252,13 @@ wxString FreeFileSync::formatFilesizeToShortString(const double filesize)
switch (length)
{
case 0:
- temp = "Error";
+ temp = wxT("Error");
break;
case 1:
- temp = wxString("0") + GlobalResources::decimalPoint + "0" + temp;
+ temp = wxString(wxT("0")) + GlobalResources::decimalPoint + wxT("0") + temp;
break; //0,01
case 2:
- temp = wxString("0") + GlobalResources::decimalPoint + temp;
+ temp = wxString(wxT("0")) + GlobalResources::decimalPoint + temp;
break; //0,11
case 3:
temp.insert(1, GlobalResources::decimalPoint);
@@ -1262,7 +1271,7 @@ wxString FreeFileSync::formatFilesizeToShortString(const double filesize)
temp = temp.substr(0, 3);
break; //111
default:
- return "Error";
+ return wxT("Error");
}
}
return (temp + unit);
@@ -1275,9 +1284,9 @@ void FreeFileSync::filterCurrentGridData(FileCompareResult& currentGridData, con
wxString excludeFilterTmp(excludeFilter);
//make sure filters end with ";" - no problem with empty strings here
- if (!includeFilterTmp.EndsWith(";"))
+ if (!includeFilterTmp.EndsWith(wxT(";")))
includeFilterTmp.Append(';');
- if (!excludeFilterTmp.EndsWith(";"))
+ if (!excludeFilterTmp.EndsWith(wxT(";")))
excludeFilterTmp.Append(';');
//load filters into vectors
@@ -1308,7 +1317,7 @@ void FreeFileSync::filterCurrentGridData(FileCompareResult& currentGridData, con
for (FileCompareResult::iterator i = currentGridData.begin(); i != currentGridData.end(); ++i)
{
//process include filters
- if (i->fileDescrLeft.objType != isNothing)
+ if (i->fileDescrLeft.objType != TYPE_NOTHING)
{
bool includedLeft = false;
for (vector<wxString>::const_iterator j = includeList.begin(); j != includeList.end(); ++j)
@@ -1325,7 +1334,7 @@ void FreeFileSync::filterCurrentGridData(FileCompareResult& currentGridData, con
}
}
- if (i->fileDescrRight.objType != isNothing)
+ if (i->fileDescrRight.objType != TYPE_NOTHING)
{
bool includedRight = false;
for (vector<wxString>::const_iterator j = includeList.begin(); j != includeList.end(); ++j)
@@ -1385,8 +1394,8 @@ wxString FreeFileSync::getFormattedDirectoryName(const wxString& dirname)
inline
bool deletionImminent(const FileCompareLine& line, const SyncConfiguration& config)
{ //test if current sync-line will result in deletion of files -> used to avoid disc space bottlenecks
- if ((line.cmpResult == fileOnLeftSideOnly && config.exLeftSideOnly == syncDirLeft) ||
- (line.cmpResult == fileOnRightSideOnly && config.exRightSideOnly == syncDirRight))
+ if ((line.cmpResult == FILE_LEFT_SIDE_ONLY && config.exLeftSideOnly == SYNC_DIR_LEFT) ||
+ (line.cmpResult == FILE_RIGHT_SIDE_ONLY && config.exRightSideOnly == SYNC_DIR_RIGHT))
return true;
else
return false;
@@ -1448,7 +1457,7 @@ void FreeFileSync::startSynchronizationProcess(FileCompareResult& grid, const Sy
//synchronize folders:
for (FileCompareResult::const_iterator i = grid.begin(); i != grid.end(); ++i)
{
- if (i->fileDescrLeft.objType == isDirectory || i->fileDescrRight.objType == isDirectory)
+ if (i->fileDescrLeft.objType == TYPE_DIRECTORY || i->fileDescrRight.objType == TYPE_DIRECTORY)
{
while (true)
{ //trigger display refresh
@@ -1481,13 +1490,14 @@ void FreeFileSync::startSynchronizationProcess(FileCompareResult& grid, const Sy
}
//synchronize files:
+ bool deleteLoop = true;
for (int k = 0; k < 2; ++k) //loop over all files twice; reason: first delete, then copy (no sorting necessary: performance)
{
- bool deleteLoop = !k; //-> first loop: delete files, second loop: copy files
+ deleteLoop = !k; //-> first loop: delete files, second loop: copy files
for (FileCompareResult::const_iterator i = grid.begin(); i != grid.end(); ++i)
{
- if (i->fileDescrLeft.objType == isFile || i->fileDescrRight.objType == isFile)
+ if (i->fileDescrLeft.objType == TYPE_FILE || i->fileDescrRight.objType == TYPE_FILE)
{
if (deleteLoop && deletionImminent(*i, config) ||
!deleteLoop && !deletionImminent(*i, config))
@@ -1537,9 +1547,9 @@ void FreeFileSync::startSynchronizationProcess(FileCompareResult& grid, const Sy
}
}
}
- catch (std::runtime_error& theException)
+ catch (const RuntimeException& theException)
{
- wxMessageBox(_(theException.what()), _("An exception occured!"), wxOK | wxICON_ERROR);
+ wxMessageBox(theException.show(), _("An exception occured!"), wxOK | wxICON_ERROR);
return;
}
}
@@ -1547,16 +1557,22 @@ void FreeFileSync::startSynchronizationProcess(FileCompareResult& grid, const Sy
bool FreeFileSync::isFFS_ConfigFile(const wxString& filename)
{
- ifstream config(filename.c_str());
- if (!config)
+ wxFFile configFile(filename.c_str(), wxT("rb"));
+ if (!configFile.IsOpened())
return false;
char bigBuffer[10000];
//read FFS identifier
- config.get(bigBuffer, FreeFileSync::FFS_ConfigFileID.Len() + 1);
+ size_t bytesRead = configFile.Read(bigBuffer, FreeFileSync::FfsConfigFileID.size());
- return (FFS_ConfigFileID == wxString(bigBuffer));
+ if (!configFile.Error() && bytesRead < 10000)
+ {
+ bigBuffer[bytesRead] = 0;
+ return (FfsConfigFileID == string(bigBuffer));
+ }
+ else
+ return false;
}
@@ -1565,10 +1581,10 @@ void FreeFileSync::addSubElements(set<int>& subElements, const FileCompareResult
{
wxString relevantDirectory;
- if (relevantRow.fileDescrLeft.objType == isDirectory)
+ if (relevantRow.fileDescrLeft.objType == TYPE_DIRECTORY)
relevantDirectory = relevantRow.fileDescrLeft.relFilename;
- else if (relevantRow.fileDescrRight.objType == isDirectory)
+ else if (relevantRow.fileDescrRight.objType == TYPE_DIRECTORY)
relevantDirectory = relevantRow.fileDescrRight.relFilename;
else
@@ -1596,14 +1612,14 @@ void FreeFileSync::deleteOnGridAndHD(FileCompareResult& grid, const set<int>& ro
{
try
{
- if (currentCmpLine.fileDescrLeft.objType == isFile)
+ if (currentCmpLine.fileDescrLeft.objType == TYPE_FILE)
fileSyncObject.removeFile(currentCmpLine.fileDescrLeft.filename);
- else if (currentCmpLine.fileDescrLeft.objType == isDirectory)
+ else if (currentCmpLine.fileDescrLeft.objType == TYPE_DIRECTORY)
fileSyncObject.removeDirectory(currentCmpLine.fileDescrLeft.filename);
- if (currentCmpLine.fileDescrRight.objType == isFile)
+ if (currentCmpLine.fileDescrRight.objType == TYPE_FILE)
fileSyncObject.removeFile(currentCmpLine.fileDescrRight.filename);
- else if (currentCmpLine.fileDescrRight.objType == isDirectory)
+ else if (currentCmpLine.fileDescrRight.objType == TYPE_DIRECTORY)
fileSyncObject.removeDirectory(currentCmpLine.fileDescrRight.filename);
rowsToDeleteInGrid.insert(*i);
@@ -1618,7 +1634,7 @@ void FreeFileSync::deleteOnGridAndHD(FileCompareResult& grid, const set<int>& ro
break;
else if (rv == StatusUpdater::retry)
- ; //continue with loop
+ ; //continue in loop
else
assert (false);
}
@@ -1654,7 +1670,7 @@ bool updateUI_IsAllowed()
wxLongLong newExec = wxGetLocalTimeMillis();
- if (newExec - lastExec >= uiUpdateInterval) //perform ui updates not more often than necessary
+ if (newExec - lastExec >= UI_UPDATE_INTERVAL) //perform ui updates not more often than necessary
{
lastExec = newExec;
return true;
bgstack15