fix crash when copy'ing latent plugins
[ardour.git] / libs / ardour / location_importer.cc
index 31f19ef164c53b7229cd0d1c9e2627279480cfdd..87c304ff9e264238fa9dfa9e29016cdafccf6b5b 100644 (file)
 
 */
 
-#include <ardour/location_importer.h>
+#include "ardour/location_importer.h"
 
 #include <sstream>
 #include <stdexcept>
 
-#include <ardour/session.h>
-#include <pbd/convert.h>
-#include <pbd/failed_constructor.h>
+#include "ardour/session.h"
+#include "pbd/convert.h"
+#include "pbd/failed_constructor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
+using namespace std;
 using namespace PBD;
 using namespace ARDOUR;
 
@@ -38,14 +39,14 @@ LocationImportHandler::LocationImportHandler (XMLTree const & source, Session &
 {
        XMLNode const *root = source.root();
        XMLNode const * location_node;
-       
+
        if (!(location_node = root->child ("Locations"))) {
                throw failed_constructor();
        }
-       
+
        // Construct importable locations
        XMLNodeList const & locations = location_node->children();
-       for (XMLNodeList::const_iterator it = locations.begin(); it != locations.end(); it++) {
+       for (XMLNodeList::const_iterator it = locations.begin(); it != locations.end(); ++it) {
                try {
                        elements.push_back (ElementPtr ( new LocationImporter (source, session, *this, **it)));
                } catch (failed_constructor err) {
@@ -61,7 +62,7 @@ LocationImportHandler::get_info () const
 }
 
 /*** LocationImporter ***/
-LocationImporter::LocationImporter (XMLTree const & source, Session & session, LocationImportHandler & handler, XMLNode const & node) : 
+LocationImporter::LocationImporter (XMLTree const & source, Session & session, LocationImportHandler & handler, XMLNode const & node) :
   ElementImporter (source, session),
   handler (handler),
   xml_location (node),
@@ -70,7 +71,7 @@ LocationImporter::LocationImporter (XMLTree const & source, Session & session, L
        // Parse XML
        bool name_ok = false;
        XMLPropertyList props = xml_location.properties();
-       
+
        for (XMLPropertyIterator it = props.begin(); it != props.end(); ++it) {
                string prop = (*it)->name();
                if (!prop.compare ("id") || !prop.compare ("flags") || !prop.compare ("locked")) {
@@ -86,7 +87,7 @@ LocationImporter::LocationImporter (XMLTree const & source, Session & session, L
                        std::cerr << string_compose (X_("LocationImporter did not recognise XML-property \"%1\""), prop) << endmsg;
                }
        }
-       
+
        if (!name_ok) {
                error << X_("LocationImporter did not find necessary XML-property \"name\"") << endmsg;
                throw failed_constructor();
@@ -95,7 +96,7 @@ LocationImporter::LocationImporter (XMLTree const & source, Session & session, L
 
 LocationImporter::~LocationImporter ()
 {
-       if (!queued && location) {
+       if (!queued()) {
                delete location;
        }
 }
@@ -103,93 +104,87 @@ LocationImporter::~LocationImporter ()
 string
 LocationImporter::get_info () const
 {
-       nframes_t start, end;
-       SMPTE::Time start_time, end_time;
-       
+       framepos_t start, end;
+       Timecode::Time start_time, end_time;
+
        // Get sample positions
        std::istringstream iss_start (xml_location.property ("start")->value());
        iss_start >> start;
        std::istringstream iss_end (xml_location.property ("end")->value());
        iss_end >> end;
-       
-       // Convert to smpte
-       session.sample_to_smpte (start, start_time, true, false);
-       session.sample_to_smpte (end, end_time, true, false);
-       
+
+       // Convert to timecode
+       session.sample_to_timecode (start, start_time, true, false);
+       session.sample_to_timecode (end, end_time, true, false);
+
        // return info
        std::ostringstream oss;
        if (start == end) {
-               oss << _("Location: ") << smpte_to_string (start_time);
+               oss << _("Location: ") << timecode_to_string (start_time);
        } else {
-               oss << _("Range\nstart: ") << smpte_to_string (start_time) <<
-                 _("\nend: ") << smpte_to_string (end_time);
+               oss << _("Range\nstart: ") << timecode_to_string (start_time) <<
+                 _("\nend: ") << timecode_to_string (end_time);
        }
-       
+
        return oss.str();
 }
 
 bool
-LocationImporter::prepare_move ()
+LocationImporter::_prepare_move ()
 {
        try {
-               Location const original (xml_location);
+               Location const original (session, xml_location);
                location = new Location (original); // Updates id
        } catch (failed_constructor& err) {
                throw std::runtime_error (X_("Error in session file!"));
-               return false;
+               return false;
        }
-       
+
        std::pair<bool, string> rename_pair;
-       
+
        if (location->is_auto_punch()) {
-               rename_pair = Rename (_("The location is the Punch range. It will be imported as a normal range.\nYou may rename the imported location:"), name);
+               rename_pair = *Rename (_("The location is the Punch range. It will be imported as a normal range.\nYou may rename the imported location:"), name);
                if (!rename_pair.first) {
                        return false;
                }
-               
+
                name = rename_pair.second;
                location->set_auto_punch (false, this);
                location->set_is_range_marker (true, this);
        }
-       
+
        if (location->is_auto_loop()) {
-               rename_pair = Rename (_("The location is a Loop range. It will be imported as a normal range.\nYou may rename the imported location:"), name);
+               rename_pair = *Rename (_("The location is a Loop range. It will be imported as a normal range.\nYou may rename the imported location:"), name);
                if (!rename_pair.first) { return false; }
-               
+
                location->set_auto_loop (false, this);
                location->set_is_range_marker (true, this);
        }
-       
+
        // duplicate name checking
        Locations::LocationList const & locations(session.locations()->list());
        for (Locations::LocationList::const_iterator it = locations.begin(); it != locations.end(); ++it) {
                if (!((*it)->name().compare (location->name())) || !handler.check_name (location->name())) {
-                       rename_pair = Rename (_("A location with that name already exists.\nYou may rename the imported location:"), name);
+                       rename_pair = *Rename (_("A location with that name already exists.\nYou may rename the imported location:"), name);
                        if (!rename_pair.first) { return false; }
                        name = rename_pair.second;
                }
        }
-       
+
        location->set_name (name);
-       queued = true;
+
        return true;
 }
 
 void
-LocationImporter::cancel_move ()
+LocationImporter::_cancel_move ()
 {
-       queued = false;
-       if (location) {
-               delete location;
-               location = 0;
-       }
+       delete location;
+       location = 0;
 }
 
 void
-LocationImporter::move ()
+LocationImporter::_move ()
 {
-       if (!queued) {
-               return;
-       }
        session.locations()->add (location);
 }