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