mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-16 19:56:31 +01:00
Add backend support to extract session-archives
This commit is contained in:
parent
e71ea821dd
commit
bbbf8e6127
3 changed files with 100 additions and 1 deletions
|
|
@ -28,6 +28,8 @@
|
|||
namespace ARDOUR {
|
||||
|
||||
LIBARDOUR_API extern int find_session (std::string str, std::string& path, std::string& snapshot, bool& isnew);
|
||||
LIBARDOUR_API extern int inflate_session (const std::string& zipfile, const std::string& target_dir, std::string& path, std::string& snapshot);
|
||||
LIBARDOUR_API extern std::string inflate_error (int);
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -26,8 +26,11 @@
|
|||
#include "pbd/gstdio_compat.h"
|
||||
|
||||
#include <glibmm/miscutils.h>
|
||||
#include <glibmm/fileutils.h>
|
||||
|
||||
#include "pbd/basename.h"
|
||||
#include "pbd/compose.h"
|
||||
#include "pbd/file_archive.h"
|
||||
#include "pbd/pathexpand.h"
|
||||
#include "pbd/error.h"
|
||||
|
||||
|
|
@ -185,4 +188,96 @@ find_session (string str, string& path, string& snapshot, bool& isnew)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* check if zip is a session-archive,
|
||||
* return > 0 if file is not an archive
|
||||
* return < 0 if unzip failed
|
||||
* return 0 on success. path and snapshot are set.
|
||||
*/
|
||||
int
|
||||
inflate_session (const std::string& zipfile, const std::string& target_dir, string& path, string& snapshot)
|
||||
{
|
||||
if (zipfile.find (".tar.xz") == string::npos) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
try {
|
||||
PBD::FileArchive ar (zipfile);
|
||||
std::vector<std::string> files = ar.contents ();
|
||||
|
||||
if (files.size () == 0) {
|
||||
error << _("Archive is empty") << endmsg;
|
||||
return 2;
|
||||
}
|
||||
|
||||
/* session archives are expected to be named after the archive */
|
||||
std::string bn = Glib::path_get_dirname (files.front());
|
||||
if (bn.empty ()) {
|
||||
error << _("Archive does not contain a session folder") << endmsg;
|
||||
return 3;
|
||||
}
|
||||
if (bn[bn.length() - 1] == '/') {
|
||||
bn = bn.substr (0, bn.length() - 1);
|
||||
}
|
||||
if (bn.empty ()) {
|
||||
error << _("Archive does not contain a valid session structure") << endmsg;
|
||||
return 4;
|
||||
}
|
||||
|
||||
string sn = Glib::build_filename (bn, bn + statefile_suffix);
|
||||
|
||||
if (std::find (files.begin(), files.end(), sn) == files.end()) {
|
||||
error << _("Archive does not contain a session file") << endmsg;
|
||||
return 5;
|
||||
}
|
||||
|
||||
/* check if target folder exists */
|
||||
string dest = Glib::build_filename (target_dir, bn);
|
||||
if (Glib::file_test (dest, Glib::FILE_TEST_EXISTS)) {
|
||||
error << string_compose (_("Destination '%1' already exists."), dest) << endmsg;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (0 == ar.inflate (target_dir)) {
|
||||
info << string_compose (_("Extracted session-archive to '%1'."), dest) << endmsg;
|
||||
path = dest;
|
||||
snapshot = bn;
|
||||
return 0;
|
||||
}
|
||||
|
||||
} catch (...) {
|
||||
error << _("Error reading file-archive") << endmsg;
|
||||
return 6;
|
||||
}
|
||||
|
||||
error << _("Error extracting file-archive") << endmsg;
|
||||
return -2;
|
||||
}
|
||||
|
||||
string inflate_error (int e) {
|
||||
switch (e) {
|
||||
case 0:
|
||||
return _("No Error");
|
||||
case 1:
|
||||
return _("File extension is not .tar.xz");
|
||||
case 2:
|
||||
return _("Archive is empty");
|
||||
case 3:
|
||||
return _("Archive does not contain a session folder");
|
||||
case 4:
|
||||
return _("Archive does not contain a valid session structure");
|
||||
case 5:
|
||||
return _("Archive does not contain a session file");
|
||||
case 6:
|
||||
return _("Error reading file-archive");
|
||||
case -1:
|
||||
return _("Destination folder already exists.");
|
||||
case -2:
|
||||
return _("Error extracting file-archive");
|
||||
default:
|
||||
assert (0);
|
||||
break;
|
||||
}
|
||||
return _("Unknown Error");
|
||||
}
|
||||
|
||||
} // namespace ARDOUR
|
||||
|
|
|
|||
|
|
@ -333,7 +333,7 @@ Session::Session (AudioEngine &eng,
|
|||
init_name_id_counter (1); // reset for new sessions, start at 1
|
||||
VCA::set_next_vca_number (1); // reset for new sessions, start at 1
|
||||
|
||||
pre_engine_init (fullpath);
|
||||
pre_engine_init (fullpath); // sets _is_new
|
||||
|
||||
setup_lua ();
|
||||
|
||||
|
|
@ -479,6 +479,8 @@ Session::Session (AudioEngine &eng,
|
|||
}
|
||||
#endif
|
||||
|
||||
ensure_subdirs (); // archived or zipped sessions may lack peaks/ analysis/ etc
|
||||
|
||||
_is_new = false;
|
||||
session_loaded ();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue