public bool ApplyDeletedFolders(ref List<string> deletedFolders)
{
bool success = true;
foreach (string deletedFolder in deletedFolders)
{
SyncItem deletedItem = SyncItemFactory.CreateFromLocalPath(deletedFolder, true, repoInfo, database);
try
{
var deletedIFolder = session.GetObjectByPath(deletedItem.RemotePath) as IFolder;
// Check whether the remote folder has changes we haven't gotten yet (conflict)
var changed = HasFolderChanged(deletedIFolder);
// Delete the remote folder if unchanged, otherwise let full sync handle the conflict.
var remotePath = deletedItem.RemotePath;
var localPath = deletedItem.LocalPath;
var remoteFolders = new List<string>();
if (changed)
{
// TODO: Internationalization
string message = String.Format("Restoring folder {0} because its sub-items have been modified on the server. You can delete it again.", localPath);
Utils.NotifyUser(message);
// TODO: Handle folder conflict
// Delete local database entry.
database.RemoveFolder(SyncItemFactory.CreateFromLocalPath(deletedFolder, true, repoInfo, database));
DownloadDirectory(deletedIFolder, remotePath, localPath);
return false;
}
else
{
DeleteRemoteFolder(deletedIFolder, deletedItem, Utils.UpperFolderLocal(deletedItem.LocalPath));
}
}
catch (Exception e)
{
if (e is ArgumentNullException || e is CmisObjectNotFoundException)
{
// Typical error when the document does not exist anymore on the server
// TODO Make DotCMIS generate a more precise exception.
Logger.Error("The folder has probably been deleted on the server already: " + deletedFolder, e);
// Delete local database entry.
database.RemoveFolder(SyncItemFactory.CreateFromLocalPath(deletedFolder, true, repoInfo, database));
// Note: This is not a failure per-se, so we don't need to modify the "success" variable.
}
else
{
Logger.Error("Error applying local folder deletion to the server: " + deletedFolder, e);
success = false;
}
}
}
return success;
}