Move Session::find_session into a session_utils.h header

git-svn-id: svn://localhost/ardour2/trunk@1865 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Tim Mayberry 2007-05-18 02:41:44 +00:00
parent 09d6a96321
commit 1ca0e752fd
8 changed files with 188 additions and 156 deletions

View File

@ -56,6 +56,7 @@
#include <ardour/ardour.h>
#include <ardour/profile.h>
#include <ardour/session_route.h>
#include <ardour/session_utils.h>
#include <ardour/port.h>
#include <ardour/audioengine.h>
#include <ardour/playlist.h>
@ -1010,7 +1011,7 @@ ARDOUR_UI::open_session ()
bool isnew;
if (session_path.length() > 0) {
if (Session::find_session (session_path, path, name, isnew) == 0) {
if (ARDOUR::find_session (session_path, path, name, isnew) == 0) {
_session_is_new = isnew;
load_session (path, name);
}

View File

@ -44,6 +44,7 @@
#include "i18n.h"
#include <ardour/session.h>
#include <ardour/session_utils.h>
#include <unistd.h>
@ -2062,7 +2063,7 @@ ImageFrameSocketHandler::handle_open_session(const char* msg)
std::string path, name ;
bool isnew;
if (ARDOUR::Session::find_session(session_name, path, name, isnew) == 0) {
if (ARDOUR::find_session(session_name, path, name, isnew) == 0) {
if (ARDOUR_UI::instance()->load_session (path, name) == 0) {
send_return_success() ;
} else {

View File

@ -32,6 +32,7 @@
#include <ardour/version.h>
#include <ardour/ardour.h>
#include <ardour/audioengine.h>
#include <ardour/session_utils.h>
#include <gtkmm/main.h>
#include <gtkmm2ext/popup.h>
@ -140,7 +141,7 @@ maybe_load_session ()
bool isnew;
if (Session::find_session (session_name, path, name, isnew)) {
if (find_session (session_name, path, name, isnew)) {
error << string_compose(_("could not load command line session \"%1\""), session_name) << endmsg;
return false;
}

View File

@ -30,6 +30,7 @@ ardour_files=Split("""
chan_count.cc
diskstream.cc
filename_extensions.cc
find_session.cc
track.cc
audio_diskstream.cc
audio_library.cc

View File

@ -240,9 +240,6 @@ class Session : public PBD::StatefulDestructible
virtual ~Session ();
static int find_session (string str, string& path, string& snapshot, bool& isnew);
string path() const { return _path; }
string name() const { return _name; }
string snap_name() const { return _current_snapshot_name; }

View File

@ -0,0 +1,15 @@
#ifndef __ardour_session_utils_h__
#define __ardour_session_utils_h__
#include <string>
namespace ARDOUR {
using std::string;
int find_session (string str, string& path, string& snapshot, bool& isnew);
};
#endif

166
libs/ardour/find_session.cc Normal file
View File

@ -0,0 +1,166 @@
#include <unistd.h>
#include <sys/stat.h>
#include <climits>
#include <cerrno>
#include <pbd/compose.h>
#include <pbd/error.h>
#include <ardour/session_utils.h>
#include <ardour/filename_extensions.h>
#include <ardour/utils.h>
#include "i18n.h"
using namespace PBD;
int
ARDOUR::find_session (string str, string& path, string& snapshot, bool& isnew)
{
struct stat statbuf;
char buf[PATH_MAX+1];
isnew = false;
if (!realpath (str.c_str(), buf) && (errno != ENOENT && errno != ENOTDIR)) {
error << string_compose (_("Could not resolve path: %1 (%2)"), buf, strerror(errno)) << endmsg;
return -1;
}
str = buf;
/* check to see if it exists, and what it is */
if (stat (str.c_str(), &statbuf)) {
if (errno == ENOENT) {
isnew = true;
} else {
error << string_compose (_("cannot check session path %1 (%2)"), str, strerror (errno))
<< endmsg;
return -1;
}
}
if (!isnew) {
/* it exists, so it must either be the name
of the directory, or the name of the statefile
within it.
*/
if (S_ISDIR (statbuf.st_mode)) {
string::size_type slash = str.find_last_of ('/');
if (slash == string::npos) {
/* a subdirectory of cwd, so statefile should be ... */
string tmp;
tmp = str;
tmp += '/';
tmp += str;
tmp += statefile_suffix;
/* is it there ? */
if (stat (tmp.c_str(), &statbuf)) {
error << string_compose (_("cannot check statefile %1 (%2)"), tmp, strerror (errno))
<< endmsg;
return -1;
}
path = str;
snapshot = str;
} else {
/* some directory someplace in the filesystem.
the snapshot name is the directory name
itself.
*/
path = str;
snapshot = str.substr (slash+1);
}
} else if (S_ISREG (statbuf.st_mode)) {
string::size_type slash = str.find_last_of ('/');
string::size_type suffix;
/* remove the suffix */
if (slash != string::npos) {
snapshot = str.substr (slash+1);
} else {
snapshot = str;
}
suffix = snapshot.find (statefile_suffix);
if (suffix == string::npos) {
error << string_compose (_("%1 is not an Ardour snapshot file"), str) << endmsg;
return -1;
}
/* remove suffix */
snapshot = snapshot.substr (0, suffix);
if (slash == string::npos) {
/* we must be in the directory where the
statefile lives. get it using cwd().
*/
char cwd[PATH_MAX+1];
if (getcwd (cwd, sizeof (cwd)) == 0) {
error << string_compose (_("cannot determine current working directory (%1)"), strerror (errno))
<< endmsg;
return -1;
}
path = cwd;
} else {
/* full path to the statefile */
path = str.substr (0, slash);
}
} else {
/* what type of file is it? */
error << string_compose (_("unknown file type for session %1"), str) << endmsg;
return -1;
}
} else {
/* its the name of a new directory. get the name
as "dirname" does.
*/
string::size_type slash = str.find_last_of ('/');
if (slash == string::npos) {
/* no slash, just use the name, but clean it up */
path = legalize_for_path (str);
snapshot = path;
} else {
path = str;
snapshot = str.substr (slash+1);
}
}
return 0;
}

View File

@ -105,156 +105,6 @@ sigc::signal<void> Session::SMPTEOffsetChanged;
sigc::signal<void> Session::StartTimeChanged;
sigc::signal<void> Session::EndTimeChanged;
int
Session::find_session (string str, string& path, string& snapshot, bool& isnew)
{
struct stat statbuf;
char buf[PATH_MAX+1];
isnew = false;
if (!realpath (str.c_str(), buf) && (errno != ENOENT && errno != ENOTDIR)) {
error << string_compose (_("Could not resolve path: %1 (%2)"), buf, strerror(errno)) << endmsg;
return -1;
}
str = buf;
/* check to see if it exists, and what it is */
if (stat (str.c_str(), &statbuf)) {
if (errno == ENOENT) {
isnew = true;
} else {
error << string_compose (_("cannot check session path %1 (%2)"), str, strerror (errno))
<< endmsg;
return -1;
}
}
if (!isnew) {
/* it exists, so it must either be the name
of the directory, or the name of the statefile
within it.
*/
if (S_ISDIR (statbuf.st_mode)) {
string::size_type slash = str.find_last_of ('/');
if (slash == string::npos) {
/* a subdirectory of cwd, so statefile should be ... */
string tmp;
tmp = str;
tmp += '/';
tmp += str;
tmp += statefile_suffix;
/* is it there ? */
if (stat (tmp.c_str(), &statbuf)) {
error << string_compose (_("cannot check statefile %1 (%2)"), tmp, strerror (errno))
<< endmsg;
return -1;
}
path = str;
snapshot = str;
} else {
/* some directory someplace in the filesystem.
the snapshot name is the directory name
itself.
*/
path = str;
snapshot = str.substr (slash+1);
}
} else if (S_ISREG (statbuf.st_mode)) {
string::size_type slash = str.find_last_of ('/');
string::size_type suffix;
/* remove the suffix */
if (slash != string::npos) {
snapshot = str.substr (slash+1);
} else {
snapshot = str;
}
suffix = snapshot.find (statefile_suffix);
if (suffix == string::npos) {
error << string_compose (_("%1 is not an Ardour snapshot file"), str) << endmsg;
return -1;
}
/* remove suffix */
snapshot = snapshot.substr (0, suffix);
if (slash == string::npos) {
/* we must be in the directory where the
statefile lives. get it using cwd().
*/
char cwd[PATH_MAX+1];
if (getcwd (cwd, sizeof (cwd)) == 0) {
error << string_compose (_("cannot determine current working directory (%1)"), strerror (errno))
<< endmsg;
return -1;
}
path = cwd;
} else {
/* full path to the statefile */
path = str.substr (0, slash);
}
} else {
/* what type of file is it? */
error << string_compose (_("unknown file type for session %1"), str) << endmsg;
return -1;
}
} else {
/* its the name of a new directory. get the name
as "dirname" does.
*/
string::size_type slash = str.find_last_of ('/');
if (slash == string::npos) {
/* no slash, just use the name, but clean it up */
path = legalize_for_path (str);
snapshot = path;
} else {
path = str;
snapshot = str.substr (slash+1);
}
}
return 0;
}
Session::Session (AudioEngine &eng,
string fullpath,
string snapshot_name,