summaryrefslogtreecommitdiffstats
path: root/src/Serialiser.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2016-10-06 15:51:11 -0400
committerDavid Robillard <d@drobilla.net>2016-10-06 15:51:11 -0400
commit77f6e9e63ce9ad329b43c92e8a9556aff8e78f2f (patch)
tree50dca5900274ca2f95c3d06069b7fe0bd285e46b /src/Serialiser.cpp
parenta513af4218d0a62a45960d04ff6ddeecb8d3d4f5 (diff)
downloadingen-77f6e9e63ce9ad329b43c92e8a9556aff8e78f2f.tar.gz
ingen-77f6e9e63ce9ad329b43c92e8a9556aff8e78f2f.tar.bz2
ingen-77f6e9e63ce9ad329b43c92e8a9556aff8e78f2f.zip
Add plugin state saving
This only works with a server-side save, so the GUI now uses that if the server is not running remotely, where "remotely" is defined as "via TCP". This isn't perfect, since running ingen via TCP locally is a perfectly valid thing to do, but it will do for now.
Diffstat (limited to 'src/Serialiser.cpp')
-rw-r--r--src/Serialiser.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/Serialiser.cpp b/src/Serialiser.cpp
index 37bd20c0..da88559c 100644
--- a/src/Serialiser.cpp
+++ b/src/Serialiser.cpp
@@ -445,9 +445,23 @@ Serialiser::Impl::serialise_block(SPtr<const Node> block,
Sord::URI(_model->world(), uris.lv2_prototype),
class_id);
- const Node::Properties props = block->properties();
+ // Serialise properties, but remove possibly stale state:state (set again below)
+ Node::Properties props = block->properties();
+ props.erase(uris.state_state);
serialise_properties(block_id, props);
+ if (_base_uri.substr(0, 5) == "file:") {
+ const std::string base = Glib::filename_from_uri(_base_uri);
+ const std::string graph_dir = Glib::path_get_dirname(base);
+ const std::string state_dir = Glib::build_filename(graph_dir, block->symbol());
+ const std::string state_file = Glib::build_filename(state_dir, "state.ttl");
+ if (block->save_state(state_dir)) {
+ _model->add_statement(block_id,
+ Sord::URI(_model->world(), uris.state_state),
+ Sord::URI(_model->world(), Glib::filename_to_uri(state_file)));
+ }
+ }
+
for (uint32_t i = 0; i < block->num_ports(); ++i) {
Node* const p = block->port(i);
const Sord::Node port_id = path_rdf_node(p->path());