From 6b97e04546f22fc50e4293e8816933f20176dfab Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 3 Aug 2007 18:55:25 +0000 Subject: Updated LV2 revision number. Fixed formatting in lv2.h. Better/terser comment for lv2:Specification in lv2.ttl. Implemented LV2 specification discovery. git-svn-id: http://svn.drobilla.net/lad/slv2@673 a436a847-0d15-0410-975c-d299462d15a1 --- src/slv2_internal.h | 8 ++++ src/world.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 108 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/slv2_internal.h b/src/slv2_internal.h index f7999e9..bb538f6 100644 --- a/src/slv2_internal.h +++ b/src/slv2_internal.h @@ -143,6 +143,7 @@ struct _SLV2World { librdf_parser* parser; SLV2PluginClasses plugin_classes; SLV2Plugins plugins; + librdf_node* lv2_specification_node; librdf_node* lv2_plugin_node; librdf_node* rdf_a_node; @@ -171,6 +172,13 @@ void slv2_world_load_path(SLV2World world, const char* search_path); + +void +slv2_world_load_specifications(SLV2World world); + +void +slv2_world_load_file(SLV2World world, librdf_uri* file_uri); + /* ********* GUI ********* */ diff --git a/src/world.c b/src/world.c index e2b3574..0c6ad77 100644 --- a/src/world.c +++ b/src/world.c @@ -65,6 +65,9 @@ slv2_world_new() world->plugins = slv2_plugins_new(); + world->lv2_specification_node = librdf_new_node_from_uri_string(world->world, + (unsigned char*)"http://lv2plug.in/ns/lv2core#Specification"); + world->lv2_plugin_node = librdf_new_node_from_uri_string(world->world, (unsigned char*)"http://lv2plug.in/ns/lv2core#Plugin"); @@ -117,6 +120,9 @@ slv2_world_new_using_rdf_world(librdf_world* rdf_world) world->plugins = slv2_plugins_new(); + world->lv2_specification_node = librdf_new_node_from_uri_string(world->world, + (unsigned char*)"http://lv2plug.in/ns/lv2core#Specification"); + world->lv2_plugin_node = librdf_new_node_from_uri_string(rdf_world, (unsigned char*)"http://lv2plug.in/ns/lv2core#Plugin"); @@ -142,6 +148,7 @@ slv2_world_free(SLV2World world) if (world->rdf_lock) world->rdf_lock(world->rdf_lock_data); + librdf_free_node(world->lv2_specification_node); librdf_free_node(world->lv2_plugin_node); librdf_free_node(world->rdf_a_node); @@ -217,6 +224,22 @@ slv2_world_unlock_if_necessary(SLV2World world) } +/** Load the entire contents of a file into the world model. + */ +void +slv2_world_load_file(SLV2World world, librdf_uri* file_uri) +{ + slv2_world_lock_if_necessary(world); + + //printf("LOADING FILE: %s\n", librdf_uri_as_string(file_uri)); + + librdf_parser_parse_into_model(world->parser, file_uri, NULL, world->model); + + slv2_world_unlock_if_necessary(world); +} + + + void slv2_world_load_bundle(SLV2World world, const char* bundle_uri_str) { @@ -247,7 +270,7 @@ slv2_world_load_bundle(SLV2World world, const char* bundle_uri_str) librdf_node* plugin_node = librdf_new_node_from_node(librdf_statement_get_subject(s)); - /* Add ?plugin rdfs:seeAlso "datafile.ttl" */ + /* Add ?plugin rdfs:seeAlso */ librdf_node* subject = plugin_node; librdf_node* predicate = librdf_new_node_from_uri_string(world->world, (unsigned char*)"http://www.w3.org/2000/01/rdf-schema#seeAlso"); @@ -256,7 +279,7 @@ slv2_world_load_bundle(SLV2World world, const char* bundle_uri_str) librdf_model_add(world->model, subject, predicate, object); - /* Add ?plugin slv2:bundleURI "file://some/path" */ + /* Add ?plugin slv2:bundleURI */ subject = librdf_new_node_from_node(plugin_node); predicate = librdf_new_node_from_uri_string(world->world, (unsigned char*)"http://drobilla.net/ns/slv2#bundleURI"); @@ -269,6 +292,41 @@ slv2_world_load_bundle(SLV2World world, const char* bundle_uri_str) librdf_free_stream(results); + /* Query statement: ?specification a lv2:Specification */ + q = librdf_new_statement_from_nodes(world->world, + NULL, world->rdf_a_node, world->lv2_specification_node); + + results = librdf_model_find_statements(manifest_model, q); + + while (!librdf_stream_end(results)) { + librdf_statement* s = librdf_stream_get_object(results); + + librdf_node* spec_node = librdf_new_node_from_node(librdf_statement_get_subject(s)); + + /* Add ?specification rdfs:seeAlso */ + librdf_node* subject = spec_node; + librdf_node* predicate = librdf_new_node_from_uri_string(world->world, + (unsigned char*)"http://www.w3.org/2000/01/rdf-schema#seeAlso"); + librdf_node* object = librdf_new_node_from_uri(world->world, + manifest_uri); + + //printf("SPEC: %s\n", librdf_uri_as_string(librdf_node_get_uri(subject))); + + librdf_model_add(world->model, subject, predicate, object); + + /* Add ?specification slv2:bundleURI */ + subject = librdf_new_node_from_node(spec_node); + predicate = librdf_new_node_from_uri_string(world->world, + (unsigned char*)"http://drobilla.net/ns/slv2#bundleURI"); + object = librdf_new_node_from_uri(world->world, bundle_uri); + + librdf_model_add(world->model, subject, predicate, object); + + librdf_stream_next(results); + } + + librdf_free_stream(results); + /* Join the temporary model to the main model */ librdf_stream* manifest_stream = librdf_model_as_stream(manifest_model); librdf_model_add_statements(world->model, manifest_stream); @@ -351,6 +409,41 @@ slv2_plugin_compare_by_uri(const void* a, const void* b) } */ +void +slv2_world_load_specifications(SLV2World world) +{ + unsigned char* query_string = (unsigned char*) + "PREFIX : \n" + "PREFIX rdfs: \n" + "SELECT DISTINCT ?spec ?data WHERE {\n" + " ?spec a :Specification ;\n" + " rdfs:seeAlso ?data .\n" + "}\n"; + + librdf_query* q = librdf_new_query(world->world, "sparql", NULL, query_string, NULL); + + librdf_query_results* results = librdf_query_execute(q, world->model); + + while (!librdf_query_results_finished(results)) { + librdf_node* spec_node = librdf_query_results_get_binding_value(results, 0); + librdf_uri* spec_uri = librdf_node_get_uri(spec_node); + librdf_node* data_node = librdf_query_results_get_binding_value(results, 1); + librdf_uri* data_uri = librdf_node_get_uri(data_node); + + //printf("SPEC: %s / %s\n", librdf_uri_as_string(spec_uri), librdf_uri_as_string(data_uri)); + + slv2_world_load_file(world, data_uri); + + librdf_free_node(spec_node); + librdf_free_node(data_node); + + librdf_query_results_next(results); + } + + librdf_free_query_results(results); + librdf_free_query(q); +} + void slv2_world_load_plugin_classes(SLV2World world) @@ -364,8 +457,8 @@ slv2_world_load_plugin_classes(SLV2World world) "PREFIX : \n" "PREFIX rdfs: \n" "SELECT DISTINCT ?class ?parent ?label WHERE {\n" - //" ?plugin a :Plugin; a ?class .\n" - " ?class a rdfs:Class; rdfs:subClassOf ?parent; rdfs:label ?label\n" + //" ?plugin a ?class .\n" + " ?class a :Class; rdfs:subClassOf ?parent; rdfs:label ?label\n" "} ORDER BY ?class\n"; librdf_query* q = librdf_new_query(world->world, "sparql", @@ -381,7 +474,7 @@ slv2_world_load_plugin_classes(SLV2World world) librdf_node* label_node = librdf_query_results_get_binding_value(results, 2); const char* label = (const char*)librdf_node_get_literal_value(label_node); - //printf("CLASS: %s / %s\n", librdf_uri_as_string(parent_uri), librdf_uri_as_string(class_uri)); + printf("CLASS: %s / %s\n", librdf_uri_as_string(parent_uri), librdf_uri_as_string(class_uri)); SLV2PluginClass plugin_class = slv2_plugin_class_new(world, (const char*)librdf_uri_as_string(parent_uri), @@ -445,6 +538,8 @@ slv2_world_load_all(SLV2World world) /* 3. Query out things to cache */ + slv2_world_load_specifications(world); + slv2_world_load_plugin_classes(world); // Find all plugins and associated data files -- cgit v1.2.1