diff options
author | thestig@chromium.org <thestig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-12-02 08:45:01 +0000 |
---|---|---|
committer | thestig@chromium.org <thestig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-12-02 08:45:01 +0000 |
commit | 9e9b6e8ee77229781fa8581b7f46413024404a5f (patch) | |
tree | 5b3dfc45e4e65db382138b64e5a63ac3c3b0dad6 /base | |
parent | 7aadea0cf98791bbbf163b0d2ef078c7697fea4e (diff) | |
download | chromium_src-9e9b6e8ee77229781fa8581b7f46413024404a5f.zip chromium_src-9e9b6e8ee77229781fa8581b7f46413024404a5f.tar.gz chromium_src-9e9b6e8ee77229781fa8581b7f46413024404a5f.tar.bz2 |
Move some XDG code from chrome to base, make DIR_USER_CACHE generic rather than Chromium specific, and clean up a few headers.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/449048
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@33565 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rw-r--r-- | base/base.gyp | 3 | ||||
-rw-r--r-- | base/base_paths.h | 6 | ||||
-rw-r--r-- | base/base_paths_posix.cc | 12 | ||||
-rw-r--r-- | base/linux_util.cc | 40 | ||||
-rw-r--r-- | base/linux_util.h | 19 | ||||
-rw-r--r-- | base/test/test_suite.h | 1 | ||||
-rw-r--r-- | base/third_party/xdg_user_dirs/README.chromium | 3 | ||||
-rw-r--r-- | base/third_party/xdg_user_dirs/xdg_user_dir_lookup.cc | 232 | ||||
-rw-r--r-- | base/third_party/xdg_user_dirs/xdg_user_dir_lookup.h | 33 |
9 files changed, 346 insertions, 3 deletions
diff --git a/base/base.gyp b/base/base.gyp index 3373f5a..0a7aaba 100644 --- a/base/base.gyp +++ b/base/base.gyp @@ -63,6 +63,8 @@ 'third_party/xdg_mime/xdgmimemagic.h', 'third_party/xdg_mime/xdgmimeparent.c', 'third_party/xdg_mime/xdgmimeparent.h', + 'third_party/xdg_user_dirs/xdg_user_dir_lookup.cc', + 'third_party/xdg_user_dirs/xdg_user_dir_lookup.h', 'atomicops_internals_x86_gcc.cc', 'at_exit.cc', 'at_exit.h', @@ -434,6 +436,7 @@ { # else: OS != "linux" && OS != "freebsd" 'sources/': [ ['exclude', '/xdg_mime/'], + ['exclude', '/xdg_user_dirs/'], ['exclude', '_nss\.cc$'], ], 'sources!': [ diff --git a/base/base_paths.h b/base/base_paths.h index 8ec19e5..7718fbe 100644 --- a/base/base_paths.h +++ b/base/base_paths.h @@ -14,7 +14,6 @@ #elif defined(OS_MACOSX) #include "base/base_paths_mac.h" #endif -#include "base/path_service.h" namespace base { @@ -32,6 +31,11 @@ enum { DIR_SOURCE_ROOT, // Returns the root of the source tree. This key is useful // for tests that need to locate various resources. It // should not be used outside of test code. +#if defined(OS_LINUX) + DIR_USER_CACHE, // Directory where user cache data resides. The Chromium + // browser cache can be a subdirectory of DIR_USER_CACHE. + // This is $XDG_CACHE_HOME on Linux. +#endif PATH_END }; diff --git a/base/base_paths_posix.cc b/base/base_paths_posix.cc index 799c135..bcbc578 100644 --- a/base/base_paths_posix.cc +++ b/base/base_paths_posix.cc @@ -2,15 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// This is really Posix minus Mac. Mac code is in base_paths_mac.mm. + #include "base/base_paths.h" #include <unistd.h> #include "base/file_path.h" #include "base/file_util.h" +#include "base/linux_util.h" #include "base/logging.h" #include "base/path_service.h" -#include "base/string_piece.h" +#include "base/scoped_ptr.h" #include "base/sys_string_conversions.h" namespace base { @@ -56,6 +59,13 @@ bool PathProviderPosix(int key, FilePath* result) { LOG(ERROR) << "Couldn't find your source root. " << "Try running from your chromium/src directory."; return false; + case base::DIR_USER_CACHE: + scoped_ptr<base::EnvironmentVariableGetter> env( + base::EnvironmentVariableGetter::Create()); + FilePath cache_dir(base::GetXDGDirectory(env.get(), "XDG_CACHE_HOME", + ".cache")); + *result = cache_dir; + return true; } return false; } diff --git a/base/linux_util.cc b/base/linux_util.cc index dce4248d..8ac2e49 100644 --- a/base/linux_util.cc +++ b/base/linux_util.cc @@ -6,18 +6,20 @@ #include <dirent.h> #include <errno.h> +#include <glib.h> #include <stdlib.h> #include <sys/stat.h> -#include <sys/types.h> #include <unistd.h> #include <vector> #include "base/command_line.h" #include "base/lock.h" +#include "base/path_service.h" #include "base/process_util.h" #include "base/singleton.h" #include "base/string_util.h" +#include "base/third_party/xdg_user_dirs/xdg_user_dir_lookup.h" namespace { @@ -179,6 +181,23 @@ std::string linux_distro = "Unknown"; #endif +FilePath GetHomeDir(EnvironmentVariableGetter* env) { + std::string home_dir; + if (env->Getenv("HOME", &home_dir) && !home_dir.empty()) + return FilePath(home_dir); + + home_dir = g_get_home_dir(); + if (!home_dir.empty()) + return FilePath(home_dir); + + FilePath rv; + if (PathService::Get(base::DIR_TEMP, &rv)) + return rv; + + // Last resort. + return FilePath("/tmp"); +} + std::string GetLinuxDistro() { #if defined(OS_CHROMEOS) return linux_distro; @@ -215,6 +234,25 @@ std::string GetLinuxDistro() { #endif } +FilePath GetXDGDirectory(EnvironmentVariableGetter* env, + const char* env_name, const char* fallback_dir) { + std::string env_value; + if (env->Getenv(env_name, &env_value) && !env_value.empty()) + return FilePath(env_value); + return GetHomeDir(env).Append(fallback_dir); +} + +FilePath GetXDGUserDirectory(EnvironmentVariableGetter* env, + const char* dir_name, const char* fallback_dir) { + char* xdg_dir = xdg_user_dir_lookup(dir_name); + if (xdg_dir) { + FilePath rv(xdg_dir); + free(xdg_dir); + return rv; + } + return GetHomeDir(env).Append(fallback_dir); +} + // static EnvironmentVariableGetter* EnvironmentVariableGetter::Create() { return new EnvironmentVariableGetterImpl(); diff --git a/base/linux_util.h b/base/linux_util.h index 1da519e..b62f7cc 100644 --- a/base/linux_util.h +++ b/base/linux_util.h @@ -10,6 +10,8 @@ #include <string> +class FilePath; + namespace base { static const char kFindInodeSwitch[] = "--find-inode"; @@ -35,6 +37,23 @@ class EnvironmentVariableGetter { static EnvironmentVariableGetter* Create(); }; +// Get the home directory. +FilePath GetHomeDir(EnvironmentVariableGetter* env); + +// Utility function for getting XDG directories. +// |env_name| is the name of an environment variable that we want to use to get +// a directory path. |fallback_dir| is the directory relative to $HOME that we +// use if |env_name| cannot be found or is empty. |fallback_dir| may be NULL. +// Examples of |env_name| are XDG_CONFIG_HOME and XDG_DATA_HOME. +FilePath GetXDGDirectory(EnvironmentVariableGetter* env, + const char* env_name, const char* fallback_dir); + +// Wrapper around xdg_user_dir_lookup() from src/base/third_party/xdg-user-dirs +// This looks up "well known" user directories like the desktop and music +// folder. Examples of |dir_name| are DESKTOP and MUSIC. +FilePath GetXDGUserDirectory(EnvironmentVariableGetter* env, + const char* dir_name, const char* fallback_dir); + enum DesktopEnvironment { DESKTOP_ENVIRONMENT_OTHER, DESKTOP_ENVIRONMENT_GNOME, diff --git a/base/test/test_suite.h b/base/test/test_suite.h index 2566b1a..7eac0d4 100644 --- a/base/test/test_suite.h +++ b/base/test/test_suite.h @@ -15,6 +15,7 @@ #include "base/i18n/icu_util.h" #include "base/multiprocess_test.h" #include "base/nss_init.h" +#include "base/path_service.h" #include "base/process_util.h" #include "base/scoped_nsautorelease_pool.h" #include "base/scoped_ptr.h" diff --git a/base/third_party/xdg_user_dirs/README.chromium b/base/third_party/xdg_user_dirs/README.chromium new file mode 100644 index 0000000..9dc2103 --- /dev/null +++ b/base/third_party/xdg_user_dirs/README.chromium @@ -0,0 +1,3 @@ +This directory include xdg-user-dir-lookup.c renamed as xdg_user_dir_lookup.cc +from xdg-user-dirs 0.10. We made xdg_user_dir_lookup() non-static and added a +xdg_user_dir_lookup.h. diff --git a/base/third_party/xdg_user_dirs/xdg_user_dir_lookup.cc b/base/third_party/xdg_user_dirs/xdg_user_dir_lookup.cc new file mode 100644 index 0000000..343f70c --- /dev/null +++ b/base/third_party/xdg_user_dirs/xdg_user_dir_lookup.cc @@ -0,0 +1,232 @@ +/* + This file is not licenced under the GPL like the rest of the code. + Its is under the MIT license, to encourage reuse by cut-and-paste. + + Copyright (c) 2007 Red Hat, inc + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/** + * xdg_user_dir_lookup_with_fallback: + * @type: a string specifying the type of directory + * @fallback: value to use if the directory isn't specified by the user + * @returns: a newly allocated absolute pathname + * + * Looks up a XDG user directory of the specified type. + * Example of types are "DESKTOP" and "DOWNLOAD". + * + * In case the user hasn't specified any directory for the specified + * type the value returned is @fallback. + * + * The return value is newly allocated and must be freed with + * free(). The return value is never NULL if @fallback != NULL, unless + * out of memory. + **/ +static char * +xdg_user_dir_lookup_with_fallback (const char *type, const char *fallback) +{ + FILE *file; + char *home_dir, *config_home, *config_file; + char buffer[512]; + char *user_dir; + char *p, *d; + int len; + int relative; + + home_dir = getenv ("HOME"); + + if (home_dir == NULL) + goto error; + + config_home = getenv ("XDG_CONFIG_HOME"); + if (config_home == NULL || config_home[0] == 0) + { + config_file = (char*) malloc (strlen (home_dir) + strlen ("/.config/user-dirs.dirs") + 1); + if (config_file == NULL) + goto error; + + strcpy (config_file, home_dir); + strcat (config_file, "/.config/user-dirs.dirs"); + } + else + { + config_file = (char*) malloc (strlen (config_home) + strlen ("/user-dirs.dirs") + 1); + if (config_file == NULL) + goto error; + + strcpy (config_file, config_home); + strcat (config_file, "/user-dirs.dirs"); + } + + file = fopen (config_file, "r"); + free (config_file); + if (file == NULL) + goto error; + + user_dir = NULL; + while (fgets (buffer, sizeof (buffer), file)) + { + /* Remove newline at end */ + len = strlen (buffer); + if (len > 0 && buffer[len-1] == '\n') + buffer[len-1] = 0; + + p = buffer; + while (*p == ' ' || *p == '\t') + p++; + + if (strncmp (p, "XDG_", 4) != 0) + continue; + p += 4; + if (strncmp (p, type, strlen (type)) != 0) + continue; + p += strlen (type); + if (strncmp (p, "_DIR", 4) != 0) + continue; + p += 4; + + while (*p == ' ' || *p == '\t') + p++; + + if (*p != '=') + continue; + p++; + + while (*p == ' ' || *p == '\t') + p++; + + if (*p != '"') + continue; + p++; + + relative = 0; + if (strncmp (p, "$HOME/", 6) == 0) + { + p += 6; + relative = 1; + } + else if (*p != '/') + continue; + + if (relative) + { + user_dir = (char*) malloc (strlen (home_dir) + 1 + strlen (p) + 1); + if (user_dir == NULL) + goto error2; + + strcpy (user_dir, home_dir); + strcat (user_dir, "/"); + } + else + { + user_dir = (char*) malloc (strlen (p) + 1); + if (user_dir == NULL) + goto error2; + + *user_dir = 0; + } + + d = user_dir + strlen (user_dir); + while (*p && *p != '"') + { + if ((*p == '\\') && (*(p+1) != 0)) + p++; + *d++ = *p++; + } + *d = 0; + } +error2: + fclose (file); + + if (user_dir) + return user_dir; + + error: + if (fallback) + return strdup (fallback); + return NULL; +} + +/** + * xdg_user_dir_lookup: + * @type: a string specifying the type of directory + * @returns: a newly allocated absolute pathname + * + * Looks up a XDG user directory of the specified type. + * Example of types are "DESKTOP" and "DOWNLOAD". + * + * The return value is always != NULL (unless out of memory), + * and if a directory + * for the type is not specified by the user the default + * is the home directory. Except for DESKTOP which defaults + * to ~/Desktop. + * + * The return value is newly allocated and must be freed with + * free(). + **/ +char * +xdg_user_dir_lookup (const char *type) +{ + char *dir, *home_dir, *user_dir; + + dir = xdg_user_dir_lookup_with_fallback (type, NULL); + if (dir != NULL) + return dir; + + home_dir = getenv ("HOME"); + + if (home_dir == NULL) + return strdup ("/tmp"); + + /* Special case desktop for historical compatibility */ + if (strcmp (type, "DESKTOP") == 0) + { + user_dir = (char*) malloc (strlen (home_dir) + strlen ("/Desktop") + 1); + if (user_dir == NULL) + return NULL; + + strcpy (user_dir, home_dir); + strcat (user_dir, "/Desktop"); + return user_dir; + } + + return strdup (home_dir); +} + +#ifdef STANDALONE_XDG_USER_DIR_LOOKUP +int +main (int argc, char *argv[]) +{ + if (argc != 2) + { + fprintf (stderr, "Usage %s <dir-type>\n", argv[0]); + exit (1); + } + + printf ("%s\n", xdg_user_dir_lookup (argv[1])); + return 0; +} +#endif diff --git a/base/third_party/xdg_user_dirs/xdg_user_dir_lookup.h b/base/third_party/xdg_user_dirs/xdg_user_dir_lookup.h new file mode 100644 index 0000000..9e81e1b --- /dev/null +++ b/base/third_party/xdg_user_dirs/xdg_user_dir_lookup.h @@ -0,0 +1,33 @@ +/* + This file is not licenced under the GPL like the rest of the code. + Its is under the MIT license, to encourage reuse by cut-and-paste. + + Copyright (c) 2007 Red Hat, inc + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#ifndef CHROME_THIRD_PARTY_XDG_USER_DIRS_XDG_USER_DIR_LOOKUP_H_ +#define CHROME_THIRD_PARTY_XDG_USER_DIRS_XDG_USER_DIR_LOOKUP_H_ + +char* xdg_user_dir_lookup(const char *type); + +#endif // CHROME_THIRD_PARTY_XDG_USER_DIRS_XDG_USER_DIR_LOOKUP_H_ |