xref: /aosp_15_r20/external/cronet/base/file_version_info_apple.mm (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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