refactor MIDISceneChange color property addition by moving it into SceneChange to...
[ardour.git] / libs / ardour / file_source.cc
index 109539ce2d7539fe242861a0d189b6e55e5f701b..a4d317af718ff8ed8ec062d0f97cf6586c8adbc2 100644 (file)
@@ -56,7 +56,7 @@ PBD::Signal2<int,std::string,std::vector<std::string> > FileSource::AmbiguousFil
 FileSource::FileSource (Session& session, DataType type, const string& path, const string& origin, Source::Flag flag)
        : Source(session, type, path, flag)
        , _path (path)
-       , _file_is_new (!origin.empty()) // origin empty => new file VS. origin !empty => new file
+       , _file_is_new (!origin.empty()) // if origin is left unspecified (empty string) then file must exist
        , _channel (0)
         , _origin (origin)
         , _open (false)
@@ -214,7 +214,7 @@ FileSource::move_to_trash (const string& trash_dir_name)
 
        if (move_dependents_to_trash() != 0) {
                /* try to back out */
-               rename (newpath.c_str(), _path.c_str());
+               ::rename (newpath.c_str(), _path.c_str());
                return -1;
        }
 
@@ -252,8 +252,6 @@ FileSource::find (Session& s, DataType type, const string& path, bool must_exist
                         goto out;
                 }
 
-                hits.clear ();
-
                 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
 
                         fullpath = Glib::build_filename (*i, path);
@@ -308,8 +306,9 @@ FileSource::find (Session& s, DataType type, const string& path, bool must_exist
                        /* no match: error */
 
                         if (must_exist) {
-                                error << string_compose(
-                                        _("Filesource: cannot find required file (%1)"), path) << endmsg;
+                               /* do not generate an error here, leave that to
+                                  whoever deals with the false return value.
+                               */
                                 goto out;
                         } else {
                                 isnew = true;
@@ -320,16 +319,17 @@ FileSource::find (Session& s, DataType type, const string& path, bool must_exist
                        
                        keeppath = de_duped_hits[0];
                }
-                                                 
-        } else {
+                                                  
+       } else {
                 keeppath = path;
         }
 
         /* Current find() is unable to parse relative path names to yet non-existant
            sources. QuickFix(tm)
         */
-        if (keeppath == "") {
-                if (must_exist) {
+
+       if (keeppath.empty()) {
+               if (must_exist) {
                         error << "FileSource::find(), keeppath = \"\", but the file must exist" << endl;
                 } else {
                         keeppath = path;
@@ -546,6 +546,12 @@ void
 FileSource::set_path (const std::string& newpath)
 {
         _path = newpath;
+       set_within_session_from_path (newpath);
+       if (_within_session) {
+               _origin = Glib::path_get_basename (newpath);
+       } else {
+               _origin = newpath;
+       }
 }
 
 void
@@ -572,3 +578,30 @@ FileSource::is_stub () const
        return true;
 }
                
+int
+FileSource::rename (const string& newpath)
+{
+       Glib::Threads::Mutex::Lock lm (_lock);
+       string oldpath = _path;
+
+       // Test whether newpath exists, if yes notify the user but continue.
+       if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
+               error << string_compose (_("Programming error! %1 tried to rename a file over another file! It's safe to continue working, but please report this to the developers."), PROGRAM_NAME) << endmsg;
+               return -1;
+       }
+
+       if (Glib::file_test (oldpath.c_str(), Glib::FILE_TEST_EXISTS)) { 
+               /* rename only needed if file exists on disk */
+               if (::rename (oldpath.c_str(), newpath.c_str()) != 0) {
+                       error << string_compose (_("cannot rename file %1 to %2 (%3)"), oldpath, newpath, strerror(errno)) << endmsg;
+                       return -1;
+               }
+       }
+
+       _name = Glib::path_get_basename (newpath);
+       _path = newpath;
+
+       return 0;
+}
+
+