X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Ffilesystem_paths.cc;h=c0766c066f65f2f7c3755469601bfc157ec470b9;hb=c16d5203385fdb623646f7f686adaceebd784deb;hp=bc2055c0dc7b21b306a2a460ea6f0bc3e1013e6f;hpb=0dac6b545b8b7467ee6488f6b4d48d81322db457;p=ardour.git diff --git a/libs/ardour/filesystem_paths.cc b/libs/ardour/filesystem_paths.cc index bc2055c0dc..c0766c066f 100644 --- a/libs/ardour/filesystem_paths.cc +++ b/libs/ardour/filesystem_paths.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2007 Tim Mayberry + Copyright (C) 2007 Tim Mayberry This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,82 +16,240 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include +#include #include "pbd/error.h" -#include "pbd/filesystem_paths.h" +#include "pbd/compose.h" #include +#include #include "ardour/directory_names.h" #include "ardour/filesystem_paths.h" -#define WITH_STATIC_PATHS 1 +#include "i18n.h" + +#ifdef PLATFORM_WINDOWS +#include "shlobj.h" +#include "pbd/windows_special_dirs.h" +#endif + +using namespace PBD; namespace ARDOUR { using std::string; -sys::path +std::string user_config_directory () { - const string home_dir = Glib::get_home_dir (); + static std::string p; + + if (!p.empty()) return p; + +#ifdef __APPLE__ + + p = Glib::build_filename (Glib::get_home_dir(), "Library/Preferences"); + +#else + + const char* c = 0; + /* adopt freedesktop standards, and put .ardour3 into $XDG_CONFIG_HOME or ~/.config */ + 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::get_user_config_dir(); +#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; + +#ifndef PLATFORM_WINDOWS + p = Glib::build_filename (p, ".config"); +#endif + + } +#endif // end not __APPLE__ + + p = Glib::build_filename (p, user_config_dir_name); + + if (!Glib::file_test (p, Glib::FILE_TEST_EXISTS)) { + if (g_mkdir_with_parents (p.c_str(), 0755)) { + error << string_compose (_("Cannot create Configuration directory %1 - cannot run"), + p) << endmsg; + exit (1); + } + } else if (!Glib::file_test (p, Glib::FILE_TEST_IS_DIR)) { + error << string_compose (_("Configuration directory %1 already exists and is not a directory/folder - cannot run"), + p) << endmsg; + exit (1); + } + + return p; +} + +std::string +user_cache_directory () +{ + static std::string p; - if (home_dir.empty ()) { - const string error_msg = "Unable to determine home directory"; + if (!p.empty()) return p; - // log the error - error << error_msg << endmsg; +#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::get_user_data_dir(); +#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; + +#ifndef PLATFORM_WINDOWS + p = Glib::build_filename (p, ".cache"); +#endif - throw sys::filesystem_error(error_msg); } +#endif // end not __APPLE__ + + p = Glib::build_filename (p, user_config_dir_name); + +#ifdef PLATFORM_WINDOWS + /* On Windows Glib::get_user_data_dir is the folder to use for local + * (as opposed to roaming) application data. + * See documentation for CSIDL_LOCAL_APPDATA. + * Glib::get_user_data_dir() == GLib::get_user_config_dir() + * so we add an extra subdir *below* the config dir. + */ + p = Glib::build_filename (p, "cache"); +#endif - sys::path p(home_dir); - p /= user_config_dir_name; + 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; } -sys::path -ardour_module_directory () +std::string +ardour_dll_directory () { - sys::path module_directory(MODULE_DIR); - module_directory /= "ardour3"; - return module_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, LIBARDOUR); +#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 -ardour_search_path () +#ifdef PLATFORM_WINDOWS +Searchpath +windows_search_path () { - SearchPath spath_env(Glib::getenv("ARDOUR_PATH")); - return spath_env; + 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, LIBARDOUR); } +#endif -SearchPath -system_config_search_path () +Searchpath +ardour_config_search_path () { -#ifdef WITH_STATIC_PATHS - SearchPath config_path(string(CONFIG_DIR)); + static Searchpath search_path; + + if (search_path.empty()) { + // Start by adding the user's personal config folder + search_path += user_config_directory(); +#ifdef PLATFORM_WINDOWS + // On Windows, add am intermediate configuration folder + // (one that's guaranteed to be writable by all users). + const gchar* const *all_users_folder = g_get_system_config_dirs(); + // Despite its slightly odd name, the above returns a single entry which + // corresponds to 'All Users' on Windows (according to the documentation) + + if (all_users_folder) { + std::string writable_all_users_path = all_users_folder[0]; + writable_all_users_path += "\\"; + writable_all_users_path += PROGRAM_NAME; + writable_all_users_path += "\\.config"; +#ifdef _WIN64 + writable_all_users_path += "\\win64"; #else - SearchPath config_path(system_config_directories()); + writable_all_users_path += "\\win32"; #endif + search_path += writable_all_users_path; + } - config_path.add_subdirectory_to_paths("ardour3"); + // now add a suitable config path from the bundle + search_path += windows_search_path (); +#endif + // finally, add any paths from ARDOUR_CONFIG_PATH if it exists + std::string s = Glib::getenv("ARDOUR_CONFIG_PATH"); + if (s.empty()) { + std::cerr << _("ARDOUR_CONFIG_PATH not set in environment\n"); + } else { + search_path += Searchpath (s); + } + } - return config_path; + return search_path; } -SearchPath -system_data_search_path () +Searchpath +ardour_data_search_path () { -#ifdef WITH_STATIC_PATHS - SearchPath data_path(string(DATA_DIR)); -#else - SearchPath data_path(system_data_directories()); -#endif + static Searchpath search_path; - data_path.add_subdirectory_to_paths("ardour3"); + 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\n"); + } else { + search_path += Searchpath (s); + } + } - return data_path; + return search_path; } } // namespace ARDOUR