diff options
Diffstat (limited to 'libs/ardour/filesystem_paths.cc')
-rw-r--r-- | libs/ardour/filesystem_paths.cc | 112 |
1 files changed, 97 insertions, 15 deletions
diff --git a/libs/ardour/filesystem_paths.cc b/libs/ardour/filesystem_paths.cc index 73bfaff137..1b4bd0476d 100644 --- a/libs/ardour/filesystem_paths.cc +++ b/libs/ardour/filesystem_paths.cc @@ -30,6 +30,11 @@ #include "i18n.h" +#ifdef PLATFORM_WINDOWS +#include "shlobj.h" +#include "pbd/windows_special_dirs.h" +#endif + using namespace PBD; namespace ARDOUR { @@ -54,8 +59,12 @@ user_config_directory () if ((c = getenv ("XDG_CONFIG_HOME")) != 0) { p = c; } else { +#ifdef PLATFORM_WINDOWS + // Not technically the home dir (since it needs to be a writable folder) + const string home_dir = Glib::build_filename (Glib::get_user_config_dir(), user_config_dir_name); +#else const string home_dir = Glib::get_home_dir(); - +#endif if (home_dir.empty ()) { error << "Unable to determine home directory" << endmsg; exit (1); @@ -66,7 +75,9 @@ user_config_directory () } #endif +#ifndef PLATFORM_WINDOWS p = Glib::build_filename (p, user_config_dir_name); +#endif if (!Glib::file_test (p, Glib::FILE_TEST_EXISTS)) { if (g_mkdir_with_parents (p.c_str(), 0755)) { @@ -84,51 +95,122 @@ user_config_directory () } std::string +user_cache_directory () +{ + static std::string p; + + if (!p.empty()) return p; + +#ifdef __APPLE__ + p = Glib::build_filename (Glib::get_home_dir(), "Library/Caches"); +#else + const char* c = 0; + + /* adopt freedesktop standards, and put .ardour3 into $XDG_CACHE_HOME + * defaulting to or ~/.config + */ + if ((c = getenv ("XDG_CACHE_HOME")) != 0) { + p = c; + } else { +#ifdef PLATFORM_WINDOWS + // Not technically the home dir (since it needs to be a writable folder) + const string home_dir = Glib::build_filename (Glib::get_user_data_dir(), user_config_dir_name); +#else + const string home_dir = Glib::get_home_dir(); +#endif + if (home_dir.empty ()) { + error << "Unable to determine home directory" << endmsg; + exit (1); + } + + p = home_dir; + p = Glib::build_filename (p, ".cache"); + } +#endif + +#ifndef PLATFORM_WINDOWS + p = Glib::build_filename (p, user_config_dir_name); +#endif + + if (!Glib::file_test (p, Glib::FILE_TEST_EXISTS)) { + if (g_mkdir_with_parents (p.c_str(), 0755)) { + error << string_compose (_("Cannot create cache directory %1 - cannot run"), + p) << endmsg; + exit (1); + } + } else if (!Glib::file_test (p, Glib::FILE_TEST_IS_DIR)) { + error << string_compose (_("Cache directory %1 already exists and is not a directory/folder - cannot run"), + p) << endmsg; + exit (1); + } + + return p; +} + +std::string ardour_dll_directory () { +#ifdef PLATFORM_WINDOWS + std::string dll_dir_path(g_win32_get_package_installation_directory_of_module(NULL)); + dll_dir_path = Glib::build_filename (dll_dir_path, "lib"); + return Glib::build_filename (dll_dir_path, "ardour3"); +#else std::string s = Glib::getenv("ARDOUR_DLL_PATH"); if (s.empty()) { std::cerr << _("ARDOUR_DLL_PATH not set in environment - exiting\n"); ::exit (1); } return s; +#endif } -SearchPath +#ifdef PLATFORM_WINDOWS +Searchpath +windows_search_path () +{ + std::string dll_dir_path(g_win32_get_package_installation_directory_of_module(NULL)); + dll_dir_path = Glib::build_filename (dll_dir_path, "share"); + return Glib::build_filename (dll_dir_path, "ardour3"); +} +#endif + +Searchpath ardour_config_search_path () { - static SearchPath search_path; + static Searchpath search_path; if (search_path.empty()) { search_path += user_config_directory(); - +#ifdef PLATFORM_WINDOWS + search_path += windows_search_path (); +#endif std::string s = Glib::getenv("ARDOUR_CONFIG_PATH"); if (s.empty()) { - std::cerr << _("ARDOUR_CONFIG_PATH not set in environment - exiting\n"); - ::exit (1); + std::cerr << _("ARDOUR_CONFIG_PATH not set in environment\n"); + } else { + search_path += Searchpath (s); } - - search_path += SearchPath (s); } return search_path; } -SearchPath +Searchpath ardour_data_search_path () { - static SearchPath search_path; + static Searchpath search_path; if (search_path.empty()) { search_path += user_config_directory(); - +#ifdef PLATFORM_WINDOWS + search_path += windows_search_path (); +#endif std::string s = Glib::getenv("ARDOUR_DATA_PATH"); if (s.empty()) { - std::cerr << _("ARDOUR_DATA_PATH not set in environment - exiting\n"); - ::exit (1); + std::cerr << _("ARDOUR_DATA_PATH not set in environment\n"); + } else { + search_path += Searchpath (s); } - - search_path += SearchPath (s); } return search_path; |