/* Function: ReleaseFileSource * Releases a <FileSource> claimed via <PickFileSource()> after all processing is complete on it. */ protected void ReleaseFileSource(FileSource fileSource, FileSourceAdder fileSourceAdder, bool scanningCompleted) { lock (accessLock) { // If scanning wasn't completed allow it to be chosen again if (!scanningCompleted) { // Need to find which index it was at for (int i = 0; i < fileSources.Count; i++) { if ((object)fileSources[i] == (object)fileSource) { fileSourcesClaimed[i] = false; fileSourceAdders[i] = null; break; } } } if (fileSource is FileSources.Folder) { folderPrefixesClaimed.Remove( (fileSource as FileSources.Folder).Path.Prefix ); } } }
// Group: Initialization and Configuration Functions // __________________________________________________________________________ /* Function: Adder */ public Adder(Engine.Instance engineInstance) : base(engineInstance) { fileSources = Manager.FileSources; fileSourcesClaimed = new bool[fileSources.Count]; fileSourceAdders = new FileSourceAdder[fileSources.Count]; folderPrefixesClaimed = new StringSet(KeySettings.IgnoreCase); accessLock = new object(); }
// Group: Individual File Management Functions // __________________________________________________________________________ /* Function: PickFileSource * * Returns a <FileSource> that is available to be scanned for files and its corresponding <FileSourceAdder>, or false if there * aren't any. You must pass them to <ReleaseFileSource()> when done. * * If this function returns false it doesn't mean that there are no unscanned <FileSources> remaining, as it may be requiring * some to be scanned sequentially to prevent multiple sources on the same disk from being scanned at the same time. So * while this function may return null while a particular <FileSource> is being scanned, it may return another one after it's * released. */ protected bool PickFileSource(out FileSource fileSource, out FileSourceAdder fileSourceAdder) { lock (accessLock) { for (int i = 0; i < fileSources.Count; i++) { if (fileSourcesClaimed[i] == false) { fileSource = fileSources[i]; if (fileSource is FileSources.Folder) { string folderPrefix = (fileSource as FileSources.Folder).Path.Prefix; if (folderPrefixesClaimed.Contains(folderPrefix) == false) { fileSourcesClaimed[i] = true; folderPrefixesClaimed.Add(folderPrefix); fileSourceAdder = fileSource.CreateAdderProcess(); fileSourceAdders[i] = fileSourceAdder; return(true); } } else // not a folder { fileSourcesClaimed[i] = true; fileSourceAdder = fileSource.CreateAdderProcess(); fileSourceAdders[i] = fileSourceAdder; return(true); } } } } fileSource = null; fileSourceAdder = null; return(false); }