void WorkerThread() { try { while (!Closing) { Thread.Sleep(0); lock (SearchStateLock) { BackupProject Project = CurrentProject; if (Project == null) { Thread.Sleep(100); IsArchiveNamesComplete = true; IsFolderNamesComplete = true; continue; } string[] SearchWords = CurrentSearchWords; if (SearchWords == null || SearchWords.Length == 0) { // In the case where the user has selected a project but no search details, // we want to show all available backup archives. if (!IsArchiveNamesComplete) { lock (Project.ArchiveFileList) { foreach (ArchiveFilename Backup in Project.ArchiveFileList.Archives) { if (!AllResults.Contains(Backup)) { AllResults.Add(Backup); lock (NewResults) NewResults.Add(Backup); } } } IsArchiveNamesComplete = true; } IsFolderNamesComplete = true; Thread.Sleep(100); continue; } if (!IsArchiveNamesComplete && IncludeArchiveNames) { lock (Project.ArchiveFileList) { foreach (ArchiveFilename Backup in Project.ArchiveFileList.Archives) { string BackupFile = Backup.ToString().ToLower(); bool Match = true; foreach (string Word in SearchWords) { if (!BackupFile.Contains(Word)) { Match = false; break; } } if (!Match) { continue; } if (!AllResults.Contains(Backup)) { AllResults.Add(Backup); lock (NewResults) NewResults.Add(Backup); } } } IsArchiveNamesComplete = true; continue; } if (!IsFolderNamesComplete && IncludeFolderNames) { ArchiveFilename ExamineNext = null; lock (Project.ArchiveFileList) { foreach (ArchiveFilename Backup in Project.ArchiveFileList.Archives) { bool AlreadyDone = false; foreach (ArchiveFilename PosRes in AllResults) { if (Backup == PosRes) { AlreadyDone = true; break; } } if (AlreadyDone) { continue; } foreach (ArchiveFilename NegRes in NegFolderNameResults) { if (Backup == NegRes) { AlreadyDone = true; break; } } if (AlreadyDone) { continue; } ExamineNext = Backup; break; } } if (ExamineNext == null) { IsFolderNamesComplete = true; continue; } /** Examine a single archive on this pass of the loop **/ Manifest Manifest; lock (Project.ManifestCache) { if (!Project.ManifestCache.TryGetValue(ExamineNext, out Manifest)) { try { using (NetworkConnection newconn = new NetworkConnection(Project.CompleteBackupFolder, Project.BackupCredentials)) Manifest = ExamineNext.LoadArchiveManifest(Project, false); Project.ManifestCache.Add(ExamineNext, Manifest); } catch (Ionic.Zip.BadPasswordException) { PasswordBlockedSearch = true; NegFolderNameResults.Add(ExamineNext); continue; } } } if (SearchManifestForFolderName(ExamineNext, Manifest.ArchiveRoot, SearchWords)) { if (!AllResults.Contains(ExamineNext)) { AllResults.Add(ExamineNext); lock (NewResults) NewResults.Add(ExamineNext); } } else { NegFolderNameResults.Add(ExamineNext); } continue; } // If we reach this point, the search has already completed. Idle time. Thread.Sleep(100); } } } catch (Exception ex) { lock (ExceptionLock) { WorkerException = ex; } } }