private bool WatchSyncMove(string remoteFolder, string localFolder, string oldPathname, string newPathname, Grace grace)
{
bool success = true;
SleepWhileSuspended();
try
{
// Old item.
string oldDirectory = Path.GetDirectoryName(oldPathname);
string oldFilename = Path.GetFileName(oldPathname);
string oldLocalName = oldPathname.Substring(localFolder.Length + 1);
SyncItem oldItem = database.GetSyncItemFromLocalPath(oldPathname);
if (oldItem == null)
{
// The change is about a file which was not in database yet, we can't move it. Further action is needed.
return false;
}
string oldRemoteName = oldItem.RemotePath;
string oldRemoteBaseName = CmisUtils.GetUpperFolderOfCmisPath(oldRemoteName);
bool oldPathnameWorthSyncing = Utils.WorthSyncing(oldDirectory, oldFilename, repoInfo);
// New item.
bool isFolder = Utils.IsFolder(newPathname);
string newDirectory = Path.GetDirectoryName(newPathname); // TODO do this only if isFolder is true, modify rest of the logic accordingly.
string newFilename = Path.GetFileName(newPathname);
string newLocalName = newPathname.Substring(localFolder.Length + 1);
SyncItem newItem = SyncItemFactory.CreateFromLocalPath(newPathname, isFolder, repoInfo, database);
string newRemoteName = newItem.RemotePath;
string newRemoteBaseName = CmisUtils.GetUpperFolderOfCmisPath(newRemoteName);
bool newPathnameWorthSyncing = Utils.WorthSyncing(newDirectory, newFilename, repoInfo);
// Operations.
bool rename = oldDirectory.Equals(newDirectory) && !oldFilename.Equals(newFilename);
bool move = !oldDirectory.Equals(newDirectory) && oldFilename.Equals(newFilename);
if ((rename && move) || (!rename && !move))
{
Logger.ErrorFormat("Not a valid rename/move: {0} -> {1}", oldPathname, newPathname);
return true; // It is not our problem that watcher data is not valid.
}
if (oldPathnameWorthSyncing && newPathnameWorthSyncing)
{
if (database.ContainsLocalFile(oldPathname))
{
if (database.ContainsLocalFile(newPathname))
{
//database already contains path so revert back to delete/update
success &= WatcherSyncDelete(remoteFolder, localFolder, oldPathname, grace);
success &= WatcherSyncUpdate(remoteFolder, localFolder, newPathname);
}
else
{
if (rename)
{
//rename file...
IDocument remoteDocument = (IDocument)session.GetObjectByPath(oldRemoteName);
success &= RenameFile(oldDirectory, newFilename, remoteDocument);
}
else //move
{
//move file...
IDocument remoteDocument = (IDocument)session.GetObjectByPath(oldRemoteName);
IFolder oldRemoteFolder = (IFolder)session.GetObjectByPath(oldRemoteBaseName);
IFolder newRemoteFolder = (IFolder)session.GetObjectByPath(newRemoteBaseName);
success &= MoveFile(oldDirectory, newDirectory, oldRemoteFolder, newRemoteFolder, remoteDocument);
}
}
}
else if (database.ContainsFolder(oldPathname))
{
if (database.ContainsFolder(newPathname))
{
//database already contains path so revert back to delete/update
success &= WatcherSyncDelete(remoteFolder, localFolder, oldPathname, grace);
success &= WatcherSyncUpdate(remoteFolder, localFolder, newPathname);
}
else
{
if (rename)
{
//rename folder...
IFolder remoteFolderObject = (IFolder)session.GetObjectByPath(oldRemoteName);
success &= RenameFolder(oldDirectory, newFilename, remoteFolderObject);
}
else //move
{
//move folder...
IFolder remoteFolderObject = (IFolder)session.GetObjectByPath(oldRemoteName);
IFolder oldRemoteFolder = (IFolder)session.GetObjectByPath(oldRemoteBaseName);
IFolder newRemoteFolder = (IFolder)session.GetObjectByPath(newRemoteBaseName);
success &= MoveFolder(oldDirectory, newDirectory, oldRemoteFolder, newRemoteFolder, remoteFolderObject);
}
}
}
else
{
//File/Folder has not been synced before so simply update
success &= WatcherSyncUpdate(remoteFolder, localFolder, newPathname);
}
}
else if (oldPathnameWorthSyncing && !newPathnameWorthSyncing)
{
//New path not worth syncing
success &= WatcherSyncDelete(remoteFolder, localFolder, oldPathname, grace);
}
else if (!oldPathnameWorthSyncing && newPathnameWorthSyncing)
{
//Old path not worth syncing
success &= WatcherSyncUpdate(remoteFolder, localFolder, newPathname);
}
else
{
//Neither old or new path worth syncing
}
}
catch (FileNotFoundException e)
{
success = false;
Logger.Warn("Could process watcher sync move, file or folder not found: " + oldPathname + " -> " + newPathname, e);
}
catch (Exception e)
{
success = false;
ProcessRecoverableException("Could not process watcher sync move: " + oldPathname + " -> " + newPathname, e);
}
return success;
}