1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be 3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file. 4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Defines base::PathProviderAndroid which replaces base::PathProviderPosix for 6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Android in base/path_service.cc. 7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <limits.h> 9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <unistd.h> 10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/jni_android.h" 12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/path_utils.h" 13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/base_paths.h" 14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/files/file_path.h" 15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/files/file_util.h" 16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/logging.h" 17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/process/process_metrics.h" 18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace base { 20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool PathProviderAndroid(int key, FilePath* result) { 22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez switch (key) { 23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez case base::FILE_EXE: { 24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez char bin_dir[PATH_MAX + 1]; 25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez int bin_dir_size = readlink(kProcSelfExe, bin_dir, PATH_MAX); 26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (bin_dir_size < 0 || bin_dir_size > PATH_MAX) { 27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez NOTREACHED() << "Unable to resolve " << kProcSelfExe << "."; 28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez bin_dir[bin_dir_size] = 0; 31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez *result = FilePath(bin_dir); 32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez case base::FILE_MODULE: 35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // dladdr didn't work in Android as only the file name was returned. 36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez NOTIMPLEMENTED(); 37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez case base::DIR_MODULE: 39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return base::android::GetNativeLibraryDirectory(result); 40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez case base::DIR_SOURCE_ROOT: 41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Used only by tests. 42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // In that context, hooked up via base/test/test_support_android.cc. 43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez NOTIMPLEMENTED(); 44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez case base::DIR_USER_DESKTOP: 46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Android doesn't support GetUserDesktop. 47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez NOTIMPLEMENTED(); 48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez case base::DIR_CACHE: 50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return base::android::GetCacheDirectory(result); 51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez case base::DIR_ANDROID_APP_DATA: 52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return base::android::GetDataDirectory(result); 53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez case base::DIR_ANDROID_EXTERNAL_STORAGE: 54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return base::android::GetExternalStorageDirectory(result); 55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez default: 56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Note: the path system expects this function to override the default 57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // behavior. So no need to log an error if we don't support a given 58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // path. The system will just use the default. 59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace base 64