blob: 7aa1288ddee7447ebc9bf4fdbbb91280c9693466 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ios/chrome/browser/chrome_paths.h"
#include "base/base_paths.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "base/threading/thread_restrictions.h"
#include "build/branding_buildflags.h"
#include "components/gcm_driver/gcm_driver_constants.h"
#include "ios/chrome/browser/chrome_paths_internal.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace ios {
namespace {
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
const base::FilePath::CharType kProductDirName[] =
FILE_PATH_LITERAL("Google/Chrome");
#else
const base::FilePath::CharType kProductDirName[] =
FILE_PATH_LITERAL("Chromium");
#endif
bool GetDefaultUserDataDirectory(base::FilePath* result) {
if (!base::PathService::Get(base::DIR_APP_DATA, result)) {
NOTREACHED();
return false;
}
*result = result->Append(kProductDirName);
return true;
}
bool PathProvider(int key, base::FilePath* result) {
// Assume that creation of the directory is not required if it does not exist.
// This flag is set to true for the case where it needs to be created.
bool create_dir = false;
base::FilePath cur;
switch (key) {
case DIR_USER_DATA:
if (!GetDefaultUserDataDirectory(&cur))
return false;
create_dir = true;
break;
case DIR_CRASH_DUMPS:
if (!GetDefaultUserDataDirectory(&cur))
return false;
cur = cur.Append(FILE_PATH_LITERAL("Crash Reports"));
create_dir = true;
break;
case DIR_TEST_DATA:
if (!base::PathService::Get(base::DIR_SOURCE_ROOT, &cur))
return false;
cur = cur.Append(FILE_PATH_LITERAL("ios"));
cur = cur.Append(FILE_PATH_LITERAL("chrome"));
cur = cur.Append(FILE_PATH_LITERAL("test"));
cur = cur.Append(FILE_PATH_LITERAL("data"));
break;
case DIR_GLOBAL_GCM_STORE:
if (!base::PathService::Get(DIR_USER_DATA, &cur))
return false;
cur = cur.Append(gcm_driver::kGCMStoreDirname);
break;
case FILE_LOCAL_STATE:
if (!base::PathService::Get(DIR_USER_DATA, &cur))
return false;
cur = cur.Append(FILE_PATH_LITERAL("Local State"));
break;
case FILE_RESOURCES_PACK:
if (!base::PathService::Get(base::DIR_MODULE, &cur))
return false;
cur = cur.Append(FILE_PATH_LITERAL("resources.pak"));
break;
default:
return false;
}
if (create_dir && !base::PathExists(cur) && !base::CreateDirectory(cur))
return false;
*result = cur;
return true;
}
} // namespace
void RegisterPathProvider() {
base::PathService::RegisterProvider(PathProvider, PATH_START, PATH_END);
}
void GetUserCacheDirectory(const base::FilePath& browser_state_dir,
base::FilePath* result) {
// If the browser state directory is under ~/Library/Application Support,
// use a suitable cache directory under ~/Library/Caches.
// Default value in cases where any of the following fails.
*result = browser_state_dir;
base::FilePath app_data_dir;
if (!base::PathService::Get(base::DIR_APP_DATA, &app_data_dir))
return;
base::FilePath cache_dir;
if (!base::PathService::Get(base::DIR_CACHE, &cache_dir))
return;
if (!app_data_dir.AppendRelativePath(browser_state_dir, &cache_dir))
return;
*result = cache_dir;
}
} // namespace ios