/* ============================================================================== This file is part of the JUCE library - "Jules' Utility Class Extensions" Copyright 2004-11 by Raw Material Software Ltd. ------------------------------------------------------------------------------ JUCE can be redistributed and/or modified under the terms of the GNU General Public License (Version 2), as published by the Free Software Foundation. A copy of the license is included in the JUCE distribution, or can be found online at www.gnu.org/licenses. JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.rawmaterialsoftware.com/juce for more information. ============================================================================== */ #include "jucer_Module.h" #include "jucer_ProjectType.h" #include "jucer_ProjectExporter.h" #include "jucer_ProjectSaver.h" #include "jucer_AudioPluginModule.h" #include "jucer_JuceLibraryModule.h" //============================================================================== ModuleList::ModuleList() { rescan(); } ModuleList& ModuleList::getInstance() { static ModuleList list; return list; } struct ModuleSorter { static int compareElements (const ModuleList::Module* m1, const ModuleList::Module* m2) { return m1->uid.compareIgnoreCase (m2->uid); } }; void ModuleList::rescan() { modules.clear(); moduleFolder = StoredSettings::getInstance()->getLastKnownJuceFolder().getChildFile ("modules"); DirectoryIterator iter (moduleFolder, false, "*", File::findDirectories); while (iter.next()) { const File moduleDef (iter.getFile().getChildFile ("juce_module_info")); if (moduleDef.exists()) { ScopedPointer m (new JuceLibraryModule (moduleDef)); jassert (m->isValid()); if (m->isValid()) { Module* info = new Module(); modules.add (info); info->uid = m->getID(); info->name = m->moduleInfo ["name"]; info->description = m->moduleInfo ["description"]; info->file = moduleDef; } } } ModuleSorter sorter; modules.sort (sorter); } LibraryModule* ModuleList::Module::create() const { return new JuceLibraryModule (file); } LibraryModule* ModuleList::loadModule (const String& uid) const { const Module* const m = findModuleInfo (uid); return m != nullptr ? m->create() : nullptr; } const ModuleList::Module* ModuleList::findModuleInfo (const String& uid) const { for (int i = modules.size(); --i >= 0;) if (modules.getUnchecked(i)->uid == uid) return modules.getUnchecked(i); return nullptr; } void ModuleList::getDependencies (const String& moduleID, StringArray& dependencies) const { ScopedPointer lib (loadModule (moduleID)); JuceLibraryModule* m = dynamic_cast (static_cast (lib)); if (m != nullptr) { const var depsArray (m->moduleInfo ["dependencies"]); const Array* const deps = depsArray.getArray(); for (int i = 0; i < deps->size(); ++i) { const var& d = deps->getReference(i); String uid (d ["id"].toString()); String version (d ["version"].toString()); if (! dependencies.contains (uid, true)) { dependencies.add (uid); getDependencies (uid, dependencies); } } } } void ModuleList::createDependencies (const String& moduleID, OwnedArray& modules) const { ScopedPointer lib (loadModule (moduleID)); JuceLibraryModule* m = dynamic_cast (static_cast (lib)); if (m != nullptr) { var depsArray (m->moduleInfo ["dependencies"]); const Array* const deps = depsArray.getArray(); for (int i = 0; i < deps->size(); ++i) { const var& d = deps->getReference(i); String uid (d ["id"].toString()); String version (d ["version"].toString()); //xxx to do - also need to find version conflicts jassertfalse } } }