diff options
author | David Robillard <d@drobilla.net> | 2009-06-14 22:28:29 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2009-06-14 22:28:29 +0000 |
commit | 03aa15ef37abb29d9d88d8b4912616247ceffa5d (patch) | |
tree | ee0e2574c467a689fffc7f9f064e601912ce68e6 /src/plugin.c | |
parent | edf989ee2de5b4644aaa981a165262c0b6438823 (diff) | |
download | lilv-03aa15ef37abb29d9d88d8b4912616247ceffa5d.tar.gz lilv-03aa15ef37abb29d9d88d8b4912616247ceffa5d.tar.bz2 lilv-03aa15ef37abb29d9d88d8b4912616247ceffa5d.zip |
Updated LV2 dynamic manifest extension.
git-svn-id: http://svn.drobilla.net/lad/trunk/slv2@2105 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/plugin.c')
-rw-r--r-- | src/plugin.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/plugin.c b/src/plugin.c index 9564336..2aa9417 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -30,6 +30,9 @@ #include "slv2/query.h" #include "slv2/util.h" #include "slv2_internal.h" +#ifdef SLV2_DYN_MANIFEST +#include <dlfcn.h> +#endif /* private @@ -43,6 +46,9 @@ slv2_plugin_new(SLV2World world, SLV2Value uri, librdf_uri* bundle_uri) plugin->plugin_uri = uri; plugin->bundle_uri = slv2_value_new_librdf_uri(world, bundle_uri); plugin->binary_uri = NULL; +#ifdef SLV2_DYN_MANIFEST + plugin->dynman_uri = NULL; +#endif plugin->plugin_class = NULL; plugin->data_uris = slv2_values_new(); plugin->ports = NULL; @@ -50,6 +56,10 @@ slv2_plugin_new(SLV2World world, SLV2Value uri, librdf_uri* bundle_uri) plugin->rdf = NULL; plugin->num_ports = 0; + /*printf("PLUGIN %s DATA URIs: %p\n", + slv2_value_as_string(plugin->plugin_uri), + (void*)plugin->data_uris);*/ + return plugin; } @@ -67,6 +77,11 @@ slv2_plugin_free(SLV2Plugin p) slv2_value_free(p->binary_uri); p->binary_uri = NULL; +#ifdef SLV2_DYN_MANIFEST + slv2_value_free(p->dynman_uri); + p->dynman_uri = NULL; +#endif + if (p->ports) { for (uint32_t i = 0; i < p->num_ports; ++i) slv2_port_free(p->ports[i]); @@ -205,6 +220,43 @@ slv2_plugin_load(SLV2Plugin p) librdf_uri* data_uri = slv2_value_as_librdf_uri(data_uri_val); librdf_parser_parse_into_model(p->world->parser, data_uri, NULL, p->rdf); } + +#ifdef SLV2_DYN_MANIFEST + // Load and parse dynamic manifest data, if this is a library + if (p->dynman_uri) { + const char* lib_path = slv2_uri_to_path(slv2_value_as_string(p->dynman_uri)); + void* lib = dlopen(lib_path, RTLD_LAZY); + if (!lib) { + SLV2_WARNF("Unable to open dynamic manifest %s\n", slv2_value_as_string(p->dynman_uri)); + return; + } + + typedef int (*OpenFunc)(LV2_Dyn_Manifest_Handle*, const LV2_Dyn_Manifest_Feature *const *); + OpenFunc open_func = (OpenFunc)dlsym(lib, "lv2_dyn_manifest_open"); + LV2_Dyn_Manifest_Handle handle = NULL; + if (open_func) + open_func(&handle, &dman_features); + + typedef int (*GetDataFunc)(LV2_Dyn_Manifest_Handle handle, + FILE* fp, + const char* uri); + GetDataFunc get_data_func = (GetDataFunc)dlsym(lib, "lv2_dyn_manifest_get_data"); + if (get_data_func) { + FILE* fd = tmpfile(); + get_data_func(handle, fd, slv2_value_as_string(p->plugin_uri)); + rewind(fd); + librdf_parser_parse_file_handle_into_model(p->world->parser, + fd, 0, slv2_value_as_librdf_uri(p->plugin_uri), p->rdf); + fclose(fd); + } + + typedef int (*CloseFunc)(LV2_Dyn_Manifest_Handle); + CloseFunc close_func = (CloseFunc)dlsym(lib, "lv2_dyn_manifest_close"); + if (close_func) + close_func(handle); + } +#endif + assert(p->rdf); } |