OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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/sys_info.h" | 5 #include "base/sys_info.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/environment.h" | 8 #include "base/environment.h" |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
11 #include "base/lazy_instance.h" | 11 #include "base/lazy_instance.h" |
12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
13 #include "base/strings/string_piece.h" | 13 #include "base/strings/string_piece.h" |
14 #include "base/strings/string_split.h" | 14 #include "base/strings/string_split.h" |
15 #include "base/strings/string_tokenizer.h" | 15 #include "base/strings/string_tokenizer.h" |
16 #include "base/strings/string_util.h" | 16 #include "base/strings/string_util.h" |
17 #include "base/threading/thread_restrictions.h" | 17 #include "base/threading/thread_restrictions.h" |
18 | 18 |
19 namespace base { | 19 namespace base { |
20 | 20 |
21 namespace { | 21 namespace { |
22 | 22 |
23 const char* kLinuxStandardBaseVersionKeys[] = { | 23 const char* kLinuxStandardBaseVersionKeys[] = { |
24 "CHROMEOS_RELEASE_VERSION", | 24 "CHROMEOS_RELEASE_VERSION", |
25 "GOOGLE_RELEASE", | 25 "GOOGLE_RELEASE", |
26 "DISTRIB_RELEASE", | 26 "DISTRIB_RELEASE", |
27 }; | 27 }; |
28 const size_t kLinuxStandardBaseVersionKeysLength = | 28 |
29 arraysize(kLinuxStandardBaseVersionKeys); | 29 const char kChromeOsReleaseNameKey[] = "CHROMEOS_RELEASE_NAME"; |
| 30 |
| 31 const char* const kChromeOsReleaseNames[] = { |
| 32 "Chrome OS", |
| 33 "Chromium OS", |
| 34 }; |
30 | 35 |
31 const char kLinuxStandardBaseReleaseFile[] = "/etc/lsb-release"; | 36 const char kLinuxStandardBaseReleaseFile[] = "/etc/lsb-release"; |
32 | 37 |
33 const char kLsbReleaseKey[] = "LSB_RELEASE"; | 38 const char kLsbReleaseKey[] = "LSB_RELEASE"; |
34 const char kLsbReleaseTimeKey[] = "LSB_RELEASE_TIME"; // Seconds since epoch | 39 const char kLsbReleaseTimeKey[] = "LSB_RELEASE_TIME"; // Seconds since epoch |
35 | 40 |
36 const char kLsbReleaseSourceKey[] = "lsb-release"; | 41 const char kLsbReleaseSourceKey[] = "lsb-release"; |
37 const char kLsbReleaseSourceEnv[] = "env"; | 42 const char kLsbReleaseSourceEnv[] = "env"; |
38 const char kLsbReleaseSourceFile[] = "file"; | 43 const char kLsbReleaseSourceFile[] = "file"; |
39 | 44 |
40 class ChromeOSVersionInfo { | 45 class ChromeOSVersionInfo { |
41 public: | 46 public: |
42 ChromeOSVersionInfo() { | 47 ChromeOSVersionInfo() { |
43 Parse(); | 48 Parse(); |
44 } | 49 } |
45 | 50 |
46 void Parse() { | 51 void Parse() { |
47 lsb_release_map_.clear(); | 52 lsb_release_map_.clear(); |
48 major_version_ = 0; | 53 major_version_ = 0; |
49 minor_version_ = 0; | 54 minor_version_ = 0; |
50 bugfix_version_ = 0; | 55 bugfix_version_ = 0; |
| 56 is_running_on_chromeos_ = false; |
51 | 57 |
52 std::string lsb_release, lsb_release_time_str; | 58 std::string lsb_release, lsb_release_time_str; |
53 scoped_ptr<base::Environment> env(base::Environment::Create()); | 59 scoped_ptr<base::Environment> env(base::Environment::Create()); |
54 bool parsed_from_env = | 60 bool parsed_from_env = |
55 env->GetVar(kLsbReleaseKey, &lsb_release) && | 61 env->GetVar(kLsbReleaseKey, &lsb_release) && |
56 env->GetVar(kLsbReleaseTimeKey, &lsb_release_time_str); | 62 env->GetVar(kLsbReleaseTimeKey, &lsb_release_time_str); |
57 if (parsed_from_env) { | 63 if (parsed_from_env) { |
58 double us = 0; | 64 double us = 0; |
59 if (StringToDouble(lsb_release_time_str, &us)) | 65 if (StringToDouble(lsb_release_time_str, &us)) |
60 lsb_release_time_ = base::Time::FromDoubleT(us); | 66 lsb_release_time_ = base::Time::FromDoubleT(us); |
(...skipping 27 matching lines...) Expand all Loading... |
88 int32* bugfix_version) { | 94 int32* bugfix_version) { |
89 *major_version = major_version_; | 95 *major_version = major_version_; |
90 *minor_version = minor_version_; | 96 *minor_version = minor_version_; |
91 *bugfix_version = bugfix_version_; | 97 *bugfix_version = bugfix_version_; |
92 } | 98 } |
93 | 99 |
94 const base::Time& lsb_release_time() const { return lsb_release_time_; } | 100 const base::Time& lsb_release_time() const { return lsb_release_time_; } |
95 const SysInfo::LsbReleaseMap& lsb_release_map() const { | 101 const SysInfo::LsbReleaseMap& lsb_release_map() const { |
96 return lsb_release_map_; | 102 return lsb_release_map_; |
97 } | 103 } |
| 104 bool is_running_on_chromeos() const { return is_running_on_chromeos_; } |
98 | 105 |
99 private: | 106 private: |
100 void ParseLsbRelease(const std::string& lsb_release) { | 107 void ParseLsbRelease(const std::string& lsb_release) { |
101 // Parse and cache lsb_release key pairs. There should only be a handful | 108 // Parse and cache lsb_release key pairs. There should only be a handful |
102 // of entries so the overhead for this will be small, and it can be | 109 // of entries so the overhead for this will be small, and it can be |
103 // useful for debugging. | 110 // useful for debugging. |
104 std::vector<std::pair<std::string, std::string> > pairs; | 111 std::vector<std::pair<std::string, std::string> > pairs; |
105 base::SplitStringIntoKeyValuePairs(lsb_release, '=', '\n', &pairs); | 112 base::SplitStringIntoKeyValuePairs(lsb_release, '=', '\n', &pairs); |
106 for (size_t i = 0; i < pairs.size(); ++i) { | 113 for (size_t i = 0; i < pairs.size(); ++i) { |
107 std::string key, value; | 114 std::string key, value; |
108 TrimWhitespaceASCII(pairs[i].first, TRIM_ALL, &key); | 115 TrimWhitespaceASCII(pairs[i].first, TRIM_ALL, &key); |
109 TrimWhitespaceASCII(pairs[i].second, TRIM_ALL, &value); | 116 TrimWhitespaceASCII(pairs[i].second, TRIM_ALL, &value); |
110 if (key.empty()) | 117 if (key.empty()) |
111 continue; | 118 continue; |
112 lsb_release_map_[key] = value; | 119 lsb_release_map_[key] = value; |
113 } | 120 } |
114 // Parse the version from the first matching recognized version key. | 121 // Parse the version from the first matching recognized version key. |
115 std::string version; | 122 std::string version; |
116 for (size_t i = 0; i < kLinuxStandardBaseVersionKeysLength; ++i) { | 123 for (size_t i = 0; i < arraysize(kLinuxStandardBaseVersionKeys); ++i) { |
117 std::string key = kLinuxStandardBaseVersionKeys[i]; | 124 std::string key = kLinuxStandardBaseVersionKeys[i]; |
118 if (GetLsbReleaseValue(key, &version) && !version.empty()) | 125 if (GetLsbReleaseValue(key, &version) && !version.empty()) |
119 break; | 126 break; |
120 } | 127 } |
121 StringTokenizer tokenizer(version, "."); | 128 StringTokenizer tokenizer(version, "."); |
122 if (tokenizer.GetNext()) { | 129 if (tokenizer.GetNext()) { |
123 StringToInt(StringPiece(tokenizer.token_begin(), tokenizer.token_end()), | 130 StringToInt(StringPiece(tokenizer.token_begin(), tokenizer.token_end()), |
124 &major_version_); | 131 &major_version_); |
125 } | 132 } |
126 if (tokenizer.GetNext()) { | 133 if (tokenizer.GetNext()) { |
127 StringToInt(StringPiece(tokenizer.token_begin(), tokenizer.token_end()), | 134 StringToInt(StringPiece(tokenizer.token_begin(), tokenizer.token_end()), |
128 &minor_version_); | 135 &minor_version_); |
129 } | 136 } |
130 if (tokenizer.GetNext()) { | 137 if (tokenizer.GetNext()) { |
131 StringToInt(StringPiece(tokenizer.token_begin(), tokenizer.token_end()), | 138 StringToInt(StringPiece(tokenizer.token_begin(), tokenizer.token_end()), |
132 &bugfix_version_); | 139 &bugfix_version_); |
133 } | 140 } |
| 141 |
| 142 // Check release name for Chrome OS. |
| 143 std::string release_name; |
| 144 if (GetLsbReleaseValue(kChromeOsReleaseNameKey, &release_name)) { |
| 145 for (size_t i = 0; i < arraysize(kChromeOsReleaseNames); ++i) { |
| 146 if (release_name == kChromeOsReleaseNames[i]) { |
| 147 is_running_on_chromeos_ = true; |
| 148 break; |
| 149 } |
| 150 } |
| 151 } |
134 } | 152 } |
135 | 153 |
136 base::Time lsb_release_time_; | 154 base::Time lsb_release_time_; |
137 SysInfo::LsbReleaseMap lsb_release_map_; | 155 SysInfo::LsbReleaseMap lsb_release_map_; |
138 int32 major_version_; | 156 int32 major_version_; |
139 int32 minor_version_; | 157 int32 minor_version_; |
140 int32 bugfix_version_; | 158 int32 bugfix_version_; |
| 159 bool is_running_on_chromeos_; |
141 }; | 160 }; |
142 | 161 |
143 static LazyInstance<ChromeOSVersionInfo> | 162 static LazyInstance<ChromeOSVersionInfo> |
144 g_chrome_os_version_info = LAZY_INSTANCE_INITIALIZER; | 163 g_chrome_os_version_info = LAZY_INSTANCE_INITIALIZER; |
145 | 164 |
146 ChromeOSVersionInfo& GetChromeOSVersionInfo() { | 165 ChromeOSVersionInfo& GetChromeOSVersionInfo() { |
147 return g_chrome_os_version_info.Get(); | 166 return g_chrome_os_version_info.Get(); |
148 } | 167 } |
149 | 168 |
150 } // namespace | 169 } // namespace |
(...skipping 24 matching lines...) Expand all Loading... |
175 board = "unknown"; | 194 board = "unknown"; |
176 return board; | 195 return board; |
177 } | 196 } |
178 | 197 |
179 // static | 198 // static |
180 base::Time SysInfo::GetLsbReleaseTime() { | 199 base::Time SysInfo::GetLsbReleaseTime() { |
181 return GetChromeOSVersionInfo().lsb_release_time(); | 200 return GetChromeOSVersionInfo().lsb_release_time(); |
182 } | 201 } |
183 | 202 |
184 // static | 203 // static |
| 204 bool SysInfo::IsRunningOnChromeOS() { |
| 205 return GetChromeOSVersionInfo().is_running_on_chromeos(); |
| 206 } |
| 207 |
| 208 // static |
185 void SysInfo::SetChromeOSVersionInfoForTest(const std::string& lsb_release, | 209 void SysInfo::SetChromeOSVersionInfoForTest(const std::string& lsb_release, |
186 const Time& lsb_release_time) { | 210 const Time& lsb_release_time) { |
187 scoped_ptr<base::Environment> env(base::Environment::Create()); | 211 scoped_ptr<base::Environment> env(base::Environment::Create()); |
188 env->SetVar(kLsbReleaseKey, lsb_release); | 212 env->SetVar(kLsbReleaseKey, lsb_release); |
189 env->SetVar(kLsbReleaseTimeKey, | 213 env->SetVar(kLsbReleaseTimeKey, |
190 base::DoubleToString(lsb_release_time.ToDoubleT())); | 214 base::DoubleToString(lsb_release_time.ToDoubleT())); |
191 g_chrome_os_version_info.Get().Parse(); | 215 g_chrome_os_version_info.Get().Parse(); |
192 } | 216 } |
193 | 217 |
194 } // namespace base | 218 } // namespace base |
OLD | NEW |