diff options
Diffstat (limited to 'src/libs/client/Store.cpp')
-rw-r--r-- | src/libs/client/Store.cpp | 299 |
1 files changed, 133 insertions, 166 deletions
diff --git a/src/libs/client/Store.cpp b/src/libs/client/Store.cpp index ef1b7283..36e815d8 100644 --- a/src/libs/client/Store.cpp +++ b/src/libs/client/Store.cpp @@ -55,22 +55,98 @@ Store::clear() void +Store::add_plugin_orphan(CountedPtr<NodeModel> node) +{ + cerr << "WARNING: Node " << node->path() << " received, but plugin " + << node->plugin_uri() << " unknown." << endl; + + map<string, list<CountedPtr<NodeModel> > >::iterator spawn + = m_plugin_orphans.find(node->plugin_uri()); + + if (spawn != m_plugin_orphans.end()) { + spawn->second.push_back(node); + } else { + list<CountedPtr<NodeModel> > l; + l.push_back(node); + m_plugin_orphans[node->plugin_uri()] = l; + } +} + + +void +Store::resolve_plugin_orphans(CountedPtr<PluginModel> plugin) +{ + map<string, list<CountedPtr<NodeModel> > >::iterator spawn + = m_plugin_orphans.find(plugin->uri()); + + if (spawn != m_plugin_orphans.end()) { + cerr << "XXXXXXXXXX PLUGIN-ORPHAN PLUGIN FOUND!! XXXXXXXXXXXXXXXXX" << endl; + } +} + + +void +Store::add_orphan(CountedPtr<ObjectModel> child) +{ + cerr << "WARNING: Orphan object " << child->path() << " received." << endl; + + map<Path, list<CountedPtr<ObjectModel> > >::iterator children + = m_orphans.find(child->path().parent()); + + if (children != m_orphans.end()) { + children->second.push_back(child); + } else { + list<CountedPtr<ObjectModel> > l; + l.push_back(child); + m_orphans[child->path().parent()] = l; + } +} + + +void +Store::resolve_orphans(CountedPtr<ObjectModel> parent) +{ + map<Path, list<CountedPtr<ObjectModel> > >::iterator children + = m_orphans.find(parent->path()); + + if (children != m_orphans.end()) { + cerr << "XXXXXXXXXXXXX ORPHAN PARENT FOUND!! XXXXXXXXXXXXXXXXX" << endl; + } +} + + +void Store::add_object(CountedPtr<ObjectModel> object) { assert(object->path() != ""); assert(m_objects.find(object->path()) == m_objects.end()); + if (object->path() != "/") { + CountedPtr<ObjectModel> parent = this->object(object->path().parent()); + if (parent) { + assert(object->path().is_child_of(parent->path())); + object->set_parent(parent); + parent->add_child(object); + assert(object->parent() == parent); + } else { + add_orphan(object); + } + } + m_objects[object->path()] = object; new_object_sig.emit(object); + + resolve_orphans(object); + //cout << "[Store] Added " << object->path() << endl; } CountedPtr<ObjectModel> -Store::remove_object(const string& path) +Store::remove_object(const Path& path) { - map<string, CountedPtr<ObjectModel> >::iterator i = m_objects.find(path); + map<Path, CountedPtr<ObjectModel> >::iterator i = m_objects.find(path); if (i != m_objects.end()) { assert((*i).second->path() == path); @@ -80,7 +156,7 @@ Store::remove_object(const string& path) return result; } else { cerr << "[Store] Unable to find object " << path << " to remove." << endl; - return NULL; + return CountedPtr<ObjectModel>(); } } @@ -91,84 +167,29 @@ Store::plugin(const string& uri) assert(uri.length() > 0); map<string, CountedPtr<PluginModel> >::iterator i = m_plugins.find(uri); if (i == m_plugins.end()) - return NULL; + return CountedPtr<PluginModel>(); else return (*i).second; } CountedPtr<ObjectModel> -Store::object(const string& path) +Store::object(const Path& path) { assert(path.length() > 0); - map<string, CountedPtr<ObjectModel> >::iterator i = m_objects.find(path); + map<Path, CountedPtr<ObjectModel> >::iterator i = m_objects.find(path); if (i == m_objects.end()) - return NULL; + return CountedPtr<ObjectModel>(); else return (*i).second; } -#if 0 -CountedPtr<PatchModel> -Store::patch(const string& path) -{ - assert(path.length() > 0); - map<string, CountedPtr<ObjectModel> >::iterator i = m_objects.find(path); - if (i == m_objects.end()) - return NULL; - else - return (CountedPtr<PatchModel>)(*i).second; // FIXME -} - - -CountedPtr<NodeModel> -Store::node(const string& path) -{ - assert(path.length() > 0); - map<string, CountedPtr<ObjectModel> >::iterator i = m_objects.find(path); - if (i == m_objects.end()) - return NULL; - else - return (*i).second; -} - - -CountedPtr<PortModel> -Store::port(const string& path) -{ - assert(path.length() > 0); - map<string, CountedPtr<ObjectModel> >::iterator i = m_objects.find(path); - if (i == m_objects.end()) { - return NULL; - } else { - // Normal port - /*PortModel* const pc = dynamic_cast<PortModel*>((*i).second); - if (pc) - return pc;*/ - return (*i).second; - - // Patch port (corresponding Node is in store) - // FIXME - // - /* - NodeModel* const nc = dynamic_cast<NodeModel*>((*i).second); - if (nc) - return nc->as_port(); // Patch port (maybe) - */ - } - - return NULL; -} -#endif - void Store::add_plugin(CountedPtr<PluginModel> pm) { - //if (m_plugins.find(pm->uri()) != m_plugins.end()) { - // cerr << "DUPE PLUGIN: " << pm->uri() << endl; - //} else { - m_plugins[pm->uri()] = pm; - //} + // FIXME: dupes? + + m_plugins[pm->uri()] = pm; } @@ -177,10 +198,9 @@ Store::add_plugin(CountedPtr<PluginModel> pm) void -Store::destruction_event(const string& path) +Store::destruction_event(const Path& path) { - // I'm assuming the compiler will optimize out all these const - // pointers into one... + // Hopefully the compiler will optimize all these const pointers into one... CountedPtr<ObjectModel> obj_ptr = remove_object(path); ObjectModel* const object = obj_ptr.get(); @@ -194,147 +214,94 @@ Store::destruction_event(const string& path) cerr << "Node\n"; PatchModel* const parent = dynamic_cast<PatchModel* const>(object->parent().get()); if (parent) - parent->remove_node(node->name()); + parent->remove_node(node->path().name()); } PortModel* const port = dynamic_cast<PortModel*>(object); if (port) { NodeModel* const parent = dynamic_cast<NodeModel* const>(object->parent().get()); assert(parent); - parent->remove_port(port->name()); + parent->remove_port(port->path().name()); } - // FIXME: emit signals + if (object) + object->destroyed_sig.emit(); } void Store::new_plugin_event(const string& type, const string& uri, const string& name) { - PluginModel* const p = new PluginModel(type, uri); + CountedPtr<PluginModel> p(new PluginModel(type, uri)); p->name(name); add_plugin(p); + resolve_plugin_orphans(p); } void -Store::new_patch_event(const string& path, uint32_t poly) +Store::new_patch_event(const Path& path, uint32_t poly) { - // FIXME: What to do with a conflict? - - if (m_objects.find(path) == m_objects.end()) { - CountedPtr<PatchModel> p(new PatchModel(path, poly)); - add_object(p); - - if (path != "/") { - CountedPtr<PatchModel> parent = object(p->path().parent()); - if (parent) { - assert(path.substr(0, parent->path().length()) == parent->path()); - p->set_parent(parent); - parent->add_node(p); - assert(p->parent() == parent); - } else { - cerr << "ERROR: new patch with no parent" << endl; - } - } - } + CountedPtr<PatchModel> p(new PatchModel(path, poly)); + add_object(p); } void -Store::new_node_event(const string& plugin_type, const string& plugin_uri, const string& node_path, bool is_polyphonic, uint32_t num_ports) +Store::new_node_event(const string& plugin_type, const string& plugin_uri, const Path& node_path, bool is_polyphonic, uint32_t num_ports) { - // FIXME: What to do with a conflict? - - if (m_objects.find(node_path) == m_objects.end()) { - - CountedPtr<PluginModel> plug = plugin(plugin_uri); - assert(plug); - + // FIXME: num_ports unused + + CountedPtr<PluginModel> plug = plugin(plugin_uri); + if (!plug) { + CountedPtr<NodeModel> n(new NodeModel(plugin_uri, node_path)); + n->polyphonic(is_polyphonic); + add_plugin_orphan(n); + } else { CountedPtr<NodeModel> n(new NodeModel(plug, node_path)); n->polyphonic(is_polyphonic); - // FIXME: num_ports unused add_object(n); - - //std::map<string, CountedPtr<ObjectModel> >::iterator pi = m_objects.find(n->path().parent()); - //if (pi != m_objects.end()) { - CountedPtr<PatchModel> parent = object(n->path().parent()); - if (parent) { - n->set_parent(parent); - assert(n->parent() == parent); - parent->add_node(n); - assert(n->parent() == parent); - } else { - cerr << "ERROR: new node with no parent" << endl; - } } } void -Store::new_port_event(const string& path, const string& type, bool is_output) +Store::new_port_event(const Path& path, const string& type, bool is_output) { // FIXME: this sucks - /* - if (m_objects.find(path) == m_objects.end()) { - PortModel::Type ptype = PortModel::CONTROL; - if (type == "AUDIO") ptype = PortModel::AUDIO; - else if (type == "CONTROL") ptype = PortModel::CONTROL; - else if (type== "MIDI") ptype = PortModel::MIDI; - else cerr << "[OSCListener] WARNING: Unknown port type received (" << type << ")" << endl; - - PortModel::Direction pdir = is_output ? PortModel::OUTPUT : PortModel::INPUT; - - PortModel* const p = new PortModel(path, ptype, pdir); - - add_object(p); - } else - */ - if (m_objects.find(path) == m_objects.end()) { - - PortModel::Type ptype = PortModel::CONTROL; - if (type == "AUDIO") ptype = PortModel::AUDIO; - else if (type == "CONTROL") ptype = PortModel::CONTROL; - else if (type== "MIDI") ptype = PortModel::MIDI; - else cerr << "[Store] WARNING: Unknown port type received (" << type << ")" << endl; - - PortModel::Direction pdir = is_output ? PortModel::OUTPUT : PortModel::INPUT; - - CountedPtr<PortModel> p(new PortModel(path, ptype, pdir)); - add_object(p); - - CountedPtr<NodeModel> parent = object(p->path().parent()); - if (parent) { - p->set_parent(parent); - assert(p->parent() == parent); - parent->add_port(p); - assert(p->parent() == parent); - } else { - cerr << "ERROR: new port with no parent" << endl; - } - } + + PortModel::Type ptype = PortModel::CONTROL; + if (type == "AUDIO") ptype = PortModel::AUDIO; + else if (type == "CONTROL") ptype = PortModel::CONTROL; + else if (type== "MIDI") ptype = PortModel::MIDI; + else cerr << "[Store] WARNING: Unknown port type received (" << type << ")" << endl; + + PortModel::Direction pdir = is_output ? PortModel::OUTPUT : PortModel::INPUT; + + CountedPtr<PortModel> p(new PortModel(path, ptype, pdir)); + add_object(p); } void -Store::patch_enabled_event(const string& path) +Store::patch_enabled_event(const Path& path) { - CountedPtr<PatchModel> patch = object(path); + CountedPtr<PatchModel> patch = PtrCast<PatchModel>(object(path)); if (patch) patch->enable(); } void -Store::patch_disabled_event(const string& path) +Store::patch_disabled_event(const Path& path) { - CountedPtr<PatchModel> patch = object(path); + CountedPtr<PatchModel> patch = PtrCast<PatchModel>(object(path)); if (patch) patch->disable(); } void -Store::metadata_update_event(const string& subject_path, const string& predicate, const string& value) +Store::metadata_update_event(const Path& subject_path, const string& predicate, const string& value) { CountedPtr<ObjectModel> subject = object(subject_path); if (subject) @@ -345,9 +312,9 @@ Store::metadata_update_event(const string& subject_path, const string& predicate void -Store::control_change_event(const string& port_path, float value) +Store::control_change_event(const Path& port_path, float value) { - CountedPtr<PortModel> port = object(port_path); + CountedPtr<PortModel> port = PtrCast<PortModel>(object(port_path)); if (port) port->value(value); else @@ -358,8 +325,8 @@ Store::control_change_event(const string& port_path, float value) void Store::connection_event(const Path& src_port_path, const Path& dst_port_path) { - CountedPtr<PortModel> src_port = object(src_port_path); - CountedPtr<PortModel> dst_port = object(dst_port_path); + CountedPtr<PortModel> src_port = PtrCast<PortModel>(object(src_port_path)); + CountedPtr<PortModel> dst_port = PtrCast<PortModel>(object(dst_port_path)); assert(src_port); assert(dst_port); @@ -367,9 +334,9 @@ Store::connection_event(const Path& src_port_path, const Path& dst_port_path) src_port->connected_to(dst_port); dst_port->connected_to(src_port); - CountedPtr<ConnectionModel> cm = new ConnectionModel(src_port, dst_port); + CountedPtr<ConnectionModel> cm(new ConnectionModel(src_port, dst_port)); - CountedPtr<PatchModel> patch = this->object(cm->patch_path()); + CountedPtr<PatchModel> patch = PtrCast<PatchModel>(this->object(cm->patch_path())); if (patch) patch->add_connection(cm); @@ -384,8 +351,8 @@ Store::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. - CountedPtr<PortModel> src_port = object(src_port_path); - CountedPtr<PortModel> dst_port = object(dst_port_path); + CountedPtr<PortModel> src_port = PtrCast<PortModel>(object(src_port_path)); + CountedPtr<PortModel> dst_port = PtrCast<PortModel>(object(dst_port_path)); assert(src_port); assert(dst_port); @@ -393,9 +360,9 @@ Store::disconnection_event(const Path& src_port_path, const Path& dst_port_path) src_port->disconnected_from(dst_port); dst_port->disconnected_from(src_port); - CountedPtr<ConnectionModel> cm = new ConnectionModel(src_port, dst_port); + CountedPtr<ConnectionModel> cm(new ConnectionModel(src_port, dst_port)); - CountedPtr<PatchModel> patch = this->object(cm->patch_path()); + CountedPtr<PatchModel> patch = PtrCast<PatchModel>(this->object(cm->patch_path())); if (patch) patch->remove_connection(src_port_path, dst_port_path); |