Fix Searchpath::operator+ to return by value rather than reference and not modify...
[ardour.git] / libs / pbd / stateful.cc
index b2c76f452f4e6d03cd7b6ca012e9412396d6bf1f..c4077f60af43e184739525b8f4b9b880275d7782 100644 (file)
     $Id: stateful.cc 629 2006-06-21 23:01:03Z paul $
 */
 
+#ifdef COMPILER_MSVC
+#include <io.h>      // Microsoft's nearest equivalent to <unistd.h>
+#else
 #include <unistd.h>
+#endif
+
+#include <glibmm/fileutils.h>
+#include <glibmm/miscutils.h>
 
 #include "pbd/debug.h"
 #include "pbd/stateful.h"
 #include "pbd/property_list.h"
 #include "pbd/properties.h"
 #include "pbd/destructible.h"
-#include "pbd/filesystem.h"
 #include "pbd/xml++.h"
 #include "pbd/error.h"
 
@@ -39,8 +45,8 @@ int Stateful::current_state_version = 0;
 int Stateful::loading_state_version = 0;
 
 Stateful::Stateful ()
-       : _frozen (0)
-       , _properties (new OwnedPropertyList)
+       : _properties (new OwnedPropertyList)
+       , _stateful_frozen (0)
 {
        _extra_xml = 0;
        _instant_xml = 0;
@@ -102,9 +108,14 @@ Stateful::save_extra_xml (const XMLNode& node)
 }
 
 void
-Stateful::add_instant_xml (XMLNode& node, const sys::path& directory_path)
+Stateful::add_instant_xml (XMLNode& node, const std::string& directory_path)
 {
-       sys::create_directories (directory_path); // may throw
+       if (!Glib::file_test (directory_path, Glib::FILE_TEST_IS_DIR)) {
+               if (g_mkdir_with_parents (directory_path.c_str(), 0755) != 0) {
+                       error << string_compose(_("Error: could not create directory %1"), directory_path) << endmsg;
+                       return;
+               }
+       }
 
        if (_instant_xml == 0) {
                _instant_xml = new XMLNode ("instant");
@@ -113,12 +124,10 @@ Stateful::add_instant_xml (XMLNode& node, const sys::path& directory_path)
        _instant_xml->remove_nodes_and_delete (node.name());
        _instant_xml->add_child_copy (node);
 
-       sys::path instant_xml_path(directory_path);
-
-       instant_xml_path /= "instant.xml";
+       std::string instant_xml_path = Glib::build_filename (directory_path, "instant.xml");
        
        XMLTree tree;
-       tree.set_filename(instant_xml_path.to_string());
+       tree.set_filename(instant_xml_path);
 
        /* Important: the destructor for an XMLTree deletes
           all of its nodes, starting at _root. We therefore
@@ -134,24 +143,23 @@ Stateful::add_instant_xml (XMLNode& node, const sys::path& directory_path)
        tree.set_root (copy);
 
        if (!tree.write()) {
-               error << string_compose(_("Error: could not write %1"), instant_xml_path.to_string()) << endmsg;
+               error << string_compose(_("Error: could not write %1"), instant_xml_path) << endmsg;
        }
 }
 
 XMLNode *
-Stateful::instant_xml (const string& str, const sys::path& directory_path)
+Stateful::instant_xml (const string& str, const std::string& directory_path)
 {
        if (_instant_xml == 0) {
 
-               sys::path instant_xml_path(directory_path);
-               instant_xml_path /= "instant.xml";
+               std::string instant_xml_path = Glib::build_filename (directory_path, "instant.xml");
 
-               if (exists(instant_xml_path)) {
+               if (Glib::file_test (instant_xml_path, Glib::FILE_TEST_EXISTS)) {
                        XMLTree tree;
-                       if (tree.read(instant_xml_path.to_string())) {
+                       if (tree.read(instant_xml_path)) {
                                _instant_xml = new XMLNode(*(tree.root()));
                        } else {
-                               warning << string_compose(_("Could not understand XML file %1"), instant_xml_path.to_string()) << endmsg;
+                               warning << string_compose(_("Could not understand XML file %1"), instant_xml_path) << endmsg;
                                return 0;
                        }
                } else {
@@ -274,8 +282,8 @@ Stateful::send_change (const PropertyChange& what_changed)
        }
 
        {
-               Glib::Mutex::Lock lm (_lock);
-               if (_frozen) {
+               Glib::Threads::Mutex::Lock lm (_lock);
+               if (property_changes_suspended ()) {
                        _pending_changed.add (what_changed);
                        return;
                }
@@ -287,7 +295,7 @@ Stateful::send_change (const PropertyChange& what_changed)
 void
 Stateful::suspend_property_changes ()
 {
-       _frozen++;
+       g_atomic_int_add (&_stateful_frozen, 1);
 }
 
 void
@@ -296,9 +304,9 @@ Stateful::resume_property_changes ()
        PropertyChange what_changed;
 
        {
-               Glib::Mutex::Lock lm (_lock);
+               Glib::Threads::Mutex::Lock lm (_lock);
 
-               if (_frozen && --_frozen > 0) {
+               if (property_changes_suspended() && g_atomic_int_dec_and_test (&_stateful_frozen) == FALSE) {
                        return;
                }