1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/common/chrome_paths_internal.h"
6
7#include "base/environment.h"
8#include "base/file_util.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/path_service.h"
11#include "base/nix/xdg_util.h"
12
13namespace {
14
15const char kDotConfigDir[] = ".config";
16const char kDownloadsDir[] = "Downloads";
17const char kXdgConfigHomeEnvVar[] = "XDG_CONFIG_HOME";
18
19}  // namespace
20
21namespace chrome {
22
23// See http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
24// for a spec on where config files go.  The net effect for most
25// systems is we use ~/.config/chromium/ for Chromium and
26// ~/.config/google-chrome/ for official builds.
27// (This also helps us sidestep issues with other apps grabbing ~/.chromium .)
28bool GetDefaultUserDataDirectory(FilePath* result) {
29  scoped_ptr<base::Environment> env(base::Environment::Create());
30  FilePath config_dir(base::nix::GetXDGDirectory(env.get(),
31                                                 kXdgConfigHomeEnvVar,
32                                                 kDotConfigDir));
33#if defined(GOOGLE_CHROME_BUILD)
34  *result = config_dir.Append("google-chrome");
35#else
36  *result = config_dir.Append("chromium");
37#endif
38  return true;
39}
40
41void GetUserCacheDirectory(const FilePath& profile_dir, FilePath* result) {
42  // See http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
43  // for a spec on where cache files go.  Our rule is:
44  // - if the user-data-dir in the standard place,
45  //     use same subdirectory of the cache directory.
46  //     (this maps ~/.config/google-chrome to ~/.cache/google-chrome as well
47  //      as the same thing for ~/.config/chromium)
48  // - otherwise, use the profile dir directly.
49
50  // Default value in cases where any of the following fails.
51  *result = profile_dir;
52
53  scoped_ptr<base::Environment> env(base::Environment::Create());
54
55  FilePath cache_dir;
56  if (!PathService::Get(base::DIR_CACHE, &cache_dir))
57    return;
58  FilePath config_dir(base::nix::GetXDGDirectory(env.get(),
59                                                 kXdgConfigHomeEnvVar,
60                                                 kDotConfigDir));
61
62  if (!config_dir.AppendRelativePath(profile_dir, &cache_dir))
63    return;
64
65  *result = cache_dir;
66}
67
68bool GetChromeFrameUserDataDirectory(FilePath* result) {
69  scoped_ptr<base::Environment> env(base::Environment::Create());
70  FilePath config_dir(base::nix::GetXDGDirectory(env.get(),
71                                                 kXdgConfigHomeEnvVar,
72                                                 kDotConfigDir));
73#if defined(GOOGLE_CHROME_BUILD)
74  *result = config_dir.Append("google-chrome-frame");
75#else
76  *result = config_dir.Append("chrome-frame");
77#endif
78  return true;
79}
80
81bool GetUserDocumentsDirectory(FilePath* result) {
82  scoped_ptr<base::Environment> env(base::Environment::Create());
83  *result = base::nix::GetXDGUserDirectory(env.get(), "DOCUMENTS", "Documents");
84  return true;
85}
86
87// We respect the user's preferred download location, unless it is
88// ~ or their desktop directory, in which case we default to ~/Downloads.
89bool GetUserDownloadsDirectory(FilePath* result) {
90  scoped_ptr<base::Environment> env(base::Environment::Create());
91  *result = base::nix::GetXDGUserDirectory(env.get(), "DOWNLOAD",
92                                           kDownloadsDir);
93
94  FilePath home = file_util::GetHomeDir();
95  if (*result == home) {
96    *result = home.Append(kDownloadsDir);
97    return true;
98  }
99
100  FilePath desktop;
101  GetUserDesktop(&desktop);
102  if (*result == desktop) {
103    *result = home.Append(kDownloadsDir);
104  }
105
106  return true;
107}
108
109bool GetUserDesktop(FilePath* result) {
110  scoped_ptr<base::Environment> env(base::Environment::Create());
111  *result = base::nix::GetXDGUserDirectory(env.get(), "DESKTOP", "Desktop");
112  return true;
113}
114
115}  // namespace chrome
116