1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Use of this source code is governed by a BSD-style license that can be
306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// found in the LICENSE file.
406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "chrome/common/chrome_paths_internal.h"
606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/environment.h"
806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "base/file_util.h"
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
10201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/path_service.h"
11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/nix/xdg_util.h"
1206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace {
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char kDotConfigDir[] = ".config";
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char kDownloadsDir[] = "Downloads";
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char kXdgConfigHomeEnvVar[] = "XDG_CONFIG_HOME";
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}  // namespace
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochnamespace chrome {
2206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
2306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// See http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
2406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// for a spec on where config files go.  The net effect for most
2506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// systems is we use ~/.config/chromium/ for Chromium and
2606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// ~/.config/google-chrome/ for official builds.
2706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// (This also helps us sidestep issues with other apps grabbing ~/.chromium .)
2806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochbool GetDefaultUserDataDirectory(FilePath* result) {
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<base::Environment> env(base::Environment::Create());
30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FilePath config_dir(base::nix::GetXDGDirectory(env.get(),
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                 kXdgConfigHomeEnvVar,
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                 kDotConfigDir));
3306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#if defined(GOOGLE_CHROME_BUILD)
3406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  *result = config_dir.Append("google-chrome");
3506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#else
3606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  *result = config_dir.Append("chromium");
3706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#endif
3806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  return true;
3906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
4006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
41201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid GetUserCacheDirectory(const FilePath& profile_dir, FilePath* result) {
42201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // See http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
43201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // for a spec on where cache files go.  Our rule is:
44201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // - if the user-data-dir in the standard place,
45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  //     use same subdirectory of the cache directory.
46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  //     (this maps ~/.config/google-chrome to ~/.cache/google-chrome as well
47201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  //      as the same thing for ~/.config/chromium)
48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // - otherwise, use the profile dir directly.
49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
50201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Default value in cases where any of the following fails.
51201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  *result = profile_dir;
52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  scoped_ptr<base::Environment> env(base::Environment::Create());
54201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  FilePath cache_dir;
56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!PathService::Get(base::DIR_CACHE, &cache_dir))
57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FilePath config_dir(base::nix::GetXDGDirectory(env.get(),
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                 kXdgConfigHomeEnvVar,
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                 kDotConfigDir));
61201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
62201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!config_dir.AppendRelativePath(profile_dir, &cache_dir))
63201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
64201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
65201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  *result = cache_dir;
66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
67201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
6806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochbool GetChromeFrameUserDataDirectory(FilePath* result) {
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<base::Environment> env(base::Environment::Create());
70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FilePath config_dir(base::nix::GetXDGDirectory(env.get(),
71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                 kXdgConfigHomeEnvVar,
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                 kDotConfigDir));
7306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#if defined(GOOGLE_CHROME_BUILD)
7406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  *result = config_dir.Append("google-chrome-frame");
7506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#else
7606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  *result = config_dir.Append("chrome-frame");
7706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#endif
7806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  return true;
7906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
8006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
8106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochbool GetUserDocumentsDirectory(FilePath* result) {
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<base::Environment> env(base::Environment::Create());
83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  *result = base::nix::GetXDGUserDirectory(env.get(), "DOCUMENTS", "Documents");
8406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  return true;
8506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
8606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
8706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// We respect the user's preferred download location, unless it is
8806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// ~ or their desktop directory, in which case we default to ~/Downloads.
8906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochbool GetUserDownloadsDirectory(FilePath* result) {
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<base::Environment> env(base::Environment::Create());
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  *result = base::nix::GetXDGUserDirectory(env.get(), "DOWNLOAD",
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                           kDownloadsDir);
9306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
9406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  FilePath home = file_util::GetHomeDir();
9506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  if (*result == home) {
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    *result = home.Append(kDownloadsDir);
9706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    return true;
9806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
9906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
10006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  FilePath desktop;
10106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  GetUserDesktop(&desktop);
10206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  if (*result == desktop) {
103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    *result = home.Append(kDownloadsDir);
10406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
10506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
10606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  return true;
10706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
10806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
10906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochbool GetUserDesktop(FilePath* result) {
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<base::Environment> env(base::Environment::Create());
111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  *result = base::nix::GetXDGUserDirectory(env.get(), "DESKTOP", "Desktop");
11206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  return true;
11306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
11406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
11506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}  // namespace chrome
116