X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fconfiguration.cc;h=b164d418abcd2daa33b05462f376dd220e001589;hb=ac1a2557065726e31a4c9dfaec97b29393e043d8;hp=c8d71c5155b2199ea8065cb109483ba69c63189d;hpb=99904735e066804358f1d0bd138a84f1e9ecda91;p=ardour.git diff --git a/libs/ardour/configuration.cc b/libs/ardour/configuration.cc index c8d71c5155..b164d418ab 100644 --- a/libs/ardour/configuration.cc +++ b/libs/ardour/configuration.cc @@ -20,13 +20,21 @@ #include #include /* for snprintf, grrr */ +#include +#include /* for g_stat() */ + #include #include +#include +#include + +#include #include #include #include #include +#include #include "i18n.h" @@ -51,7 +59,8 @@ Configuration::Configuration () #define CONFIG_VARIABLE_SPECIAL(Type,var,name,value,mutator) var (name,value,mutator), #include "ardour/configuration_vars.h" #undef CONFIG_VARIABLE -#undef CONFIG_VARIABLE_SPECIAL +#undef CONFIG_VARIABLE_SPECIAL + current_owner (ConfigVariableBase::Default) { @@ -71,55 +80,85 @@ Configuration::set_current_owner (ConfigVariableBase::Owner owner) int Configuration::load_state () { - string rcfile; - - /* load system configuration first */ - - rcfile = find_config_file ("ardour_system.rc"); + bool found = false; - if (rcfile.length()) { + sys::path system_rc_file; + struct stat statbuf; + /* load system configuration first */ + + if ( find_file_in_search_path (ardour_search_path() + system_config_search_path(), + "ardour_system.rc", system_rc_file) ) + { XMLTree tree; + found = true; - cerr << string_compose (_("loading system configuration file %1"), rcfile) << endl; + string rcfile = system_rc_file.to_string(); + + /* stupid XML Parser hates empty files */ - if (!tree.read (rcfile.c_str())) { - error << string_compose(_("Ardour: cannot read system configuration file \"%1\""), rcfile) << endmsg; + if (g_stat (rcfile.c_str(), &statbuf)) { return -1; } - current_owner = ConfigVariableBase::System; - - if (set_state (*tree.root())) { - error << string_compose(_("Ardour: system configuration file \"%1\" not loaded successfully."), rcfile) << endmsg; - return -1; + if (statbuf.st_size != 0) { + cerr << string_compose (_("loading system configuration file %1"), rcfile) << endl; + + if (!tree.read (rcfile.c_str())) { + error << string_compose(_("Ardour: cannot read system configuration file \"%1\""), rcfile) << endmsg; + return -1; + } + + current_owner = ConfigVariableBase::System; + + if (set_state (*tree.root())) { + error << string_compose(_("Ardour: system configuration file \"%1\" not loaded successfully."), rcfile) << endmsg; + return -1; + } + } else { + error << _("your system Ardour configuration file is empty. This probably means that there as an error installing Ardour") << endmsg; } } - /* now load configuration file for user */ - - rcfile = find_config_file ("ardour.rc"); - if (rcfile.length()) { + sys::path user_rc_file; + if (find_file_in_search_path (ardour_search_path() + user_config_directory(), + "ardour.rc", user_rc_file)) + { XMLTree tree; - cerr << string_compose (_("loading user configuration file %1"), rcfile) << endl; - - if (!tree.read (rcfile)) { - error << string_compose(_("Ardour: cannot read configuration file \"%1\""), rcfile) << endmsg; - return -1; - } + string rcfile = user_rc_file.to_string(); - current_owner = ConfigVariableBase::Config; + /* stupid XML parser hates empty files */ - if (set_state (*tree.root())) { - error << string_compose(_("Ardour: user configuration file \"%1\" not loaded successfully."), rcfile) << endmsg; + if (g_stat (rcfile.c_str(), &statbuf)) { return -1; } + + if (statbuf.st_size != 0) { + cerr << string_compose (_("loading user configuration file %1"), rcfile) << endl; + + if (!tree.read (rcfile)) { + error << string_compose(_("Ardour: cannot read configuration file \"%1\""), rcfile) << endmsg; + return -1; + } + + current_owner = ConfigVariableBase::Config; + + if (set_state (*tree.root())) { + error << string_compose(_("Ardour: user configuration file \"%1\" not loaded successfully."), rcfile) << endmsg; + return -1; + } + } else { + warning << _("your Ardour configuration file is empty. This is not normal.") << endmsg; + } } + if (!found) + error << "Ardour: could not find configuration file (ardour.rc), canvas will look broken." << endmsg; + return 0; } @@ -127,11 +166,23 @@ int Configuration::save_state() { XMLTree tree; - string rcfile; - rcfile = get_user_ardour_path (); - rcfile += "ardour.rc"; + try + { + sys::create_directories (user_config_directory ()); + } + catch (const sys::filesystem_error& ex) + { + error << "Could not create user configuration directory" << endmsg; + return -1; + } + + sys::path rcfile_path(user_config_directory()); + + rcfile_path /= "ardour.rc"; + const string rcfile = rcfile_path.to_string(); + // this test seems bogus? if (rcfile.length()) { tree.set_root (&get_state()); if (!tree.write (rcfile.c_str())){ @@ -143,6 +194,19 @@ Configuration::save_state() return 0; } +void +Configuration::add_instant_xml(XMLNode& node) +{ + Stateful::add_instant_xml (node, user_config_directory ()); +} + +XMLNode* +Configuration::instant_xml(const string& node_name) +{ + return Stateful::instant_xml (node_name, user_config_directory ()); +} + + bool Configuration::save_config_options_predicate (ConfigVariableBase::Owner owner) { @@ -157,12 +221,15 @@ Configuration::get_state () LocaleGuard lg (X_("POSIX")); root = new XMLNode("Ardour"); - typedef map::const_iterator CI; - for(CI m = midi_ports.begin(); m != midi_ports.end(); ++m){ - root->add_child_nocopy(m->second->get_state()); + + MIDI::Manager::PortMap::const_iterator i; + const MIDI::Manager::PortMap& ports = MIDI::Manager::instance()->get_midi_ports(); + + for (i = ports.begin(); i != ports.end(); ++i) { + root->add_child_nocopy(i->second->get_state()); } - root->add_child_nocopy (get_variables (sigc::mem_fun (*this, &Configuration::save_config_options_predicate))); + root->add_child_nocopy (get_variables (sigc::mem_fun (*this, &Configuration::save_config_options_predicate), "Config")); if (_extra_xml) { root->add_child_copy (*_extra_xml); @@ -174,23 +241,23 @@ Configuration::get_state () } XMLNode& -Configuration::get_variables (sigc::slot predicate) +Configuration::get_variables (sigc::slot predicate, std::string which_node) { XMLNode* node; LocaleGuard lg (X_("POSIX")); - node = new XMLNode("Config"); + node = new XMLNode(which_node); #undef CONFIG_VARIABLE #undef CONFIG_VARIABLE_SPECIAL -#define CONFIG_VARIABLE(type,var,name,value) \ - if (predicate (var.owner())) { var.add_to_node (*node); } -#define CONFIG_VARIABLE_SPECIAL(type,var,name,value,mutator) \ - if (predicate (var.owner())) { var.add_to_node (*node); } +#define CONFIG_VARIABLE(type,var,Name,value) \ + if (node->name() == "Config") { if (predicate (var.owner())) { var.add_to_node (*node); }} +#define CONFIG_VARIABLE_SPECIAL(type,var,Name,value,mutator) \ + if (node->name() == "Config") { if (predicate (var.owner())) { var.add_to_node (*node); }} #include "ardour/configuration_vars.h" #undef CONFIG_VARIABLE #undef CONFIG_VARIABLE_SPECIAL - + return *node; } @@ -212,10 +279,13 @@ Configuration::set_state (const XMLNode& root) if (node->name() == "MIDI-port") { try { - pair newpair; - newpair.second = new MidiPortDescriptor (*node); - newpair.first = newpair.second->tag; - midi_ports.insert (newpair); + + MIDI::Port::Descriptor desc (*node); + map::iterator x; + if ((x = midi_ports.find (desc.tag)) != midi_ports.end()) { + midi_ports.erase (x); + } + midi_ports.insert (pair(desc.tag,*node)); } catch (failed_constructor& err) { @@ -252,58 +322,12 @@ Configuration::set_variables (const XMLNode& node, ConfigVariableBase::Owner own if (var.set_from_node (node, owner)) { \ ParameterChanged (name); \ } + #include "ardour/configuration_vars.h" #undef CONFIG_VARIABLE -#undef CONFIG_VARIABLE_SPECIAL - -} - -Configuration::MidiPortDescriptor::MidiPortDescriptor (const XMLNode& node) -{ - const XMLProperty *prop; - bool have_tag = false; - bool have_device = false; - bool have_type = false; - bool have_mode = false; - - if ((prop = node.property ("tag")) != 0) { - tag = prop->value(); - have_tag = true; - } - - if ((prop = node.property ("device")) != 0) { - device = prop->value(); - have_device = true; - } - - if ((prop = node.property ("type")) != 0) { - type = prop->value(); - have_type = true; - } - - if ((prop = node.property ("mode")) != 0) { - mode = prop->value(); - have_mode = true; - } - - if (!have_tag || !have_device || !have_type || !have_mode) { - throw failed_constructor(); - } -} - -XMLNode& -Configuration::MidiPortDescriptor::get_state() -{ - XMLNode* root = new XMLNode("MIDI-port"); - - root->add_property("tag", tag); - root->add_property("device", device); - root->add_property("type", type); - root->add_property("mode", mode); - - return *root; +#undef CONFIG_VARIABLE_SPECIAL + } - void Configuration::map_parameters (sigc::slot theSlot) {