Add additional PBD::string_to/to_string specializations for PBD::ID
[ardour.git] / libs / pbd / stateful.cc
index 476fdcc28fdc7a83f344bbad847b0408114ee4a1..d2b41e9c723bdaacbcd78e6eb3003b7294274cf1 100644 (file)
 
 #include "pbd/debug.h"
 #include "pbd/stateful.h"
+#include "pbd/types_convert.h"
 #include "pbd/property_list.h"
 #include "pbd/properties.h"
 #include "pbd/destructible.h"
 #include "pbd/xml++.h"
 #include "pbd/error.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
@@ -44,12 +45,14 @@ namespace PBD {
 int Stateful::current_state_version = 0;
 int Stateful::loading_state_version = 0;
 
+Glib::Threads::Private<bool> Stateful::_regenerate_xml_or_string_ids;
+
 Stateful::Stateful ()
-       : _properties (new OwnedPropertyList)
+       : _extra_xml (0)
+       , _instant_xml (0)
+       , _properties (new OwnedPropertyList)
        , _stateful_frozen (0)
 {
-       _extra_xml = 0;
-       _instant_xml = 0;
 }
 
 Stateful::~Stateful ()
@@ -69,7 +72,7 @@ Stateful::add_extra_xml (XMLNode& node)
                _extra_xml = new XMLNode ("Extra");
        }
 
-       _extra_xml->remove_nodes (node.name());
+       _extra_xml->remove_nodes_and_delete (node.name());
        _extra_xml->add_child_nocopy (node);
 }
 
@@ -98,7 +101,7 @@ Stateful::save_extra_xml (const XMLNode& node)
           to by _extra_xml if a new Extra node is found, but not
           otherwise.
        */
-       
+
        const XMLNode* xtra = node.child ("Extra");
 
        if (xtra) {
@@ -125,7 +128,7 @@ Stateful::add_instant_xml (XMLNode& node, const std::string& directory_path)
        _instant_xml->add_child_copy (node);
 
        std::string instant_xml_path = Glib::build_filename (directory_path, "instant.xml");
-       
+
        XMLTree tree;
        tree.set_filename(instant_xml_path);
 
@@ -192,7 +195,7 @@ PropertyList *
 Stateful::get_changes_as_properties (Command* cmd) const
 {
        PropertyList* pl = new PropertyList;
-       
+
        for (OwnedPropertyList::const_iterator i = _properties->begin(); i != _properties->end(); ++i) {
                i->second->get_changes_as_properties (*pl, cmd);
        }
@@ -209,7 +212,7 @@ PropertyChange
 Stateful::set_values (XMLNode const & node)
 {
        PropertyChange c;
-       
+
        for (OwnedPropertyList::iterator i = _properties->begin(); i != _properties->end(); ++i) {
                if (i->second->set_value (node)) {
                        c.add (i->first);
@@ -232,7 +235,7 @@ Stateful::apply_changes (const PropertyList& property_list)
        for (PropertyList::const_iterator pp = property_list.begin(); pp != property_list.end(); ++pp) {
                DEBUG_TRACE (DEBUG::Stateful, string_compose ("in plist: %1\n", pp->second->property_name()));
        }
-       
+
        for (PropertyList::const_iterator i = property_list.begin(); i != property_list.end(); ++i) {
                if ((p = _properties->find (i->first)) != _properties->end()) {
 
@@ -240,7 +243,7 @@ Stateful::apply_changes (const PropertyList& property_list)
                                DEBUG::Stateful,
                                string_compose ("actually setting property %1 using %2\n", p->second->property_name(), i->second->property_name())
                                );
-                       
+
                        if (apply_changes (*i->second)) {
                                c.add (i->first);
                        }
@@ -249,7 +252,7 @@ Stateful::apply_changes (const PropertyList& property_list)
                                                                      i->second->property_name()));
                }
        }
-       
+
        post_set (c);
 
        send_change (c);
@@ -380,10 +383,14 @@ Stateful::clear_owned_changes ()
 bool
 Stateful::set_id (const XMLNode& node)
 {
-       const XMLProperty* prop;
+       bool* regen = _regenerate_xml_or_string_ids.get();
+
+       if (regen && *regen) {
+               reset_id ();
+               return true;
+       }
 
-       if ((prop = node.property ("id")) != 0) {
-               _id = prop->value ();
+       if (node.get_property ("id", _id)) {
                return true;
        }
 
@@ -399,7 +406,31 @@ Stateful::reset_id ()
 void
 Stateful::set_id (const string& str)
 {
-       _id = str;
+       bool* regen = _regenerate_xml_or_string_ids.get();
+
+       if (regen && *regen) {
+               reset_id ();
+       } else {
+               _id = str;
+       }
+}
+
+bool
+Stateful::regenerate_xml_or_string_ids () const
+{
+       bool* regen = _regenerate_xml_or_string_ids.get();
+       if (regen && *regen) {
+               return true;
+       } else {
+               return false;
+       }
+}
+
+void
+Stateful::set_regenerate_xml_and_string_ids_in_this_thread (bool yn)
+{
+       bool* val = new bool (yn);
+       _regenerate_xml_or_string_ids.set (val);
 }
 
 } // namespace PBD