#include <sys/time.h>
#include <sys/stat.h>
-#include <stdio.h> // for rename(), sigh
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
+#include <glib.h>
+#include <glib/gstdio.h>
+
#include "pbd/convert.h"
#include "pbd/basename.h"
#include "pbd/stl_delete.h"
#include "ardour/source.h"
#include "ardour/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
, _path (path)
, _file_is_new (!origin.empty()) // if origin is left unspecified (empty string) then file must exist
, _channel (0)
- , _origin (origin)
- , _open (false)
+ , _origin (origin)
+ , _gain (1.f)
{
set_within_session_from_path (path);
}
FileSource::FileSource (Session& session, const XMLNode& node, bool /*must_exist*/)
: Source (session, node)
, _file_is_new (false)
+ , _channel (0)
+ , _gain (1.f)
{
/* this setting of _path is temporary - we expect derived classes
to call ::init() which will actually locate the file
int
FileSource::set_state (const XMLNode& node, int /*version*/)
{
- const XMLProperty* prop;
-
- if ((prop = node.property (X_("channel"))) != 0) {
- _channel = atoi (prop->value());
- } else {
+ if (!node.get_property (X_("channel"), _channel)) {
_channel = 0;
}
- if ((prop = node.property (X_("origin"))) != 0) {
- _origin = prop->value();
- }
+ node.get_property (X_("origin"), _origin);
+
+ if (!node.get_property (X_("gain"), _gain)) {
+ _gain = 1.f;
+ }
return 0;
}
}
}
- if (::rename (_path.c_str(), newpath.c_str()) != 0) {
+ if (::g_rename (_path.c_str(), newpath.c_str()) != 0) {
PBD::error << string_compose (
_("cannot rename file source from %1 to %2 (%3)"),
- _path, newpath, strerror (errno)) << endmsg;
+ _path, newpath, g_strerror (errno)) << endmsg;
return -1;
}
if (move_dependents_to_trash() != 0) {
/* try to back out */
- ::rename (newpath.c_str(), _path.c_str());
+ ::g_rename (newpath.c_str(), _path.c_str());
return -1;
}
/** Find the actual source file based on \a filename.
*
- * If the source is within the session tree, \a filename should be a simple filename (no slashes).
- * If the source is external, \a filename should be a full path.
+ * If the source is within the session tree, \a path should be a simple filename (no slashes).
+ * If the source is external, \a path should be a full path.
* In either case, found_path is set to the complete absolute path of the source file.
- * \return true iff the file was found.
+ * \return true if the file was found.
*/
bool
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);
vector<string>::iterator j = i;
++j;
-
+
while (j != hits.end()) {
if (PBD::equivalent_paths (*i, *j)) {
/* *i and *j are the same file; break out of the loop early */
/* 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;
} else {
/* only one match: happy days */
-
+
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;
}
found_path = keeppath;
-
ret = true;
out:
if (cnt > 1) {
error << string_compose (
- _("FileSource: \"%1\" is ambigous when searching\n\t"), pathstr) << endmsg;
+ _("FileSource: \"%1\" is ambiguous when searching\n\t"), pathstr) << endmsg;
goto out;
} else if (cnt == 0) {
if (must_exist) {
error << string_compose(
_("Filesource: cannot find required file (%1): %2"),
- path, strerror (errno)) << endmsg;
+ path, g_strerror (errno)) << endmsg;
goto out;
}
if (errno != ENOENT) {
error << string_compose(
_("Filesource: cannot check for existing file (%1): %2"),
- path, strerror (errno)) << endmsg;
+ path, g_strerror (errno)) << endmsg;
goto out;
}
#endif
void
FileSource::set_path (const std::string& newpath)
{
+ close ();
_path = newpath;
+ set_within_session_from_path (newpath);
+ if (_within_session) {
+ _origin = Glib::path_get_basename (newpath);
+ } else {
+ _origin = newpath;
+ }
+}
+
+
+void
+FileSource::replace_file (const std::string& newpath)
+{
+ close ();
+ _path = newpath;
+ _name = Glib::path_get_basename (newpath);
}
void
if (!empty()) {
return false;
}
-
+
if (!removable()) {
return false;
}
return true;
}
-
+
int
FileSource::rename (const string& newpath)
{
return -1;
}
- if (Glib::file_test (oldpath.c_str(), Glib::FILE_TEST_EXISTS)) {
+ 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;
+ if (::g_rename (oldpath.c_str(), newpath.c_str()) != 0) {
+ error << string_compose (_("cannot rename file %1 to %2 (%3)"), oldpath, newpath, g_strerror(errno)) << endmsg;
return -1;
}
}
return 0;
}
+
+