Fix merge regression: use TempoLines class instead of same built in to editor.
[ardour.git] / libs / ardour / export_profile_manager.cc
index 88432bcedc5b7ba95a7de60de3ebb1b3157fd414..ac17ec7310f51d7d483f665097e9142d05c7e23b 100644 (file)
 #include <pbd/xml++.h>
 #include <pbd/convert.h>
 
-#include <ardour/audioengine.h>
 #include <ardour/export_failed.h>
 #include <ardour/export_format_specification.h>
 #include <ardour/export_timespan.h>
 #include <ardour/export_channel_configuration.h>
 #include <ardour/export_filename.h>
+#include <ardour/export_preset.h>
 #include <ardour/export_handler.h>
+#include <ardour/filename_extensions.h>
 #include <ardour/session.h>
 
 #include "i18n.h"
@@ -45,143 +46,6 @@ using namespace PBD;
 namespace ARDOUR
 {
 
-ExportProfileManager::Preset::Preset (string filename, Session & s) :
-  _id (0), session (s), global (filename), local (0)
-{
-       XMLNode * root;
-       if ((root = global.root())) {
-               XMLProperty * prop;
-               if ((prop = root->property ("id"))) {
-                       set_id ((uint32_t) atoi (prop->value()));
-               }
-               if ((prop = root->property ("name"))) {
-                       set_name (prop->value());
-               }
-               
-               XMLNode * instant_xml = get_instant_xml ();
-               if (instant_xml) {
-                       XMLNode * instant_copy = new XMLNode (*instant_xml);
-                       set_local_state (*instant_copy);
-               }
-       }
-}
-
-ExportProfileManager::Preset::~Preset ()
-{
-       if (local) {
-               delete local;
-       }
-}
-
-void
-ExportProfileManager::Preset::set_name (string name)
-{
-       _name = name;
-
-       XMLNode * node; 
-       if ((node = global.root())) {
-               node->add_property ("name", name);
-       }
-       if (local) {
-               local->add_property ("name", name);
-       }
-}
-
-void
-ExportProfileManager::Preset::set_id (uint32_t id)
-{
-       _id = id;
-
-       XMLNode * node;
-       if ((node = global.root())) {
-               node->add_property ("id", id);
-       }
-       if (local) {
-               local->add_property ("id", id);
-       }
-}
-
-void
-ExportProfileManager::Preset::set_global_state (XMLNode & state)
-{
-       delete global.root ();
-       global.set_root (&state);
-       
-       set_id (_id);
-       set_name (_name);
-}
-
-void
-ExportProfileManager::Preset::set_local_state (XMLNode & state)
-{
-       delete local;
-       local = &state;
-       
-       set_id (_id);
-       set_name (_name);
-}
-
-void
-ExportProfileManager::Preset::save () const
-{
-       save_instant_xml ();
-       if (global.root()) {
-               global.write ();
-       }
-}
-
-void
-ExportProfileManager::Preset::remove_local () const
-{
-       remove_instant_xml ();
-}
-
-XMLNode *
-ExportProfileManager::Preset::get_instant_xml () const
-{
-       XMLNode * instant_xml;
-       
-       if ((instant_xml = session.instant_xml ("ExportPresets"))) {
-               XMLNodeList children = instant_xml->children ("ExportPreset");
-               for (XMLNodeList::iterator it = children.begin(); it != children.end(); ++it) {
-                       XMLProperty * prop;
-                       if ((prop = (*it)->property ("id")) && _id == (uint32_t) atoi (prop->value())) {
-                               return *it;
-                       }
-               }
-       }
-       
-       return 0;
-}
-
-void
-ExportProfileManager::Preset::save_instant_xml () const
-{
-       if (!local) { return; }
-
-       /* First remove old, then add new */
-       
-       remove_instant_xml ();
-       
-       XMLNode * instant_xml;
-       if ((instant_xml = session.instant_xml ("ExportPresets"))) {
-               instant_xml->add_child_copy (*local);
-       } else {
-               instant_xml = new XMLNode ("ExportPresets");
-               instant_xml->add_child_copy (*local);
-               session.add_instant_xml (*instant_xml, false);
-       }
-}
-
-void
-ExportProfileManager::Preset::remove_instant_xml () const
-{
-       XMLNode * instant_xml;
-       if ((instant_xml = session.instant_xml ("ExportPresets"))) {
-               instant_xml->remove_nodes_and_delete ("id", to_string (_id, std::dec));
-       }
-}
-
 ExportProfileManager::ExportProfileManager (Session & s) :
   handler (s.get_export_handler()),
   session (s),
@@ -257,31 +121,35 @@ ExportProfileManager::prepare_for_export ()
        }
 }
 
-void
+bool
 ExportProfileManager::load_preset (PresetPtr preset)
 {
+       bool ok = true;
+
        current_preset = preset;
-       if (!preset) { return; }
+       if (!preset) { return false; }
 
        XMLNode const * state;
        if ((state = preset->get_local_state())) {
                set_local_state (*state);
-       }
+       } else { ok = false; }
        
        if ((state = preset->get_global_state())) {
-               set_global_state (*state);
-       }
+               if (!set_global_state (*state)) {
+                       ok = false;
+               }
+       } else { ok = false; }
+       
+       return ok;
 }
 
 void
 ExportProfileManager::load_presets ()
 {
-       preset_id_counter = 0;
-       
-       vector<sys::path> found = find_file ("*.preset");
+       vector<sys::path> found = find_file (string_compose (X_("*%1"),export_preset_suffix));
 
        for (vector<sys::path>::iterator it = found.begin(); it != found.end(); ++it) {
-               preset_id_counter = std::max (preset_id_counter, load_preset_from_disk (*it));
+               load_preset_from_disk (*it);
        }
 }
 
@@ -289,11 +157,9 @@ ExportProfileManager::PresetPtr
 ExportProfileManager::save_preset (string const & name)
 {
        if (!current_preset) {
-               ++preset_id_counter;
-               string filename = export_config_dir.to_string() + "/" + to_string (preset_id_counter, std::dec) + ".preset";
-               current_preset.reset (new Preset (filename, session));
+               string filename = export_config_dir.to_string() + "/" + name + export_preset_suffix;
+               current_preset.reset (new ExportPreset (filename, session));
                preset_list.push_back (current_preset);
-               current_preset->set_id (preset_id_counter);
        }
        
        XMLNode * global_preset = new XMLNode ("ExportPreset");
@@ -333,39 +199,36 @@ ExportProfileManager::remove_preset ()
        current_preset.reset();
 }
 
-uint32_t
+void
 ExportProfileManager::load_preset_from_disk (PBD::sys::path const & path)
 {
-       PresetPtr preset (new Preset (path.to_string(), session));
+       PresetPtr preset (new ExportPreset (path.to_string(), session));
        preset_list.push_back (preset);
        
        /* Handle id to filename mapping */
        
        FilePair pair (preset->id(), path);
        preset_file_map.insert (pair);
-       
-       return preset->id();
 }
 
-void
+bool
 ExportProfileManager::set_state (XMLNode const & root)
 {
-       set_global_state (root);
-       set_local_state (root);
+       return set_global_state (root) && set_local_state (root);
 }
 
-void
+bool
 ExportProfileManager::set_global_state (XMLNode const & root)
 {
-       init_formats (root.children ("ExportFormat"));
-       init_filenames (root.children ("ExportFilename"));
+       return init_filenames (root.children ("ExportFilename")) &&
+              init_formats (root.children ("ExportFormat"));
 }
 
-void
+bool
 ExportProfileManager::set_local_state (XMLNode const & root)
 {
-       init_timespans (root.children ("ExportTimespan"));;
-       init_channel_configs (root.children ("ExportChannelConfiguration"));
+       return init_timespans (root.children ("ExportTimespan")) &&
+              init_channel_configs (root.children ("ExportChannelConfiguration"));
 }
 
 void
@@ -383,7 +246,7 @@ ExportProfileManager::serialize_global_profile (XMLNode & root)
        }
 
        for (FilenameStateList::iterator it = filenames.begin(); it != filenames.end(); ++it) {
-               root.add_child_nocopy (serialize_filename (*it));
+               root.add_child_nocopy ((*it)->filename->get_state());
        }
 }
 
@@ -395,7 +258,7 @@ ExportProfileManager::serialize_local_profile (XMLNode & root)
        }
        
        for (ChannelConfigStateList::iterator it = channel_configs.begin(); it != channel_configs.end(); ++it) {
-               root.add_child_nocopy (serialize_channel_config (*it));
+               root.add_child_nocopy ((*it)->config->get_state());
        }
 }
 
@@ -427,7 +290,7 @@ ExportProfileManager::set_selection_range (nframes_t start, nframes_t end)
        }
 }
 
-void
+bool
 ExportProfileManager::init_timespans (XMLNodeList nodes)
 {
        timespans.clear ();
@@ -438,12 +301,14 @@ ExportProfileManager::init_timespans (XMLNodeList nodes)
                TimespanStatePtr timespan (new TimespanState (session_range, selection_range, ranges));
        
                timespans.push_back (timespan);
-               return;
+               return false;
        }
 
        for (XMLNodeList::const_iterator it = nodes.begin(); it != nodes.end(); ++it) {
                timespans.push_back (deserialize_timespan (**it));
        }
+       
+       return true;
 }
 
 ExportProfileManager::TimespanStatePtr
@@ -526,7 +391,7 @@ ExportProfileManager::update_ranges () {
        }
 }
 
-void
+bool
 ExportProfileManager::init_channel_configs (XMLNodeList nodes)
 {
        channel_configs.clear();
@@ -534,70 +399,16 @@ ExportProfileManager::init_channel_configs (XMLNodeList nodes)
        if (nodes.empty()) {    
                ChannelConfigStatePtr config (new ChannelConfigState (handler->add_channel_config()));
                channel_configs.push_back (config);
-               return;
+               return false;
        }
        
        for (XMLNodeList::const_iterator it = nodes.begin(); it != nodes.end(); ++it) {
-               channel_configs.push_back (deserialize_channel_config (**it));
-       }
-}
-
-ExportProfileManager::ChannelConfigStatePtr
-ExportProfileManager::deserialize_channel_config (XMLNode & root)
-{
-
-       ChannelConfigStatePtr state (new ChannelConfigState (handler->add_channel_config()));
-       XMLProperty const * prop;
-       
-       if ((prop = root.property ("split"))) {
-               state->config->set_split(!prop->value().compare ("true"));
-       }
-
-       XMLNodeList channels = root.children ("Channel");
-       for (XMLNodeList::iterator it = channels.begin(); it != channels.end(); ++it) {
-               boost::shared_ptr<ExportChannel> channel (new ExportChannel ());
-       
-               XMLNodeList ports = (*it)->children ("Port");
-               for (XMLNodeList::iterator p_it = ports.begin(); p_it != ports.end(); ++p_it) {
-                       if ((prop = (*p_it)->property ("name"))) {
-                               channel->add_port (dynamic_cast<AudioPort *> (session.engine().get_port_by_name (prop->value())));
-                       }
-               }
-       
-               state->config->register_channel (channel);
-       }
-
-       return state;
-}
-
-XMLNode &
-ExportProfileManager::serialize_channel_config (ChannelConfigStatePtr state)
-{
-       XMLNode * root = new XMLNode ("ExportChannelConfiguration");
-       XMLNode * channel;
-       XMLNode * port_node;
-       
-       root->add_property ("split", state->config->get_split() ? "true" : "false");
-       root->add_property ("channels", to_string (state->config->get_n_chans(), std::dec));
-       
-       uint32_t i = 1;
-       ExportChannelConfiguration::ChannelList const & chan_list = state->config->get_channels();
-       for (ExportChannelConfiguration::ChannelList::const_iterator c_it = chan_list.begin(); c_it != chan_list.end(); ++c_it) {
-               channel = root->add_child ("Channel");
-               if (!channel) { continue; }
-               
-               channel->add_property ("number", to_string (i, std::dec));
-               
-               for (ExportChannel::const_iterator p_it = (*c_it)->begin(); p_it != (*c_it)->end(); ++p_it) {
-                       if ((port_node = channel->add_child ("Port"))) {
-                               port_node->add_property ("name", (*p_it)->name());
-                       }
-               }
-               
-               ++i;
+               ChannelConfigStatePtr config (new ChannelConfigState (handler->add_channel_config()));
+               config->config->set_state (**it);
+               channel_configs.push_back (config);
        }
        
-       return *root;
+       return true;
 }
 
 ExportProfileManager::FormatStatePtr
@@ -630,7 +441,7 @@ ExportProfileManager::save_format_to_disk (FormatPtr format)
        /* Get filename for file */
 
        Glib::ustring new_name = format->name();
-       new_name += ".format";
+       new_name += export_format_suffix;
        
        sys::path new_path (export_config_dir);
        new_path /= new_name;
@@ -703,21 +514,24 @@ ExportProfileManager::get_new_format (FormatPtr original)
        return format;
 }
 
-void
+bool
 ExportProfileManager::init_formats (XMLNodeList nodes)
 {
+       bool ok = true;
        formats.clear();
 
        if (nodes.empty()) {
                FormatStatePtr format (new FormatState (format_list, FormatPtr ()));
                formats.push_back (format);
-               return;
+               return false;
        }
        
        for (XMLNodeList::const_iterator it = nodes.begin(); it != nodes.end(); ++it) {
                FormatStatePtr format;
                if ((format = deserialize_format (**it))) {
                        formats.push_back (format);
+               } else {
+                       ok = false;
                }
        }
        
@@ -725,16 +539,18 @@ ExportProfileManager::init_formats (XMLNodeList nodes)
                FormatStatePtr format (new FormatState (format_list, FormatPtr ()));
                formats.push_back (format);
        }
+       
+       return ok;
 }
 
 ExportProfileManager::FormatStatePtr
 ExportProfileManager::deserialize_format (XMLNode & root)
 {
        XMLProperty * prop;
-       uint32_t id = 0;
+       UUID id;
        
        if ((prop = root.property ("id"))) {
-               id = atoi (prop->value());
+               id = prop->value();
        }
        
        for (FormatList::iterator it = format_list->begin(); it != format_list->end(); ++it) {
@@ -751,7 +567,7 @@ ExportProfileManager::serialize_format (FormatStatePtr state)
 {
        XMLNode * root = new XMLNode ("ExportFormat");
        
-       string id = state->format ? to_string (state->format->id(), std::dec) : "0";
+       string id = state->format ? state->format->id().to_s() : "";
        root->add_property ("id", id);
        
        return *root;
@@ -760,7 +576,7 @@ ExportProfileManager::serialize_format (FormatStatePtr state)
 void
 ExportProfileManager::load_formats ()
 {
-       vector<sys::path> found = find_file ("*.format");
+       vector<sys::path> found = find_file (string_compose ("*%1", export_format_suffix));
 
        for (vector<sys::path>::iterator it = found.begin(); it != found.end(); ++it) {
                load_format_from_disk (*it);
@@ -801,7 +617,7 @@ ExportProfileManager::remove_filename_state (FilenameStatePtr state)
        }
 }
 
-void
+bool
 ExportProfileManager::init_filenames (XMLNodeList nodes)
 {
        filenames.clear ();
@@ -809,26 +625,16 @@ ExportProfileManager::init_filenames (XMLNodeList nodes)
        if (nodes.empty()) {
                FilenameStatePtr filename (new FilenameState (handler->add_filename()));
                filenames.push_back (filename);
-               return;
+               return false;
        }
        
        for (XMLNodeList::const_iterator it = nodes.begin(); it != nodes.end(); ++it) {
-               filenames.push_back (deserialize_filename (**it));
+               FilenamePtr filename = handler->add_filename();
+               filename->set_state (**it);
+               filenames.push_back (FilenameStatePtr (new FilenameState (filename)));
        }
-}
-
-ExportProfileManager::FilenameStatePtr
-ExportProfileManager::deserialize_filename (XMLNode & root)
-{
-       FilenamePtr filename = handler->add_filename();
-       filename->set_state (root);
-       return FilenameStatePtr (new FilenameState (filename));
-}
-
-XMLNode &
-ExportProfileManager::serialize_filename (FilenameStatePtr state)
-{
-       return state->filename->get_state();
+       
+       return true;
 }
 
 boost::shared_ptr<ExportProfileManager::Warnings>