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) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/environment.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/nix/xdg_util.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::nix::GetXDGDirectory; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::nix::GetXDGUserDirectory; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::nix::kDotConfigDir; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::nix::kXdgConfigHomeEnvVar; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDownloadsDir[] = "Downloads"; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMusicDir[] = "Music"; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPicturesDir[] = "Pictures"; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kVideosDir[] = "Videos"; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generic function for GetUser{Music,Pictures,Video}Directory. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetUserMediaDirectory(const std::string& xdg_name, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& fallback_name, 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* result) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No local media directories on CrOS. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = GetXDGUserDirectory(xdg_name.c_str(), fallback_name.c_str()); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::FilePath home = base::GetHomeDir(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*result != home) { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath desktop; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_USER_DESKTOP, &desktop)) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*result != desktop) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = home.Append(fallback_name); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for a spec on where config files go. The net effect for most 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// systems is we use ~/.config/chromium/ for Chromium and 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ~/.config/google-chrome/ for official builds. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (This also helps us sidestep issues with other apps grabbing ~/.chromium .) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetDefaultUserDataDirectory(base::FilePath* result) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Environment> env(base::Environment::Create()); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath config_dir(GetXDGDirectory(env.get(), 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kXdgConfigHomeEnvVar, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDotConfigDir)); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = config_dir.Append("google-chrome"); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = config_dir.Append("chromium"); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetUserCacheDirectory(const base::FilePath& profile_dir, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* result) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for a spec on where cache files go. Our rule is: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - if the user-data-dir in the standard place, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use same subdirectory of the cache directory. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (this maps ~/.config/google-chrome to ~/.cache/google-chrome as well 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as the same thing for ~/.config/chromium) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - otherwise, use the profile dir directly. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Default value in cases where any of the following fails. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = profile_dir; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Environment> env(base::Environment::Create()); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath cache_dir; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_CACHE, &cache_dir)) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath config_dir(GetXDGDirectory(env.get(), 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kXdgConfigHomeEnvVar, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDotConfigDir)); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!config_dir.AppendRelativePath(profile_dir, &cache_dir)) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = cache_dir; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetChromeFrameUserDataDirectory(base::FilePath* result) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Environment> env(base::Environment::Create()); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath config_dir(GetXDGDirectory(env.get(), 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kXdgConfigHomeEnvVar, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDotConfigDir)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = config_dir.Append("google-chrome-frame"); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = config_dir.Append("chrome-frame"); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetUserDocumentsDirectory(base::FilePath* result) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = GetXDGUserDirectory("DOCUMENTS", "Documents"); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetUserDownloadsDirectorySafe(base::FilePath* result) { 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::FilePath home = base::GetHomeDir(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = home.Append(kDownloadsDir); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetUserDownloadsDirectory(base::FilePath* result) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = base::nix::GetXDGUserDirectory("DOWNLOAD", kDownloadsDir); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We respect the user's preferred pictures location, unless it is 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ~ or their desktop directory, in which case we default to ~/Music. 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetUserMusicDirectory(base::FilePath* result) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetUserMediaDirectory("MUSIC", kMusicDir, result); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We respect the user's preferred pictures location, unless it is 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ~ or their desktop directory, in which case we default to ~/Pictures. 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetUserPicturesDirectory(base::FilePath* result) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetUserMediaDirectory("PICTURES", kPicturesDir, result); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We respect the user's preferred pictures location, unless it is 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ~ or their desktop directory, in which case we default to ~/Videos. 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetUserVideosDirectory(base::FilePath* result) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetUserMediaDirectory("VIDEOS", kVideosDir, result); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProcessNeedsProfileDir(const std::string& process_type) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For now we have no reason to forbid this on Linux as we don't 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have the roaming profile troubles there. Moreover the Linux breakpad needs 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // profile dir access in all process if enabled on Linux. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome 155