diff options
-rw-r--r-- | Slimber/MainController.cpp | 2 | ||||
-rw-r--r-- | Swiften/Application/SConscript | 4 | ||||
-rw-r--r-- | Swiften/Application/UnixApplicationPathProvider.cpp | 66 | ||||
-rw-r--r-- | Swiften/Application/UnixApplicationPathProvider.h | 46 |
4 files changed, 75 insertions, 43 deletions
diff --git a/Slimber/MainController.cpp b/Slimber/MainController.cpp index 5c624a2..a557a07 100644 --- a/Slimber/MainController.cpp +++ b/Slimber/MainController.cpp @@ -35,7 +35,7 @@ MainController::MainController(Menulet* menulet) : menulet(menulet) { boost::bind(&MainController::handleServicesChanged, this)); vCardCollection = new FileVCardCollection( - PlatformApplicationPathProvider("Slimber").getSettingsDir()); + PlatformApplicationPathProvider("Slimber").getDataDir()); server = new Server(5222, 5562, linkLocalServiceBrowser, vCardCollection); server->onStopped.connect( diff --git a/Swiften/Application/SConscript b/Swiften/Application/SConscript index 2eacc80..7b25a97 100644 --- a/Swiften/Application/SConscript +++ b/Swiften/Application/SConscript @@ -17,6 +17,10 @@ elif swiften_env["PLATFORM"] == "win32" : sources += [ "WindowsApplicationPathProvider.cpp" ] +else : + sources += [ + "UnixApplicationPathProvider.cpp" + ] objects = swiften_env.StaticObject(sources) swiften_env.Append(SWIFTEN_OBJECTS = [objects]) diff --git a/Swiften/Application/UnixApplicationPathProvider.cpp b/Swiften/Application/UnixApplicationPathProvider.cpp new file mode 100644 index 0000000..b474ecf --- /dev/null +++ b/Swiften/Application/UnixApplicationPathProvider.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2010 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include "Swiften/Application/UnixApplicationPathProvider.h" + +#include <boost/filesystem/convenience.hpp> + +namespace Swift { + +UnixApplicationPathProvider::UnixApplicationPathProvider(const String& name) : ApplicationPathProvider(name) { + resourceDirs.push_back(getExecutableDir() / "../resources"); // Development + char* xdgDataDirs = getenv("XDG_DATA_DIRS"); + if (xdgDataDirs) { + std::vector<String> dataDirs = String(xdgDataDirs).split(':'); + if (!dataDirs.empty()) { + foreach(const String& dir, dataDirs) { + resourceDirs.push_back(boost::filesystem::path(dir.getUTF8String()) / "swift"); + } + return; + } + } + resourceDirs.push_back("/usr/local/share/swift"); + resourceDirs.push_back("/usr/share/swift"); +} + +boost::filesystem::path UnixApplicationPathProvider::getHomeDir() const { + return boost::filesystem::path(getenv("HOME")); +} + +boost::filesystem::path UnixApplicationPathProvider::getDataDir() const { + char* xdgDataHome = getenv("XDG_DATA_HOME"); + String dataDir; + if (xdgDataHome) { + dataDir = String(xdgDataHome); + } + + boost::filesystem::path dataPath = (dataDir.isEmpty() ? + getHomeDir() / ".local" / "share" + : boost::filesystem::path(dataDir.getUTF8String())) / getApplicationName().getLowerCase().getUTF8String(); + + try { + boost::filesystem::create_directories(dataPath); + } + catch (const boost::filesystem::filesystem_error& e) { + std::cerr << "ERROR: " << e.what() << std::endl; + } + return dataPath; +} + +boost::filesystem::path UnixApplicationPathProvider::getExecutableDir() const { + ByteArray path; + path.resize(4096); + size_t size = readlink("/proc/self/exe", path.getData(), path.getSize()); + if (size > 0) { + path.resize(size); + return boost::filesystem::path(path.toString().getUTF8Data()).parent_path(); + } + else { + return boost::filesystem::path(); + } +} + +} diff --git a/Swiften/Application/UnixApplicationPathProvider.h b/Swiften/Application/UnixApplicationPathProvider.h index 5dd5aa5..c1bfd95 100644 --- a/Swiften/Application/UnixApplicationPathProvider.h +++ b/Swiften/Application/UnixApplicationPathProvider.h @@ -17,49 +17,11 @@ namespace Swift { class UnixApplicationPathProvider : public ApplicationPathProvider { public: - UnixApplicationPathProvider(const String& name) : ApplicationPathProvider(name) { - resourceDirs.push_back(getExecutableDir() / "../resources"); // Development - char* xdgDataDirs = getenv("XDG_DATA_DIRS"); - if (xdgDataDirs) { - std::vector<String> dataDirs = String(xdgDataDirs).split(':'); - if (!dataDirs.empty()) { - foreach(const String& dir, dataDirs) { - resourceDirs.push_back(boost::filesystem::path(dir.getUTF8String()) / "swift"); - } - return; - } - } - resourceDirs.push_back("/usr/local/share/swift"); - resourceDirs.push_back("/usr/share/swift"); - } - - virtual boost::filesystem::path getHomeDir() const { - return boost::filesystem::path(getenv("HOME")); - } + UnixApplicationPathProvider(const String& name); - boost::filesystem::path getDataDir() const { - boost::filesystem::path result(getHomeDir() / ("." + getApplicationName().getLowerCase().getUTF8String())); - try { - boost::filesystem::create_directory(result); - } - catch (const boost::filesystem::filesystem_error& e) { - std::cerr << "ERROR: " << e.what() << std::endl; - } - return result; - } - - virtual boost::filesystem::path getExecutableDir() const { - ByteArray path; - path.resize(4096); - size_t size = readlink("/proc/self/exe", path.getData(), path.getSize()); - if (size > 0) { - path.resize(size); - return boost::filesystem::path(path.toString().getUTF8Data()).parent_path(); - } - else { - return boost::filesystem::path(); - } - } + virtual boost::filesystem::path getHomeDir() const; + boost::filesystem::path getDataDir() const; + virtual boost::filesystem::path getExecutableDir() const; virtual std::vector<boost::filesystem::path> getResourceDirs() const { return resourceDirs; |