/// <summary> /// Iterate over all active files in the state. /// </summary> /// <param name="mode">RaiseAlways to raise Changed event for each active file, RaiseOnlyOnModified to only raise for modified active files.</param> /// <param name="action">A delegate with an action to take for each active file, returning the same or updated active file as need be.</param> public void ForEach(ChangedEventMode mode, Func <ActiveFile, ActiveFile> action) { if (action == null) { throw new ArgumentNullException("action"); } bool isModified = false; List <ActiveFile> activeFiles = new List <ActiveFile>(); foreach (ActiveFile activeFile in ActiveFiles) { ActiveFile updatedActiveFile = action(activeFile); activeFiles.Add(updatedActiveFile); if (updatedActiveFile != activeFile) { isModified = true; OnChanged(new ActiveFileChangedEventArgs(updatedActiveFile)); activeFile.Dispose(); } } if (isModified) { lock (_lock) { SetRangeInternal(activeFiles, ActiveFileStatus.None); } Save(); } if (!isModified && mode == ChangedEventMode.RaiseAlways) { RaiseChangedForAll(activeFiles); } }
/// <summary> /// Enumerate all files listed as active, checking for status changes and take appropriate actions such as updating status /// in the FileSystemState, re-encrypting or deleting temporary plaintext copies. /// </summary> /// <param name="fileSystemState">The FileSystemState to enumerate and possibly update.</param> /// <param name="mode">Under what circumstances is the FileSystemState.Changed event raised.</param> /// <param name="progress">The ProgressContext to provide visual progress feedback via.</param> public static void CheckActiveFiles(this FileSystemState fileSystemState, ChangedEventMode mode, ProgressContext progress) { progress.NotifyLevelStart(); progress.AddTotal(fileSystemState.ActiveFileCount); fileSystemState.ForEach(mode, (ActiveFile activeFile) => { try { if (FileLock.IsLocked(activeFile.DecryptedFileInfo, activeFile.EncryptedFileInfo)) { return(activeFile); } if (OS.Current.UtcNow - activeFile.LastActivityTimeUtc <= new TimeSpan(0, 0, 5)) { return(activeFile); } activeFile = fileSystemState.CheckActiveFileActions(activeFile, progress); return(activeFile); } finally { progress.AddCount(1); } }); progress.NotifyLevelFinished(); }
/// <summary> /// Enumerate all files listed as active, checking for status changes and take appropriate actions such as updating status /// in the FileSystemState, re-encrypting or deleting temporary plaintext copies. /// </summary> /// <param name="fileSystemState">The FileSystemState to enumerate and possibly update.</param> /// <param name="mode">Under what circumstances is the FileSystemState.Changed event raised.</param> /// <param name="progress">The ProgressContext to provide visual progress feedback via.</param> public static void CheckActiveFiles(this FileSystemState fileSystemState, ChangedEventMode mode, ProgressContext progress) { progress.NotifyLevelStart(); progress.AddTotal(fileSystemState.ActiveFileCount); fileSystemState.ForEach(mode, (ActiveFile activeFile) => { try { if (FileLock.IsLocked(activeFile.DecryptedFileInfo, activeFile.EncryptedFileInfo)) { return activeFile; } if (OS.Current.UtcNow - activeFile.LastActivityTimeUtc <= new TimeSpan(0, 0, 5)) { return activeFile; } activeFile = fileSystemState.CheckActiveFileActions(activeFile, progress); return activeFile; } finally { progress.AddCount(1); } }); progress.NotifyLevelFinished(); }
/// <summary> /// Iterate over all active files in the state. /// </summary> /// <param name="mode">RaiseAlways to raise Changed event for each active file, RaiseOnlyOnModified to only raise for modified active files.</param> /// <param name="action">A delegate with an action to take for each active file, returning the same or updated active file as need be.</param> public void ForEach(ChangedEventMode mode, Func<ActiveFile, ActiveFile> action) { if (action == null) { throw new ArgumentNullException("action"); } bool isModified = false; List<ActiveFile> activeFiles = new List<ActiveFile>(); foreach (ActiveFile activeFile in ActiveFiles) { ActiveFile updatedActiveFile = action(activeFile); activeFiles.Add(updatedActiveFile); if (updatedActiveFile != activeFile) { isModified = true; OnChanged(new ActiveFileChangedEventArgs(updatedActiveFile)); activeFile.Dispose(); } } if (isModified) { lock (_lock) { SetRangeInternal(activeFiles, ActiveFileStatus.None); } Save(); } if (!isModified && mode == ChangedEventMode.RaiseAlways) { RaiseChangedForAll(activeFiles); } }