blob: 9758d33b66a00891208fd1ac733a2866b15e2a18 [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>
26
Alex Deymo39910dc2015-11-09 17:04:30 -080027#include "update_engine/common/utils.h"
Sen Jiang255e22b2016-05-20 16:15:29 -070028#include "update_engine/connection_utils.h"
Alex Deymo63784a52014-05-28 10:46:14 -070029#include "update_engine/update_manager/shill_provider.h"
30#include "update_engine/update_manager/updater_provider.h"
David Zeuthenfe225c12014-04-29 10:37:35 -070031
Sen Jiang255e22b2016-05-20 16:15:29 -070032using chromeos_update_engine::ConnectionTethering;
33using chromeos_update_engine::ConnectionType;
34using chromeos_update_engine::connection_utils::StringForConnectionType;
David Zeuthenfe225c12014-04-29 10:37:35 -070035using std::set;
36using std::string;
37
Alex Deymo63784a52014-05-28 10:46:14 -070038namespace chromeos_update_manager {
David Zeuthenfe225c12014-04-29 10:37:35 -070039
40// Template instantiation for common types; used in BoxedValue::ToString().
41// Keep in sync with boxed_value_unitttest.cc.
42
43template<>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070044string BoxedValue::ValuePrinter<string>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -070045 const string* val = reinterpret_cast<const string*>(value);
46 return *val;
47}
48
49template<>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070050string BoxedValue::ValuePrinter<int>(const void* value) {
Alex Deymof967ebe2014-05-05 14:46:17 -070051 const int* val = reinterpret_cast<const int*>(value);
52 return base::IntToString(*val);
53}
54
55template<>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070056string BoxedValue::ValuePrinter<unsigned int>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -070057 const unsigned int* val = reinterpret_cast<const unsigned int*>(value);
58 return base::UintToString(*val);
59}
60
61template<>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070062string BoxedValue::ValuePrinter<int64_t>(const void* value) {
Alex Deymof967ebe2014-05-05 14:46:17 -070063 const int64_t* val = reinterpret_cast<const int64_t*>(value);
64 return base::Int64ToString(*val);
David Zeuthenfe225c12014-04-29 10:37:35 -070065}
66
67template<>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070068string BoxedValue::ValuePrinter<uint64_t>(const void* value) {
Alex Deymof967ebe2014-05-05 14:46:17 -070069 const uint64_t* val =
70 reinterpret_cast<const uint64_t*>(value);
Ben Chandcf5a1d2014-08-07 09:34:12 -070071 return base::Uint64ToString(static_cast<uint64_t>(*val));
David Zeuthenfe225c12014-04-29 10:37:35 -070072}
73
74template<>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070075string BoxedValue::ValuePrinter<bool>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -070076 const bool* val = reinterpret_cast<const bool*>(value);
77 return *val ? "true" : "false";
78}
79
80template<>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070081string BoxedValue::ValuePrinter<double>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -070082 const double* val = reinterpret_cast<const double*>(value);
83 return base::DoubleToString(*val);
84}
85
86template<>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070087string BoxedValue::ValuePrinter<base::Time>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -070088 const base::Time* val = reinterpret_cast<const base::Time*>(value);
89 return chromeos_update_engine::utils::ToString(*val);
90}
91
92template<>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070093string BoxedValue::ValuePrinter<base::TimeDelta>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -070094 const base::TimeDelta* val = reinterpret_cast<const base::TimeDelta*>(value);
95 return chromeos_update_engine::utils::FormatTimeDelta(*val);
96}
97
David Zeuthenfe225c12014-04-29 10:37:35 -070098template<>
Gilad Arnoldec7f9162014-07-15 13:24:46 -070099string BoxedValue::ValuePrinter<ConnectionType>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700100 const ConnectionType* val = reinterpret_cast<const ConnectionType*>(value);
Sen Jiang255e22b2016-05-20 16:15:29 -0700101 return StringForConnectionType(*val);
David Zeuthenfe225c12014-04-29 10:37:35 -0700102}
103
104template<>
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700105string BoxedValue::ValuePrinter<set<ConnectionType>>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700106 string ret = "";
107 const set<ConnectionType>* val =
108 reinterpret_cast<const set<ConnectionType>*>(value);
109 for (auto& it : *val) {
110 ConnectionType type = it;
111 if (ret.size() > 0)
112 ret += ",";
Sen Jiang255e22b2016-05-20 16:15:29 -0700113 ret += StringForConnectionType(type);
David Zeuthenfe225c12014-04-29 10:37:35 -0700114 }
115 return ret;
116}
117
118template<>
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700119string BoxedValue::ValuePrinter<ConnectionTethering>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700120 const ConnectionTethering* val =
121 reinterpret_cast<const ConnectionTethering*>(value);
122 switch (*val) {
123 case ConnectionTethering::kNotDetected:
124 return "Not Detected";
125 case ConnectionTethering::kSuspected:
126 return "Suspected";
127 case ConnectionTethering::kConfirmed:
128 return "Confirmed";
129 case ConnectionTethering::kUnknown:
130 return "Unknown";
131 }
132 NOTREACHED();
133 return "Unknown";
134}
135
136template<>
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700137string BoxedValue::ValuePrinter<Stage>(const void* value) {
David Zeuthenfe225c12014-04-29 10:37:35 -0700138 const Stage* val = reinterpret_cast<const Stage*>(value);
139 switch (*val) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700140 case Stage::kIdle:
David Zeuthenfe225c12014-04-29 10:37:35 -0700141 return "Idle";
142 case Stage::kCheckingForUpdate:
143 return "Checking For Update";
144 case Stage::kUpdateAvailable:
145 return "Update Available";
146 case Stage::kDownloading:
147 return "Downloading";
148 case Stage::kVerifying:
149 return "Verifying";
150 case Stage::kFinalizing:
151 return "Finalizing";
152 case Stage::kUpdatedNeedReboot:
153 return "Updated, Need Reboot";
154 case Stage::kReportingErrorEvent:
155 return "Reporting Error Event";
156 case Stage::kAttemptingRollback:
157 return "Attempting Rollback";
158 }
159 NOTREACHED();
160 return "Unknown";
161}
162
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700163template<>
164string BoxedValue::ValuePrinter<UpdateRequestStatus>(const void* value) {
165 const UpdateRequestStatus* val =
166 reinterpret_cast<const UpdateRequestStatus*>(value);
167 switch (*val) {
168 case UpdateRequestStatus::kNone:
169 return "None";
170 case UpdateRequestStatus::kInteractive:
171 return "Interactive";
172 case UpdateRequestStatus::kPeriodic:
173 return "Periodic";
174 }
175 NOTREACHED();
176 return "Unknown";
177}
178
Alex Deymo63784a52014-05-28 10:46:14 -0700179} // namespace chromeos_update_manager