Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/file_version_info_mac.h"
      6 
      7 #import <Foundation/Foundation.h>
      8 
      9 #include "base/files/file_path.h"
     10 #include "base/logging.h"
     11 #include "base/mac/bundle_locations.h"
     12 #include "base/mac/foundation_util.h"
     13 #include "base/strings/sys_string_conversions.h"
     14 
     15 FileVersionInfoMac::FileVersionInfoMac(NSBundle *bundle)
     16     : bundle_([bundle retain]) {
     17 }
     18 
     19 FileVersionInfoMac::~FileVersionInfoMac() {}
     20 
     21 // static
     22 FileVersionInfo* FileVersionInfo::CreateFileVersionInfoForCurrentModule() {
     23   return CreateFileVersionInfo(base::mac::FrameworkBundlePath());
     24 }
     25 
     26 // static
     27 FileVersionInfo* FileVersionInfo::CreateFileVersionInfo(
     28     const base::FilePath& file_path) {
     29   NSString* path = base::SysUTF8ToNSString(file_path.value());
     30   NSBundle* bundle = [NSBundle bundleWithPath:path];
     31   return new FileVersionInfoMac(bundle);
     32 }
     33 
     34 string16 FileVersionInfoMac::company_name() {
     35   return string16();
     36 }
     37 
     38 string16 FileVersionInfoMac::company_short_name() {
     39   return string16();
     40 }
     41 
     42 string16 FileVersionInfoMac::internal_name() {
     43   return string16();
     44 }
     45 
     46 string16 FileVersionInfoMac::product_name() {
     47   return GetString16Value(kCFBundleNameKey);
     48 }
     49 
     50 string16 FileVersionInfoMac::product_short_name() {
     51   return GetString16Value(kCFBundleNameKey);
     52 }
     53 
     54 string16 FileVersionInfoMac::comments() {
     55   return string16();
     56 }
     57 
     58 string16 FileVersionInfoMac::legal_copyright() {
     59   return GetString16Value(CFSTR("CFBundleGetInfoString"));
     60 }
     61 
     62 string16 FileVersionInfoMac::product_version() {
     63   // On OS X, CFBundleVersion is used by LaunchServices, and must follow
     64   // specific formatting rules, so the four-part Chrome version is in
     65   // CFBundleShortVersionString. On iOS, however, CFBundleVersion can be the
     66   // full version, but CFBundleShortVersionString has a policy-enfoced limit
     67   // of three version components.
     68 #if defined(OS_IOS)
     69   return GetString16Value(CFSTR("CFBundleVersion"));
     70 #else
     71   return GetString16Value(CFSTR("CFBundleShortVersionString"));
     72 #endif  // defined(OS_IOS)
     73 }
     74 
     75 string16 FileVersionInfoMac::file_description() {
     76   return string16();
     77 }
     78 
     79 string16 FileVersionInfoMac::legal_trademarks() {
     80   return string16();
     81 }
     82 
     83 string16 FileVersionInfoMac::private_build() {
     84   return string16();
     85 }
     86 
     87 string16 FileVersionInfoMac::file_version() {
     88   return product_version();
     89 }
     90 
     91 string16 FileVersionInfoMac::original_filename() {
     92   return GetString16Value(kCFBundleNameKey);
     93 }
     94 
     95 string16 FileVersionInfoMac::special_build() {
     96   return string16();
     97 }
     98 
     99 string16 FileVersionInfoMac::last_change() {
    100   return GetString16Value(CFSTR("SCMRevision"));
    101 }
    102 
    103 bool FileVersionInfoMac::is_official_build() {
    104 #if defined (GOOGLE_CHROME_BUILD)
    105   return true;
    106 #else
    107   return false;
    108 #endif
    109 }
    110 
    111 string16 FileVersionInfoMac::GetString16Value(CFStringRef name) {
    112   if (bundle_) {
    113     NSString *ns_name = base::mac::CFToNSCast(name);
    114     NSString* value = [bundle_ objectForInfoDictionaryKey:ns_name];
    115     if (value) {
    116       return base::SysNSStringToUTF16(value);
    117     }
    118   }
    119   return string16();
    120 }
    121