1*6777b538SAndroid Build Coastguard Worker// Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker// found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker#include "base/file_version_info_apple.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker#import <Foundation/Foundation.h> 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker#include "base/apple/bridging.h" 10*6777b538SAndroid Build Coastguard Worker#include "base/apple/bundle_locations.h" 11*6777b538SAndroid Build Coastguard Worker#include "base/apple/foundation_util.h" 12*6777b538SAndroid Build Coastguard Worker#include "base/files/file_path.h" 13*6777b538SAndroid Build Coastguard Worker#include "base/strings/sys_string_conversions.h" 14*6777b538SAndroid Build Coastguard Worker#include "build/build_config.h" 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard WorkerFileVersionInfoApple::FileVersionInfoApple(NSBundle* bundle) 17*6777b538SAndroid Build Coastguard Worker : bundle_(bundle) {} 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard WorkerFileVersionInfoApple::~FileVersionInfoApple() = default; 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker// static 22*6777b538SAndroid Build Coastguard Workerstd::unique_ptr<FileVersionInfo> 23*6777b538SAndroid Build Coastguard WorkerFileVersionInfo::CreateFileVersionInfoForCurrentModule() { 24*6777b538SAndroid Build Coastguard Worker return CreateFileVersionInfo(base::apple::FrameworkBundlePath()); 25*6777b538SAndroid Build Coastguard Worker} 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker// static 28*6777b538SAndroid Build Coastguard Workerstd::unique_ptr<FileVersionInfo> FileVersionInfo::CreateFileVersionInfo( 29*6777b538SAndroid Build Coastguard Worker const base::FilePath& file_path) { 30*6777b538SAndroid Build Coastguard Worker NSString* path = base::SysUTF8ToNSString(file_path.value()); 31*6777b538SAndroid Build Coastguard Worker NSBundle* bundle = [NSBundle bundleWithPath:path]; 32*6777b538SAndroid Build Coastguard Worker return std::make_unique<FileVersionInfoApple>(bundle); 33*6777b538SAndroid Build Coastguard Worker} 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Workerstd::u16string FileVersionInfoApple::company_name() { 36*6777b538SAndroid Build Coastguard Worker return std::u16string(); 37*6777b538SAndroid Build Coastguard Worker} 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Workerstd::u16string FileVersionInfoApple::company_short_name() { 40*6777b538SAndroid Build Coastguard Worker return std::u16string(); 41*6777b538SAndroid Build Coastguard Worker} 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Workerstd::u16string FileVersionInfoApple::internal_name() { 44*6777b538SAndroid Build Coastguard Worker return std::u16string(); 45*6777b538SAndroid Build Coastguard Worker} 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Workerstd::u16string FileVersionInfoApple::product_name() { 48*6777b538SAndroid Build Coastguard Worker return GetString16Value(kCFBundleNameKey); 49*6777b538SAndroid Build Coastguard Worker} 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Workerstd::u16string FileVersionInfoApple::product_short_name() { 52*6777b538SAndroid Build Coastguard Worker return GetString16Value(kCFBundleNameKey); 53*6777b538SAndroid Build Coastguard Worker} 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Workerstd::u16string FileVersionInfoApple::product_version() { 56*6777b538SAndroid Build Coastguard Worker // On macOS, CFBundleVersion is used by LaunchServices, and must follow 57*6777b538SAndroid Build Coastguard Worker // specific formatting rules, so the four-part Chrome version is in 58*6777b538SAndroid Build Coastguard Worker // CFBundleShortVersionString. On iOS, both have a policy-enforced limit 59*6777b538SAndroid Build Coastguard Worker // of three version components, so the full version is stored in a custom 60*6777b538SAndroid Build Coastguard Worker // key (CrBundleVersion) falling back to CFBundleVersion if not present. 61*6777b538SAndroid Build Coastguard Worker#if BUILDFLAG(IS_IOS) 62*6777b538SAndroid Build Coastguard Worker std::u16string version(GetString16Value(CFSTR("CrBundleVersion"))); 63*6777b538SAndroid Build Coastguard Worker if (version.length() > 0) { 64*6777b538SAndroid Build Coastguard Worker return version; 65*6777b538SAndroid Build Coastguard Worker } 66*6777b538SAndroid Build Coastguard Worker return GetString16Value(CFSTR("CFBundleVersion")); 67*6777b538SAndroid Build Coastguard Worker#else 68*6777b538SAndroid Build Coastguard Worker return GetString16Value(CFSTR("CFBundleShortVersionString")); 69*6777b538SAndroid Build Coastguard Worker#endif // BUILDFLAG(IS_IOS) 70*6777b538SAndroid Build Coastguard Worker} 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Workerstd::u16string FileVersionInfoApple::file_description() { 73*6777b538SAndroid Build Coastguard Worker return std::u16string(); 74*6777b538SAndroid Build Coastguard Worker} 75*6777b538SAndroid Build Coastguard Worker 76*6777b538SAndroid Build Coastguard Workerstd::u16string FileVersionInfoApple::file_version() { 77*6777b538SAndroid Build Coastguard Worker return product_version(); 78*6777b538SAndroid Build Coastguard Worker} 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Workerstd::u16string FileVersionInfoApple::original_filename() { 81*6777b538SAndroid Build Coastguard Worker return GetString16Value(kCFBundleNameKey); 82*6777b538SAndroid Build Coastguard Worker} 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Workerstd::u16string FileVersionInfoApple::special_build() { 85*6777b538SAndroid Build Coastguard Worker return std::u16string(); 86*6777b538SAndroid Build Coastguard Worker} 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Workerstd::u16string FileVersionInfoApple::GetString16Value(CFStringRef name) { 89*6777b538SAndroid Build Coastguard Worker if (bundle_) { 90*6777b538SAndroid Build Coastguard Worker NSString* ns_name = base::apple::CFToNSPtrCast(name); 91*6777b538SAndroid Build Coastguard Worker NSString* value = [bundle_ objectForInfoDictionaryKey:ns_name]; 92*6777b538SAndroid Build Coastguard Worker if (value) { 93*6777b538SAndroid Build Coastguard Worker return base::SysNSStringToUTF16(value); 94*6777b538SAndroid Build Coastguard Worker } 95*6777b538SAndroid Build Coastguard Worker } 96*6777b538SAndroid Build Coastguard Worker return std::u16string(); 97*6777b538SAndroid Build Coastguard Worker} 98