1*6777b538SAndroid Build Coastguard Worker// Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker// found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker// Defines base::PathProviderMac which replaces base::PathProviderPosix for Mac 6*6777b538SAndroid Build Coastguard Worker// in base/path_service.cc. 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker#import <Foundation/Foundation.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker#include "base/apple/bundle_locations.h" 11*6777b538SAndroid Build Coastguard Worker#include "base/apple/foundation_util.h" 12*6777b538SAndroid Build Coastguard Worker#include "base/base_paths.h" 13*6777b538SAndroid Build Coastguard Worker#include "base/base_paths_apple.h" 14*6777b538SAndroid Build Coastguard Worker#include "base/files/file_path.h" 15*6777b538SAndroid Build Coastguard Worker#include "base/files/file_util.h" 16*6777b538SAndroid Build Coastguard Worker#include "base/notreached.h" 17*6777b538SAndroid Build Coastguard Worker#include "base/path_service.h" 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Workernamespace base { 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Workerbool PathProviderMac(int key, base::FilePath* result) { 22*6777b538SAndroid Build Coastguard Worker switch (key) { 23*6777b538SAndroid Build Coastguard Worker case base::FILE_EXE: 24*6777b538SAndroid Build Coastguard Worker *result = base::apple::internal::GetExecutablePath(); 25*6777b538SAndroid Build Coastguard Worker return true; 26*6777b538SAndroid Build Coastguard Worker case base::FILE_MODULE: 27*6777b538SAndroid Build Coastguard Worker return base::apple::internal::GetModulePathForAddress( 28*6777b538SAndroid Build Coastguard Worker result, reinterpret_cast<const void*>(&base::PathProviderMac)); 29*6777b538SAndroid Build Coastguard Worker case base::DIR_APP_DATA: { 30*6777b538SAndroid Build Coastguard Worker bool success = 31*6777b538SAndroid Build Coastguard Worker base::apple::GetUserDirectory(NSApplicationSupportDirectory, result); 32*6777b538SAndroid Build Coastguard Worker return success; 33*6777b538SAndroid Build Coastguard Worker } 34*6777b538SAndroid Build Coastguard Worker case base::DIR_SRC_TEST_DATA_ROOT: 35*6777b538SAndroid Build Coastguard Worker // Go through PathService to catch overrides. 36*6777b538SAndroid Build Coastguard Worker if (!PathService::Get(base::FILE_EXE, result)) { 37*6777b538SAndroid Build Coastguard Worker return false; 38*6777b538SAndroid Build Coastguard Worker } 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker // Start with the executable's directory. 41*6777b538SAndroid Build Coastguard Worker *result = result->DirName(); 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker if (base::apple::AmIBundled()) { 44*6777b538SAndroid Build Coastguard Worker // The bundled app executables (Chromium, TestShell, etc) live five 45*6777b538SAndroid Build Coastguard Worker // levels down, eg: 46*6777b538SAndroid Build Coastguard Worker // src/xcodebuild/{Debug|Release}/Chromium.app/Contents/MacOS/Chromium 47*6777b538SAndroid Build Coastguard Worker *result = result->DirName().DirName().DirName().DirName().DirName(); 48*6777b538SAndroid Build Coastguard Worker } else { 49*6777b538SAndroid Build Coastguard Worker // Unit tests execute two levels deep from the source root, eg: 50*6777b538SAndroid Build Coastguard Worker // src/xcodebuild/{Debug|Release}/base_unittests 51*6777b538SAndroid Build Coastguard Worker *result = result->DirName().DirName(); 52*6777b538SAndroid Build Coastguard Worker } 53*6777b538SAndroid Build Coastguard Worker return true; 54*6777b538SAndroid Build Coastguard Worker case base::DIR_USER_DESKTOP: 55*6777b538SAndroid Build Coastguard Worker return base::apple::GetUserDirectory(NSDesktopDirectory, result); 56*6777b538SAndroid Build Coastguard Worker case base::DIR_ASSETS: 57*6777b538SAndroid Build Coastguard Worker if (!base::apple::AmIBundled()) { 58*6777b538SAndroid Build Coastguard Worker return PathService::Get(base::DIR_MODULE, result); 59*6777b538SAndroid Build Coastguard Worker } 60*6777b538SAndroid Build Coastguard Worker *result = base::apple::FrameworkBundlePath().Append( 61*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("Resources")); 62*6777b538SAndroid Build Coastguard Worker return true; 63*6777b538SAndroid Build Coastguard Worker case base::DIR_CACHE: 64*6777b538SAndroid Build Coastguard Worker return base::apple::GetUserDirectory(NSCachesDirectory, result); 65*6777b538SAndroid Build Coastguard Worker default: 66*6777b538SAndroid Build Coastguard Worker return false; 67*6777b538SAndroid Build Coastguard Worker } 68*6777b538SAndroid Build Coastguard Worker} 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker} // namespace base 71