Home | History | Annotate | Download | only in common
      1 // Copyright (c) 2011 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/environment.h"
      8 #include "base/file_util.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "base/path_service.h"
     11 #include "base/nix/xdg_util.h"
     12 
     13 namespace {
     14 
     15 const char kDotConfigDir[] = ".config";
     16 const char kDownloadsDir[] = "Downloads";
     17 const char kXdgConfigHomeEnvVar[] = "XDG_CONFIG_HOME";
     18 
     19 }  // namespace
     20 
     21 namespace chrome {
     22 
     23 // See http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
     24 // for a spec on where config files go.  The net effect for most
     25 // systems is we use ~/.config/chromium/ for Chromium and
     26 // ~/.config/google-chrome/ for official builds.
     27 // (This also helps us sidestep issues with other apps grabbing ~/.chromium .)
     28 bool GetDefaultUserDataDirectory(FilePath* result) {
     29   scoped_ptr<base::Environment> env(base::Environment::Create());
     30   FilePath config_dir(base::nix::GetXDGDirectory(env.get(),
     31                                                  kXdgConfigHomeEnvVar,
     32                                                  kDotConfigDir));
     33 #if defined(GOOGLE_CHROME_BUILD)
     34   *result = config_dir.Append("google-chrome");
     35 #else
     36   *result = config_dir.Append("chromium");
     37 #endif
     38   return true;
     39 }
     40 
     41 void GetUserCacheDirectory(const FilePath& profile_dir, FilePath* result) {
     42   // See http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
     43   // for a spec on where cache files go.  Our rule is:
     44   // - if the user-data-dir in the standard place,
     45   //     use same subdirectory of the cache directory.
     46   //     (this maps ~/.config/google-chrome to ~/.cache/google-chrome as well
     47   //      as the same thing for ~/.config/chromium)
     48   // - otherwise, use the profile dir directly.
     49 
     50   // Default value in cases where any of the following fails.
     51   *result = profile_dir;
     52 
     53   scoped_ptr<base::Environment> env(base::Environment::Create());
     54 
     55   FilePath cache_dir;
     56   if (!PathService::Get(base::DIR_CACHE, &cache_dir))
     57     return;
     58   FilePath config_dir(base::nix::GetXDGDirectory(env.get(),
     59                                                  kXdgConfigHomeEnvVar,
     60                                                  kDotConfigDir));
     61 
     62   if (!config_dir.AppendRelativePath(profile_dir, &cache_dir))
     63     return;
     64 
     65   *result = cache_dir;
     66 }
     67 
     68 bool GetChromeFrameUserDataDirectory(FilePath* result) {
     69   scoped_ptr<base::Environment> env(base::Environment::Create());
     70   FilePath config_dir(base::nix::GetXDGDirectory(env.get(),
     71                                                  kXdgConfigHomeEnvVar,
     72                                                  kDotConfigDir));
     73 #if defined(GOOGLE_CHROME_BUILD)
     74   *result = config_dir.Append("google-chrome-frame");
     75 #else
     76   *result = config_dir.Append("chrome-frame");
     77 #endif
     78   return true;
     79 }
     80 
     81 bool GetUserDocumentsDirectory(FilePath* result) {
     82   scoped_ptr<base::Environment> env(base::Environment::Create());
     83   *result = base::nix::GetXDGUserDirectory(env.get(), "DOCUMENTS", "Documents");
     84   return true;
     85 }
     86 
     87 // We respect the user's preferred download location, unless it is
     88 // ~ or their desktop directory, in which case we default to ~/Downloads.
     89 bool GetUserDownloadsDirectory(FilePath* result) {
     90   scoped_ptr<base::Environment> env(base::Environment::Create());
     91   *result = base::nix::GetXDGUserDirectory(env.get(), "DOWNLOAD",
     92                                            kDownloadsDir);
     93 
     94   FilePath home = file_util::GetHomeDir();
     95   if (*result == home) {
     96     *result = home.Append(kDownloadsDir);
     97     return true;
     98   }
     99 
    100   FilePath desktop;
    101   GetUserDesktop(&desktop);
    102   if (*result == desktop) {
    103     *result = home.Append(kDownloadsDir);
    104   }
    105 
    106   return true;
    107 }
    108 
    109 bool GetUserDesktop(FilePath* result) {
    110   scoped_ptr<base::Environment> env(base::Environment::Create());
    111   *result = base::nix::GetXDGUserDirectory(env.get(), "DESKTOP", "Desktop");
    112   return true;
    113 }
    114 
    115 }  // namespace chrome
    116