private bool WatcherSync(string remoteFolder, string localFolder)
{
Logger.Debug(remoteFolder + " : " + localFolder);
bool locallyModified = false;
SleepWhileSuspended();
Queue<WatcherEvent> changeQueue = repo.Watcher.GetChangeQueue();
repo.Watcher.Clear();
if (Logger.IsDebugEnabled)
{
foreach (WatcherEvent change in changeQueue)
{
if (change.GetFileSystemEventArgs() is CmisSync.Lib.Watcher.MovedEventArgs)
{
Logger.DebugFormat("Moved: {0} -> {1}",
((CmisSync.Lib.Watcher.MovedEventArgs)change.GetFileSystemEventArgs()).OldFullPath,
change.GetFileSystemEventArgs().FullPath);
}
else if (change.GetFileSystemEventArgs() is RenamedEventArgs)
{
Logger.DebugFormat("Renamed: {0} -> {1}",
((RenamedEventArgs)change.GetFileSystemEventArgs()).OldFullPath,
change.GetFileSystemEventArgs().FullPath);
}
else
{
Logger.DebugFormat("{0}: {1}",
change.GetFileSystemEventArgs().ChangeType,
change.GetFileSystemEventArgs().FullPath);
}
}
}
while (changeQueue.Count > 0)
{
activityListener.ActivityStarted();
try
{
WatcherEvent earliestChange = changeQueue.Dequeue();
string pathname = earliestChange.GetFileSystemEventArgs().FullPath;
if (!pathname.StartsWith(localFolder))
{
Logger.DebugFormat("Path {0} does not apply for target {1}.", pathname, localFolder);
activityListener.ActivityStopped();
continue;
}
if (pathname == localFolder)
{
continue;
}
if (earliestChange.GetFileSystemEventArgs() is CmisSync.Lib.Watcher.MovedEventArgs)
{
// Move
CmisSync.Lib.Watcher.MovedEventArgs change =
(CmisSync.Lib.Watcher.MovedEventArgs)earliestChange.GetFileSystemEventArgs();
Logger.DebugFormat("Processing 'Moved': {0} -> {1}.", change.OldFullPath, pathname);
bool done = WatchSyncMove(remoteFolder, localFolder, change.OldFullPath, pathname, earliestChange.GetGrace());
locallyModified |= !done;
}
else if (earliestChange.GetFileSystemEventArgs() is RenamedEventArgs)
{
// Rename
RenamedEventArgs change =
(RenamedEventArgs)earliestChange.GetFileSystemEventArgs();
Logger.DebugFormat("Processing 'Renamed': {0} -> {1}.", change.OldFullPath, pathname);
bool done = WatchSyncMove(remoteFolder, localFolder, change.OldFullPath, pathname, earliestChange.GetGrace());
locallyModified |= !done;
}
else
{
Logger.DebugFormat("Processing '{0}': {1}.",
earliestChange.GetFileSystemEventArgs().ChangeType, pathname);
switch (earliestChange.GetFileSystemEventArgs().ChangeType)
{
case WatcherChangeTypes.Created:
case WatcherChangeTypes.Changed:
bool done = WatcherSyncUpdate(remoteFolder, localFolder, pathname);
locallyModified |= !done;
break;
case WatcherChangeTypes.Deleted:
done = WatcherSyncDelete(remoteFolder, localFolder, pathname, earliestChange.GetGrace());
locallyModified |= !done;
break;
default:
Logger.ErrorFormat("Ignoring change with unhandled type -> '{0}': {1}.",
earliestChange.GetFileSystemEventArgs().ChangeType, pathname);
break;
}
}
}
catch(Exception ex)
{
locallyModified = true;
}
activityListener.ActivityStopped();
}
return locallyModified;
}