PluginDirectoryScanner::PluginDirectoryScanner (KnownPluginList& listToAddTo, AudioPluginFormat& formatToLookFor, FileSearchPath directoriesToSearch, const bool recursive, const File& deadMansPedal, bool allowPluginsWhichRequireAsynchronousInstantiation) : list (listToAddTo), format (formatToLookFor), deadMansPedalFile (deadMansPedal), allowAsync (allowPluginsWhichRequireAsynchronousInstantiation) { directoriesToSearch.removeRedundantPaths(); filesOrIdentifiersToScan = format.searchPathsForPlugins (directoriesToSearch, recursive, allowAsync); // If any plugins have crashed recently when being loaded, move them to the // end of the list to give the others a chance to load correctly.. for (auto& crashed : readDeadMansPedalFile (deadMansPedalFile)) for (int j = filesOrIdentifiersToScan.size(); --j >= 0;) if (crashed == filesOrIdentifiersToScan[j]) filesOrIdentifiersToScan.move (j, -1); applyBlacklistingsFromDeadMansPedal (listToAddTo, deadMansPedalFile); nextIndex.set (filesOrIdentifiersToScan.size()); }
bool PluginDirectoryScanner::scanNextFile (const bool dontRescanIfAlreadyInList, String& nameOfPluginBeingScanned) { const int index = --nextIndex; if (index >= 0) { const String file (filesOrIdentifiersToScan [index]); if (file.isNotEmpty() && ! list.isListingUpToDate (file, format)) { nameOfPluginBeingScanned = format.getNameOfPluginFromIdentifier (file); OwnedArray <PluginDescription> typesFound; // Add this plugin to the end of the dead-man's pedal list in case it crashes... StringArray crashedPlugins (readDeadMansPedalFile (deadMansPedalFile)); crashedPlugins.removeString (file); crashedPlugins.add (file); setDeadMansPedalFile (crashedPlugins); list.scanAndAddFile (file, dontRescanIfAlreadyInList, typesFound, format); // Managed to load without crashing, so remove it from the dead-man's-pedal.. crashedPlugins.removeString (file); setDeadMansPedalFile (crashedPlugins); if (typesFound.size() == 0 && ! list.getBlacklistedFiles().contains (file)) failedFiles.add (file); } } updateProgress(); return index > 0; }
void PluginDirectoryScanner::applyBlacklistingsFromDeadMansPedal (KnownPluginList& list, const File& file) { // If any plugins have crashed recently when being loaded, move them to the // end of the list to give the others a chance to load correctly.. for (auto& crashedPlugin : readDeadMansPedalFile (file)) list.addToBlacklist (crashedPlugin); }