15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths_internal.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/base_paths.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/environment.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/nix/xdg_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::nix::GetXDGDirectory; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::nix::GetXDGUserDirectory; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::nix::kDotConfigDir; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::nix::kXdgConfigHomeEnvVar; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDownloadsDir[] = "Downloads"; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMusicDir[] = "Music"; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPicturesDir[] = "Pictures"; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kVideosDir[] = "Videos"; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generic function for GetUser{Music,Pictures,Video}Directory. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetUserMediaDirectory(const std::string& xdg_name, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& fallback_name, 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* result) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No local media directories on CrOS. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = GetXDGUserDirectory(xdg_name.c_str(), fallback_name.c_str()); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath home; 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PathService::Get(base::DIR_HOME, &home); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*result != home) { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath desktop; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_USER_DESKTOP, &desktop)) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*result != desktop) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = home.Append(fallback_name); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for a spec on where config files go. The net effect for most 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// systems is we use ~/.config/chromium/ for Chromium and 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ~/.config/google-chrome/ for official builds. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (This also helps us sidestep issues with other apps grabbing ~/.chromium .) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetDefaultUserDataDirectory(base::FilePath* result) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Environment> env(base::Environment::Create()); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath config_dir(GetXDGDirectory(env.get(), 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kXdgConfigHomeEnvVar, 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kDotConfigDir)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = config_dir.Append("google-chrome"); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = config_dir.Append("chromium"); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetUserCacheDirectory(const base::FilePath& profile_dir, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* result) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for a spec on where cache files go. Our rule is: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - if the user-data-dir in the standard place, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use same subdirectory of the cache directory. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (this maps ~/.config/google-chrome to ~/.cache/google-chrome as well 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as the same thing for ~/.config/chromium) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - otherwise, use the profile dir directly. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Default value in cases where any of the following fails. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = profile_dir; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Environment> env(base::Environment::Create()); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath cache_dir; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_CACHE, &cache_dir)) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath config_dir(GetXDGDirectory(env.get(), 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kXdgConfigHomeEnvVar, 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kDotConfigDir)); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!config_dir.AppendRelativePath(profile_dir, &cache_dir)) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = cache_dir; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetUserDocumentsDirectory(base::FilePath* result) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = GetXDGUserDirectory("DOCUMENTS", "Documents"); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetUserDownloadsDirectorySafe(base::FilePath* result) { 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath home; 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PathService::Get(base::DIR_HOME, &home); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = home.Append(kDownloadsDir); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetUserDownloadsDirectory(base::FilePath* result) { 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *result = GetXDGUserDirectory("DOWNLOAD", kDownloadsDir); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We respect the user's preferred pictures location, unless it is 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ~ or their desktop directory, in which case we default to ~/Music. 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetUserMusicDirectory(base::FilePath* result) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetUserMediaDirectory("MUSIC", kMusicDir, result); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We respect the user's preferred pictures location, unless it is 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ~ or their desktop directory, in which case we default to ~/Pictures. 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetUserPicturesDirectory(base::FilePath* result) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetUserMediaDirectory("PICTURES", kPicturesDir, result); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We respect the user's preferred pictures location, unless it is 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ~ or their desktop directory, in which case we default to ~/Videos. 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetUserVideosDirectory(base::FilePath* result) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetUserMediaDirectory("VIDEOS", kVideosDir, result); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProcessNeedsProfileDir(const std::string& process_type) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For now we have no reason to forbid this on Linux as we don't 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have the roaming profile troubles there. Moreover the Linux breakpad needs 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // profile dir access in all process if enabled on Linux. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome 146