| @@ -1785,6 +1785,13 @@ private: | |||
| SupportsTime time = SupportsTime::no; | |||
| }; | |||
| struct FreeString { void operator() (void* ptr) const noexcept { lilv_free (ptr); } }; | |||
| static File bundlePathFromUri (const char* uri) | |||
| { | |||
| return File { std::unique_ptr<char, FreeString> { lilv_file_uri_parse (uri, nullptr) }.get() }; | |||
| } | |||
| class Plugins | |||
| { | |||
| public: | |||
| @@ -1800,6 +1807,17 @@ public: | |||
| return lilv_plugins_get_by_uri (plugins, uri.get()); | |||
| } | |||
| const LilvPlugin* getByFile (const File& file) const | |||
| { | |||
| for (const auto* plugin : *this) | |||
| { | |||
| if (bundlePathFromUri (lilv_node_as_uri (lilv_plugin_get_bundle_uri (plugin))) == file) | |||
| return plugin; | |||
| } | |||
| return nullptr; | |||
| } | |||
| private: | |||
| const LilvPlugins* plugins = nullptr; | |||
| }; | |||
| @@ -2135,8 +2153,6 @@ private: | |||
| JUCE_LEAK_DETECTOR (PortMap) | |||
| }; | |||
| struct FreeString { void operator() (void* ptr) const noexcept { lilv_free (ptr); } }; | |||
| class PluginState | |||
| { | |||
| public: | |||
| @@ -2584,11 +2600,6 @@ public: | |||
| auto withPluginUri (URL v) const noexcept { return withMember (*this, &UiInstanceArgs::pluginUri, std::move (v)); } | |||
| }; | |||
| static File bundlePathFromUri (const char* uri) | |||
| { | |||
| return File { std::unique_ptr<char, FreeString> { lilv_file_uri_parse (uri, nullptr) }.get() }; | |||
| } | |||
| /* | |||
| Creates and holds a UI instance for a plugin with a specific URI, using the provided descriptor. | |||
| */ | |||
| @@ -5213,10 +5224,17 @@ public: | |||
| void findAllTypesForFile (OwnedArray<PluginDescription>& result, | |||
| const String& identifier) | |||
| { | |||
| auto desc = getDescription (findPluginByUri (identifier)); | |||
| if (File::isAbsolutePath (identifier)) | |||
| world->loadBundle (world->newFileUri (nullptr, File::addTrailingSeparator (identifier).toRawUTF8())); | |||
| if (desc.fileOrIdentifier.isNotEmpty()) | |||
| result.add (std::make_unique<PluginDescription> (desc)); | |||
| for (const auto& plugin : { findPluginByUri (identifier), findPluginByFile (identifier) }) | |||
| { | |||
| if (auto desc = getDescription (plugin); desc.fileOrIdentifier.isNotEmpty()) | |||
| { | |||
| result.add (std::make_unique<PluginDescription> (desc)); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| bool fileMightContainThisPluginType (const String& file) const | |||
| @@ -5226,7 +5244,7 @@ public: | |||
| const auto numBytes = file.getNumBytesAsUTF8(); | |||
| std::vector<uint8_t> vec (numBytes + 1, 0); | |||
| std::copy (data, data + numBytes, vec.begin()); | |||
| return serd_uri_string_has_scheme (vec.data()); | |||
| return serd_uri_string_has_scheme (vec.data()) || file.endsWith (".lv2"); | |||
| } | |||
| String getNameOfPluginFromIdentifier (const String& identifier) | |||
| @@ -5488,6 +5506,11 @@ private: | |||
| return world->getAllPlugins().getByUri (world->newUri (s.toRawUTF8())); | |||
| } | |||
| const LilvPlugin* findPluginByFile (const File& f) | |||
| { | |||
| return world->getAllPlugins().getByFile (f); | |||
| } | |||
| template <typename Fn> | |||
| void visitParentClasses (const LilvPluginClass* c, Fn&& fn) const | |||
| { | |||