/// <summary> /// Initializes a new instance of the /// <see cref="CreatedChangedDeletedFileSystemEventHandler"/> class. /// </summary> /// <param name="queue">Sync event queue.</param> /// <param name="storage">Meta data storage.</param> /// <param name="fsFactory">File system info factory.</param> /// <param name="threshold">Delay after which a deleted event is passed to the queue.</param> public CreatedChangedDeletedFileSystemEventHandler( ISyncEventQueue queue, IMetaDataStorage storage, IFileSystemInfoFactory fsFactory = null, long threshold = 100) { if (queue == null) { throw new ArgumentNullException("Given queue is null"); } if (storage == null) { throw new ArgumentNullException("Given storage is null"); } this.queue = queue; this.storage = storage; this.threshold = threshold; this.fsFactory = fsFactory ?? new FileSystemInfoFactory(); this.events = new List <Tuple <FileSystemEventArgs, Guid, DateTime, bool> >(); this.timer = new Timer(); this.timer.AutoReset = false; this.timer.Elapsed += (sender, e) => this.PopEventsFromList(); }
/// <summary> /// Initializes a new instance of the <see cref="RemoteObjectMovedOrRenamedAccumulator"/> class. /// </summary> /// <param name="queue">Sync event queue.</param> /// <param name="storage">Meta data storage.</param> /// <param name="fsFactory">FileSystemInfo factory.</param> public RemoteObjectMovedOrRenamedAccumulator(ISyncEventQueue queue, IMetaDataStorage storage, IFileSystemInfoFactory fsFactory = null) : base(queue) { if (storage == null) { throw new ArgumentNullException("storage"); } this.storage = storage; this.fsFactory = fsFactory == null ? new FileSystemInfoFactory() : fsFactory; }
/// <summary> /// Initializes a new instance of the <see cref="CmisSync.Lib.Filter.IgnoreAlreadyHandledFsEventsFilter"/> class. /// </summary> /// <param name="storage">Storage instance.</param> /// <param name="fsFactory">Fs factory.</param> public IgnoreAlreadyHandledFsEventsFilter(IMetaDataStorage storage, IFileSystemInfoFactory fsFactory = null) { if (storage == null) { throw new ArgumentNullException("storage"); } this.storage = storage; this.fsFactory = fsFactory ?? new FileSystemInfoFactory(); }
/// <summary> /// Initializes a new instance of the <see cref="RenamedFileSystemEventHandler"/> class. /// </summary> /// <param name="queue">Sync event queue to report the events to.</param> /// <param name="fsFactory">File system factory.</param> public RenamedFileSystemEventHandler(ISyncEventQueue queue, IFileSystemInfoFactory fsFactory = null) { if (queue == null) { throw new ArgumentNullException("queue"); } this.queue = queue; this.fsFactory = fsFactory ?? new FileSystemInfoFactory(); }
public HandlerMockWithoutTimerAction( ISyncEventQueue queue, IMetaDataStorage storage, IFileSystemInfoFactory fsFactory) : base(queue, storage, fsFactory, 10) { this.timer.Dispose(); this.timer = new Timer(); this.timer.AutoReset = false; }
/// <summary> /// Initializes a new instance of the <see cref="EventManagerInitializer"/> class. /// </summary> /// <param name='queue'>The SyncEventQueue.</param> /// <param name='storage'>Storage for Metadata.</param> /// <param name='fileTransmissionStorage'>Storage for file transmissions.</param> /// <param name='ignoredStorage'>Storage for ignored entities.</param> /// <param name='repoInfo'>Repo info.</param> /// <param name='filter'>Filter aggregation.</param> /// <param name='activityListner'>Listener for Sync activities.</param> /// <param name='fsFactory'>File system factory.</param> /// <exception cref='ArgumentNullException'> /// Is thrown when an argument passed to a method is invalid because it is <see langword="null" /> . /// </exception> public EventManagerInitializer( ISyncEventQueue queue, IMetaDataStorage storage, IFileTransmissionStorage fileTransmissionStorage, IIgnoredEntitiesStorage ignoredStorage, RepoInfo repoInfo, IFilterAggregator filter, ActivityListenerAggregator activityListener, IFileSystemInfoFactory fsFactory = null) : base(queue) { if (storage == null) { throw new ArgumentNullException("storage"); } if (fileTransmissionStorage == null) { throw new ArgumentNullException("fileTransmissionStorage"); } if (repoInfo == null) { throw new ArgumentNullException("repoInfo"); } if (filter == null) { throw new ArgumentNullException("filter"); } if (activityListener == null) { throw new ArgumentNullException("activityListener"); } if (ignoredStorage == null) { throw new ArgumentNullException("ignoredStorage", "Given storage for ignored entries is null"); } if (fsFactory == null) { this.fileSystemFactory = new FileSystemInfoFactory(); } else { this.fileSystemFactory = fsFactory; } this.filter = filter; this.repoInfo = repoInfo; this.storage = storage; this.ignoredStorage = ignoredStorage; this.fileTransmissionStorage = fileTransmissionStorage; this.activityListener = activityListener; }
/// <summary> /// Initializes a new instance of the <see cref="RenamedFileSystemEventHandler"/> class. /// </summary> /// <param name="queue">Sync event queue to report the events to.</param> /// <param name="fsFactory">File system factory.</param> public RenamedFileSystemEventHandler(ISyncEventQueue queue, IFileSystemInfoFactory fsFactory = null) { if (queue == null) { throw new ArgumentNullException("Given queue is null"); } this.queue = queue; this.fsFactory = fsFactory ?? new FileSystemInfoFactory(); }
public Ls(IConsole console, IDirectory directory, IFileSystemInfoFactory factory, ILinkManager linkManager) { _console = console; _directory = directory; _factory = factory; _linkManager = linkManager; }
/// <summary> /// Initializes a new instance of the <see cref="LocalObjectFetcher"/> class. /// </summary> /// <param name='matcher'> /// Matcher from IMetaDataStorage /// </param> /// <param name='fsFactory'> /// Fs factory, should be null unless in Unit Tests /// </param> /// <exception cref='ArgumentNullException'> /// Is thrown when an argument passed to a method is invalid because it is <see langword="null" /> . /// </exception> public LocalObjectFetcher(IPathMatcher matcher, IFileSystemInfoFactory fsFactory = null) { if (matcher == null) { throw new ArgumentNullException("matcher"); } this.matcher = matcher; if(fsFactory == null) { this.fsFactory = new FileSystemInfoFactory(); } else { this.fsFactory = fsFactory; } }
public LocalEventGenerator(IMetaDataStorage storage, IFileSystemInfoFactory fsFactory = null) { if (storage == null) { throw new ArgumentNullException("storage"); } this.storage = storage; if (fsFactory == null) { this.fsFactory = new FileSystemInfoFactory(); } else { this.fsFactory = fsFactory; } }
/// <summary> /// Initializes a new instance of the /// <see cref="CmisSync.Lib.Consumer.SituationSolver.LocalObjectChangedRemoteObjectChanged"/> class. /// </summary> /// <param name="session">Cmis session.</param> /// <param name="storage">Meta data storage.</param> /// <param name="transmissionStorage">Transmission storage.</param> /// <param name="transmissionManager">Transmission manager.</param> /// <param name="fsFactory">File system factory.</param> public LocalObjectChangedRemoteObjectChanged( ISession session, IMetaDataStorage storage, IFileTransmissionStorage transmissionStorage, ITransmissionManager transmissionManager, IFileSystemInfoFactory fsFactory = null) : base(session, storage, transmissionStorage) { if (transmissionManager == null) { throw new ArgumentNullException("transmissionManager"); } this.transmissionManager = transmissionManager; this.fsFactory = fsFactory ?? new FileSystemInfoFactory(); }
/// <summary> /// Initializes a new instance of the <see cref="CmisSync.Lib.Sync.Strategy.ContentChangeEventTransformer"/> class. /// </summary> /// <param name='queue'> /// The ISyncEventQueue. /// </param> /// <param name='storage'> /// The MetaDataStorage. /// </param> /// <param name='fsFactory'> /// Fs factory can be null. /// </param> /// <exception cref='ArgumentNullException'> /// Is thrown when an argument passed to a method is invalid because it is <see langword="null" /> . /// </exception> public ContentChangeEventTransformer(ISyncEventQueue queue, IMetaDataStorage storage, IFileSystemInfoFactory fsFactory = null) : base(queue) { if (storage == null) { throw new ArgumentNullException("storage"); } this.storage = storage; if (fsFactory == null) { this.fsFactory = new FileSystemInfoFactory(); } else { this.fsFactory = fsFactory; } }
/// <summary> /// Initializes a new instance of the <see cref="CmisSync.Lib.Consumer.SituationSolver.RemoteObjectChanged"/> class. /// </summary> /// <param name="session">Cmis session.</param> /// <param name="storage">Meta data storage.</param> /// <param name="transmissonManager">Transmisson manager.</param> /// <param name="fsFactory">File System Factory.</param> public RemoteObjectChanged( ISession session, IMetaDataStorage storage, ActiveActivitiesManager transmissonManager, IFileSystemInfoFactory fsFactory = null) : base(session, storage) { if (transmissonManager == null) { throw new ArgumentNullException("Given transmission manager is null"); } this.transmissonManager = transmissonManager; this.fsFactory = fsFactory ?? new FileSystemInfoFactory(); }
/// <summary> /// Initializes a new instance of the <see cref="CmisSync.Lib.Consumer.SituationSolver.RemoteObjectAdded"/> class. /// </summary> /// <param name="session">Cmis session.</param> /// <param name="storage">Meta data storage.</param> /// <param name="transmissionStorage">Transmission progress storage.</param> /// <param name="transmissionManager">Transmission manager.</param> /// <param name="fsFactory">File system factory.</param> public RemoteObjectAdded( ISession session, IMetaDataStorage storage, IFileTransmissionStorage transmissionStorage, TransmissionManager transmissionManager, IFileSystemInfoFactory fsFactory = null) : base(session, storage, transmissionStorage) { if (transmissionManager == null) { throw new ArgumentNullException("transmissionManager"); } this.fsFactory = fsFactory ?? new FileSystemInfoFactory(); this.manager = transmissionManager; }
/// <summary> /// Initializes a new instance of the <see cref="LocalObjectFetcher"/> class. /// </summary> /// <param name='matcher'> /// Matcher from IMetaDataStorage /// </param> /// <param name='fsFactory'> /// Fs factory, should be null unless in Unit Tests /// </param> /// <exception cref='ArgumentNullException'> /// Is thrown when an argument passed to a method is invalid because it is <see langword="null" /> . /// </exception> public LocalObjectFetcher(IPathMatcher matcher, IFileSystemInfoFactory fsFactory = null) { if (matcher == null) { throw new ArgumentNullException("matcher"); } this.matcher = matcher; if (fsFactory == null) { this.fsFactory = new FileSystemInfoFactory(); } else { this.fsFactory = fsFactory; } }
public LocalEventGenerator(IMetaDataStorage storage, IFileSystemInfoFactory fsFactory = null) { if (storage == null) { throw new ArgumentNullException("Given storage is null"); } this.storage = storage; if (fsFactory == null) { this.fsFactory = new FileSystemInfoFactory(); } else { this.fsFactory = fsFactory; } }
/// <summary> /// Initializes a new instance of the <see cref="NetWatcher"/> class. /// Takes the given file system watcher and listens for events and passes them to the given queue /// </summary> /// <param name="watcher">File System Watcher.</param> /// <param name="queue">Queue for the occured events.</param> /// <param name="storage">Meta Data Storage to verify, if a deleted object is a file or folder.</param> /// <param name="fsFactory">File system info factory. If factory is null, the normal file system is used, otherwise the given factory.</param> public NetWatcher( FileSystemWatcher watcher, ISyncEventQueue queue, IMetaDataStorage storage, FileSystemInfoFactory fsFactory = null) { if (watcher == null) { throw new ArgumentNullException("The given fs watcher must not be null"); } if (string.IsNullOrEmpty(watcher.Path)) { throw new ArgumentException("The given watcher must contain a path, where it is listening"); } if (queue == null) { throw new ArgumentNullException("The given queue must not be null"); } if (storage == null) { throw new ArgumentNullException("The given storage must not be null"); } this.fsFactory = fsFactory ?? new FileSystemInfoFactory(); this.queue = queue; this.storage = storage; this.fileSystemWatcher = watcher; this.fileSystemWatcher.IncludeSubdirectories = true; this.fileSystemWatcher.Filter = "*"; this.fileSystemWatcher.InternalBufferSize = 4 * 1024 * 16; this.fileSystemWatcher.NotifyFilter = NotifyFilters.Size | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.LastWrite | NotifyFilters.Security; this.createChangeDeleteHandler = new CreatedChangedDeletedFileSystemEventHandler(this.queue, this.storage, this.fsFactory); this.renamedHandler = new RenamedFileSystemEventHandler(this.queue, this.fsFactory); this.fileSystemWatcher.Created += new FileSystemEventHandler(this.createChangeDeleteHandler.Handle); this.fileSystemWatcher.Deleted += new FileSystemEventHandler(this.createChangeDeleteHandler.Handle); this.fileSystemWatcher.Changed += new FileSystemEventHandler(this.createChangeDeleteHandler.Handle); this.fileSystemWatcher.Renamed += new RenamedEventHandler(this.renamedHandler.Handle); }
public ConsoleColor GetColor(out string qualifier, ConsoleColor defaultColor, IFileSystemInfoFactory factory, ILinkManager manager) { qualifier = string.Empty; ConsoleColor entryColor = defaultColor; string target; if (manager.TryGetLink(Info, out target)) { var targetInfo = factory.Build(target); if (targetInfo.Exists) { entryColor = ConsoleColor.Cyan; qualifier = "@"; } else { entryColor = ConsoleColor.Red; qualifier = "@"; } } else if (Info.Attributes.HasFlag(FileAttributes.Directory)) { entryColor = ConsoleColor.Blue; qualifier = "/"; } else if (Info.Attributes.HasFlag(FileAttributes.System)) { entryColor = ConsoleColor.DarkYellow; } else if (Info.Attributes.HasFlag(FileAttributes.Compressed) || Info.Attributes.HasFlag(FileAttributes.Archive) || Info.IsCompressionExtension()) { entryColor = ConsoleColor.Magenta; } else if (Info.IsExecutable(ClaimsPrincipal.Current.Identity.Name)) { entryColor = ConsoleColor.Green; qualifier = "*"; } return(entryColor); }
/// <summary> /// Initializes a new instance of the <see cref="EventManagerInitializer"/> class. /// </summary> /// <param name='queue'>The SyncEventQueue.</param> /// <param name='storage'>Storage for Metadata.</param> /// <param name='repoInfo'>Repo info.</param> /// <param name="filter">Filter aggregation.</param> /// <param name='activityListner'>Listener for Sync activities.</param> /// <param name='fsFactory'>File system factory.</param> /// <exception cref='ArgumentNullException'> /// Is thrown when an argument passed to a method is invalid because it is <see langword="null" /> . /// </exception> public EventManagerInitializer( ISyncEventQueue queue, IMetaDataStorage storage, RepoInfo repoInfo, IFilterAggregator filter, ActivityListenerAggregator activityListener, IFileSystemInfoFactory fsFactory = null) : base(queue) { if (storage == null) { throw new ArgumentNullException("storage null"); } if (repoInfo == null) { throw new ArgumentNullException("Repoinfo null"); } if (filter == null) { throw new ArgumentNullException("Filter null"); } if (activityListener == null) { throw new ArgumentNullException("Given activityListener is null"); } if (fsFactory == null) { this.fileSystemFactory = new FileSystemInfoFactory(); } else { this.fileSystemFactory = fsFactory; } this.filter = filter; this.repoInfo = repoInfo; this.storage = storage; this.activityListener = activityListener; }
public CrawlEventGenerator(IMetaDataStorage storage, IFileSystemInfoFactory fsFactory = null) { if (storage == null) { throw new ArgumentNullException("storage"); } this.storage = storage; if (fsFactory == null) { this.fsFactory = new FileSystemInfoFactory(); } else { this.fsFactory = fsFactory; } this.localEventGenerator = new LocalEventGenerator(this.storage, this.fsFactory); this.remoteEventGenerator = new RemoteEventGenerator(this.storage); }
/// <summary> /// Initializes a new instance of the <see cref="NetWatcher"/> class. /// Takes the given file system watcher and listens for events and passes them to the given queue /// </summary> /// <param name="watcher">File System Watcher.</param> /// <param name="queue">Queue for the occured events.</param> /// <param name="storage">Meta Data Storage to verify, if a deleted object is a file or folder.</param> /// <param name="fsFactory">File system info factory. If factory is null, the normal file system is used, otherwise the given factory.</param> public NetWatcher( FileSystemWatcher watcher, ISyncEventQueue queue, IMetaDataStorage storage, FileSystemInfoFactory fsFactory = null) { if (watcher == null) { throw new ArgumentNullException("watcher"); } if (string.IsNullOrEmpty(watcher.Path)) { throw new ArgumentException("The given watcher must contain a path, where it is listening"); } if (queue == null) { throw new ArgumentNullException("queue"); } if (storage == null) { throw new ArgumentNullException("storage"); } this.fsFactory = fsFactory ?? new FileSystemInfoFactory(); this.queue = queue; this.storage = storage; this.fileSystemWatcher = watcher; this.fileSystemWatcher.IncludeSubdirectories = true; this.fileSystemWatcher.Filter = "*"; this.fileSystemWatcher.InternalBufferSize = 4 * 1024 * 16; this.fileSystemWatcher.NotifyFilter = NotifyFilters.Size | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.LastWrite | NotifyFilters.Security; this.createChangeDeleteHandler = new CreatedChangedDeletedFileSystemEventHandler(this.queue, this.storage, this.fsFactory); this.renamedHandler = new RenamedFileSystemEventHandler(this.queue, this.fsFactory); this.fileSystemWatcher.Created += new FileSystemEventHandler(this.createChangeDeleteHandler.Handle); this.fileSystemWatcher.Deleted += new FileSystemEventHandler(this.createChangeDeleteHandler.Handle); this.fileSystemWatcher.Changed += new FileSystemEventHandler(this.createChangeDeleteHandler.Handle); this.fileSystemWatcher.Renamed += new RenamedEventHandler(this.renamedHandler.Handle); }
/// <summary> /// Initializes a new instance of the <see cref="CmisSync.Lib.Consumer.SituationSolver.RemoteObjectAdded"/> class. /// </summary> /// <param name="session">Cmis session.</param> /// <param name="storage">Meta data storage.</param> /// <param name="queue">Queue to report new transmissions to.</param> /// <param name="transmissonManager">Transmisson manager.</param> /// <param name="fsFactory">File system factory.</param> public RemoteObjectAdded( ISession session, IMetaDataStorage storage, ISyncEventQueue queue, ActiveActivitiesManager transmissonManager, IFileSystemInfoFactory fsFactory = null) : base(session, storage) { if (queue == null) { throw new ArgumentNullException("Given queue is null"); } if (transmissonManager == null) { throw new ArgumentNullException("Given transmission manager is null"); } this.fsFactory = fsFactory ?? new FileSystemInfoFactory(); this.queue = queue; this.manager = transmissonManager; }
/// <summary> /// Initializes a new instance of the /// <see cref="CreatedChangedDeletedFileSystemEventHandler"/> class. /// </summary> /// <param name="queue">Sync event queue.</param> /// <param name="storage">Meta data storage.</param> /// <param name="fsFactory">File system info factory.</param> /// <param name="threshold">Delay after which a deleted event is passed to the queue.</param> public CreatedChangedDeletedFileSystemEventHandler( ISyncEventQueue queue, IMetaDataStorage storage, IFileSystemInfoFactory fsFactory = null, long threshold = 100) { if (queue == null) { throw new ArgumentNullException("queue"); } if (storage == null) { throw new ArgumentNullException("storage"); } this.queue = queue; this.storage = storage; this.threshold = threshold; this.fsFactory = fsFactory ?? new FileSystemInfoFactory(); this.events = new List<Tuple<FileSystemEventArgs, Guid, DateTime, bool>>(); this.timer = new Timer(); this.timer.AutoReset = false; this.timer.Elapsed += (sender, e) => this.PopEventsFromList(); }
protected byte[] DownloadChanges(IFileInfo target, IDocument remoteDocument, IMappedObject obj, IFileSystemInfoFactory fsFactory, ITransmissionManager transmissionManager, ILog logger) { // Download changes byte[] hash = null; var cacheFile = fsFactory.CreateDownloadCacheFileInfo(target); var transmission = transmissionManager.CreateTransmission(TransmissionType.DOWNLOAD_MODIFIED_FILE, target.FullName, cacheFile.FullName); hash = this.DownloadCacheFile(cacheFile, remoteDocument, transmission, fsFactory); obj.ChecksumAlgorithmName = "SHA-1"; try { var backupFile = fsFactory.CreateFileInfo(target.FullName + ".bak.sync"); Guid? uuid = target.Uuid; cacheFile.Replace(target, backupFile, true); try { target.Uuid = uuid; } catch (RestoreModificationDateException e) { logger.Debug("Failed to restore modification date of original file", e); } try { backupFile.Uuid = null; } catch (RestoreModificationDateException e) { logger.Debug("Failed to restore modification date of backup file", e); } byte[] checksumOfOldFile = null; using (var oldFileStream = backupFile.Open(FileMode.Open, FileAccess.Read, FileShare.None)) { checksumOfOldFile = SHA1Managed.Create().ComputeHash(oldFileStream); } if (!obj.LastChecksum.SequenceEqual(checksumOfOldFile)) { var conflictFile = fsFactory.CreateConflictFileInfo(target); backupFile.MoveTo(conflictFile.FullName); OperationsLogger.Info(string.Format("Updated local content of \"{0}\" with content of remote document {1} and created conflict file {2}", target.FullName, remoteDocument.Id, conflictFile.FullName)); } else { backupFile.Delete(); OperationsLogger.Info(string.Format("Updated local content of \"{0}\" with content of remote document {1}", target.FullName, remoteDocument.Id)); } } catch(Exception ex) { transmission.FailedException = ex; throw; } transmission.Status = TransmissionStatus.FINISHED; return hash; }
public MappedFile (MappedObjectData data, IMetaDataStorage storage, IFileSystemInfoFactory fsFactory = null) : base(data, storage, fsFactory) { }
protected static byte[] DownloadChanges(IFileInfo target, IDocument remoteDocument, IMappedObject obj, IFileSystemInfoFactory fsFactory, ActiveActivitiesManager transmissonManager, ILog logger) { // Download changes byte[] lastChecksum = obj.LastChecksum; byte[] hash = null; var cacheFile = fsFactory.CreateDownloadCacheFileInfo(target); var transmissionEvent = new FileTransmissionEvent(FileTransmissionType.DOWNLOAD_MODIFIED_FILE, target.FullName, cacheFile.FullName); transmissonManager.AddTransmission(transmissionEvent); try { using (SHA1 hashAlg = new SHA1Managed()) { using (var filestream = cacheFile.Open(FileMode.Create, FileAccess.Write, FileShare.None)) using (IFileDownloader download = ContentTaskUtils.CreateDownloader()) { download.DownloadFile(remoteDocument, filestream, transmissionEvent, hashAlg); obj.ChecksumAlgorithmName = "SHA-1"; hash = hashAlg.Hash; } } var backupFile = fsFactory.CreateFileInfo(target.FullName + ".bak.sync"); Guid?uuid = target.Uuid; cacheFile.Replace(target, backupFile, true); try { target.Uuid = uuid; } catch (RestoreModificationDateException e) { logger.Debug("Failed to restore modification date of original file", e); } try { backupFile.Uuid = null; } catch (RestoreModificationDateException e) { logger.Debug("Failed to restore modification date of backup file", e); } byte[] checksumOfOldFile = null; using (var oldFileStream = backupFile.Open(FileMode.Open, FileAccess.Read, FileShare.None)) { checksumOfOldFile = SHA1Managed.Create().ComputeHash(oldFileStream); } if (!lastChecksum.SequenceEqual(checksumOfOldFile)) { var conflictFile = fsFactory.CreateConflictFileInfo(target); backupFile.MoveTo(conflictFile.FullName); OperationsLogger.Info(string.Format("Updated local content of \"{0}\" with content of remote document {1} and created conflict file {2}", target.FullName, remoteDocument.Id, conflictFile.FullName)); } else { backupFile.Delete(); OperationsLogger.Info(string.Format("Updated local content of \"{0}\" with content of remote document {1}", target.FullName, remoteDocument.Id)); } } catch (Exception ex) { transmissionEvent.ReportProgress(new TransmissionProgressEventArgs { FailedException = ex }); throw; } transmissionEvent.ReportProgress(new TransmissionProgressEventArgs { Completed = true }); return(hash); }
/// <summary> /// Initializes a new instance of the <see cref="Repository"/> class. /// </summary> /// <param name="repoInfo">Repo info.</param> /// <param name="activityListener">Activity listener.</param> /// <param name="inMemory">If set to <c>true</c> in memory.</param> /// <param name="queue">Event Queue.</param> protected Repository(RepoInfo repoInfo, ActivityListenerAggregator activityListener, bool inMemory, ICountingQueue queue) : base(repoInfo) { if (activityListener == null) { throw new ArgumentNullException("activityListener"); } this.fileSystemFactory = new FileSystemInfoFactory(); this.activityListener = activityListener; this.rootFolderMonitor = new RepositoryRootDeletedDetection(this.fileSystemFactory.CreateDirectoryInfo(this.LocalPath)); this.rootFolderMonitor.RepoRootDeleted += this.RootFolderAvailablilityChanged; if (!this.fileSystemFactory.CreateDirectoryInfo(this.LocalPath).IsExtendedAttributeAvailable()) { throw new ExtendedAttributeException("Extended Attributes are not available on the local path: " + this.LocalPath); } this.Queue = queue; this.Queue.EventManager.AddEventHandler(rootFolderMonitor); this.Queue.EventManager.AddEventHandler(new DebugLoggingHandler()); // Create Database connection this.db = new DBreezeEngine(new DBreezeConfiguration { DBreezeDataFolderName = inMemory ? string.Empty : repoInfo.GetDatabasePath(), Storage = inMemory ? DBreezeConfiguration.eStorage.MEMORY : DBreezeConfiguration.eStorage.DISK }); // Create session dependencies this.sessionFactory = SessionFactory.NewInstance(); this.authProvider = AuthProviderFactory.CreateAuthProvider(repoInfo.AuthenticationType, repoInfo.Address, this.db); // Initialize storage this.storage = new MetaDataStorage(this.db, new PathMatcher(this.LocalPath, this.RepoInfo.RemotePath), inMemory); this.fileTransmissionStorage = new FileTransmissionStorage(this.db, RepoInfo.ChunkSize); // Add ignore file/folder filter this.ignoredFoldersFilter = new IgnoredFoldersFilter { IgnoredPaths = new List <string>(repoInfo.GetIgnoredPaths()) }; this.ignoredFileNameFilter = new IgnoredFileNamesFilter { Wildcards = ConfigManager.CurrentConfig.IgnoreFileNames }; this.ignoredFolderNameFilter = new IgnoredFolderNameFilter { Wildcards = ConfigManager.CurrentConfig.IgnoreFolderNames }; this.invalidFolderNameFilter = new InvalidFolderNameFilter(); var symlinkFilter = new SymlinkFilter(); this.filters = new FilterAggregator(this.ignoredFileNameFilter, this.ignoredFolderNameFilter, this.invalidFolderNameFilter, this.ignoredFoldersFilter, symlinkFilter); this.reportingFilter = new ReportingFilter( this.Queue, this.ignoredFoldersFilter, this.ignoredFileNameFilter, this.ignoredFolderNameFilter, this.invalidFolderNameFilter, symlinkFilter); this.Queue.EventManager.AddEventHandler(this.reportingFilter); this.alreadyAddedFilter = new IgnoreAlreadyHandledFsEventsFilter(this.storage, this.fileSystemFactory); this.Queue.EventManager.AddEventHandler(this.alreadyAddedFilter); // Add handler for repo config changes this.Queue.EventManager.AddEventHandler(new GenericSyncEventHandler <RepoConfigChangedEvent>(0, this.RepoInfoChanged)); // Add periodic sync procedures scheduler this.Scheduler = new SyncScheduler(this.Queue, repoInfo.PollInterval); this.Queue.EventManager.AddEventHandler(this.Scheduler); // Add File System Watcher #if __COCOA__ this.WatcherProducer = new CmisSync.Lib.Producer.Watcher.MacWatcher(LocalPath, Queue); #else this.WatcherProducer = new NetWatcher(new FileSystemWatcher(this.LocalPath), this.Queue, this.storage); #endif this.WatcherConsumer = new WatcherConsumer(this.Queue); this.Queue.EventManager.AddEventHandler(this.WatcherConsumer); // Add transformer this.transformer = new ContentChangeEventTransformer(this.Queue, this.storage, this.fileSystemFactory); this.Queue.EventManager.AddEventHandler(this.transformer); // Add local fetcher var localFetcher = new LocalObjectFetcher(this.storage.Matcher, this.fileSystemFactory); this.Queue.EventManager.AddEventHandler(localFetcher); this.ignoredStorage = new IgnoredEntitiesStorage(new IgnoredEntitiesCollection(), this.storage); this.Queue.EventManager.AddEventHandler(new EventManagerInitializer(this.Queue, this.storage, this.fileTransmissionStorage, this.ignoredStorage, this.RepoInfo, this.filters, activityListener, this.fileSystemFactory)); this.Queue.EventManager.AddEventHandler(new DelayRetryAndNextSyncEventHandler(this.Queue)); this.connectionScheduler = new ConnectionScheduler(this.RepoInfo, this.Queue, this.sessionFactory, this.authProvider); this.Queue.EventManager.AddEventHandler(this.connectionScheduler); this.Queue.EventManager.AddEventHandler( new GenericSyncEventHandler <SuccessfulLoginEvent>( 10000, delegate(ISyncEvent e) { this.RepoStatusFlags.Connected = true; this.Status = this.RepoStatusFlags.Status; return(false); })); this.Queue.EventManager.AddEventHandler( new GenericSyncEventHandler <ConfigurationNeededEvent>( 10000, delegate(ISyncEvent e) { this.RepoStatusFlags.Warning = true; this.Status = this.RepoStatusFlags.Status; return(false); })); this.unsubscriber = this.Queue.CategoryCounter.Subscribe(this); }
/// <summary> /// Initializes a new instance of the <see cref="Repository"/> class. /// </summary> /// <param name="repoInfo">Repo info.</param> /// <param name="activityListener">Activity listener.</param> /// <param name="inMemory">If set to <c>true</c> in memory.</param> /// <param name="queue">Event Queue.</param> protected Repository(RepoInfo repoInfo, ActivityListenerAggregator activityListener, bool inMemory, IDisposableSyncEventQueue queue) { if (repoInfo == null) { throw new ArgumentNullException("Given repoInfo is null"); } if (activityListener == null) { throw new ArgumentNullException("Given activityListener is null"); } this.fileSystemFactory = new FileSystemInfoFactory(); // Initialize local variables this.RepoInfo = repoInfo; this.LocalPath = repoInfo.LocalPath; this.Name = repoInfo.DisplayName; this.RemoteUrl = repoInfo.Address; if (!this.fileSystemFactory.CreateDirectoryInfo(this.LocalPath).IsExtendedAttributeAvailable()) { throw new ExtendedAttributeException("Extended Attributes are not available on the local path: " + this.LocalPath); } this.Queue = queue; this.Queue.EventManager.AddEventHandler(new DebugLoggingHandler()); // Create Database connection this.db = new DBreezeEngine(new DBreezeConfiguration { DBreezeDataFolderName = inMemory ? string.Empty : repoInfo.GetDatabasePath(), Storage = inMemory ? DBreezeConfiguration.eStorage.MEMORY : DBreezeConfiguration.eStorage.DISK }); // Create session dependencies this.sessionFactory = SessionFactory.NewInstance(); this.authProvider = AuthProviderFactory.CreateAuthProvider(repoInfo.AuthenticationType, repoInfo.Address, this.db); // Initialize storage this.storage = new MetaDataStorage(this.db, new PathMatcher(this.LocalPath, this.RepoInfo.RemotePath)); // Add ignore file/folder filter this.ignoredFoldersFilter = new IgnoredFoldersFilter { IgnoredPaths = new List <string>(repoInfo.GetIgnoredPaths()) }; this.ignoredFileNameFilter = new IgnoredFileNamesFilter { Wildcards = ConfigManager.CurrentConfig.IgnoreFileNames }; this.ignoredFolderNameFilter = new IgnoredFolderNameFilter { Wildcards = ConfigManager.CurrentConfig.IgnoreFolderNames }; this.invalidFolderNameFilter = new InvalidFolderNameFilter(); this.filters = new FilterAggregator(this.ignoredFileNameFilter, this.ignoredFolderNameFilter, this.invalidFolderNameFilter, this.ignoredFoldersFilter); this.reportingFilter = new ReportingFilter( this.Queue, this.ignoredFoldersFilter, this.ignoredFileNameFilter, this.ignoredFolderNameFilter, this.invalidFolderNameFilter); this.Queue.EventManager.AddEventHandler(this.reportingFilter); this.alreadyAddedFilter = new IgnoreAlreadyHandledFsEventsFilter(this.storage, this.fileSystemFactory); this.Queue.EventManager.AddEventHandler(this.alreadyAddedFilter); // Add handler for repo config changes this.Queue.EventManager.AddEventHandler(new GenericSyncEventHandler <RepoConfigChangedEvent>(0, this.RepoInfoChanged)); // Add periodic sync procedures scheduler this.Scheduler = new SyncScheduler(this.Queue, repoInfo.PollInterval); this.Queue.EventManager.AddEventHandler(this.Scheduler); // Add File System Watcher #if __COCOA__ this.WatcherProducer = new CmisSync.Lib.Producer.Watcher.MacWatcher(LocalPath, Queue); #else this.WatcherProducer = new NetWatcher(new FileSystemWatcher(this.LocalPath), this.Queue, this.storage); #endif this.WatcherConsumer = new WatcherConsumer(this.Queue); this.Queue.EventManager.AddEventHandler(this.WatcherConsumer); // Add transformer this.transformer = new ContentChangeEventTransformer(this.Queue, this.storage, this.fileSystemFactory); this.Queue.EventManager.AddEventHandler(this.transformer); // Add local fetcher var localFetcher = new LocalObjectFetcher(this.storage.Matcher, this.fileSystemFactory); this.Queue.EventManager.AddEventHandler(localFetcher); this.SyncStatusChanged += delegate(SyncStatus status) { this.Status = status; }; this.Queue.EventManager.AddEventHandler(new EventManagerInitializer(this.Queue, this.storage, this.RepoInfo, this.filters, activityListener, this.fileSystemFactory)); this.Queue.EventManager.AddEventHandler(new DelayRetryAndNextSyncEventHandler(this.Queue)); this.connectionScheduler = new ConnectionScheduler(this.RepoInfo, this.Queue, this.sessionFactory, this.authProvider); this.Queue.EventManager.AddEventHandler(this.connectionScheduler); }
protected byte[] DownloadCacheFile(IFileInfo target, IDocument remoteDocument, Transmission transmission, IFileSystemInfoFactory fsFactory) { if (!this.LoadCacheFile(target, remoteDocument, fsFactory)) { if (target.Exists) { target.Delete(); } } using (var hashAlg = new SHA1Reuse()) { using (var filestream = target.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) using (var downloader = ContentTaskUtils.CreateDownloader()) { try { downloader.DownloadFile(remoteDocument, filestream, transmission, hashAlg, (byte[] checksumUpdate, long length) => this.SaveCacheFile(target, remoteDocument, checksumUpdate, length, transmission)); if (this.TransmissionStorage != null) { this.TransmissionStorage.RemoveObjectByRemoteObjectId(remoteDocument.Id); } } catch (Exception ex) { transmission.FailedException = ex; throw; } } target.Refresh(); return(hashAlg.Hash); } }
private SingleStepEventQueue CreateQueue(Mock <ISession> session, IMetaDataStorage storage, IFileSystemInfoFactory fsFactory) { return(this.CreateQueue(session, storage, new ObservableHandler(), fsFactory)); }
private SingleStepEventQueue CreateQueue(Mock<ISession> session, IMetaDataStorage storage, ObservableHandler observer, IFileSystemInfoFactory fsFactory = null) { var manager = new SyncEventManager(); SingleStepEventQueue queue = new SingleStepEventQueue(manager); manager.AddEventHandler(observer); var connectionScheduler = new ConnectionScheduler(new RepoInfo(), queue, Mock.Of<ISessionFactory>(), Mock.Of<IAuthenticationProvider>()); manager.AddEventHandler(connectionScheduler); var changes = new ContentChanges(session.Object, storage, queue, this.maxNumberOfContentChanges, this.isPropertyChangesSupported); manager.AddEventHandler(changes); var transformer = new ContentChangeEventTransformer(queue, storage, fsFactory); manager.AddEventHandler(transformer); var ccaccumulator = new ContentChangeEventAccumulator(session.Object, queue); manager.AddEventHandler(ccaccumulator); var remoteFetcher = new RemoteObjectFetcher(session.Object, storage); manager.AddEventHandler(remoteFetcher); var localFetcher = new LocalObjectFetcher(storage.Matcher, fsFactory); manager.AddEventHandler(localFetcher); var watcher = new Strategy.WatcherConsumer(queue); manager.AddEventHandler(watcher); var localDetection = new LocalSituationDetection(); var remoteDetection = new RemoteSituationDetection(); var transmissionManager = new TransmissionManager(); var activityAggregator = new ActivityListenerAggregator(Mock.Of<IActivityListener>(), transmissionManager); var ignoreFolderFilter = new IgnoredFoldersFilter(); var ignoreFolderNameFilter = new IgnoredFolderNameFilter(); var ignoreFileNamesFilter = new IgnoredFileNamesFilter(); var invalidFolderNameFilter = new InvalidFolderNameFilter(); var filterAggregator = new FilterAggregator(ignoreFileNamesFilter, ignoreFolderNameFilter, invalidFolderNameFilter, ignoreFolderFilter); var syncMechanism = new SyncMechanism(localDetection, remoteDetection, queue, session.Object, storage, Mock.Of<IFileTransmissionStorage>(), activityAggregator, filterAggregator); manager.AddEventHandler(syncMechanism); var remoteFolder = MockSessionUtil.CreateCmisFolder(); remoteFolder.Setup(r => r.Path).Returns(this.remoteRoot); var localFolder = new Mock<IDirectoryInfo>(); localFolder.Setup(f => f.FullName).Returns(this.localRoot); var generator = new CrawlEventGenerator(storage, fsFactory); var ignoreStorage = new IgnoredEntitiesStorage(new IgnoredEntitiesCollection(), storage); var treeBuilder = new DescendantsTreeBuilder(storage, remoteFolder.Object, localFolder.Object, filterAggregator, ignoreStorage); var notifier = new CrawlEventNotifier(queue); var crawler = new DescendantsCrawler(queue, treeBuilder, generator, notifier, Mock.Of<IActivityListener>()); manager.AddEventHandler(crawler); var permissionDenied = new GenericHandleDublicatedEventsFilter<PermissionDeniedEvent, ConfigChangedEvent>(); manager.AddEventHandler(permissionDenied); var alreadyAddedFilter = new IgnoreAlreadyHandledFsEventsFilter(storage, fsFactory); manager.AddEventHandler(alreadyAddedFilter); var ignoreContentChangesFilter = new IgnoreAlreadyHandledContentChangeEventsFilter(storage, session.Object); manager.AddEventHandler(ignoreContentChangesFilter); var delayRetryAndNextSyncEventHandler = new DelayRetryAndNextSyncEventHandler(queue); manager.AddEventHandler(delayRetryAndNextSyncEventHandler); /* This is not implemented yet var failedOperationsFilder = new FailedOperationsFilter(queue); manager.AddEventHandler(failedOperationsFilder); */ var reportingFilter = new ReportingFilter(queue, ignoreFolderFilter, ignoreFileNamesFilter, ignoreFolderNameFilter, invalidFolderNameFilter, new SymlinkFilter()); manager.AddEventHandler(reportingFilter); var debugHandler = new DebugLoggingHandler(); manager.AddEventHandler(debugHandler); var movedOrRenamed = new RemoteObjectMovedOrRenamedAccumulator(queue, storage, fsFactory); manager.AddEventHandler(movedOrRenamed); return queue; }
private bool LoadCacheFile(IFileInfo target, IDocument remoteDocument, IFileSystemInfoFactory fsFactory) { if (this.TransmissionStorage == null) { return(false); } IFileTransmissionObject obj = this.TransmissionStorage.GetObjectByRemoteObjectId(remoteDocument.Id); if (obj == null) { return(false); } IFileInfo localFile = fsFactory.CreateFileInfo(obj.LocalPath); if (!localFile.Exists) { return(false); } if (obj.LastChangeToken != remoteDocument.ChangeToken || localFile.Length != obj.LastContentSize) { localFile.Delete(); return(false); } try { byte[] localHash; using (var f = localFile.Open(FileMode.Open, FileAccess.Read, FileShare.None)) { localHash = SHA1Managed.Create().ComputeHash(f); } if (!localHash.SequenceEqual(obj.LastChecksum)) { localFile.Delete(); return(false); } if (target.FullName != obj.LocalPath) { if (target.Exists) { Guid?uuid = target.Uuid; if (uuid != null) { localFile.Uuid = uuid; } target.Delete(); } localFile.MoveTo(target.FullName); target.Refresh(); } return(true); } catch (Exception) { localFile.Delete(); return(false); } }
private SingleStepEventQueue CreateQueue(Mock<ISession> session, IMetaDataStorage storage, IFileSystemInfoFactory fsFactory) { return this.CreateQueue(session, storage, new ObservableHandler(), fsFactory); }
private SingleStepEventQueue CreateQueue(Mock <ISession> session, IMetaDataStorage storage, ObservableHandler observer, IFileSystemInfoFactory fsFactory = null) { var manager = new SyncEventManager(); SingleStepEventQueue queue = new SingleStepEventQueue(manager); manager.AddEventHandler(observer); var connectionScheduler = new ConnectionScheduler(new RepoInfo(), queue, Mock.Of <ISessionFactory>(), Mock.Of <IAuthenticationProvider>()); manager.AddEventHandler(connectionScheduler); var changes = new ContentChanges(session.Object, storage, queue, this.maxNumberOfContentChanges, this.isPropertyChangesSupported); manager.AddEventHandler(changes); var transformer = new ContentChangeEventTransformer(queue, storage, fsFactory); manager.AddEventHandler(transformer); var ccaccumulator = new ContentChangeEventAccumulator(session.Object, queue); manager.AddEventHandler(ccaccumulator); var remoteFetcher = new RemoteObjectFetcher(session.Object, storage); manager.AddEventHandler(remoteFetcher); var localFetcher = new LocalObjectFetcher(storage.Matcher, fsFactory); manager.AddEventHandler(localFetcher); var watcher = new Strategy.WatcherConsumer(queue); manager.AddEventHandler(watcher); var localDetection = new LocalSituationDetection(); var remoteDetection = new RemoteSituationDetection(); var transmissionManager = new ActiveActivitiesManager(); var activityAggregator = new ActivityListenerAggregator(Mock.Of <IActivityListener>(), transmissionManager); var ignoreFolderFilter = new IgnoredFoldersFilter(); var ignoreFolderNameFilter = new IgnoredFolderNameFilter(); var ignoreFileNamesFilter = new IgnoredFileNamesFilter(); var invalidFolderNameFilter = new InvalidFolderNameFilter(); var filterAggregator = new FilterAggregator(ignoreFileNamesFilter, ignoreFolderNameFilter, invalidFolderNameFilter, ignoreFolderFilter); var syncMechanism = new SyncMechanism(localDetection, remoteDetection, queue, session.Object, storage, activityAggregator, filterAggregator, isServerAbleToUpdateModificationDate: true); manager.AddEventHandler(syncMechanism); var remoteFolder = MockSessionUtil.CreateCmisFolder(); var localFolder = new Mock <IDirectoryInfo>(); var generator = new CrawlEventGenerator(storage, fsFactory); var treeBuilder = new DescendantsTreeBuilder(storage, remoteFolder.Object, localFolder.Object, filterAggregator); var notifier = new CrawlEventNotifier(queue); var crawler = new DescendantsCrawler(queue, treeBuilder, generator, notifier, Mock.Of <IActivityListener>()); manager.AddEventHandler(crawler); var permissionDenied = new GenericHandleDublicatedEventsFilter <PermissionDeniedEvent, ConfigChangedEvent>(); manager.AddEventHandler(permissionDenied); var alreadyAddedFilter = new IgnoreAlreadyHandledFsEventsFilter(storage, fsFactory); manager.AddEventHandler(alreadyAddedFilter); var ignoreContentChangesFilter = new IgnoreAlreadyHandledContentChangeEventsFilter(storage, session.Object); manager.AddEventHandler(ignoreContentChangesFilter); var delayRetryAndNextSyncEventHandler = new DelayRetryAndNextSyncEventHandler(queue); manager.AddEventHandler(delayRetryAndNextSyncEventHandler); /* This is not implemented yet * var failedOperationsFilder = new FailedOperationsFilter(queue); * manager.AddEventHandler(failedOperationsFilder); */ var reportingFilter = new ReportingFilter(queue, ignoreFolderFilter, ignoreFileNamesFilter, ignoreFolderNameFilter, invalidFolderNameFilter); manager.AddEventHandler(reportingFilter); var debugHandler = new DebugLoggingHandler(); manager.AddEventHandler(debugHandler); var movedOrRenamed = new RemoteObjectMovedOrRenamedAccumulator(queue, storage, fsFactory); manager.AddEventHandler(movedOrRenamed); return(queue); }
protected byte[] DownloadCacheFile(IFileInfo target, IDocument remoteDocument, Transmission transmission, IFileSystemInfoFactory fsFactory) { if (!this.LoadCacheFile(target, remoteDocument, fsFactory)) { if (target.Exists) { target.Delete(); } } using (var hashAlg = new SHA1Reuse()) { using (var filestream = target.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) using (var downloader = ContentTaskUtils.CreateDownloader()) { try { downloader.DownloadFile(remoteDocument, filestream, transmission, hashAlg, (byte[] checksumUpdate, long length) => this.SaveCacheFile(target, remoteDocument, checksumUpdate, length, transmission)); if (this.TransmissionStorage != null) { this.TransmissionStorage.RemoveObjectByRemoteObjectId(remoteDocument.Id); } } catch (Exception ex) { transmission.FailedException = ex; throw; } } target.Refresh(); return hashAlg.Hash; } }
protected byte[] DownloadChanges(IFileInfo target, IDocument remoteDocument, IMappedObject obj, IFileSystemInfoFactory fsFactory, ITransmissionManager transmissionManager, ILog logger) { // Download changes byte[] hash = null; var cacheFile = fsFactory.CreateDownloadCacheFileInfo(target); var transmission = transmissionManager.CreateTransmission(TransmissionType.DOWNLOAD_MODIFIED_FILE, target.FullName, cacheFile.FullName); hash = this.DownloadCacheFile(cacheFile, remoteDocument, transmission, fsFactory); obj.ChecksumAlgorithmName = "SHA-1"; try { var backupFile = fsFactory.CreateFileInfo(target.FullName + ".bak.sync"); Guid?uuid = target.Uuid; cacheFile.Replace(target, backupFile, true); try { target.Uuid = uuid; } catch (RestoreModificationDateException e) { logger.Debug("Failed to restore modification date of original file", e); } try { backupFile.Uuid = null; } catch (RestoreModificationDateException e) { logger.Debug("Failed to restore modification date of backup file", e); } byte[] checksumOfOldFile = null; using (var oldFileStream = backupFile.Open(FileMode.Open, FileAccess.Read, FileShare.None)) { checksumOfOldFile = SHA1Managed.Create().ComputeHash(oldFileStream); } if (!obj.LastChecksum.SequenceEqual(checksumOfOldFile)) { var conflictFile = fsFactory.CreateConflictFileInfo(target); backupFile.MoveTo(conflictFile.FullName); OperationsLogger.Info(string.Format("Updated local content of \"{0}\" with content of remote document {1} and created conflict file {2}", target.FullName, remoteDocument.Id, conflictFile.FullName)); } else { backupFile.Delete(); OperationsLogger.Info(string.Format("Updated local content of \"{0}\" with content of remote document {1}", target.FullName, remoteDocument.Id)); } } catch (Exception ex) { transmission.FailedException = ex; throw; } transmission.Status = TransmissionStatus.FINISHED; return(hash); }
public MappedFile(MappedObjectData data, IMetaDataStorage storage, IFileSystemInfoFactory fsFactory = null) : base(data, storage, fsFactory) { }
private bool LoadCacheFile(IFileInfo target, IDocument remoteDocument, IFileSystemInfoFactory fsFactory) { if (this.TransmissionStorage == null) { return false; } IFileTransmissionObject obj = this.TransmissionStorage.GetObjectByRemoteObjectId(remoteDocument.Id); if (obj == null) { return false; } IFileInfo localFile = fsFactory.CreateFileInfo(obj.LocalPath); if (!localFile.Exists) { return false; } if (obj.LastChangeToken != remoteDocument.ChangeToken || localFile.Length != obj.LastContentSize) { localFile.Delete(); return false; } try { byte[] localHash; using (var f = localFile.Open(FileMode.Open, FileAccess.Read, FileShare.None)) { localHash = SHA1Managed.Create().ComputeHash(f); } if (!localHash.SequenceEqual(obj.LastChecksum)) { localFile.Delete(); return false; } if (target.FullName != obj.LocalPath) { if (target.Exists) { Guid? uuid = target.Uuid; if (uuid != null) { localFile.Uuid = uuid; } target.Delete(); } localFile.MoveTo(target.FullName); target.Refresh(); } return true; } catch (Exception) { localFile.Delete(); return false; } }