X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fardour%2Ffilesystem_paths.cc;h=54f7508b659d92ce55b34410dcbbd1fb35b26f1b;hb=456fb789d3adcdb52de3abd863c1bf64c973effa;hp=465d07bddc86d93f9783334a00315e44fc1e86b8;hpb=0abcfb16ba203be43fcb2d2cd0b740da85679e7a;p=ardour.git diff --git a/libs/ardour/filesystem_paths.cc b/libs/ardour/filesystem_paths.cc index 465d07bddc..54f7508b65 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,45 +16,144 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include +#include -#include +#include "pbd/error.h" +#include "pbd/compose.h" #include +#include -#include -#include +#include "ardour/directory_names.h" +#include "ardour/filesystem_paths.h" + +#include "i18n.h" + +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 (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/Preferences"); +#else + const char* c = 0; - throw sys::filesystem_error(error_msg); - } + /* adopt freedesktop standards, and put .ardour3 into $XDG_CONFIG_HOME or ~/.config + */ + + if ((c = getenv ("XDG_CONFIG_HOME")) != 0) { + p = c; + } else { + const string home_dir = Glib::get_home_dir(); + + if (home_dir.empty ()) { + error << "Unable to determine home directory" << endmsg; + exit (1); + } - sys::path p(home_dir); - p /= user_config_dir_name; + p = home_dir; + p = Glib::build_filename (p, ".config"); + } +#endif + + 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; } -sys::path -system_module_directory () +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 +} + +#ifdef PLATFORM_WINDOWS +Searchpath +windows_search_path () { - sys::path module_directory(MODULE_DIR); - module_directory /= "ardour2"; - return module_directory; + 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; + + if (search_path.empty()) { + search_path += user_config_directory(); +#ifdef PLATFORM_WINDOWS + search_path += windows_search_path (); +#else + std::string s = Glib::getenv("ARDOUR_CONFIG_PATH"); + if (s.empty()) { + std::cerr << _("ARDOUR_CONFIG_PATH not set in environment - exiting\n"); + ::exit (1); + } + + search_path += Searchpath (s); +#endif + } + + return search_path; +} + +Searchpath +ardour_data_search_path () +{ + static Searchpath search_path; + + if (search_path.empty()) { + search_path += user_config_directory(); +#ifdef PLATFORM_WINDOWS + search_path += windows_search_path (); +#else + std::string s = Glib::getenv("ARDOUR_DATA_PATH"); + if (s.empty()) { + std::cerr << _("ARDOUR_DATA_PATH not set in environment - exiting\n"); + ::exit (1); + } + + search_path += Searchpath (s); +#endif + } + + return search_path; } } // namespace ARDOUR