chrome_paths_linux.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1// Copyright (c) 2012 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/base_paths.h" 8#include "base/environment.h" 9#include "base/files/file_util.h" 10#include "base/memory/scoped_ptr.h" 11#include "base/nix/xdg_util.h" 12#include "base/path_service.h" 13#include "chrome/common/chrome_paths.h" 14 15namespace chrome { 16 17using base::nix::GetXDGDirectory; 18using base::nix::GetXDGUserDirectory; 19using base::nix::kDotConfigDir; 20using base::nix::kXdgConfigHomeEnvVar; 21 22namespace { 23 24const char kDownloadsDir[] = "Downloads"; 25const char kMusicDir[] = "Music"; 26const char kPicturesDir[] = "Pictures"; 27const char kVideosDir[] = "Videos"; 28 29// Generic function for GetUser{Music,Pictures,Video}Directory. 30bool GetUserMediaDirectory(const std::string& xdg_name, 31 const std::string& fallback_name, 32 base::FilePath* result) { 33#if defined(OS_CHROMEOS) 34 // No local media directories on CrOS. 35 return false; 36#else 37 *result = GetXDGUserDirectory(xdg_name.c_str(), fallback_name.c_str()); 38 39 base::FilePath home; 40 PathService::Get(base::DIR_HOME, &home); 41 if (*result != home) { 42 base::FilePath desktop; 43 if (!PathService::Get(base::DIR_USER_DESKTOP, &desktop)) 44 return false; 45 if (*result != desktop) { 46 return true; 47 } 48 } 49 50 *result = home.Append(fallback_name); 51 return true; 52#endif 53} 54 55} // namespace 56 57// See http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html 58// for a spec on where config files go. The net effect for most 59// systems is we use ~/.config/chromium/ for Chromium and 60// ~/.config/google-chrome/ for official builds. 61// (This also helps us sidestep issues with other apps grabbing ~/.chromium .) 62bool GetDefaultUserDataDirectory(base::FilePath* result) { 63 scoped_ptr<base::Environment> env(base::Environment::Create()); 64 base::FilePath config_dir(GetXDGDirectory(env.get(), 65 kXdgConfigHomeEnvVar, 66 kDotConfigDir)); 67#if defined(GOOGLE_CHROME_BUILD) 68 *result = config_dir.Append("google-chrome"); 69#else 70 *result = config_dir.Append("chromium"); 71#endif 72 return true; 73} 74 75void GetUserCacheDirectory(const base::FilePath& profile_dir, 76 base::FilePath* result) { 77 // See http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html 78 // for a spec on where cache files go. Our rule is: 79 // - if the user-data-dir in the standard place, 80 // use same subdirectory of the cache directory. 81 // (this maps ~/.config/google-chrome to ~/.cache/google-chrome as well 82 // as the same thing for ~/.config/chromium) 83 // - otherwise, use the profile dir directly. 84 85 // Default value in cases where any of the following fails. 86 *result = profile_dir; 87 88 scoped_ptr<base::Environment> env(base::Environment::Create()); 89 90 base::FilePath cache_dir; 91 if (!PathService::Get(base::DIR_CACHE, &cache_dir)) 92 return; 93 base::FilePath config_dir(GetXDGDirectory(env.get(), 94 kXdgConfigHomeEnvVar, 95 kDotConfigDir)); 96 97 if (!config_dir.AppendRelativePath(profile_dir, &cache_dir)) 98 return; 99 100 *result = cache_dir; 101} 102 103bool GetUserDocumentsDirectory(base::FilePath* result) { 104 *result = GetXDGUserDirectory("DOCUMENTS", "Documents"); 105 return true; 106} 107 108bool GetUserDownloadsDirectorySafe(base::FilePath* result) { 109 base::FilePath home; 110 PathService::Get(base::DIR_HOME, &home); 111 *result = home.Append(kDownloadsDir); 112 return true; 113} 114 115bool GetUserDownloadsDirectory(base::FilePath* result) { 116 *result = GetXDGUserDirectory("DOWNLOAD", kDownloadsDir); 117 return true; 118} 119 120// We respect the user's preferred pictures location, unless it is 121// ~ or their desktop directory, in which case we default to ~/Music. 122bool GetUserMusicDirectory(base::FilePath* result) { 123 return GetUserMediaDirectory("MUSIC", kMusicDir, result); 124} 125 126// We respect the user's preferred pictures location, unless it is 127// ~ or their desktop directory, in which case we default to ~/Pictures. 128bool GetUserPicturesDirectory(base::FilePath* result) { 129 return GetUserMediaDirectory("PICTURES", kPicturesDir, result); 130} 131 132// We respect the user's preferred pictures location, unless it is 133// ~ or their desktop directory, in which case we default to ~/Videos. 134bool GetUserVideosDirectory(base::FilePath* result) { 135 return GetUserMediaDirectory("VIDEOS", kVideosDir, result); 136} 137 138bool ProcessNeedsProfileDir(const std::string& process_type) { 139 // For now we have no reason to forbid this on Linux as we don't 140 // have the roaming profile troubles there. Moreover the Linux breakpad needs 141 // profile dir access in all process if enabled on Linux. 142 return true; 143} 144 145} // namespace chrome 146