From 7d40d96d71678af014877369a1f431e72dd69b5d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Fri, 20 Aug 2010 22:02:51 +0200
Subject: Comply to FreeDesktop.org standard for storing data files.

Resolves: #526

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;
-- 
cgit v0.10.2-6-g49f6