summaryrefslogtreecommitdiff
path: root/libs/ardour/find_session.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-12-27 22:24:24 +0100
committerRobin Gareus <robin@gareus.org>2016-12-27 22:24:24 +0100
commitbbbf8e61274774972b90397be875a4c6c15b8b54 (patch)
tree7e7d46327471ab4edb4bd7e8b64ffb2ee0bffd1f /libs/ardour/find_session.cc
parente71ea821dd0166015b41ade10c198455349dc662 (diff)
Add backend support to extract session-archives
Diffstat (limited to 'libs/ardour/find_session.cc')
-rw-r--r--libs/ardour/find_session.cc95
1 files changed, 95 insertions, 0 deletions
diff --git a/libs/ardour/find_session.cc b/libs/ardour/find_session.cc
index af39a47527..3301dfd20d 100644
--- a/libs/ardour/find_session.cc
+++ b/libs/ardour/find_session.cc
@@ -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