summaryrefslogtreecommitdiffstats
path: root/src/libs/client/Loader.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-04-11 03:46:40 +0000
committerDavid Robillard <d@drobilla.net>2007-04-11 03:46:40 +0000
commit72a21b5dbe82ac726f4d7a4308601d802001d9c0 (patch)
tree2d10c530c7dd278898db65a56e0a56754d73660d /src/libs/client/Loader.cpp
parentfa10838af240f0457097051eb2e4153772a44386 (diff)
downloadingen-72a21b5dbe82ac726f4d7a4308601d802001d9c0.tar.gz
ingen-72a21b5dbe82ac726f4d7a4308601d802001d9c0.tar.bz2
ingen-72a21b5dbe82ac726f4d7a4308601d802001d9c0.zip
Serialization (both saving and restoring) of nested patches.
Serialization of patch (float) metadata. Removed useless cruft from Save dialog. Remember filename on save to avoid save as next time. git-svn-id: http://svn.drobilla.net/lad/ingen@437 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/client/Loader.cpp')
-rw-r--r--src/libs/client/Loader.cpp150
1 files changed, 124 insertions, 26 deletions
diff --git a/src/libs/client/Loader.cpp b/src/libs/client/Loader.cpp
index 70ef0820..09724d6c 100644
--- a/src/libs/client/Loader.cpp
+++ b/src/libs/client/Loader.cpp
@@ -16,6 +16,7 @@
*/
#include <iostream>
+#include <glibmm/ustring.h>
#include <raptor.h>
#include "raul/RDFQuery.h"
#include "Loader.h"
@@ -63,11 +64,10 @@ Loader::load(const Glib::ustring& filename,
Glib::ustring document_uri = (const char*)document_uri_str;
//Glib::ustring document_uri = "file:///home/dave/code/drobillanet/ingen/src/progs/ingenuity/test2.ingen.ttl";
- if (patch_uri == "")
- patch_uri = "<>"; // FIXME: Will load every patch in the file?
+ patch_uri = string("<") + patch_uri + ">";
cerr << "[Loader] Loading " << patch_uri << " from " << document_uri
- << " under " << parent << endl;
+ << " under " << (string)(parent ? (string)parent.get() : "no parent") << endl;
/* Get polyphony (mandatory) */
@@ -106,11 +106,12 @@ Loader::load(const Glib::ustring& filename,
}
Path patch_path = ( parent ? (parent.get().base() + patch_name) : Path("/") );
- cerr << "************ PATCH: " << patch_path << ", poly = " << patch_poly << endl;
+ cerr << "************ PATCH: name=" << patch_name << ", path=" << patch_path
+ << ", poly = " << patch_poly << endl;
_engine->create_patch(patch_path, patch_poly);
- /* Load nodes */
+ /* Load (plugin) nodes */
query = RDFQuery(*_namespaces, Glib::ustring(
"SELECT DISTINCT ?name ?plugin ?floatkey ?floatval FROM <") + document_uri + "> WHERE {\n" +
@@ -135,8 +136,8 @@ Loader::load(const Glib::ustring& filename,
created[node_path] = true;
}
- Glib::ustring floatkey = _namespaces->qualify((*i)["floatkey"]);
- Glib::ustring floatval = (*i)["floatval"];
+ const Glib::ustring& floatkey = _namespaces->qualify((*i)["floatkey"]);
+ const Glib::ustring& floatval = (*i)["floatval"];
if (floatkey != "" && floatval != "") {
const float val = atof(floatval.c_str());
@@ -144,6 +145,31 @@ Loader::load(const Glib::ustring& filename,
}
}
+
+ /* Load subpatches */
+
+ query = RDFQuery(*_namespaces, Glib::ustring(
+ "SELECT DISTINCT ?patch ?name FROM <") + document_uri + "> WHERE {\n" +
+ patch_uri + " ingen:node ?patch .\n"
+ "?patch a ingen:Patch ;\n"
+ " ingen:name ?name .\n"
+ "}");
+
+ results = query.run(document_uri);
+
+ for (RDFQuery::Results::iterator i = results.begin(); i != results.end(); ++i) {
+
+ const Glib::ustring& name = (*i)["name"];
+ const Glib::ustring& patch = (*i)["patch"];
+
+ const Path subpatch_path = patch_path.base() + (string)name;
+
+ if (created.find(subpatch_path) == created.end()) {
+ load(filename, patch_path, name, patch);
+ created[subpatch_path] = true;
+ }
+ }
+
created.clear();
@@ -225,39 +251,111 @@ Loader::load(const Glib::ustring& filename,
created.clear();
- /* Load connections */
+ /* Node -> Node connections */
+
+ query = RDFQuery(*_namespaces, Glib::ustring(
+ "SELECT DISTINCT ?srcnodename ?srcname ?dstnodename ?dstname FROM <") + document_uri + "> WHERE {\n" +
+ patch_uri + " ingen:node ?srcnode ;\n"
+ " ingen:node ?dstnode .\n"
+ "?srcnode ingen:port ?src ;\n"
+ " ingen:name ?srcnodename .\n" +
+ "?dstnode ingen:port ?dst ;\n"
+ " ingen:name ?dstnodename .\n"
+ "?src ingen:name ?srcname .\n"
+ "?dst ingen:connectedTo ?src ;\n"
+ " ingen:name ?dstname .\n"
+ "}\n");
+
+ results = query.run(document_uri);
+
+ for (RDFQuery::Results::iterator i = results.begin(); i != results.end(); ++i) {
+ Path src_node = patch_path.base() + string((*i)["srcnodename"]);
+ Path src_port = src_node.base() + string((*i)["srcname"]);
+ Path dst_node = patch_path.base() + string((*i)["dstnodename"]);
+ Path dst_port = dst_node.base() + string((*i)["dstname"]);
+
+ cerr << patch_path << " 1 CONNECTION: " << src_port << " -> " << dst_port << endl;
+
+ _engine->connect(src_port, dst_port);
+ }
+
+
+ /* This Patch -> Node connections */
+
+ query = RDFQuery(*_namespaces, Glib::ustring(
+ "SELECT DISTINCT ?srcname ?dstnodename ?dstname FROM <") + document_uri + "> WHERE {\n" +
+ patch_uri + " ingen:port ?src ;\n" +
+ " ingen:node ?dstnode .\n"
+ "?dstnode ingen:port ?dst ;\n"
+ " ingen:name ?dstnodename .\n"
+ "?dst ingen:connectedTo ?src ;\n"
+ " ingen:name ?dstname .\n"
+ "?src ingen:name ?srcname .\n"
+ "}\n");
+
+ results = query.run(document_uri);
+
+ for (RDFQuery::Results::iterator i = results.begin(); i != results.end(); ++i) {
+ Path src_port = patch_path.base() + string((*i)["srcname"]);
+
+ Path dst_node = patch_path.base() + string((*i)["dstnodename"]);
+ Path dst_port = dst_node.base() + string((*i)["dstname"]);
+
+ cerr << patch_path << " 2 CONNECTION: " << src_port << " -> " << dst_port << endl;
+
+ _engine->connect(src_port, dst_port);
+ }
+
+
+ /* Node -> This Patch connections */
- // FIXME: path?
query = RDFQuery(*_namespaces, Glib::ustring(
- "SELECT DISTINCT ?srcnode ?src ?dstnode ?dst FROM <") + document_uri + "> WHERE {\n" +
- "?srcnoderef ingen:port ?srcref .\n"
- "?dstnoderef ingen:port ?dstref .\n"
- "?dstref ingen:connectedTo ?srcref .\n"
- "?srcref ingen:name ?src .\n"
- "?dstref ingen:name ?dst .\n"
- "OPTIONAL { ?srcnoderef ingen:name ?srcnode } .\n"
- "OPTIONAL { ?dstnoderef ingen:name ?dstnode }\n"
+ "SELECT DISTINCT ?srcnodename ?srcname ?dstname FROM <") + document_uri + "> WHERE {\n" +
+ patch_uri + " ingen:port ?dst ;\n" +
+ " ingen:node ?srcnode .\n"
+ "?srcnode ingen:port ?src ;\n"
+ " ingen:name ?srcnodename .\n"
+ "?dst ingen:connectedTo ?src ;\n"
+ " ingen:name ?dstname .\n"
+ "?src ingen:name ?srcname .\n"
"}\n");
results = query.run(document_uri);
for (RDFQuery::Results::iterator i = results.begin(); i != results.end(); ++i) {
- Path src_node = patch_path;
- if ((*i).find("srcnode") != (*i).end())
- src_node = patch_path.base() + string((*i)["srcnode"]);
- Path src_port = src_node.base() + string((*i)["src"]);
+ Path dst_port = patch_path.base() + string((*i)["dstname"]);
- Path dst_node = patch_path;
- if ((*i).find("dstnode") != (*i).end())
- dst_node = patch_path.base() + string((*i)["dstnode"]);
- Path dst_port = dst_node.base() + string((*i)["dst"]);
+ Path src_node = patch_path.base() + string((*i)["srcnodename"]);
+ Path src_port = src_node.base() + string((*i)["srcname"]);
- //cerr << "CONNECTION: " << src_port << " -> " << dst_port << endl;
+ cerr << patch_path << " 3 CONNECTION: " << src_port << " -> " << dst_port << endl;
_engine->connect(src_port, dst_port);
}
+ /* Load metadata */
+
+ query = RDFQuery(*_namespaces, Glib::ustring(
+ "SELECT DISTINCT ?floatkey ?floatval FROM <") + document_uri + "> WHERE {\n" +
+ patch_uri + " ?floatkey ?floatval . \n"
+ " FILTER ( datatype(?floatval) = xsd:decimal ) \n"
+ "}");
+
+ results = query.run(document_uri);
+
+ for (RDFQuery::Results::iterator i = results.begin(); i != results.end(); ++i) {
+
+ const Glib::ustring& floatkey = _namespaces->qualify((*i)["floatkey"]);
+ const Glib::ustring& floatval = (*i)["floatval"];
+
+ if (floatkey != "" && floatval != "") {
+ const float val = atof(floatval.c_str());
+ _engine->set_metadata(patch_path, floatkey, Atom(val));
+ }
+ }
+
+
// Set passed metadata last to override any loaded values
for (MetadataMap::const_iterator i = data.begin(); i != data.end(); ++i)
_engine->set_metadata(patch_path, i->first, i->second);