|  | // 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/file_version_info_mac.h" | 
|  |  | 
|  | #import <Foundation/Foundation.h> | 
|  |  | 
|  | #include "base/files/file_path.h" | 
|  | #include "base/logging.h" | 
|  | #include "base/mac/bundle_locations.h" | 
|  | #include "base/mac/foundation_util.h" | 
|  | #include "base/strings/sys_string_conversions.h" | 
|  | #include "build_config.h" | 
|  |  | 
|  | FileVersionInfoMac::FileVersionInfoMac(NSBundle *bundle) | 
|  | : bundle_([bundle retain]) { | 
|  | } | 
|  |  | 
|  | FileVersionInfoMac::~FileVersionInfoMac() {} | 
|  |  | 
|  | // static | 
|  | FileVersionInfo* FileVersionInfo::CreateFileVersionInfoForCurrentModule() { | 
|  | return CreateFileVersionInfo(base::mac::FrameworkBundlePath()); | 
|  | } | 
|  |  | 
|  | // static | 
|  | FileVersionInfo* FileVersionInfo::CreateFileVersionInfo( | 
|  | const base::FilePath& file_path) { | 
|  | NSString* path = base::SysUTF8ToNSString(file_path.value()); | 
|  | NSBundle* bundle = [NSBundle bundleWithPath:path]; | 
|  | return new FileVersionInfoMac(bundle); | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::company_name() { | 
|  | return base::string16(); | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::company_short_name() { | 
|  | return base::string16(); | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::internal_name() { | 
|  | return base::string16(); | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::product_name() { | 
|  | return GetString16Value(kCFBundleNameKey); | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::product_short_name() { | 
|  | return GetString16Value(kCFBundleNameKey); | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::comments() { | 
|  | return base::string16(); | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::legal_copyright() { | 
|  | return GetString16Value(CFSTR("CFBundleGetInfoString")); | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::product_version() { | 
|  | // On OS X, CFBundleVersion is used by LaunchServices, and must follow | 
|  | // specific formatting rules, so the four-part Chrome version is in | 
|  | // CFBundleShortVersionString. On iOS, both have a policy-enfoced limit | 
|  | // of three version components, so the full version is stored in a custom | 
|  | // key (CrBundleVersion) falling back to CFBundleVersion if not present. | 
|  | #if defined(OS_IOS) | 
|  | base::string16 version(GetString16Value(CFSTR("CrBundleVersion"))); | 
|  | if (version.length() > 0) | 
|  | return version; | 
|  | return GetString16Value(CFSTR("CFBundleVersion")); | 
|  | #else | 
|  | return GetString16Value(CFSTR("CFBundleShortVersionString")); | 
|  | #endif  // defined(OS_IOS) | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::file_description() { | 
|  | return base::string16(); | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::legal_trademarks() { | 
|  | return base::string16(); | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::private_build() { | 
|  | return base::string16(); | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::file_version() { | 
|  | return product_version(); | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::original_filename() { | 
|  | return GetString16Value(kCFBundleNameKey); | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::special_build() { | 
|  | return base::string16(); | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::last_change() { | 
|  | return GetString16Value(CFSTR("SCMRevision")); | 
|  | } | 
|  |  | 
|  | bool FileVersionInfoMac::is_official_build() { | 
|  | #if defined (GOOGLE_CHROME_BUILD) | 
|  | return true; | 
|  | #else | 
|  | return false; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | base::string16 FileVersionInfoMac::GetString16Value(CFStringRef name) { | 
|  | if (bundle_) { | 
|  | NSString *ns_name = base::mac::CFToNSCast(name); | 
|  | NSString* value = [bundle_ objectForInfoDictionaryKey:ns_name]; | 
|  | if (value) { | 
|  | return base::SysNSStringToUTF16(value); | 
|  | } | 
|  | } | 
|  | return base::string16(); | 
|  | } |