public static ICollection <ApplicationUninstallerEntry> GetApplicationsFromDirectories( IEnumerable <ApplicationUninstallerEntry> allUninstallers, ICollection <DirectoryInfo> results) { var output = new List <ApplicationUninstallerEntry>(); var processed = new List <DirectoryInfo>(); foreach (var dir in results.Distinct(PathTools.PathsEqual).OrderBy(x => x.FullName)) { if (processed.Any(x => x.FullName.Contains(dir.FullName, StringComparison.InvariantCultureIgnoreCase))) { continue; } processed.Add(dir); } var exceptions = allUninstallers.Where(x => x.InstallLocation != null).ToList(); var infoAdder = new InfoAdderManager(); foreach (var dir in processed) { var items = exceptions.Where( x => x.InstallLocation.Contains(dir.FullName, StringComparison.InvariantCultureIgnoreCase)) .ToList(); if (items.Count > 0) { output.AddRange(items); continue; } var res = DirectoryFactory.TryCreateFromDirectory(dir, exceptions).ToList(); if (res.Count == 0) { MessageBox.Show( string.Format(Localisable.Uninstaller_GetApplicationsFromDirectories_NothingFound_Message, dir.FullName), Localisable.Uninstaller_GetApplicationsFromDirectories_NothingFound_Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); continue; } foreach (var result in res) { infoAdder.AddMissingInformation(result); output.Add(result); } } return(output); }
public static void GenerateMisingInformation(List <ApplicationUninstallerEntry> entries, InfoAdderManager infoAdder, List <Guid> msiProducts, bool skipRunLast, ListGenerationProgress.ListGenerationCallback progressCallback) { void WorkLogic(ApplicationUninstallerEntry entry, object state) { infoAdder.AddMissingInformation(entry, skipRunLast); if (msiProducts != null) { entry.IsValid = FactoryTools.CheckIsValid(entry, msiProducts); } } var workSpreader = new ThreadedWorkSpreader <ApplicationUninstallerEntry, object>(MaxThreadsPerDrive, WorkLogic, list => null, entry => entry.DisplayName ?? entry.RatingId ?? string.Empty); var cDrive = new DirectoryInfo(Environment.SystemDirectory).Root; var dividedItems = SplitByPhysicalDrives(entries, entry => { var loc = entry.InstallLocation ?? entry.UninstallerLocation; if (!string.IsNullOrEmpty(loc)) { try { return(new DirectoryInfo(loc)); } catch (SystemException ex) { Console.WriteLine(ex); } } return(cDrive); }); workSpreader.Start(dividedItems, progressCallback); workSpreader.Join(); }
public static IList <ApplicationUninstallerEntry> GetUninstallerEntries(ListGenerationProgress.ListGenerationCallback callback) { const int totalStepCount = 8; var currentStep = 1; // Find msi products --------------------------------------------------------------------------------------- var msiProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_MSI); callback(msiProgress); var msiGuidCount = 0; var msiProducts = MsiTools.MsiEnumProducts().DoForEach(x => { msiProgress.Inner = new ListGenerationProgress(0, -1, String.Format(Localisation.Progress_MSI_sub, ++msiGuidCount)); callback(msiProgress); }).ToList(); // Find stuff mentioned in registry ------------------------------------------------------------------------ List <ApplicationUninstallerEntry> registryResults; if (UninstallToolsGlobalConfig.ScanRegistry) { var regProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_Registry); callback(regProgress); var registryFactory = new RegistryFactory(msiProducts); registryResults = registryFactory.GetUninstallerEntries(report => { regProgress.Inner = report; callback(regProgress); }).ToList(); // Fill in instal llocations for the drive search if (UninstallToolsGlobalConfig.UninstallerFactoryCache != null) { ApplyCache(registryResults, UninstallToolsGlobalConfig.UninstallerFactoryCache, InfoAdder); } var installLocAddProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_GatherUninstallerInfo); callback(installLocAddProgress); var installLocAddCount = 0; foreach (var result in registryResults) { installLocAddProgress.Inner = new ListGenerationProgress(installLocAddCount++, registryResults.Count, result.DisplayName ?? string.Empty); callback(installLocAddProgress); InfoAdder.AddMissingInformation(result, true); } } else { registryResults = new List <ApplicationUninstallerEntry>(); } // Look for entries on drives, based on info in registry. ---------------------------------------------------- // Will introduce duplicates to already detected stuff. Need to check for duplicates with other entries later. List <ApplicationUninstallerEntry> driveResults; if (UninstallToolsGlobalConfig.ScanDrives) { var driveProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_DriveScan); callback(driveProgress); var driveFactory = new DirectoryFactory(registryResults); driveResults = driveFactory.GetUninstallerEntries(report => { driveProgress.Inner = report; callback(driveProgress); }).ToList(); } else { driveResults = new List <ApplicationUninstallerEntry>(); } // Get misc entries that use fancy logic -------------------------------------------------------------------- var miscProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_AppStores); callback(miscProgress); var otherResults = GetMiscUninstallerEntries(report => { miscProgress.Inner = report; callback(miscProgress); }); // Handle duplicate entries ---------------------------------------------------------------------------------- var mergeProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_Merging); callback(mergeProgress); var mergedResults = registryResults.ToList(); mergedResults = MergeResults(mergedResults, otherResults, report => { mergeProgress.Inner = report; report.TotalCount *= 2; report.Message = Localisation.Progress_Merging_Stores; callback(mergeProgress); }); // Make sure to merge driveResults last mergedResults = MergeResults(mergedResults, driveResults, report => { mergeProgress.Inner = report; report.CurrentCount += report.TotalCount; report.TotalCount *= 2; report.Message = Localisation.Progress_Merging_Drives; callback(mergeProgress); }); // Fill in any missing information ------------------------------------------------------------------------- if (UninstallToolsGlobalConfig.UninstallerFactoryCache != null) { ApplyCache(mergedResults, UninstallToolsGlobalConfig.UninstallerFactoryCache, InfoAdder); } var infoAddProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_GeneratingInfo); callback(infoAddProgress); var infoAddCount = 0; foreach (var result in mergedResults) { infoAddProgress.Inner = new ListGenerationProgress(infoAddCount++, registryResults.Count, result.DisplayName ?? string.Empty); callback(infoAddProgress); InfoAdder.AddMissingInformation(result); result.IsValid = CheckIsValid(result, msiProducts); } // Cache missing information to speed up future scans if (UninstallToolsGlobalConfig.UninstallerFactoryCache != null) { foreach (var entry in mergedResults) { UninstallToolsGlobalConfig.UninstallerFactoryCache.TryCacheItem(entry); } try { UninstallToolsGlobalConfig.UninstallerFactoryCache.Save(); } catch (SystemException e) { Console.WriteLine(@"Failed to save cache: " + e); } } // Detect startups and attach them to uninstaller entries ---------------------------------------------------- var startupsProgress = new ListGenerationProgress(currentStep, totalStepCount, Localisation.Progress_Startup); callback(startupsProgress); var i = 0; var startupEntries = new List <StartupEntryBase>(); foreach (var factory in StartupManager.Factories) { startupsProgress.Inner = new ListGenerationProgress(i++, StartupManager.Factories.Count, factory.Key); callback(startupsProgress); try { startupEntries.AddRange(factory.Value()); } catch (Exception ex) { PremadeDialogs.GenericError(ex); } } startupsProgress.Inner = new ListGenerationProgress(1, 1, Localisation.Progress_Merging); callback(startupsProgress); try { AttachStartupEntries(mergedResults, startupEntries); } catch (Exception ex) { PremadeDialogs.GenericError(ex); } return(mergedResults); }
public static IEnumerable <ApplicationUninstallerEntry> GetUninstallerEntries(ListGenerationProgress.ListGenerationCallback callback) { const int totalStepCount = 8; var currentStep = 1; // Find msi products var msiProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_MSI); callback(msiProgress); var msiGuidCount = 0; var msiProducts = MsiTools.MsiEnumProducts().DoForEach(x => { msiProgress.Inner = new ListGenerationProgress(0, -1, string.Format(Localisation.Progress_MSI_sub, ++msiGuidCount)); callback(msiProgress); }).ToList(); // Find stuff mentioned in registry var regProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_Registry); callback(regProgress); var registryFactory = new RegistryFactory(msiProducts); var registryResults = registryFactory.GetUninstallerEntries(report => { regProgress.Inner = report; callback(regProgress); }).ToList(); // Fill in instal llocations for the drive search var installLocAddProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_GatherUninstallerInfo); callback(installLocAddProgress); var infoAdder = new InfoAdderManager(); var installLocAddCount = 0; foreach (var result in registryResults) { installLocAddProgress.Inner = new ListGenerationProgress(installLocAddCount++, registryResults.Count, result.DisplayName ?? string.Empty); callback(installLocAddProgress); infoAdder.AddMissingInformation(result, true); } // Look for entries on drives, based on info in registry. Need to check for duplicates with other entries later var driveProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_DriveScan); callback(driveProgress); var driveFactory = new DirectoryFactory(registryResults); var driveResults = driveFactory.GetUninstallerEntries(report => { driveProgress.Inner = report; callback(driveProgress); }).ToList(); // Get misc entries that use fancy logic var miscProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_AppStores); callback(miscProgress); var otherResults = GetMiscUninstallerEntries(report => { miscProgress.Inner = report; callback(miscProgress); }); // Handle duplicate entries var mergeProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_Merging); callback(mergeProgress); var mergedResults = registryResults.ToList(); mergedResults = MergeResults(mergedResults, otherResults, infoAdder, report => { mergeProgress.Inner = report; report.TotalCount *= 2; report.Message = Localisation.Progress_Merging_Stores; callback(mergeProgress); }); // Make sure to merge driveResults last mergedResults = MergeResults(mergedResults, driveResults, infoAdder, report => { mergeProgress.Inner = report; report.CurrentCount += report.TotalCount; report.TotalCount *= 2; report.Message = Localisation.Progress_Merging_Drives; callback(mergeProgress); }); // Fill in any missing information var infoAddProgress = new ListGenerationProgress(currentStep, totalStepCount, Localisation.Progress_GeneratingInfo); callback(infoAddProgress); var infoAddCount = 0; foreach (var result in mergedResults) { infoAddProgress.Inner = new ListGenerationProgress(infoAddCount++, registryResults.Count, result.DisplayName ?? string.Empty); callback(infoAddProgress); infoAdder.AddMissingInformation(result); result.IsValid = CheckIsValid(result, msiProducts); } //callback(new GetUninstallerListProgress(currentStep, totalStepCount, "Finished")); return(mergedResults); }
public static IList <ApplicationUninstallerEntry> GetUninstallerEntries(ListGenerationProgress.ListGenerationCallback callback) { const int totalStepCount = 7; var currentStep = 1; var infoAdder = new InfoAdderManager(); // Find msi products var msiProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_MSI); callback(msiProgress); var msiGuidCount = 0; var msiProducts = MsiTools.MsiEnumProducts().DoForEach(x => { msiProgress.Inner = new ListGenerationProgress(0, -1, string.Format(Localisation.Progress_MSI_sub, ++msiGuidCount)); callback(msiProgress); }).ToList(); // Find stuff mentioned in registry List <ApplicationUninstallerEntry> registryResults; if (UninstallToolsGlobalConfig.ScanRegistry) { var regProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_Registry); callback(regProgress); var registryFactory = new RegistryFactory(msiProducts); registryResults = registryFactory.GetUninstallerEntries(report => { regProgress.Inner = report; callback(regProgress); }).ToList(); // Fill in instal llocations for the drive search if (UninstallToolsGlobalConfig.UninstallerFactoryCache != null) { ApplyCache(registryResults, UninstallToolsGlobalConfig.UninstallerFactoryCache, infoAdder); } var installLocAddProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_GatherUninstallerInfo); callback(installLocAddProgress); var installLocAddCount = 0; foreach (var result in registryResults) { installLocAddProgress.Inner = new ListGenerationProgress(installLocAddCount++, registryResults.Count, result.DisplayName ?? string.Empty); callback(installLocAddProgress); infoAdder.AddMissingInformation(result, true); } } else { registryResults = new List <ApplicationUninstallerEntry>(); } // Look for entries on drives, based on info in registry. Need to check for duplicates with other entries later List <ApplicationUninstallerEntry> driveResults; if (UninstallToolsGlobalConfig.ScanDrives) { var driveProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_DriveScan); callback(driveProgress); var driveFactory = new DirectoryFactory(registryResults); driveResults = driveFactory.GetUninstallerEntries(report => { driveProgress.Inner = report; callback(driveProgress); }).ToList(); } else { driveResults = new List <ApplicationUninstallerEntry>(); } // Get misc entries that use fancy logic var miscProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_AppStores); callback(miscProgress); var otherResults = GetMiscUninstallerEntries(report => { miscProgress.Inner = report; callback(miscProgress); }); // Handle duplicate entries var mergeProgress = new ListGenerationProgress(currentStep++, totalStepCount, Localisation.Progress_Merging); callback(mergeProgress); var mergedResults = registryResults.ToList(); mergedResults = MergeResults(mergedResults, otherResults, infoAdder, report => { mergeProgress.Inner = report; report.TotalCount *= 2; report.Message = Localisation.Progress_Merging_Stores; callback(mergeProgress); }); // Make sure to merge driveResults last mergedResults = MergeResults(mergedResults, driveResults, infoAdder, report => { mergeProgress.Inner = report; report.CurrentCount += report.TotalCount; report.TotalCount *= 2; report.Message = Localisation.Progress_Merging_Drives; callback(mergeProgress); }); // Fill in any missing information if (UninstallToolsGlobalConfig.UninstallerFactoryCache != null) { ApplyCache(mergedResults, UninstallToolsGlobalConfig.UninstallerFactoryCache, infoAdder); } var infoAddProgress = new ListGenerationProgress(currentStep, totalStepCount, Localisation.Progress_GeneratingInfo); callback(infoAddProgress); var infoAddCount = 0; foreach (var result in mergedResults) { infoAddProgress.Inner = new ListGenerationProgress(infoAddCount++, registryResults.Count, result.DisplayName ?? string.Empty); callback(infoAddProgress); infoAdder.AddMissingInformation(result); result.IsValid = CheckIsValid(result, msiProducts); } //callback(new GetUninstallerListProgress(currentStep, totalStepCount, "Finished")); if (UninstallToolsGlobalConfig.UninstallerFactoryCache != null) { foreach (var entry in mergedResults) { UninstallToolsGlobalConfig.UninstallerFactoryCache.TryCacheItem(entry); } try { UninstallToolsGlobalConfig.UninstallerFactoryCache.Save(); } catch (SystemException e) { Console.WriteLine(@"Failed to save cache: " + e); } } return(mergedResults); }