CmisSync.Lib.Sync.CmisRepo.SynchronizedFolder.WatcherSync C# (CSharp) Method

WatcherSync() private method

Synchronization based on local filesystem monitoring ("watcher").
private WatcherSync ( string remoteFolder, string localFolder ) : bool
remoteFolder string Remote folder.
localFolder string Local folder.
return bool
            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;
            }