blob: 54021b85ee08c29ad26e1c3a258f9165a87eb4a4 [file] [log] [blame]
// Copyright (c) 2012 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 "base/mac/bundle_locations.h"
#include "base/logging.h"
#include "base/mac/foundation_util.h"
#include "base/strings/sys_string_conversions.h"
namespace base {
namespace mac {
// NSBundle isn't threadsafe, all functions in this file must be called on the
// main thread.
static NSBundle* g_override_framework_bundle = nil;
static NSBundle* g_override_outer_bundle = nil;
NSBundle* MainBundle() {
return [NSBundle mainBundle];
}
FilePath MainBundlePath() {
NSBundle* bundle = MainBundle();
return NSStringToFilePath([bundle bundlePath]);
}
NSBundle* OuterBundle() {
if (g_override_outer_bundle)
return g_override_outer_bundle;
return [NSBundle mainBundle];
}
FilePath OuterBundlePath() {
NSBundle* bundle = OuterBundle();
return NSStringToFilePath([bundle bundlePath]);
}
NSBundle* FrameworkBundle() {
if (g_override_framework_bundle)
return g_override_framework_bundle;
return [NSBundle mainBundle];
}
FilePath FrameworkBundlePath() {
NSBundle* bundle = FrameworkBundle();
return NSStringToFilePath([bundle bundlePath]);
}
static void AssignOverrideBundle(NSBundle* new_bundle,
NSBundle** override_bundle) {
if (new_bundle != *override_bundle) {
[*override_bundle release];
*override_bundle = [new_bundle retain];
}
}
static void AssignOverridePath(const FilePath& file_path,
NSBundle** override_bundle) {
NSString* path = base::SysUTF8ToNSString(file_path.value());
NSBundle* new_bundle = [NSBundle bundleWithPath:path];
DCHECK(new_bundle) << "Failed to load the bundle at " << file_path.value();
AssignOverrideBundle(new_bundle, override_bundle);
}
void SetOverrideOuterBundle(NSBundle* bundle) {
AssignOverrideBundle(bundle, &g_override_outer_bundle);
}
void SetOverrideFrameworkBundle(NSBundle* bundle) {
AssignOverrideBundle(bundle, &g_override_framework_bundle);
}
void SetOverrideOuterBundlePath(const FilePath& file_path) {
AssignOverridePath(file_path, &g_override_outer_bundle);
}
void SetOverrideFrameworkBundlePath(const FilePath& file_path) {
AssignOverridePath(file_path, &g_override_framework_bundle);
}
} // namespace mac
} // namespace base