summaryrefslogtreecommitdiffstats
path: root/base/nix
diff options
context:
space:
mode:
authorbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-16 04:56:06 +0000
committerbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-16 04:56:06 +0000
commit6b0349ef4ab90a6b99fc568f40e872a7f2ca39c9 (patch)
tree9ba478afe564003c74927c1530741846f6aa1336 /base/nix
parentb679032aef9317482f87ceaf67ee138aaa67a152 (diff)
downloadchromium_src-6b0349ef4ab90a6b99fc568f40e872a7f2ca39c9.zip
chromium_src-6b0349ef4ab90a6b99fc568f40e872a7f2ca39c9.tar.gz
chromium_src-6b0349ef4ab90a6b99fc568f40e872a7f2ca39c9.tar.bz2
Move xdg_util into base/nix. I originally wanted to use base/linux, but you
can't have a namespace called "linux" because it's ifdefed by GCC to be a number. Same for "unix". "x11" was discarded because some future stuff in here will not be related to x11. This also renames base_paths_posix to base_paths_linux since this does not apply to mac, and normally posix applies to mac (this confused me when I had to edit it for the XDG stuff). TEST=it compiles BUG=none Review URL: http://codereview.chromium.org/3778007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@62848 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/nix')
-rw-r--r--base/nix/xdg_util.cc85
-rw-r--r--base/nix/xdg_util.h67
-rw-r--r--base/nix/xdg_util_unittest.cc76
3 files changed, 228 insertions, 0 deletions
diff --git a/base/nix/xdg_util.cc b/base/nix/xdg_util.cc
new file mode 100644
index 0000000..b39a07d
--- /dev/null
+++ b/base/nix/xdg_util.cc
@@ -0,0 +1,85 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/nix/xdg_util.h"
+
+#include "base/environment.h"
+#include "base/file_path.h"
+#include "base/file_util.h"
+#include "base/third_party/xdg_user_dirs/xdg_user_dir_lookup.h"
+
+namespace base {
+namespace nix {
+
+FilePath GetXDGDirectory(Environment* env, const char* env_name,
+ const char* fallback_dir) {
+ std::string env_value;
+ if (env->GetVar(env_name, &env_value) && !env_value.empty())
+ return FilePath(env_value);
+ return file_util::GetHomeDir().Append(fallback_dir);
+}
+
+FilePath GetXDGUserDirectory(Environment* env, const char* dir_name,
+ const char* fallback_dir) {
+ char* xdg_dir = xdg_user_dir_lookup(dir_name);
+ if (xdg_dir) {
+ FilePath rv(xdg_dir);
+ free(xdg_dir);
+ return rv;
+ }
+ return file_util::GetHomeDir().Append(fallback_dir);
+}
+
+DesktopEnvironment GetDesktopEnvironment(Environment* env) {
+ std::string desktop_session;
+ if (env->GetVar("DESKTOP_SESSION", &desktop_session)) {
+ if (desktop_session == "gnome") {
+ return DESKTOP_ENVIRONMENT_GNOME;
+ } else if (desktop_session == "kde4") {
+ return DESKTOP_ENVIRONMENT_KDE4;
+ } else if (desktop_session == "kde") {
+ // This may mean KDE4 on newer systems, so we have to check.
+ if (env->HasVar("KDE_SESSION_VERSION"))
+ return DESKTOP_ENVIRONMENT_KDE4;
+ return DESKTOP_ENVIRONMENT_KDE3;
+ } else if (desktop_session.find("xfce") != std::string::npos) {
+ return DESKTOP_ENVIRONMENT_XFCE;
+ }
+ }
+
+ // Fall back on some older environment variables.
+ // Useful particularly in the DESKTOP_SESSION=default case.
+ if (env->HasVar("GNOME_DESKTOP_SESSION_ID")) {
+ return DESKTOP_ENVIRONMENT_GNOME;
+ } else if (env->HasVar("KDE_FULL_SESSION")) {
+ if (env->HasVar("KDE_SESSION_VERSION"))
+ return DESKTOP_ENVIRONMENT_KDE4;
+ return DESKTOP_ENVIRONMENT_KDE3;
+ }
+
+ return DESKTOP_ENVIRONMENT_OTHER;
+}
+
+const char* GetDesktopEnvironmentName(DesktopEnvironment env) {
+ switch (env) {
+ case DESKTOP_ENVIRONMENT_OTHER:
+ return NULL;
+ case DESKTOP_ENVIRONMENT_GNOME:
+ return "GNOME";
+ case DESKTOP_ENVIRONMENT_KDE3:
+ return "KDE3";
+ case DESKTOP_ENVIRONMENT_KDE4:
+ return "KDE4";
+ case DESKTOP_ENVIRONMENT_XFCE:
+ return "XFCE";
+ }
+ return NULL;
+}
+
+const char* GetDesktopEnvironmentName(Environment* env) {
+ return GetDesktopEnvironmentName(GetDesktopEnvironment(env));
+}
+
+} // namespace nix
+} // namespace base
diff --git a/base/nix/xdg_util.h b/base/nix/xdg_util.h
new file mode 100644
index 0000000..5e711d5
--- /dev/null
+++ b/base/nix/xdg_util.h
@@ -0,0 +1,67 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_NIX_XDG_UTIL_H_
+#define BASE_NIX_XDG_UTIL_H_
+#pragma once
+
+// XDG refers to http://en.wikipedia.org/wiki/Freedesktop.org .
+// This file contains utilities found across free desktop environments.
+//
+// TODO(brettw) this file should be in app/x11, but is currently used by
+// net. We should have a net API to allow the embedder to specify the behavior
+// that it uses XDG for, and then move this file.
+
+#ifdef nix
+#error asdf
+#endif
+
+class FilePath;
+
+namespace base {
+
+class Environment;
+
+namespace nix {
+
+// Utility function for getting XDG directories.
+// |env_name| is the name of an environment variable that we want to use to get
+// a directory path. |fallback_dir| is the directory relative to $HOME that we
+// use if |env_name| cannot be found or is empty. |fallback_dir| may be NULL.
+// Examples of |env_name| are XDG_CONFIG_HOME and XDG_DATA_HOME.
+FilePath GetXDGDirectory(Environment* env, const char* env_name,
+ const char* fallback_dir);
+
+// Wrapper around xdg_user_dir_lookup() from src/base/third_party/xdg-user-dirs
+// This looks up "well known" user directories like the desktop and music
+// folder. Examples of |dir_name| are DESKTOP and MUSIC.
+FilePath GetXDGUserDirectory(Environment* env, const char* dir_name,
+ const char* fallback_dir);
+
+enum DesktopEnvironment {
+ DESKTOP_ENVIRONMENT_OTHER,
+ DESKTOP_ENVIRONMENT_GNOME,
+ // KDE3 and KDE4 are sufficiently different that we count
+ // them as two different desktop environments here.
+ DESKTOP_ENVIRONMENT_KDE3,
+ DESKTOP_ENVIRONMENT_KDE4,
+ DESKTOP_ENVIRONMENT_XFCE,
+};
+
+// Return an entry from the DesktopEnvironment enum with a best guess
+// of which desktop environment we're using. We use this to know when
+// to attempt to use preferences from the desktop environment --
+// proxy settings, password manager, etc.
+DesktopEnvironment GetDesktopEnvironment(Environment* env);
+
+// Return a string representation of the given desktop environment.
+// May return NULL in the case of DESKTOP_ENVIRONMENT_OTHER.
+const char* GetDesktopEnvironmentName(DesktopEnvironment env);
+// Convenience wrapper that calls GetDesktopEnvironment() first.
+const char* GetDesktopEnvironmentName(Environment* env);
+
+} // namespace nix
+} // namespace base
+
+#endif // BASE_NIX_XDG_UTIL_H_
diff --git a/base/nix/xdg_util_unittest.cc b/base/nix/xdg_util_unittest.cc
new file mode 100644
index 0000000..2fc9d4c
--- /dev/null
+++ b/base/nix/xdg_util_unittest.cc
@@ -0,0 +1,76 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/nix/xdg_util.h"
+
+#include "base/environment.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::_;
+using ::testing::Return;
+using ::testing::SetArgumentPointee;
+using ::testing::StrEq;
+
+namespace base {
+namespace nix {
+
+namespace {
+
+class MockEnvironment : public Environment {
+ public:
+ MOCK_METHOD2(GetVar, bool(const char*, std::string* result));
+ MOCK_METHOD2(SetVar, bool(const char*, const std::string& new_value));
+ MOCK_METHOD1(UnSetVar, bool(const char*));
+};
+
+const char* kGnome = "gnome";
+const char* kKDE4 = "kde4";
+const char* kKDE = "kde";
+const char* kXFCE = "xfce";
+
+} // namespace
+
+TEST(XDGUtilTest, GetDesktopEnvironmentGnome) {
+ MockEnvironment getter;
+ EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
+ EXPECT_CALL(getter, GetVar(StrEq("DESKTOP_SESSION"), _))
+ .WillOnce(DoAll(SetArgumentPointee<1>(kGnome), Return(true)));
+
+ EXPECT_EQ(DESKTOP_ENVIRONMENT_GNOME,
+ GetDesktopEnvironment(&getter));
+}
+
+TEST(XDGUtilTest, GetDesktopEnvironmentKDE4) {
+ MockEnvironment getter;
+ EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
+ EXPECT_CALL(getter, GetVar(StrEq("DESKTOP_SESSION"), _))
+ .WillOnce(DoAll(SetArgumentPointee<1>(kKDE4), Return(true)));
+
+ EXPECT_EQ(DESKTOP_ENVIRONMENT_KDE4,
+ GetDesktopEnvironment(&getter));
+}
+
+TEST(XDGUtilTest, GetDesktopEnvironmentKDE3) {
+ MockEnvironment getter;
+ EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
+ EXPECT_CALL(getter, GetVar(StrEq("DESKTOP_SESSION"), _))
+ .WillOnce(DoAll(SetArgumentPointee<1>(kKDE), Return(true)));
+
+ EXPECT_EQ(DESKTOP_ENVIRONMENT_KDE3,
+ GetDesktopEnvironment(&getter));
+}
+
+TEST(XDGUtilTest, GetDesktopEnvironmentXFCE) {
+ MockEnvironment getter;
+ EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
+ EXPECT_CALL(getter, GetVar(StrEq("DESKTOP_SESSION"), _))
+ .WillOnce(DoAll(SetArgumentPointee<1>(kXFCE), Return(true)));
+
+ EXPECT_EQ(DESKTOP_ENVIRONMENT_XFCE,
+ GetDesktopEnvironment(&getter));
+}
+
+} // namespace nix
+} // namespace base