From ab2aa4d4922ab1a62b7a43013d09b2d9d144b3c5 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 15 Aug 2008 23:34:41 +0000 Subject: Push serialiser down into core ('world'). HTTP access to patches (serialised on demand). git-svn-id: http://svn.drobilla.net/lad/ingen@1393 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/client/Store.cpp | 138 ++++++++++++++++++++++++++++------------------ 1 file changed, 85 insertions(+), 53 deletions(-) (limited to 'src/libs/client/Store.cpp') diff --git a/src/libs/client/Store.cpp b/src/libs/client/Store.cpp index 6bb3b767..47ed3719 100644 --- a/src/libs/client/Store.cpp +++ b/src/libs/client/Store.cpp @@ -32,31 +32,31 @@ namespace Ingen { namespace Client { -Store::Store(SharedPtr engine, SharedPtr emitter) +ClientStore::ClientStore(SharedPtr engine, SharedPtr emitter) : _engine(engine) , _emitter(emitter) { - emitter->signal_object_destroyed.connect(sigc::mem_fun(this, &Store::destruction_event)); - emitter->signal_object_renamed.connect(sigc::mem_fun(this, &Store::rename_event)); - emitter->signal_new_plugin.connect(sigc::mem_fun(this, &Store::new_plugin_event)); - emitter->signal_new_patch.connect(sigc::mem_fun(this, &Store::new_patch_event)); - emitter->signal_new_node.connect(sigc::mem_fun(this, &Store::new_node_event)); - emitter->signal_new_port.connect(sigc::mem_fun(this, &Store::new_port_event)); - emitter->signal_polyphonic.connect(sigc::mem_fun(this, &Store::polyphonic_event)); - emitter->signal_patch_enabled.connect(sigc::mem_fun(this, &Store::patch_enabled_event)); - emitter->signal_patch_disabled.connect(sigc::mem_fun(this, &Store::patch_disabled_event)); - emitter->signal_patch_polyphony.connect(sigc::mem_fun(this, &Store::patch_polyphony_event)); - emitter->signal_patch_cleared.connect(sigc::mem_fun(this, &Store::patch_cleared_event)); - emitter->signal_connection.connect(sigc::mem_fun(this, &Store::connection_event)); - emitter->signal_disconnection.connect(sigc::mem_fun(this, &Store::disconnection_event)); - emitter->signal_variable_change.connect(sigc::mem_fun(this, &Store::variable_change_event)); - emitter->signal_control_change.connect(sigc::mem_fun(this, &Store::control_change_event)); - emitter->signal_port_activity.connect(sigc::mem_fun(this, &Store::port_activity_event)); + emitter->signal_object_destroyed.connect(sigc::mem_fun(this, &ClientStore::destruction_event)); + emitter->signal_object_renamed.connect(sigc::mem_fun(this, &ClientStore::rename_event)); + emitter->signal_new_plugin.connect(sigc::mem_fun(this, &ClientStore::new_plugin_event)); + emitter->signal_new_patch.connect(sigc::mem_fun(this, &ClientStore::new_patch_event)); + emitter->signal_new_node.connect(sigc::mem_fun(this, &ClientStore::new_node_event)); + emitter->signal_new_port.connect(sigc::mem_fun(this, &ClientStore::new_port_event)); + emitter->signal_polyphonic.connect(sigc::mem_fun(this, &ClientStore::polyphonic_event)); + emitter->signal_patch_enabled.connect(sigc::mem_fun(this, &ClientStore::patch_enabled_event)); + emitter->signal_patch_disabled.connect(sigc::mem_fun(this, &ClientStore::patch_disabled_event)); + emitter->signal_patch_polyphony.connect(sigc::mem_fun(this, &ClientStore::patch_polyphony_event)); + emitter->signal_patch_cleared.connect(sigc::mem_fun(this, &ClientStore::patch_cleared_event)); + emitter->signal_connection.connect(sigc::mem_fun(this, &ClientStore::connection_event)); + emitter->signal_disconnection.connect(sigc::mem_fun(this, &ClientStore::disconnection_event)); + emitter->signal_variable_change.connect(sigc::mem_fun(this, &ClientStore::variable_change_event)); + emitter->signal_control_change.connect(sigc::mem_fun(this, &ClientStore::control_change_event)); + emitter->signal_port_activity.connect(sigc::mem_fun(this, &ClientStore::port_activity_event)); } void -Store::clear() +ClientStore::clear() { _objects.clear(); _plugins.clear(); @@ -64,7 +64,7 @@ Store::clear() void -Store::add_plugin_orphan(SharedPtr node) +ClientStore::add_plugin_orphan(SharedPtr node) { cerr << "WARNING: Node " << node->path() << " received, but plugin " << node->plugin_uri() << " unknown." << endl; @@ -85,7 +85,7 @@ Store::add_plugin_orphan(SharedPtr node) void -Store::resolve_plugin_orphans(SharedPtr plugin) +ClientStore::resolve_plugin_orphans(SharedPtr plugin) { Raul::Table > >::iterator n = _plugin_orphans.find(plugin->uri()); @@ -107,7 +107,7 @@ Store::resolve_plugin_orphans(SharedPtr plugin) void -Store::add_connection_orphan(std::pair orphan) +ClientStore::add_connection_orphan(std::pair orphan) { cerr << "WARNING: Orphan connection " << orphan.first << " -> " << orphan.second << " received." << endl; @@ -117,7 +117,7 @@ Store::add_connection_orphan(std::pair orphan) void -Store::resolve_connection_orphans(SharedPtr port) +ClientStore::resolve_connection_orphans(SharedPtr port) { assert(port->parent()); @@ -140,7 +140,7 @@ Store::resolve_connection_orphans(SharedPtr port) void -Store::add_orphan(SharedPtr child) +ClientStore::add_orphan(SharedPtr child) { cerr << "WARNING: Orphan object " << child->path() << " received." << endl; @@ -160,7 +160,7 @@ Store::add_orphan(SharedPtr child) void -Store::add_variable_orphan(const Path& subject_path, const string& predicate, const Atom& value) +ClientStore::add_variable_orphan(const Path& subject_path, const string& predicate, const Atom& value) { Raul::PathTable > >::iterator orphans = _variable_orphans.find(subject_path); @@ -178,7 +178,7 @@ Store::add_variable_orphan(const Path& subject_path, const string& predicate, co void -Store::resolve_variable_orphans(SharedPtr subject) +ClientStore::resolve_variable_orphans(SharedPtr subject) { Raul::PathTable > >::iterator v = _variable_orphans.find(subject->path()); @@ -199,7 +199,7 @@ Store::resolve_variable_orphans(SharedPtr subject) void -Store::resolve_orphans(SharedPtr parent) +ClientStore::resolve_orphans(SharedPtr parent) { Raul::PathTable > >::iterator c = _orphans.find(parent->path()); @@ -219,7 +219,7 @@ Store::resolve_orphans(SharedPtr parent) void -Store::add_object(SharedPtr object) +ClientStore::add_object(SharedPtr object) { // If we already have "this" object, merge the existing one into the new // one (with precedence to the new values). @@ -265,7 +265,7 @@ Store::add_object(SharedPtr object) SharedPtr -Store::remove_object(const Path& path) +ClientStore::remove_object(const Path& path) { Objects::iterator i = _objects.find(path); @@ -308,7 +308,7 @@ Store::remove_object(const Path& path) SharedPtr -Store::plugin(const string& uri) +ClientStore::plugin(const string& uri) { assert(uri.length() > 0); Plugins::iterator i = _plugins.find(uri); @@ -320,7 +320,7 @@ Store::plugin(const string& uri) SharedPtr -Store::object(const Path& path) +ClientStore::object(const Path& path) { assert(path.length() > 0); Objects::iterator i = _objects.find(path); @@ -335,7 +335,7 @@ Store::object(const Path& path) } void -Store::add_plugin(SharedPtr pm) +ClientStore::add_plugin(SharedPtr pm) { // FIXME: dupes? merge, like with objects? @@ -343,14 +343,46 @@ Store::add_plugin(SharedPtr pm) signal_new_plugin(pm); //cerr << "Plugin: " << pm->uri() << ", # plugins: " << _plugins.size() << endl; } + + +ClientStore::Objects::const_iterator +ClientStore::children_begin(SharedPtr o) const +{ + Objects::const_iterator parent = _objects.find(o->path()); + assert(parent != _objects.end()); + ++parent; + return parent; +} +ClientStore::Objects::const_iterator +ClientStore::children_end(SharedPtr o) const +{ + Objects::const_iterator parent = _objects.find(o->path()); + assert(parent != _objects.end()); + return _objects.find_descendants_end(parent); +} + + +SharedPtr +ClientStore::find_child(SharedPtr parent, const string& child_name) const +{ + Objects::const_iterator pi = _objects.find(parent->path()); + assert(pi != _objects.end()); + Objects::const_iterator children_end = _objects.find_descendants_end(pi); + Objects::const_iterator child = _objects.find(pi, children_end, parent->path().base() + child_name); + if (child != _objects.end()) + return PtrCast(child->second); + else + return SharedPtr(); +} + /* ****** Signal Handlers ******** */ void -Store::destruction_event(const Path& path) +ClientStore::destruction_event(const Path& path) { SharedPtr removed = remove_object(path); @@ -361,7 +393,7 @@ Store::destruction_event(const Path& path) } void -Store::rename_event(const Path& old_path, const Path& new_path) +ClientStore::rename_event(const Path& old_path, const Path& new_path) { Objects::iterator parent = _objects.find(old_path); if (parent == _objects.end()) { @@ -403,7 +435,7 @@ Store::rename_event(const Path& old_path, const Path& new_path) } void -Store::new_plugin_event(const string& uri, const string& type_uri, const string& symbol, const string& name) +ClientStore::new_plugin_event(const string& uri, const string& type_uri, const string& symbol, const string& name) { SharedPtr p(new PluginModel(uri, type_uri, symbol, name)); add_plugin(p); @@ -412,35 +444,35 @@ Store::new_plugin_event(const string& uri, const string& type_uri, const string& void -Store::new_patch_event(const Path& path, uint32_t poly) +ClientStore::new_patch_event(const Path& path, uint32_t poly) { - SharedPtr p(new PatchModel(*this, path, poly)); + SharedPtr p(new PatchModel(path, poly)); add_object(p); } void -Store::new_node_event(const string& plugin_uri, const Path& node_path, bool is_polyphonic, uint32_t num_ports) +ClientStore::new_node_event(const string& plugin_uri, const Path& node_path, bool is_polyphonic, uint32_t num_ports) { // FIXME: num_ports unused SharedPtr plug = plugin(plugin_uri); if (!plug) { - SharedPtr n(new NodeModel(*this, plugin_uri, node_path, is_polyphonic)); + SharedPtr n(new NodeModel(plugin_uri, node_path, is_polyphonic)); add_plugin_orphan(n); } else { - SharedPtr n(new NodeModel(*this, plug, node_path, is_polyphonic)); + SharedPtr n(new NodeModel(plug, node_path, is_polyphonic)); add_object(n); } } void -Store::new_port_event(const Path& path, uint32_t index, const string& type, bool is_output) +ClientStore::new_port_event(const Path& path, uint32_t index, const string& type, bool is_output) { PortModel::Direction pdir = is_output ? PortModel::OUTPUT : PortModel::INPUT; - SharedPtr p(new PortModel(*this, path, index, type, pdir)); + SharedPtr p(new PortModel(path, index, type, pdir)); add_object(p); if (p->parent()) resolve_connection_orphans(p); @@ -448,7 +480,7 @@ Store::new_port_event(const Path& path, uint32_t index, const string& type, bool void -Store::polyphonic_event(const Path& path, bool polyphonic) +ClientStore::polyphonic_event(const Path& path, bool polyphonic) { SharedPtr object = this->object(path); if (object) @@ -457,7 +489,7 @@ Store::polyphonic_event(const Path& path, bool polyphonic) void -Store::patch_enabled_event(const Path& path) +ClientStore::patch_enabled_event(const Path& path) { SharedPtr patch = PtrCast(object(path)); if (patch) @@ -466,7 +498,7 @@ Store::patch_enabled_event(const Path& path) void -Store::patch_disabled_event(const Path& path) +ClientStore::patch_disabled_event(const Path& path) { SharedPtr patch = PtrCast(object(path)); if (patch) @@ -475,7 +507,7 @@ Store::patch_disabled_event(const Path& path) void -Store::patch_polyphony_event(const Path& path, uint32_t poly) +ClientStore::patch_polyphony_event(const Path& path, uint32_t poly) { SharedPtr patch = PtrCast(object(path)); if (patch) @@ -484,7 +516,7 @@ Store::patch_polyphony_event(const Path& path, uint32_t poly) void -Store::patch_cleared_event(const Path& path) +ClientStore::patch_cleared_event(const Path& path) { Objects::iterator i = _objects.find(path); if (i != _objects.end()) { @@ -512,7 +544,7 @@ Store::patch_cleared_event(const Path& path) void -Store::variable_change_event(const Path& subject_path, const string& predicate, const Atom& value) +ClientStore::variable_change_event(const Path& subject_path, const string& predicate, const Atom& value) { SharedPtr subject = object(subject_path); @@ -528,7 +560,7 @@ Store::variable_change_event(const Path& subject_path, const string& predicate, void -Store::control_change_event(const Path& port_path, float value) +ClientStore::control_change_event(const Path& port_path, float value) { SharedPtr port = PtrCast(object(port_path)); if (port) @@ -539,7 +571,7 @@ Store::control_change_event(const Path& port_path, float value) void -Store::port_activity_event(const Path& port_path) +ClientStore::port_activity_event(const Path& port_path) { SharedPtr port = PtrCast(object(port_path)); if (port) @@ -550,7 +582,7 @@ Store::port_activity_event(const Path& port_path) SharedPtr -Store::connection_patch(const Path& src_port_path, const Path& dst_port_path) +ClientStore::connection_patch(const Path& src_port_path, const Path& dst_port_path) { SharedPtr patch; @@ -575,7 +607,7 @@ Store::connection_patch(const Path& src_port_path, const Path& dst_port_path) bool -Store::attempt_connection(const Path& src_port_path, const Path& dst_port_path, bool add_orphan) +ClientStore::attempt_connection(const Path& src_port_path, const Path& dst_port_path, bool add_orphan) { SharedPtr src_port = PtrCast(object(src_port_path)); SharedPtr dst_port = PtrCast(object(dst_port_path)); @@ -608,14 +640,14 @@ Store::attempt_connection(const Path& src_port_path, const Path& dst_port_path, void -Store::connection_event(const Path& src_port_path, const Path& dst_port_path) +ClientStore::connection_event(const Path& src_port_path, const Path& dst_port_path) { attempt_connection(src_port_path, dst_port_path, true); } void -Store::disconnection_event(const Path& src_port_path, const Path& dst_port_path) +ClientStore::disconnection_event(const Path& src_port_path, const Path& dst_port_path) { // Find the ports and create a ConnectionModel just to get at the parent path // finding logic in ConnectionModel. So I'm lazy. -- cgit v1.2.1