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