OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/mac/foundation_util.h" | 5 #include "base/mac/foundation_util.h" |
6 | 6 |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 #include <string.h> | 8 #include <string.h> |
9 | 9 |
10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/mac/bundle_locations.h" |
12 #include "base/sys_string_conversions.h" | 13 #include "base/sys_string_conversions.h" |
13 | 14 |
14 namespace base { | 15 namespace base { |
15 namespace mac { | 16 namespace mac { |
16 | 17 |
17 static bool g_override_am_i_bundled = false; | 18 static bool g_override_am_i_bundled = false; |
18 static bool g_override_am_i_bundled_value = false; | 19 static bool g_override_am_i_bundled_value = false; |
19 | 20 |
20 // Adapted from http://developer.apple.com/carbon/tipsandtricks.html#AmIBundled | 21 // Adapted from http://developer.apple.com/carbon/tipsandtricks.html#AmIBundled |
21 static bool UncachedAmIBundled() { | 22 static bool UncachedAmIBundled() { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 return result; | 55 return result; |
55 } | 56 } |
56 | 57 |
57 void SetOverrideAmIBundled(bool value) { | 58 void SetOverrideAmIBundled(bool value) { |
58 g_override_am_i_bundled = true; | 59 g_override_am_i_bundled = true; |
59 g_override_am_i_bundled_value = value; | 60 g_override_am_i_bundled_value = value; |
60 } | 61 } |
61 | 62 |
62 bool IsBackgroundOnlyProcess() { | 63 bool IsBackgroundOnlyProcess() { |
63 // This function really does want to examine NSBundle's idea of the main | 64 // This function really does want to examine NSBundle's idea of the main |
64 // bundle dictionary, and not the overriden MainAppBundle. It needs to look | 65 // bundle dictionary. It needs to look at the actual running .app's |
65 // at the actual running .app's Info.plist to access its LSUIElement | 66 // Info.plist to access its LSUIElement property. |
66 // property. | 67 NSDictionary* info_dictionary = [base::mac::MainBundle() infoDictionary]; |
67 NSDictionary* info_dictionary = [[NSBundle mainBundle] infoDictionary]; | |
68 return [[info_dictionary objectForKey:@"LSUIElement"] boolValue] != NO; | 68 return [[info_dictionary objectForKey:@"LSUIElement"] boolValue] != NO; |
69 } | 69 } |
70 | 70 |
71 // No threading worries since NSBundle isn't thread safe. | |
72 static NSBundle* g_override_app_bundle = nil; | |
73 | |
74 NSBundle* MainAppBundle() { | 71 NSBundle* MainAppBundle() { |
75 if (g_override_app_bundle) | 72 return base::mac::FrameworkBundle(); |
76 return g_override_app_bundle; | |
77 return [NSBundle mainBundle]; | |
78 } | 73 } |
79 | 74 |
80 FilePath MainAppBundlePath() { | 75 FilePath MainAppBundlePath() { |
81 NSBundle* bundle = MainAppBundle(); | 76 return base::mac::FrameworkBundlePath(); |
82 return FilePath([[bundle bundlePath] fileSystemRepresentation]); | |
83 } | 77 } |
84 | 78 |
85 FilePath PathForMainAppBundleResource(CFStringRef resourceName) { | 79 FilePath PathForFrameworkBundleResource(CFStringRef resourceName) { |
86 NSBundle* bundle = MainAppBundle(); | 80 NSBundle* bundle = base::mac::FrameworkBundle(); |
87 NSString* resourcePath = [bundle pathForResource:(NSString*)resourceName | 81 NSString* resourcePath = [bundle pathForResource:(NSString*)resourceName |
88 ofType:nil]; | 82 ofType:nil]; |
89 if (!resourcePath) | 83 if (!resourcePath) |
90 return FilePath(); | 84 return FilePath(); |
91 return FilePath([resourcePath fileSystemRepresentation]); | 85 return FilePath([resourcePath fileSystemRepresentation]); |
92 } | 86 } |
93 | 87 |
94 void SetOverrideAppBundle(NSBundle* bundle) { | |
95 if (bundle != g_override_app_bundle) { | |
96 [g_override_app_bundle release]; | |
97 g_override_app_bundle = [bundle retain]; | |
98 } | |
99 } | |
100 | |
101 void SetOverrideAppBundlePath(const FilePath& file_path) { | |
102 NSString* path = base::SysUTF8ToNSString(file_path.value()); | |
103 NSBundle* bundle = [NSBundle bundleWithPath:path]; | |
104 DCHECK(bundle) << "Failed to load the bundle at " << file_path.value(); | |
105 | |
106 SetOverrideAppBundle(bundle); | |
107 } | |
108 | |
109 OSType CreatorCodeForCFBundleRef(CFBundleRef bundle) { | 88 OSType CreatorCodeForCFBundleRef(CFBundleRef bundle) { |
110 OSType creator = kUnknownType; | 89 OSType creator = kUnknownType; |
111 CFBundleGetPackageInfo(bundle, NULL, &creator); | 90 CFBundleGetPackageInfo(bundle, NULL, &creator); |
112 return creator; | 91 return creator; |
113 } | 92 } |
114 | 93 |
115 OSType CreatorCodeForApplication() { | 94 OSType CreatorCodeForApplication() { |
116 CFBundleRef bundle = CFBundleGetMainBundle(); | 95 CFBundleRef bundle = CFBundleGetMainBundle(); |
117 if (!bundle) | 96 if (!bundle) |
118 return kUnknownType; | 97 return kUnknownType; |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 CFDictionaryGetValue(user_info.get(), kCFErrorDescriptionKey)); | 354 CFDictionaryGetValue(user_info.get(), kCFErrorDescriptionKey)); |
376 } | 355 } |
377 o << "Code: " << CFErrorGetCode(err) | 356 o << "Code: " << CFErrorGetCode(err) |
378 << " Domain: " << CFErrorGetDomain(err) | 357 << " Domain: " << CFErrorGetDomain(err) |
379 << " Desc: " << desc.get(); | 358 << " Desc: " << desc.get(); |
380 if(errorDesc) { | 359 if(errorDesc) { |
381 o << "(" << errorDesc << ")"; | 360 o << "(" << errorDesc << ")"; |
382 } | 361 } |
383 return o; | 362 return o; |
384 } | 363 } |
OLD | NEW |