/*
- Copyright (C) 2000-2007 Paul Davis
+ Copyright (C) 2000-2007 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
ControlProtocolManager::ControlProtocolManager ()
{
- if (_instance == 0) {
- _instance = this;
- }
- _session = 0;
}
ControlProtocolManager::~ControlProtocolManager()
control_protocols.clear ();
-
+
for (list<ControlProtocolInfo*>::iterator p = control_protocol_info.begin(); p != control_protocol_info.end(); ++p) {
delete (*p);
}
}
void
-ControlProtocolManager::set_session (Session& s)
+ControlProtocolManager::set_session (Session* s)
{
- _session = &s;
- _session->GoingAway.connect (mem_fun (*this, &ControlProtocolManager::drop_session));
+ SessionHandlePtr::set_session (s);
- for (list<ControlProtocolInfo*>::iterator i = control_protocol_info.begin(); i != control_protocol_info.end(); ++i) {
- if ((*i)->requested || (*i)->mandatory) {
- instantiate (**i);
- (*i)->requested = false;
+ if (_session) {
+ Glib::Mutex::Lock lm (protocols_lock);
- if ((*i)->protocol && (*i)->state) {
- (*i)->protocol->set_state (*(*i)->state);
+ for (list<ControlProtocolInfo*>::iterator i = control_protocol_info.begin(); i != control_protocol_info.end(); ++i) {
+ if ((*i)->requested || (*i)->mandatory) {
+ instantiate (**i);
+ (*i)->requested = false;
+
+ if ((*i)->protocol && (*i)->state) {
+ (*i)->protocol->set_state (*(*i)->state, Stateful::loading_state_version);
+ }
}
}
}
}
void
-ControlProtocolManager::drop_session ()
+ControlProtocolManager::session_going_away()
{
- _session = 0;
+ SessionHandlePtr::session_going_away ();
{
Glib::Mutex::Lock lm (protocols_lock);
+
for (list<ControlProtocol*>::iterator p = control_protocols.begin(); p != control_protocols.end(); ++p) {
delete *p;
}
+
control_protocols.clear ();
-
+
for (list<ControlProtocolInfo*>::iterator p = control_protocol_info.begin(); p != control_protocol_info.end(); ++p) {
+ // mark existing protocols as requested
// otherwise the ControlProtocol instances are not recreated in set_session
if ((*p)->protocol) {
(*p)->requested = true;
ControlProtocol*
ControlProtocolManager::instantiate (ControlProtocolInfo& cpi)
{
+ /* CALLER MUST HOLD LOCK */
+
if (_session == 0) {
return 0;
}
return 0;
}
- Glib::Mutex::Lock lm (protocols_lock);
control_protocols.push_back (cpi.protocol);
return cpi.protocol;
}
cpi.descriptor->destroy (cpi.descriptor, cpi.protocol);
-
+
{
Glib::Mutex::Lock lm (protocols_lock);
list<ControlProtocol*>::iterator p = find (control_protocols.begin(), control_protocols.end(), cpi.protocol);
} else {
cerr << "Programming error: ControlProtocolManager::teardown() called for " << cpi.name << ", but it was not found in control_protocols" << endl;
}
-
- list<ControlProtocolInfo*>::iterator p2 = find (control_protocol_info.begin(), control_protocol_info.end(), &cpi);
- if (p2 != control_protocol_info.end()) {
- control_protocol_info.erase (p2);
- } else {
- cerr << "Programming error: ControlProtocolManager::teardown() called for " << cpi.name << ", but it was not found in control_protocol_info" << endl;
- }
}
-
+
cpi.protocol = 0;
dlclose (cpi.descriptor->module);
return 0;
return;
}
+ Glib::Mutex::Lock lm (protocols_lock);
+
for (list<ControlProtocolInfo*>::iterator i = control_protocol_info.begin(); i != control_protocol_info.end(); ++i) {
if ((*i)->mandatory && ((*i)->protocol == 0)) {
info << string_compose (_("Instantiating mandatory control protocol %1"), (*i)->name) << endmsg;
cpi->mandatory = descriptor->mandatory;
cpi->supports_feedback = descriptor->supports_feedback;
cpi->state = 0;
-
+
control_protocol_info.push_back (cpi);
-
+
info << string_compose(_("Control surface protocol discovered: \"%1\""), cpi->name) << endmsg;
}
}
void
-ControlProtocolManager::foreach_known_protocol (sigc::slot<void,const ControlProtocolInfo*> method)
+ControlProtocolManager::foreach_known_protocol (boost::function<void(const ControlProtocolInfo*)> method)
{
for (list<ControlProtocolInfo*>::iterator i = control_protocol_info.begin(); i != control_protocol_info.end(); ++i) {
method (*i);
}
int
-ControlProtocolManager::set_state (const XMLNode& node)
+ControlProtocolManager::set_state (const XMLNode& node, int /*version*/)
{
XMLNodeList clist;
XMLNodeConstIterator citer;
XMLProperty* prop;
+ Glib::Mutex::Lock lm (protocols_lock);
+
clist = node.children();
for (citer = clist.begin(); citer != clist.end(); ++citer) {
prop = (*citer)->property (X_("active"));
- if (prop && prop->value() == X_("yes")) {
+ if (prop && string_is_affirmative (prop->value())) {
if ((prop = (*citer)->property (X_("name"))) != 0) {
ControlProtocolInfo* cpi = cpi_by_name (prop->value());
if (cpi) {
} else {
cpi->state = 0;
}
-
+
if (_session) {
instantiate (*cpi);
} else {
}
}
}
- }
+ }
}
return 0;
}
cpi->state = new XMLNode (*child);
}
}
+
+ControlProtocolManager&
+ControlProtocolManager::instance ()
+{
+ if (_instance == 0) {
+ _instance = new ControlProtocolManager ();
+ }
+
+ return *_instance;
+}