From ea1e7c3239abad4eb94a869d2b45b9efccb0e775 Mon Sep 17 00:00:00 2001 From: Tres Finocchiaro Date: Mon, 18 Mar 2019 12:41:01 -0400 Subject: [PATCH] Allow new Zyn bank creation on Linux (#4905) Allow new Zyn bank creation on Linux Closes #4642 --- .../zynaddsubfx/zynaddsubfx/src/Misc/Bank.cpp | 35 +++++++++++++++++-- .../zynaddsubfx/zynaddsubfx/src/Misc/Bank.h | 7 ++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/plugins/zynaddsubfx/zynaddsubfx/src/Misc/Bank.cpp b/plugins/zynaddsubfx/zynaddsubfx/src/Misc/Bank.cpp index 5cb43e4ff25..28b69f845b8 100644 --- a/plugins/zynaddsubfx/zynaddsubfx/src/Misc/Bank.cpp +++ b/plugins/zynaddsubfx/zynaddsubfx/src/Misc/Bank.cpp @@ -188,6 +188,7 @@ void Bank::loadfromslot(unsigned int ninstrument, Part *part) */ int Bank::loadbank(string bankdirname) { + normalizedirsuffix(bankdirname); DIR *dir = opendir(bankdirname.c_str()); clearbank(); @@ -255,9 +256,15 @@ int Bank::newbank(string newbankdirname) string bankdir; bankdir = config.cfg.bankRootDirList[0]; - if(((bankdir[bankdir.size() - 1]) != '/') - && ((bankdir[bankdir.size() - 1]) != '\\')) - bankdir += "/"; + expanddirname(bankdir); + normalizedirsuffix(bankdir); + +// FIXME: Zyn should automatically handle creation of parent directory +#ifdef WIN32 + if(mkdir(bankdir.c_str()) < 0) return -1; +#else + if(mkdir(bankdir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) return -1; +#endif bankdir += newbankdirname; #ifdef WIN32 @@ -355,6 +362,8 @@ void Bank::rescanforbanks() void Bank::scanrootdir(string rootdir) { + expanddirname(rootdir); + DIR *dir = opendir(rootdir.c_str()); if(dir == NULL) return; @@ -472,3 +481,23 @@ Bank::ins_t::ins_t() { info.PADsynth_used = false; } + +void Bank::expanddirname(std::string &dirname) { + if (dirname.empty()) + return; + + // if the directory name starts with a ~ and the $HOME variable is + // defined in the environment, replace ~ by the content of $HOME + if (dirname.at(0) == '~') { + char *home_dirname = getenv("HOME"); + if (home_dirname != NULL) { + dirname = std::string(home_dirname) + dirname.substr(1); + } + } +} + +void Bank::normalizedirsuffix(string &dirname) const { + if(((dirname[dirname.size() - 1]) != '/') + && ((dirname[dirname.size() - 1]) != '\\')) + dirname += "/"; +} diff --git a/plugins/zynaddsubfx/zynaddsubfx/src/Misc/Bank.h b/plugins/zynaddsubfx/zynaddsubfx/src/Misc/Bank.h index e9f56e2fb42..a0ae74ce1e0 100644 --- a/plugins/zynaddsubfx/zynaddsubfx/src/Misc/Bank.h +++ b/plugins/zynaddsubfx/zynaddsubfx/src/Misc/Bank.h @@ -99,6 +99,13 @@ class Bank std::string dirname; void scanrootdir(std::string rootdir); //scans a root dir for banks + + /** Expends ~ prefix in dirname, if any */ + void expanddirname(std::string &dirname); + + /** Ensure that the directory name is suffixed by a + * directory separator */ + void normalizedirsuffix(std::string &dirname) const; }; #endif