blob: 907eb95974a422eb9ade9a7dd95686a2115d3c7c [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2014 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
David Zeuthenfe225c12014-04-29 10:37:35 -070016
Alex Deymoaab50e32014-11-10 19:55:35 -080017#include "update_engine/update_manager/boxed_value.h"
18
Ben Chandcf5a1d2014-08-07 09:34:12 -070019#include <stdint.h>
20
David Zeuthenfe225c12014-04-29 10:37:35 -070021#include <set>
22#include <string>
23
24#include <base/strings/string_number_conversions.h>
25#include <base/time/time.h>
Miriam Polzera02a1f12020-08-27 08:30:14 +020026#include <base/version.h>
David Zeuthenfe225c12014-04-29 10:37:35 -070027
Amin Hassaniec7bc112020-10-29 16:47:58 -070028#include "update_engine/common/connection_utils.h"
Alex Deymo39910dc2015-11-09 17:04:30 -080029#include "update_engine/common/utils.h"
Marton Hunyady0e0e3542018-02-21 18:51:39 +010030#include "update_engine/update_manager/rollback_prefs.h"
Alex Deymo63784a52014-05-28 10:46:14 -070031#include "update_engine/update_manager/shill_provider.h"
32#include "update_engine/update_manager/updater_provider.h"
Adolfo Victoria94ffe132018-06-28 16:14:56 -070033#include "update_engine/update_manager/weekly_time.h"
David Zeuthenfe225c12014-04-29 10:37:35 -070034
Sen Jiang255e22b2016-05-20 16:15:29 -070035using chromeos_update_engine::ConnectionTethering;
36using chromeos_update_engine::ConnectionType;
37using chromeos_update_engine::connection_utils::StringForConnectionType;
David Zeuthenfe225c12014-04-29 10:37:35 -070038using std::set;
39using std::string;
40
Alex Deymo63784a52014-05-28 10:46:14 -070041namespace chromeos_update_manager {
David Zeuthenfe225c12014-04-29 10:37:35 -070042
43// Template instantiation for common types; used in BoxedValue::ToString().
44// Keep in sync with boxed_value_unitttest.cc.
45
Amin Hassani4b717432019-01-14 16:24:20 -080046template <>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070047string BoxedValue::ValuePrinter<string>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -070048 const string* val = reinterpret_cast<const string*>(value);
49 return *val;
50}
51
Amin Hassani4b717432019-01-14 16:24:20 -080052template <>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070053string BoxedValue::ValuePrinter<int>(const void* value) {
Alex Deymof967ebe2014-05-05 14:46:17 -070054 const int* val = reinterpret_cast<const int*>(value);
Jakub Pawlowski7e1dcf72018-07-26 00:29:42 -070055 return base::NumberToString(*val);
Alex Deymof967ebe2014-05-05 14:46:17 -070056}
57
Amin Hassani4b717432019-01-14 16:24:20 -080058template <>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070059string BoxedValue::ValuePrinter<unsigned int>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -070060 const unsigned int* val = reinterpret_cast<const unsigned int*>(value);
Jakub Pawlowski7e1dcf72018-07-26 00:29:42 -070061 return base::NumberToString(*val);
David Zeuthenfe225c12014-04-29 10:37:35 -070062}
63
Amin Hassani4b717432019-01-14 16:24:20 -080064template <>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070065string BoxedValue::ValuePrinter<int64_t>(const void* value) {
Alex Deymof967ebe2014-05-05 14:46:17 -070066 const int64_t* val = reinterpret_cast<const int64_t*>(value);
Jakub Pawlowski7e1dcf72018-07-26 00:29:42 -070067 return base::NumberToString(*val);
David Zeuthenfe225c12014-04-29 10:37:35 -070068}
69
Amin Hassani4b717432019-01-14 16:24:20 -080070template <>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070071string BoxedValue::ValuePrinter<uint64_t>(const void* value) {
Amin Hassani4b717432019-01-14 16:24:20 -080072 const uint64_t* val = reinterpret_cast<const uint64_t*>(value);
Amin Hassani2e4eda52019-01-07 14:01:17 -080073 return base::NumberToString(*val);
David Zeuthenfe225c12014-04-29 10:37:35 -070074}
75
Amin Hassani4b717432019-01-14 16:24:20 -080076template <>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070077string BoxedValue::ValuePrinter<bool>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -070078 const bool* val = reinterpret_cast<const bool*>(value);
79 return *val ? "true" : "false";
80}
81
Amin Hassani4b717432019-01-14 16:24:20 -080082template <>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070083string BoxedValue::ValuePrinter<double>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -070084 const double* val = reinterpret_cast<const double*>(value);
Jakub Pawlowski7e1dcf72018-07-26 00:29:42 -070085 return base::NumberToString(*val);
David Zeuthenfe225c12014-04-29 10:37:35 -070086}
87
Amin Hassani4b717432019-01-14 16:24:20 -080088template <>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070089string BoxedValue::ValuePrinter<base::Time>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -070090 const base::Time* val = reinterpret_cast<const base::Time*>(value);
91 return chromeos_update_engine::utils::ToString(*val);
92}
93
Amin Hassani4b717432019-01-14 16:24:20 -080094template <>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070095string BoxedValue::ValuePrinter<base::TimeDelta>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -070096 const base::TimeDelta* val = reinterpret_cast<const base::TimeDelta*>(value);
97 return chromeos_update_engine::utils::FormatTimeDelta(*val);
98}
99
Amin Hassani4b717432019-01-14 16:24:20 -0800100template <>
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700101string BoxedValue::ValuePrinter<ConnectionType>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700102 const ConnectionType* val = reinterpret_cast<const ConnectionType*>(value);
Sen Jiang255e22b2016-05-20 16:15:29 -0700103 return StringForConnectionType(*val);
David Zeuthenfe225c12014-04-29 10:37:35 -0700104}
105
Amin Hassani4b717432019-01-14 16:24:20 -0800106template <>
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700107string BoxedValue::ValuePrinter<set<ConnectionType>>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700108 string ret = "";
109 const set<ConnectionType>* val =
110 reinterpret_cast<const set<ConnectionType>*>(value);
111 for (auto& it : *val) {
112 ConnectionType type = it;
113 if (ret.size() > 0)
114 ret += ",";
Sen Jiang255e22b2016-05-20 16:15:29 -0700115 ret += StringForConnectionType(type);
David Zeuthenfe225c12014-04-29 10:37:35 -0700116 }
117 return ret;
118}
119
Amin Hassani4b717432019-01-14 16:24:20 -0800120template <>
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700121string BoxedValue::ValuePrinter<ConnectionTethering>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700122 const ConnectionTethering* val =
123 reinterpret_cast<const ConnectionTethering*>(value);
124 switch (*val) {
125 case ConnectionTethering::kNotDetected:
126 return "Not Detected";
127 case ConnectionTethering::kSuspected:
128 return "Suspected";
129 case ConnectionTethering::kConfirmed:
130 return "Confirmed";
131 case ConnectionTethering::kUnknown:
132 return "Unknown";
133 }
134 NOTREACHED();
135 return "Unknown";
136}
137
Marton Hunyady0e0e3542018-02-21 18:51:39 +0100138template <>
139string BoxedValue::ValuePrinter<RollbackToTargetVersion>(const void* value) {
140 const RollbackToTargetVersion* val =
141 reinterpret_cast<const RollbackToTargetVersion*>(value);
142 switch (*val) {
143 case RollbackToTargetVersion::kUnspecified:
144 return "Unspecified";
145 case RollbackToTargetVersion::kDisabled:
146 return "Disabled";
Marton Hunyadyd4bc4622018-08-30 15:52:23 +0200147 case RollbackToTargetVersion::kRollbackAndPowerwash:
148 return "Rollback and powerwash";
Marton Hunyady31aefb92018-08-29 16:17:03 +0200149 case RollbackToTargetVersion::kRollbackAndRestoreIfPossible:
150 return "Rollback and restore if possible";
Marton Hunyady0e0e3542018-02-21 18:51:39 +0100151 case RollbackToTargetVersion::kMaxValue:
152 NOTREACHED();
153 return "Max value";
154 }
155 NOTREACHED();
156 return "Unknown";
157}
158
Amin Hassani4b717432019-01-14 16:24:20 -0800159template <>
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700160string BoxedValue::ValuePrinter<Stage>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700161 const Stage* val = reinterpret_cast<const Stage*>(value);
162 switch (*val) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700163 case Stage::kIdle:
David Zeuthenfe225c12014-04-29 10:37:35 -0700164 return "Idle";
165 case Stage::kCheckingForUpdate:
166 return "Checking For Update";
167 case Stage::kUpdateAvailable:
168 return "Update Available";
169 case Stage::kDownloading:
170 return "Downloading";
171 case Stage::kVerifying:
172 return "Verifying";
173 case Stage::kFinalizing:
174 return "Finalizing";
175 case Stage::kUpdatedNeedReboot:
176 return "Updated, Need Reboot";
177 case Stage::kReportingErrorEvent:
178 return "Reporting Error Event";
179 case Stage::kAttemptingRollback:
180 return "Attempting Rollback";
Amin Hassani70a90f52020-09-15 15:30:09 -0700181 case Stage::kCleanupPreviousUpdate:
182 return "Cleanup Previous Update";
David Zeuthenfe225c12014-04-29 10:37:35 -0700183 }
184 NOTREACHED();
185 return "Unknown";
186}
187
Amin Hassani4b717432019-01-14 16:24:20 -0800188template <>
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700189string BoxedValue::ValuePrinter<UpdateRequestStatus>(const void* value) {
190 const UpdateRequestStatus* val =
191 reinterpret_cast<const UpdateRequestStatus*>(value);
192 switch (*val) {
193 case UpdateRequestStatus::kNone:
194 return "None";
195 case UpdateRequestStatus::kInteractive:
196 return "Interactive";
197 case UpdateRequestStatus::kPeriodic:
198 return "Periodic";
199 }
200 NOTREACHED();
201 return "Unknown";
202}
203
Aaron Woodbf5a2522017-10-04 10:58:36 -0700204template <>
205string BoxedValue::ValuePrinter<UpdateRestrictions>(const void* value) {
206 const UpdateRestrictions* val =
207 reinterpret_cast<const UpdateRestrictions*>(value);
208
209 if (*val == UpdateRestrictions::kNone) {
210 return "None";
211 }
212 string retval = "Flags:";
213 if (*val & kRestrictDownloading) {
214 retval += " RestrictDownloading";
215 }
216 return retval;
217}
218
Adolfo Victoria94ffe132018-06-28 16:14:56 -0700219template <>
220string BoxedValue::ValuePrinter<WeeklyTimeInterval>(const void* value) {
221 const WeeklyTimeInterval* val =
222 reinterpret_cast<const WeeklyTimeInterval*>(value);
223 return val->ToString();
224}
225
226template <>
227string BoxedValue::ValuePrinter<WeeklyTimeIntervalVector>(const void* value) {
228 const WeeklyTimeIntervalVector* val =
229 reinterpret_cast<const WeeklyTimeIntervalVector*>(value);
230
231 string retval = "Disallowed intervals:\n";
232 for (const auto& interval : *val) {
233 retval += interval.ToString() + "\n";
234 }
235 return retval;
236}
237
Miriam Polzerf197cdb2020-08-27 08:18:29 +0200238template <>
239string BoxedValue::ValuePrinter<ChannelDowngradeBehavior>(const void* value) {
240 const ChannelDowngradeBehavior* val =
241 reinterpret_cast<const ChannelDowngradeBehavior*>(value);
242 switch (*val) {
243 case ChannelDowngradeBehavior::kUnspecified:
244 return "Unspecified";
245 case ChannelDowngradeBehavior::kWaitForVersionToCatchUp:
246 return "Wait for the target channel to catch up";
247 case ChannelDowngradeBehavior::kRollback:
248 return "Roll back and powerwash on channel downgrade";
249 case ChannelDowngradeBehavior::kAllowUserToConfigure:
250 return "User decides on channel downgrade behavior";
251 }
252 NOTREACHED();
253 return "Unknown";
254}
255
Miriam Polzera02a1f12020-08-27 08:30:14 +0200256template <>
257string BoxedValue::ValuePrinter<base::Version>(const void* value) {
258 const base::Version* val = reinterpret_cast<const base::Version*>(value);
259 if (val->IsValid())
260 return val->GetString();
261 return "Unknown";
262}
263
Alex Deymo63784a52014-05-28 10:46:14 -0700264} // namespace chromeos_update_manager