/*
- Copyright (C) 2004 Paul Davis
+ Copyright (C) 2004 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
*/
+#include <cstring>
#include <cerrno>
-#include <unistd.h>
#include <fstream>
#include <algorithm>
-#include <pbd/error.h>
-#include <ardour/configuration.h>
-#include <ardour/recent_sessions.h>
-#include <ardour/utils.h>
-#include "i18n.h"
+#include <glibmm/miscutils.h>
+
+#include "pbd/error.h"
+
+#include "ardour/rc_configuration.h"
+#include "ardour/filesystem_paths.h"
+#include "ardour/recent_sessions.h"
+
+#include "i18n.h"
using namespace std;
using namespace ARDOUR;
+using namespace PBD;
+
+namespace {
+
+ const char * const recent_file_name = "recent";
+
+} // anonymous
int
ARDOUR::read_recent_sessions (RecentSessions& rs)
{
- string path = Config->get_user_ardour_path();
- path += "/recent";
+ std::string path = Glib::build_filename (user_config_directory(), recent_file_name);
ifstream recent (path.c_str());
-
+
if (!recent) {
if (errno != ENOENT) {
- error << compose (_("cannot open recent session file %1 (%2)"), path, strerror (errno)) << endmsg;
+ error << string_compose (_("cannot open recent session file %1 (%2)"), path, strerror (errno)) << endmsg;
return -1;
} else {
return 1;
if (!recent.good()) {
break;
}
-
+
getline(recent, newpair.second);
if (!recent.good()) {
break;
}
- if (!access(newpair.second.c_str(), R_OK)) {
- rs.push_back (newpair);
- }
+ rs.push_back (newpair);
}
- // This deletes any missing sessions
- ARDOUR::write_recent_sessions (rs);
-
/* display sorting should be done in the GUI, otherwise the
* natural order will be broken
*/
int
ARDOUR::write_recent_sessions (RecentSessions& rs)
{
- string path = Config->get_user_ardour_path();
- path += "/recent";
+ std::string path = Glib::build_filename (user_config_directory(), recent_file_name);
ofstream recent (path.c_str());
for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
recent << (*i).first << '\n' << (*i).second << endl;
}
-
+
return 0;
}
-
+
int
ARDOUR::store_recent_sessions (string name, string path)
{
newpair.second = path;
rs.erase(remove(rs.begin(), rs.end(), newpair), rs.end());
-
+
rs.push_front (newpair);
- if (rs.size() > 10) {
- rs.erase(rs.begin()+10, rs.end());
+ uint32_t max_recent_sessions = Config->get_max_recent_sessions();
+
+ if (rs.size() > max_recent_sessions) {
+ rs.erase(rs.begin()+max_recent_sessions, rs.end());
}
return ARDOUR::write_recent_sessions (rs);
}
+int
+ARDOUR::remove_recent_sessions (const string& path)
+{
+ RecentSessions rs;
+ bool write = false;
+
+ if (ARDOUR::read_recent_sessions (rs) < 0) {
+ return -1;
+ }
+
+ for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
+ if (i->second == path) {
+ rs.erase (i);
+ write = true;
+ break;
+ }
+ }
+
+ if (write) {
+ return ARDOUR::write_recent_sessions (rs);
+ } else {
+ return 1;
+ }
+}
+