summaryrefslogtreecommitdiffstats
path: root/src/libs/client/Store.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2006-09-11 11:10:35 +0000
committerDavid Robillard <d@drobilla.net>2006-09-11 11:10:35 +0000
commitb15864870d34a1188eda93ad215734275037278e (patch)
tree224a1669a29091ea4198425d4a002e448cde8b30 /src/libs/client/Store.cpp
parent22bf43352ddfc48452d776f10ad4d12161255049 (diff)
downloadingen-b15864870d34a1188eda93ad215734275037278e.tar.gz
ingen-b15864870d34a1188eda93ad215734275037278e.tar.bz2
ingen-b15864870d34a1188eda93ad215734275037278e.zip
Switched homebrew CountedPtr to boost::shared_ptr.
Factories for patch windows, controller. Robustness updated in many places. Tons of cleanups, rewrites, bugfixes, etc. git-svn-id: http://svn.drobilla.net/lad/ingen@128 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/client/Store.cpp')
-rw-r--r--src/libs/client/Store.cpp299
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);